F5 อ่อนว่ะ - คอร์สนี้จะกลายเป็นตำนานของวงการ IT ไทย #F5อ่อนว่ะ

บทความนี้เขียนขึ้นเพื่อแชร์ความคิด และประเด็นที่โดยส่วนตัวคิดว่าน่าสนใจ ไม่สามารถเขียนความรู้ที่ได้จากวันที่ไปอบรมมาได้หมดนะครับ วันนั้นนี่เปิดโลกมาก ใครอ่านบทความนี้แล้วสนใจอยากให้พี่เค้าเปิดเพิ่ม เชิญไปอ้อนพี่เค้าเองนะครับ 😛

เกริ่นนำ

เนื่องจากความที่ไม่เข้าใจว่าทำไมเว็บไทยของเราไม่สามารถรองรับผู้ใช้งานจำนวนมากๆ ได้อย่างที่ควรจะเป็น ทำไมบางเว็บแค่โดน F5 รัวๆ ก็ล่มแล้ว มันเกิดอะไรขึ้นกับบ้านเรานะ? พี่โดมจัดเต็มเปิดคอร์สที่ผมไม่คิดว่าจะเกิดขึ้นในเมืองไทยมาก่อน ถึงแม้ว่าในอนาคตจะมีแต่ก็ไม่คิดว่าจะเป็นคอร์สราคาถูกแบบนี้ ผมนี่โชคดีเปิดเฟสบุคมาเห็นพอดี ตอนลงทะเบียนนี่จ่ายเงินแบบไม่คิดเลยครับ

Continue reading "F5 อ่อนว่ะ - คอร์สนี้จะกลายเป็นตำนานของวงการ IT ไทย #F5อ่อนว่ะ"

บทความเกี่ยวกับ Coding ที่ Thai Programmer (สมาคมโปรแกรมเมอร์ไทย)

บทความที่เกี่ยวกับการเขียนโค้ดหรือว่า Technical ต่างๆ ที่ผมคิดว่ามีประโยชน์ต่อชาวโปรแกรมเมอร์ไทย ผมจะไปเขียนไว้ที่ Thai Programmer (สมาคมโปรแกรมเมอร์ไทย) นะครับ

ส่วนเรื่องอื่นๆ ยังคงเขียนที่นี่ต่อไป 🙂

เริ่มทำ Unit Testing ใน JavaScript ด้วย Jasmine

หลายคนอาจจะรู้สึกไม่ชอบภาษา JavaScript อาจจะมีประสบการณ์ที่พอเขียนเสร็จแล้วก็ไม่อยากจะไปแก้ไข ได้แต่เขียนเพิ่มเข้าไปเรื่อยๆ นานๆ เข้าก็จะกลายเป็นโค้ดเทพ (legacy code) ที่ไม่สามารถแตะต้องอีกต่อไป ผมคิดว่าส่วนหนึ่งน่าจะเป็นเพราะว่าเมื่อก่อนเรายังไม่มี tool ดีๆ มาช่วยในการดูแลรักษาโค้ดของเรา แล้วก็ส่วนหนึ่งก็น่าจะเป็นเพราะเราไม่รู้ว่าจะเริ่มต้นดูแลรักษาโค้ดของเราอย่างไร

ผมเลยมาขอเสนอขั้นตอนง่ายๆ ในการเริ่มต้นเขียน unit test ในภาษานี้กัน เครื่องมือที่สามารถช่วยเราเขียน unit test ได้ จริงๆ มีเยอะมาก ในบทความนี้ผมขอใช้ Jasmine ซึ่งเป็นเครื่องมือที่มีการพัฒนาอยู่เรื่อยๆ แล้วก็เริ่มต้นได้ไม่ยากครับ

Continue reading "เริ่มทำ Unit Testing ใน JavaScript ด้วย Jasmine"

แวะไป Thailand Practical Software Engineering Conference 2015 มา #TPSE2015

งานนี้มีหลายหัวข้อที่น่าสนใจอยากเข้าฟัง แต่แยกร่างไม่ได้ ต้องเลือกตามที่สนใจมากที่สุดแล้วสรุปแบบโคตรสั้นได้ตามนี้

You Are Not Alone: Reflection on Global Software Development Industry โดยคุณ Tamara Nation จาก Rally Software

Tamara on You Are Not Alone: Reflection on Global Software Development Industry at TPSE 2015
ยุคสมัยนี้บริษัทจะอยู่รอดได้ต้องมีการตอบสนองต่อการเปลี่ยนแปลงที่รวดเร็ว การตลาดของบริษัทต้องปรับเปลี่ยนไปให้เร็วตาม การที่จะทำแบบนั้นได้สิ่งสำคัญคือเราต้องโฟกัสที่ value และ release บ่อยๆ เพื่อให้ได้ feedback กลับมาในเวลาอันรวดเร็ว

Machine Learning in Agoda โดยคุณ Uri Weiss จาก Agoda

Weiss on Machine Learning in Agoda at TPSE 2015

ที่ Agoda มีทีม data scientist อยู่ case study หนึ่งที่เอามาบอกเล่ากันคือการนำเอา machine learning ไปใช้กับการ bid ของ Google AdWords กล่าวคือเวลาที่ผู้ใช้ search ข้อมูลที่พักจาก Google แล้ว Agoda จะหาที่พักแล้วพยายามทำให้ rank ของผลลัพธ์จากการ search ไปอยู่ rank ต้นๆ เนื่องจาก Agoda มีคู่แข่งหลายบริษัท ดังนั้นการที่ทำให้ผลลัพธ์จากการ search มี Agoda อยู่ใน rank ที่สูงกว่าคู่แข่งนั้นย่อมเป็นเรื่องที่ดี

