เริ่มทำ 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

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

Thailand Big Data User Group #1

จัดโดย อ.​ Thanachart Numnonda ที่ Q.House ลุมพินี วันที่ 9 ม.ค. 2558 มีผู้เชี่ยวชาญทางด้าน Big Data มาร่วมด้วยคือ John Berns กับ Axel Winter มาร่วมวงด้วย งานนี้เกิดขึ้นค่อนข้างกะทันหัน แต่ก็จัดออกมาได้ดี อ. คุมเวลาได้น่าประทับใจมาก (ปกติงานแบบนี้จะลากยาว) จากที่ออกจากกะลาไปนั่งฟัง เขียนออกมาตามความสนใจส่วนตัวได้ตามนี้

  • Hadoop จากเวอร์ชั่น 1.x ไปเวอร์ชั่น 2.x มีการเปลี่ยนแปลงเยอะมาก เปลี่ยนไปแบบยกเครื่อง เวอร์ชั่น 1.x นั้นเวลาทำอะไรกับข้อมูลที่ Hadoop Distributed File System (HDFS) จะต้องผ่านส่วน MapReduce ก่อน แต่เวอร์ชั่น 2.x จะมี YARN มาทำหน้าที่เป็น Cluster Resource Management ทำให้อะไรๆ ก็ไม่ต้องขึ้นอยู่กับส่วนของ MapReduce อีกต่อไป ลองดูภาพข้างล่าง

    Hadoop Stack
    Hadoop Stack (credit: annovate.blogspot.com)
  • Hadoop ทั้งสามารถเป็นทั้ง Data Storage และสามารถนำไปใช้ประมวลผลได้ด้วย การใช้ Hadoop นั้นสามารถลดค่าใช้จ่ายได้เป็นอย่างมาก ถ้าเทียบกับการเก็บข้อมูลแบบปกติ แต่ที่น่าสนใจอย่างหนึ่งคือ Cloud Storage อย่าง S3 ของ AWS Amazon ยังคงมีค่าใช้จ่ายที่ถูกกว่า -- มาถึงตรงนี้ก็เกิดคำถามขึ้นมาในใจว่า แล้วเราจะเลือกใช้อะไร? ระหว่างจะตั้ง Hadoop Cluster เอง หรือว่าไปทำบน AWS Amazon ลองอ่านความคิดเห็นจาก What are the advantages of Amazon EMR, vs. your own EC2 instances, vs. running Hadoop locally? ดู จริงๆ แล้วมันก็ trade-off กันเนอะ การคำนึงถึง long-term solution ของธุรกิจของเราให้มากๆ แล้วก็การลองผิดลองถูกอาจจะช่วยตัดสินใจได้
  • Apache Drill เป็นตัวที่เกิดมาใหม่ คล้ายๆ Hive คือ เป็น Query Engine เหมือนกัน แต่มีความสามารถอย่างหนึ่งคือ Schema Discovery On-The-Fly นั่นคือเราไม่ต้องกำหนด Schema ให้กับข้อมูลก่อนเหมือนอย่าง Hive ซึ่งแน่นอนว่าฝ่าย Business สามารถย่นระยะห่างระหว่างตัวเองกับข้อมูลมากขึ้น ทำให้ Agile มากขึ้น แล้วก็ช่วยลดภาระทางฝั่ง IT ด้วย (ถ้าเป็น Hive ฝั่ง IT อาจจะต้องช่วยกำหนด Schema ให้)
  • Query Engine หมายความว่า Query อย่างเดียว 🙂 ไม่มี INSERT UPDATE หรือ DELETE
  • ตอนท้ายเป็น Open Discussion มีการอ้างถึง Use Case ต่างๆ บริษัทต่างๆ มีการปรับเปลี่ยนอย่างไรให้ทัน Technology ที่เกิดขึ้นใหม่มาแทบทุกวัน การตัดสินใจจะขึ้นอยู่กับข้อมูลแล้ว ไม่ใช่ขึ้นอยู่กับการมโนหรือการวางแผนเอาเอง เราอาจจะต้องลงทุนกับเวลาที่เสียไปเพื่อเลือก Technology ที่ใช่
  • มีการอ้างถึงคำพูดของ Amr A. Awadallah, CTO ของ Cloudera ว่า "Data goes to tape archives to die." สื่อออกมาประมาณว่า ข้อมูลที่โดน Archive ไปแล้ว จะค่อนข้างยาก หรืออาจจะมีค่าใช้จ่ายไม่ว่าจะเป็นทางด้านการเงินหรือเวลา ที่จะดึงกลับมาใช้งานหรือ Query ขึ้นมาได้อีก
  • เมื่อก่อน เนื่องด้วยข้อจำกัดทางด้านต่างๆ เวลาเราจะประมวลผลทางสถิติ หรือพัฒนาอัลกอริธึม Machine Learning ขึ้นมา เราจะ Sampling ข้อมูลมาแค่ส่วนหนึ่งเท่านั้นเพื่อมาแทนข้อมูลทั้งหมด แต่จะดีกว่าเยอะมากๆ ถ้าเราสามารถเอาข้อมูลทั้งหมดมาประมวลผลได้ ซึ่งสมัยนี้สามารถทำได้แล้ว Hadoop เป็น Technology หนึ่งที่ทำให้เราทำแบบนั้นได้
  • การเลือก Partner มาช่วยเรา ให้เลือก Partner ที่สามารถแนะนำเราได้ว่าอะไรคืออะไร แนะนำข้อดีข้อเสียได้ แต่อย่าไปเลือก Partner ที่มาบอกให้เราทำอะไร ซึ่งธุรกิจของเรา ข้อมูลของเรา ตัวเราเองเท่านั้นที่รู้ดีว่าควรจะทำอะไร
  • เทรนด์ในประเทศไทย ณ​ ตอนนี้ บริษัทต่างๆ เริ่มมีการนำ Hadoop เข้ามาใช้งานแล้ว แต่ส่วนใหญ่ยังใช้แค่เพื่อเก็บข้อมูลอยู่
  • ถ้าอยากเริ่มต้นศึกษาเรียนรู้ใช้แค่ Virtual Machine ก็สามารถเริ่มต้นได้แล้ว ไม่จำเป็นต้องรอให้มี Cluster จริงๆ เสียก่อน

จริงๆ มีเยอะกว่านี้แต่คงเขียนไม่ได้ออกมาหมด ใครสนใจลองเข้าไปติดตามเฟสบุคเพจ IMC Institute ต่อนะ ได้ยินมาว่าสไลด์ในงานจะโพสต์ไว้ที่นั่นครับ

ข้อสังเกต ในงานนี้ผมได้ยินคำว่า "Agile" บ่อยมาก ทั้งๆ ที่ไม่ใช่งาน Agile คำๆ นี้มันไปอยู่ทุกหนทุกแห่งจริงๆ 🙂

เป้าหมายพัฒนาตัวเองในปี 2015 และสรุป..

ดูจากสรุปปีที่แล้วทำไว้ไม่ค่อยดีเท่าไหร่ รู้สึกเกินตัวไปหน่อย ปณิธานปีนี้เอาแค่ 3 ข้อพอ! สู้ๆ

  1. อย่างน้อยต้องเอา Verified Certificate ของ  Intro to Machine Learning ส่วนคอร์สที่เกี่ยวข้องอื่นๆ ถือเป็นโบนัส 🙂
  2. อ่าน Data Science for Business ให้จบ
  3. ปั่นจักรยานให้ครบ 3,000 km

วันนี้วันที่ 1 ม.ค. ปี 2016.. สรุปเป้าหมายของปีที่แล้วได้ว่า.. ไม่ผ่านสักอย่าง 🙂

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