การนำเอา machine learning มาใช้ในส่วนนี้ทำให้ลดค่าใช้จ่ายไปได้เยอะเลยทีเดียว ยกตัวอย่างเช่น ถ้ามีคำว่า bangkok ในการ search เยอะๆ แล้วโรงแรมที่ผ่านการ search ด้วยคำๆ นี้สามารถเพิ่มยอดการจองได้ ทางทีมก็จะนำข้อมูลพวกนี้ไปเพิ่ม bid ให้สูงขั้นใน AdWords

Better Deliver with DevOps Driven Development โดยคุณ Jirayut Nimsaeng (เดียร์) จาก Kaidee

Jirayut on Better Delivery with DevOps Driven Development at TPSE 2015

คุณเดียร์กล่าวว่า DevOps ควรจะเป็นคนๆ หนึ่งที่เป็นทั้ง software engineer และ infrastructure engineer โดยมีวิธีคิดแบบทั้ง dev และ ops มีหน้าที่คือเรียนรู้ business ของบริษัทตั้งแต่การพัฒนาไปจนถึงการส่งมอบ แล้วได้แบ่งขั้นตอนการเริ่มต้นพัฒนาเพื่อการส่งมอบที่ดีขึ้นออกเป็น 3 ขึ้นคือ

  1. ขั้นการวางแผน คือการจ้างคนมาทำตำแหน่งนี้เลยจะได้โฟกัส หรือพัฒนาคนขึ้นมาทำตำแหน่งนี้เอง แล้วก็ลองออกแบบ development flow ในอุดมคติขึ้นมา
  2. ขั้นการปฏิบัติ คือให้ลองทำโปรเจคแบบ pilot ขึ้นมาสักโปรเจคหนึ่ง โปรเจคนี้จะต้องมีขนาดเล็กที่สามารถทำ development flow แบบในอุดมคติที่คิดขึ้นมาได้ ต้องทำออกมาจริงๆ
  3. ขั้นตอนการขยับขยาย คือทำ knowledge sharing หรือลองให้งานของ DevOps ให้คนอื่นลองทำบ้าง
ใครสนใจเรื่อง DevOps ลองดูจากสไลด์เพิ่มเติมนะครับ

ทำความเข้าใจกับ Python Decorators

Python decorators เป็น feature หนึ่งของภาษา Python ซึ่ง feature นี้ไม่ใช่ Decorator pattern นะครับ เพียงแต่ว่าสามารถนำไปใช้ทำ pattern แบบนั้นได้

ความสามารถของมันก็คือ มันสามารถที่จะเปลี่ยนแปลงพฤติกรรมการทำงานของฟังก์ชั่นหรือคลาสที่เราเอา decorator ที่เขียนขึ้นไปแปะไว้ได้ ประโยชน์ของมันคือเราไม่ต้องเข้าไปแก้ไขการทำงานของฟังก์ชั่นหรือคลาสนั้นๆ โดยไม่จำเป็น หรือถ้าเราไม่อยากจะเข้าไปแก้ไขการทำงานนั้นๆ เลย เราก็ใช้ decorator เข้ามาช่วยครับ บทความนี้จะขอยกตัวอย่างแค่การใช้ decorator กับฟังก์ชั่นธรรมดาง่ายๆ นะครับให้พอเห็นภาพ

สมมุติว่าเรามีฟังก์ชั่น fizzbuzz ตามนี้

def fizzbuzz(number):
    if number % 3 == 0 and number % 5 == 0:
        return 'fizzbuzz'
    elif number % 3 == 0:
        return 'fizz'
    elif number % 5 == 0:
        return 'buzz'
    else:
        return number

แล้วเราอยากจะให้แสดงผลออกมาแบบมีข้อความขึ้นสักหน่อยเช่น Your input is 3, so you get fizz. ถ้าเราสะดวกเราก็เข้าไปแก้ฟังก์ชั่นของเราเลยใช่ไหมครับ เราก็จะได้ฟังก์ชั่นหน้าตาแบบนี้

def fizzbuzz(number):
    result = 'Your input is ' + str(number) + ', so you get '
    if number % 3 == 0 and number % 5 == 0:
        result += 'fizzbuzz'
    elif number % 3 == 0:
        result += 'fizz'
    elif number % 5 == 0:
        result += 'buzz'
    else:
        result += str(number)
    return result + '.'

ดูแล้วไม่ค่อยน่าทำเลยใช่ไหมครับ? เรามาลองใช้ decorator กันดีกว่า ให้เราสร้าง nested function หรือ inner function  ขึ้นมาตามนี้ (ที่ต้องทำตามนี้เพราะว่านี่เป็น syntax ของ Python decorator ครับ)

def have_nice_message(func):
    def wrap(number):
        result = 'Your input is ' + str(number) + ', so you get '
        result += func(number)
        result += '.'
        return result
    return wrap

วิธีใช้งานเราก็แค่เอาไปแปะไว้บนหัวของฟังก์ชั่นที่เราต้องการตามนี้

@have_nice_message
def fizzbuzz(number):
    if number % 3 == 0 and number % 5 == 0:
        return 'fizzbuzz'
    elif number % 3 == 0:
        return 'fizz'
    elif number % 5 == 0:
        return 'buzz'
    else:
        return number

ผลลัพธ์ที่ได้ก็จะเหมือนกันโค้ดที่เราเข้าไปเพิ่มข้อความ แต่โค้ดที่เราได้มาจะดูสะอาดตามากขึ้น ฟังก์ชั่นเราก็ยังคงทำหน้าที่เหมือนเดิมตามปกติ 🙂