Quantcast
Channel: cc :: somkiat
Viewing all 1997 articles
Browse latest View live

ว่าด้วยเรื่องของ Test-Driven Bugfixing (TDB)

$
0
0

อ่านไปเจอเรื่อง Test-Driven Bugfixing (TDB) จากหนังสือ Test Driven Development for Embedded C เป็นแนวทางที่น่าสนใจ สำหรับการเขียนชุดการทดสอบแบบอัตโนมัติขึ้นมา นักพัฒนาน่าจะลองนำไปใช้กันดูนะ ปล. ผมชอบเรียกว่า Bug-Driven Development

ในหนังสืออธิบายว่า

เมื่อเกิด bug ขึ้นมา แน่นอนว่าต้องแก้ไขให้ถูกต้อง หลังจากนั้นทำการทดสอบเพื่อทำให้แน่ใจ มั่นใจว่ามันทำงานได้อย่างถูกต้องจริง
อีกอย่างหนึ่งคือ bug มันกำลังบอกหรือสะท้อนให้เห็นว่า การพัฒนาและทดสอบมันแย่ขนาดไหน
ดังนั้นน่าจะเริ่มกลับมาพิจารณา เพื่อหาแนวทางในการแก้ไขและปรับปรุงได้แล้วนะ

ดังนั้นเมื่อพบเจอ bug แล้วสิ่งที่ควรทำคือ

  • ทำการเขียนชุดการทดสอบเพื่อทำให้เห็น bug
  • ถ้ายังเขียนไม่ได้ ก็ทำการ debug หรือเรียนรู้ จากนั้นนำสิ่งที่เรียนรู้ในแต่ละขั้นตอนมาเขียนไว้
  • เมื่อเข้าใจแล้ว ก็เริ่มเขียนชุดการทดสอบที่ต้องการ เพื่อทำให้เห็น bug
  • ทำการแก้ไข code
  • ทำการทดสอบซ้ำอีกครั้ง ต้องผ่าน
  • เพียงเท่านี้ก็ได้ชุดการทดสอบเพิ่มมาแล้ว
เป้าหมายหลักคือ ไม่ต้องการให้ bug เดิม ๆ เกิดขึ้นมาอีก หรือถ้าเกิดขึ้นมาเราจะรู้ได้ทันที ไม่ต้องไปรอให้ใครมาทดสอบ นั่นคือ ผิดแล้วต้องจำ และเรียนรู้จากมัน ที่สำคัญกว่าคือ ก่อนจะทำการแก้ไข bug ต้องเข้าใจมันก่อน ว่าต้นเหตุของ bug อยู่ที่ไหน ขั้นตอนการสร้าง bug เป็นอย่างไร แต่หนังชีวิตจะอยู่ที่การแก้ไขนี่แหละ เพราะว่าในแต่ละระบบมีความนรกหรือยากลำบากต่างกันไป

ต่อมา ถ้าชุดการทดสอบที่เขียนขึ้นมาเพื่อแสดงให้เกิด bug มันทำงานช้า

สิ่งที่ควรต้องทำคือ แก้ไข bug ก่อน เมื่อผ่านแล้ว ให้ทำการแก้ไข test และ code เพื่อให้ทำการทดสอบได้รวดเร็วขึ้น แน่นอนว่า มันก็คือหนังชีวิตเช่นกัน

แต่ถ้าคุณไม่ทำ

ลองคิดเอาเองว่า ค่าใช้จ่ายในการแก้ไข bug แบบนี้ กับแบบที่คุณทำอยู่นั้น แบบไหนมันเปลืองกว่ากัน ทั้งเวลาการหา ทั้งเวลาการแก้ไข ทั้งเวลาการทดสอบ ทั้งเวลาการ deploy ทั้งสิ่งที่ business เสียหายไป
วันนี้คุณแก้ไข bug ด้วยวการแก้ไขที่ต้นเหตุจริง ๆ หรือยัง ? หรือแค่ทำการ patch หรือ workaround หรือพูดตรง ๆ คือ แก้ให้ผ่าน ๆ ไปก่อน เท่านั้นเอง
 

วันนี้ DevOps แล้วหรือยัง ?

$
0
0

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

หลาย ๆ บริษัทบอกว่า เรากำลังทำ DevOps !!

คำต่าง ๆ เหล่านี้มักจะออกมาจากเหล่า CXO ทั้งนั้น โดยสิ่งที่เกิดขึ้นคือ เราเปลี่ยนชื่อ หรือ สร้างหน่วยงานใหม่ขึ้นมาชื่อว่า DevOps แทนที่จะเป็น Infrastructure/System/Operation ส่วนการทำงานยังคงแยกกับทีมพัฒนาเช่นเดิม !! แต่บอกว่าเรา Lean ขึ้น เรา DevOps นะ สิ่งที่เกิดขึ้นคือ งานด้าน operation แบบ day-to-day เพียบเหมือนเดิม เพิ่มเติมคืองานอื่น ๆ เยอะขึ้น การติดตั้งและ configuration ต่าง ๆ ยังคงเป็นแบบ manual ยังคงมี process การทำงานที่เทอะทะ เครื่องมือที่ใช้งานก็ใช้เองเหมือนเดิม Automation คืออะไร ทำอย่างไร ไม่รู้ ไม่อยากเรียนรู้สิ่งใหม่ ๆ นั่นคือ ไม่ต้องการเปลี่ยนแปลงอะไรเลย
ไม่พอเราซื้อเครื่องมือ DevOps มาแล้วนะ !!

DevOps มันยากมาก ๆ

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

บางที่บอกว่าเราสำเร็จกับ DevOps แล้ว !!

สำหรับ DevOps มันคือแนวคิดเพื่อปรับปรุง people และ process จากนั้นจึงนำเครื่องมือเข้ามาช่วย ไม่มีทางสำเร็จและเสร็จสิ้น มีแต่มันดีขึ้นกว่าเดิม มีอะไรที่ยังต้องปรับปรุง (Continuous Improvement) แล้วเราจะปรับปรุงอย่างไร วัดผลอย่างไร แบบนี้ต่างหากคือ DevOps
สิ่งที่ดีวันนี้ มันอาจจะแย่ใจวันพรุ่งนี้ ดังนั้นสิ่งที่เราควรทำคือ การปรับปรุงเพื่อทำให้ดีกว่าเดิม จึงไม่แปลกที่เราจะเห็นว่ามีสิ่งต่าง ๆ เกิดขึ้นมา เช่น DevSecOps และ FrontDevOps เป็นต้น
ขอให้สนุกกับการ coding นะครับ
ไม่พอนะ ยังไม่การประกาศรับตำแหน่ง DevOps อีก  สนุกละงานนี้

สรุปเกี่ยวกับเรื่องของข้อมูลในปี 2018 จาก O’Reilly

$
0
0

ทาง O’Reilly ทำการสรุปทิศทางเกี่ยวกับข้อมูลในปี 2018 รวมทั้งแนวโน้มในการจัดการข้อมูล ทั้งคน องค์กร ทั้งเครื่องมือ ทั้ง algorithm ทั้ง machine learning ทั้ง analytic ทั้ง infrastructure ทั้งจริยธรรมในการใช้ข้อมูล มาดูกันว่ามีอะไรที่น่าสนใจบ้าง มีเครื่องมือที่ดีและง่ายขึ้นสำหรับข้อมูล Graph และ Time serie เป็นรูปแบบข้อมูลที่มีแนวโน้มในเรื่องของจำนวนสูงมาก ๆ ดังนั้นเครื่องมือจะมีเยอะขึ้น ง่ายขึ้น ตามแต่ละ use case ในการใช้งาน เช่นเรื่องของ security และ fraud detection เป็นต้น แต่ละองค์กรเริ่ม share ข้อมูลในรูปแบบ parner มากขึ้น จะเห็นได้ว่าในช่วงที่ผ่านมา องค์กรใหญ่ที่ให้บริการเช่น ธนาคาร และ เทเลคอม เริ่มมีเปิดให้บริษัทต่าง ๆ ใช้ข้อมูลได้แล้ว เช่น startup ดังนั้นเรื่องของ data partnership จึงมีโอกาสขยายได้อีกมาก เป็นอีกแนวทางในการขยายฐานของ business มีเครื่องมือทาง Machine Learning ที่ง่ายต่อการทดลองใช้งาน และ การทำงานร่วมกันในองค์กร ในแต่ละองค์กรอยู่ในช่วงการลองผิดลองถูก ซึ่งทำให้เกิดเครื่องมือต่าง ๆ มากมาย โดยสิ่งหนึ่งที่ควรมีคือ ทั้งองค์กรน่าจะต้องสร้างระบบและเครื่องมือ ที่ช่วยให้ส่วนต่าง ๆ ขององค์กรใช้งานได้ ไม่ใช่ใช้งานเพียงกลุ่มเดียวเท่านั้น น่าจะได้เห็น use case ใหม่ ๆ ของการนำ Deep Learning มาใช้งานมากขึ้น ยกตัวอย่างเช่น ใช้ในระบบคำแนะนำต่าง ๆ ใช้ในระบบ search ranking ใช้ในระบบ fraud detection ใช้ในการทำนายข้อมูล time serie ได้เห็น data pipeline ที่มี data source จำนวนมาก ส่งผลให้เกิดสิ่งใหม่ ๆ ขึ้นมา ทั้ง data integration ทั้ง data enrichment ทั้ง data processing ได้เห็นวิธีการใหม่ ๆ ในการจัดการและวิเคราะห์ข้อมูลทั้งแบบ realtime และ batching แน่นอนว่า ทั้งสองกลุ่มข้อมูลอาจจะใช้ระบบเพียงระบบเดียวเท่านั้น ไม่ต้องออกเป็น 2 ระบบอีกต่อไป น่าจะได้เห็นระบบ caching data แบบ distributed มากขึ้น ทั้ง data layer และ distributed memory system เนื่องจากจำนวน data source เยอะมาก เนื่องจากมี data storage เยอะ เนื่องจากระบบงานอยู่บน cloud ดังนั้นในการประมวลผลก็ต้องการข้อมูลที่รวดเร็วเช่นกัน ระบบ caching data จึงสำคัญ มีอะไรอีก Machine Learning น่าจะได้รับความนิยมและต้องการสูงมาก ๆ นะ เตรียมตัวกันไว้ ส่วนในไทยก็รอกันหน่อยนึง เรื่องของ Library และ Framework ต่าง ๆ Python ยังคงเป็นผู้นำ R ได้รับความนิยมสูง Spark ได้รับความนิยมสูงในการทำงานแบบ distributed computing เรื่องของ security และ privacy ของข้อมูล จะถูกเน้นสูงมาก ๆ ยิ่งใน machine leaning แล้ว ต้องเอาเรื่อง security และ privacy ใส่เข้าไปด้วยเสมอ บรรดาคนในสายงานที่เกี่ยวข้องทั้ง CXO, Manager และคนที่ทำการตัดสินใจ จำเป็นต้องมีความรู้เรื่อง Data Science และ Machine Learning บ้าง ทั้ง technology, method ต่าง ๆ ที่อาจจะส่งผลต่อ business และการตัดสินใจ ปีที่ผ่านมาเป็นปีแห่งการ Proof-Of-Concept (POC) โดยมักจะแยกเป็นทีมใหม่ เช่น Data Science Team, Machine Learning Team เพื่อแยกกันทำ project เล็ก ๆ ไป แต่ในปีนี้ทีมต่าง ๆ เหล่านี้ต้องเข้าไปมีส่วนร่วมกับทีมอื่น ๆ หรือระบบอื่น ๆ เช่นระบบ analytic และ การจัดการข้อมูลขนาดใหญ่เป็นต้น ส่วน application และ business domain ที่น่าจับตามอง ประกอบไปด้วย
  • Data journalism
  • CyberSecurity
  • Financial service

มาคำนวณค่าใช้จ่ายจากการประชุม

$
0
0

จากบทความว่าด้วย การประมาณการค่าใช้จ่ายจากการประชุมว่ามีค่าเท่าไร ? ทั้งเรื่องของเวลาที่ใช้ไปในการประชุมแต่ละครั้ง ทั้งเรื่องของค่าใช้จ่ายต่าง ๆ ที่ใช้ไปแต่ละครั้ง โดยจากบทความข้างต้น ทำการสรุปไว้ว่าบริษัทใหญ่ ๆ มีค่าใช้จ่ายจากการประชุมประมาณ 15 ล้าน USD ต่อปี !! มันเป็นตัวเลขที่ไม่น้อยเลยนะ คำถามคือ แล้วเราละ ? ลองไปใช้งานกันดูนะ (เป็น Progressive Web Apps ดังเข้าไปตาม url แล้ว Add to Home Screen ได้เลย) ใครสนใจลองทำการบันทึกและคำนาณได้นะ น่าจะทำให้เห็นอะไรหลาย ๆ อย่าง แต่สิ่งที่ควรเพิ่มเติมคือ การประชุมแต่ละครั้งนั้น ก่อให้เกิดรายได้เท่าไรบ้าง เพื่อทำให้เห็นว่า การประชุมใดควรหรือไม่ควรมี ช่วยให้เราเห็นว่าการประชุมใดที่ไร้ประโยชน์บ้าง

สวัสดี Groovy กับการพัฒนา Android app

$
0
0

ว่าง ๆ ลองไปดูภาษา Groovy พบสิ่งที่น่าสนใจคือ สนับสนุนการพัฒนา Android app แล้วนะ (ตามจริงนานแล้วนะ) โดยใช้ plugin ชื่อว่า Gradle Groovy Android Plugin ดังนั้นเรามาลองใช้งานกันหน่อยสิ ว่าเป็นอย่างไรกันบ้าง Hello World สิครับ

เริ่มต้นด้วยการ configuration project ของเรา

[gist id="8b3e6ece759f9a134363202c5f09ad9b" file="build.gradle"] โครงสร้างของ project เปลี่ยนนิดหน่อย แต่เหมือน kotlin เลย นั่นคือ โดยค่า default จะต้องสร้าง folder ใหม่สำหรับเก็บ code ภาษา Groovy ขึ้นมา
  • src/main/groovy
  • src/test/groovy
  • src/androidTest/groovy
แต่ถ้าอยาก custom ก็ทำได้เช่นกันดังนี้ ใส่ไว้ใน folder เดียวกับภาษา Java [gist id="8b3e6ece759f9a134363202c5f09ad9b" file="custom.gradle"]

เมื่อทุกอย่างพร้อมก็ Hello World กันเถอะ

ลองนำ SwissKnife หรือ view injection มาใช้นิดหน่อย [gist id="8b3e6ece759f9a134363202c5f09ad9b" file="MainActivity.groovy"]

เมื่อลองทำการ run app เจอ error ดังนี้

[code] Error:com.android.builder.dexing.DexArchiveBuilderException: Error while dexing org/codehaus/groovy/vmplugin/v7/IndyInterface.class Error:com.android.dx.cf.code.SimException: signature-polymorphic method called without --min-sdk-version >= 26 [/code] นั่นคือ min-sdk-version ต้องมากกว่าเท่ากับ 26 (ซวยละสำหรับ version เก่า ๆ) เจอว่ามันคือ issue ของ Groovy นะ มี workaround ด้วยนะเออ ไว้อีกสักพักน่าจะแก้เรียบร้อย !! ดังนั้นแก้ไขนิดหน่อยคือ min sdk version = 26 แล้ว run ได้เลย
นอกจากภาษา Java และ Kotlin แล้ว ภาษา Groovy ก็เป็นอีกหนึ่งทางเลือกที่น่าสนใจสำหรับการพัฒนา Android app ไว้ลองศึกษากันดูครับ
ขอให้สนุกกับการ coding ครับ ตัวอย่างของ source code อยู่ที่ Github::Demo

สรุปปี 2017 ของ somkiat.cc แบบสั้น ๆ

$
0
0

เมื่อสิ้นปี 2017 เข้าสู่ปี 2018 ก็ต้องทำการสรุปสิ่งต่าง ๆ ในการเขียน blog ไว้หน่อย ซึ่งมีตัวเลขที่น่าสนใจดังนี้
  • จำนวน blog ทั้งหมดในปี 2017 คือ 239 blog
  • ลดลงจากปีที่แล้วไป 40 blog
  • เฉลี่ยในแต่ละเดือนเขียนไป 20 blog
ข้อมูลจาก Google Analytic ติดไว้เผื่อมีคนถาม
  • จำนวน session ที่เข้ามาทั้งปีประมาณ 600,000  (มีคนเข้ามาอ่านด้วย)
  • จำนวน page view ที่เข้ามาทั้งปีประมาณ 1,000,000 (มีคนเข้ามาอ่านด้วย)
  • คนเข้ามาประมาณ 2 นาที
  • คนเข้ามาอ่านประมาณ 2 หน้าต่อคน
  • ช่องทางในที่เข้ามาที่สุดคือ Organic search 60%, Social (FB) 25% และ Direct 10%Browser ที่ใช้มากสุดคือ Google Chrome 65%, Android 10%, Safari 9%, Safari ใน app 9%
  • OS ที่ใช้มากสุดคือ Windows 50%, Android 20%, iOS 20%, Mac 11%
  • ขนาดหน้าจอของมือถือที่เข้ามามากที่สุดคือ 360x640 50%, 375x667 20%, 320x568 10%
บทความ 20 อันดับแรกที่ดูมากสุดในปี 2017 (เอาเฉพาะ link)
เขียนหนังสือการใช้งาน Postman แบบง่าย ๆ ไป 1 เล่ม
สวัสดีปี 2018 ครับ ขอให้สนุกกับการ coding ปี  2018 ทำอะไรบ้าง ?
  • เขียน blog ไงละ
  • ว่าจะทำ Mobile app ของตัวเองบ้าง
  • เขียนหนังสือเกี่ยวกับ Automated Testing สำหรับ Mobile app ทั้ง Android และ iOS

Building DevOps Culture :: ต้องรู้แล้วเข้าใจเหตุผลของการเปลี่ยนแปลง

$
0
0

จากหนังสือ Building a DevOps Culture นั้น เป็นหนังสือสั้น ๆ จำนวน 23 หน้าเท่านั้น ว่าด้วยเรื่องของวัฒนธรรมขององค์กรล้วน ๆ มีหลายสิ่งที่น่าสนใจ แต่ขอยกตัวอย่างหัวข้อเรื่องการเปลี่ยนแปลงมานิดหน่อย ก่อนที่เราจะทำการเปลี่ยนแปลงอะไรก็ตาม ควรรู้และเข้าใจก่อนว่า เหตุผลของการเปลี่ยนแปลงคืออะไร ? มีประโยชน์และมีคุณค่าอะไรบ้าง ?

ด้วยตัวชี้วัดมาตรฐานต่าง ๆ ดังนี้

  • ลด Time-to-Market ของ feature ใหม่ ๆ
  • เพิ่ม Availability ของ product
  • ลดเวลาในการ deploy และ release product
  • ลดจำนวน defect ในรอบการทดสอบก่อนขึ้น production
  • เพิ่มประสิทธิภาพการทำงานของ infrastructure
  • ได้ feedback จากผู้ใช้งานได้อย่างรวดเร็วว่าสิ่งที่ทำมันโดนใจผู้ใช้งานหรือไม่
โดยตัวชี้วัดและเป้าหมายต่าง ๆ ควรต้องมีประโยชน์และคุณค่า ต่อทาง business และ development ด้วยเสมอ เช่น ลดเวลาการทำงานและค่าใช้จ่ายต่าง ๆ ลงไป ลดรายได้ที่ต้องสูญเสียไปเมื่อ product เกิดปัญหาขึ้นมา ลดเวลาในการจัดเตรียม infrastructure

จากนั้นเป้าหมายต่าง ๆ ควรต้องวัดผลได้เสมอ

เพื่อทำให้เก็นว่าสิ่งที่ทำลงไป มันช่วยปรับปรุงหรือดีขึ้นหรือไม่ ยกตัวอย่างเช่น ลดเวลาในการ deploy ลงไปจาก 10 ชั่วโมงเหลือเพียง 2 ชั่วโมง เพิ่มจำนวน defect ที่เจอในการทดสอบก่อนขึ้น production จาก 25% เป็น 50%
สิ่งที่ต้องระมัดระวังคือ ที่มาที่ไปของตัวเลขต่าง ๆ ต้องชัดเจน สมเหตุสมผล เพื่อจะช่วยการการปรังปรุงมันดีขึ้นจริง ๆ แต่ถ้าที่มาที่ไปของตัวเลขมันไร้เหตุผลมาก ๆ ก็จะเป็นภัยแบบสุด ๆ

ในหนังสือแนะนำ

ตั้งเป้าหมายแรก ๆ มาจาก pain point หรือความเจ็บปวดที่ได้รับมาจริง ๆ ในหนังสือยกตัวอย่างคือ Our deployments suck เริ่มด้วยตัวเลขตั้งต้นจากปัจจุบันเช่น ในการ deploy ขึ้น production นั้น ต้องใช้คนจำนวน 6 คน (ตำแหน่งอะไรบ้าง) คำนวณออกมาเป็นค่าใช้จ่ายว่าเป็นกี่บาท ? เมื่อได้ตัวเลขตั้งต้นแล้ว ก็ถึงเวลาที่ลองปรับปรุงการทำงานในรูปแบบใหม่ ๆ แล้วนะ
ลองอ่านเรื่องอื่น ๆ เพิ่มเติมดูได้ไม่กี่หน้าเอง เป็นอีกเล่นที่เอาไว้อ่านเล่น ๆ แก้เหงาได้ครับ สามารถ Download หนังสือในรูปแบบ PDF ได้ด้วย

สรุปเรื่องของ A theory of modern Go

$
0
0

จากบทความในโค้ดทัวร์ ตอน 1 ทำการอธิบาย code ที่เขียนด้วยภาษา Go มีรูปแบบหรือ pattern ที่น่าสนใจหลายตัว หนึ่งในนั้นคือ NewEntry(url string) [gist id="859ae178eb1a6e1f7636ca934e4a98e6" file="1.go"] ทำให้นึกถึงเรื่องของ A Theory of modern Go ซึ่งอธิบายถึงเกี่ยวกับ Global state/variable จึงนำมาสรุปไว้นิดหน่อย

ในภาษา Go นั้นพยายามจะไม่มี magic ในตัวภาษา

เนื่องจาก magic เป็นสิ่งที่ไม่ดี ส่งผลเสียเยอะ แต่ก็มีข้อดีนะ เพื่อทำให้ code อ่านเข้าใจได้ง่าย เพื่อทำให้ code ดูแลรักษาได้ง่าย แต่โชคไม่ดีเท่าไร ที่ Go developer มักจะสร้าง magic ขึ้นมาใช้เอง ยกตัวอย่างเช่น Global state/variable หรือ variable ในระดับ package !! ซึ่งทำให้ code อ่านและดูแลรักษายากมาก ๆ
คำถาม ใครทำแบบนี้อยู่บ้าง ?
จาก tweet ของ Dave Cheney พูดถึง Modern Go ไว้ว่า
  • No side effect imports
  • No package level variables
นั่นคือ ลด ละ เลิก Global state/variable ในระดับ package !! หรือการใช้งานให้น้อยที่สุด

มาดูแนวทางกันที่อธิบายไว้ในบทความ

สร้าง function NewXxxx() ขึ้นมาใช้งาน ใช้สำหรับการสร้าง instance ซึ่งทำหน้าที่เหมือนกับ constructor นั่นเอง ดังนั้นผู้เรียกใช้ก็ทำการสร้าง instance ผ่านทาง function นี้ ที่สำคัญต้องสร้างข้อตกลงร่วมกันภายในทีมด้วย ว่าต้องไม่สร้าง instance แบบตรง ๆ เหมือนเดิม ยังไม่พอนะ ถ้าใน NewXxx() มี dependency ต่าง ๆ ด้วย [gist id="859ae178eb1a6e1f7636ca934e4a98e6" file="2.go"] คำอธิบาย จะเห็นได้ว่ามีการ function จาก package database/sql.Conn, logger และ pool เป็นการทำงานภายในของ function นี้ เรียกว่าคือ dependency ซึ่งทำให้เกิดผลกระทบตามมา ทั้ง dbconn, logger และ pool ต่างก็เป็น variable ในระดับ package !! นั่นหมายความว่า ผู้เรียกใช้งานและเปลี่ยนค่าต่าง ๆ ได้เลย ทำให้ไม่สามารถคาดการได้เลยว่าจะเกิดอะไรขึ้นบ้าง ? database จะล่มไหม ? network จะช้าไหม ? ดึงข้อมูลจาก database ถูกหรือไม่ ? จะมี request ใน pool ไหม ?

ดังนั้นสิ่งที่ควรทำคือ ทำการส่งค่า dependency ต่าง ๆ ผ่าน parameter เข้ามาได้เลย

เรามักเรียกวิธีการนี้ว่า Dependency Injection นั่นเอง ทำให้ผู้ใช้งานอ่านเข้าใจได้ทันทีว่า ถ้าต้องการให้ทำงานอย่างถูกต้องแล้ว ต้องทำการส่ง parameter อะไรเข้ามาบ้าง เขียนได้ดังนี้ [gist id="859ae178eb1a6e1f7636ca934e4a98e6" file="3.go"] มันดูดีขึ้นนะ แถมไม่มีตัวแปรระดับ package อีก

แต่ถ้าต้องการให้ package นี้เป็น public API สามารถทำให้ดีกว่านี้ได้อีก

นั่นคือการสร้าง interface ขึ้นมา เพื่อไม่ให้เกิดการผูกมัดกันเกินไป แถมยังช่วยให้ทดสอบด้วยการ mock dependency ต่าง ๆ ง่ายขึ้นอีกด้วย เขียนได้ดังนี้ [gist id="859ae178eb1a6e1f7636ca934e4a98e6" file="4.go"]

สังเกตไหมว่า

เมื่อเหล่า constructor และ function ต่าง ๆ มีหน้าที่การทำงานและขอบเขตที่ชัดเจน กำหนด dependency ต่าง ๆ อย่างชัดเจนแล้ว เราไม่จำเป็นต้องมี global variable หรือ variable ในระดับ package อีกต่อไป เป็นการลด magic ต่าง ๆ ลงไป ผลที่ตามมาคือ การ refactor ที่ง่ายขึ้น การดูแลรักษา code ง่ายขึ้น ดูเพิ่มเติมสำหรับการเขียนตามแนวทางนี่จาก Go kit
วันนี้ Go developer เขียน code กันอย่างไร ? มัน simple ตามแนวคิดของภาษาหรือเปล่านะ ?
 

สรุป Architecture ของระบบ Reddit.com แบบคร่าว ๆ

$
0
0

หลังจากที่ดู VDO เรื่อง The Evolution of Reddit.com's Architecture ทำการอธิบาย architecture ของระบบ Reddit.com ว่าเป็นอย่างไรบ้าง ใช้อะไรบ้าง มีวิวัฒนาการอย่างไรบ้าง มาดูกันนิดหน่อย น่าจะพอมีประโยชน์สำหรับการพัฒนาระบบงาน สิ่งที่น่าสนใจคือ architecture นั้นจะถูกปรับเปลี่ยนไปตามปัญหาที่เกิดขึ้น

สถิติที่น่าสนใจก่อนดู architecture คือ

  • 1 ล้าน post ต่อวัน
  • 5 ล้าน comment ต่อวัน
  • 75 ล้าน vote ต่อวัน
  • ค้นหา 70 ล้านครั้งต่อวัน

มาดู Architecute หลักกันหน่อย

คำอธิบาย
  • Frontend พัฒนาด้วย Node.js
  • R2 คือ monolith system เป็นระบบดั้งเดิมพัฒนาด้วยภาษา Python ตั้งแต่ปี 2008 (ชื่อคุ้น ๆ นะ R2)
  • API, Search, Thing, Listing และ Rec คือ service ที่ถูกแยกออกมาจาก R2 ยังพัฒนาด้วยภาษา Python เช่นเดิม
  • Protocol ที่ใช้สื่สารระหว่าง client-service คือ HTTP และ Thrift ซึ่งขึ้นอยู่กับ client
  • ใช้ CDN (Content Network Delivery) ในการแยก request ไปยังส่วนงานต่าง ๆ

สิ่งที่น่าสนใจมาก ๆ คือ R2

ซึ่งเป็นระบบดั้งเดิมของ Reddit.com แน่นอนว่ามันมีความซับซ้อนสูงมาก เพราะว่าทุกสิ่งอย่างรวมกันอยู่ที่นี่ การ deploy ก็ต้อง deploy code เหมือนกันในทุก ๆ server ทั้ง ๆ ที่แต่ละเครื่องก็แยกทำงานต่างกัน แต่ด้วยความเป็น monolith จึงต้องทำแบบนี้ ใช้ Load Balance ในการกระจายงานไปยัง app หรือ service ต่าง ๆ ส่วนงานที่ทำงานแบบ asynchronous จะผ่านระบบ Job Queue (RabbitMQ) Caching นั้นใช้ Memcached ในการจัดการ ถ้าระบบฐานข้อมูลหลักจะใช้ PostgreSQL (Relational) และ ThinkDB (Key-value) ส่วนการเขียนหนัก ๆ จะใช้ Cassandra ซึ่ง feature ใหม่ ๆ จะใช้ทั้งหมด แสดงดังรูป

มาดูใน service สักตัว คือ Listing service

มีความน่าสนใจเป็นอย่างมาก สำหรับการแสดงรายชื่อของหัวข้อต่าง ๆ นั่นเอง เช่น hot, new และ top เป็นต้น แสดงดังรูป ตัวอย่างของหัวข้อที่ hot ทำการเรียงจากคะแนนการ vote ถ้าเป็นคำสั่ง SQL ทั่วไปก็เพียง select * from links order by hot(ups, downs); ส่วนผลการดึงข้อมูลก็ทำ caching ไว้ โดยที่ caching จะถูกทำลายเมื่อมีหัวข้อใหม่และมีการ vote !! ถ้าดูจากสถิติของการ vote แล้ว คิดว่า caching มันจะช่วยอะไรไหม ? แน่นอนว่า ไม่ได้ช่วยอะไรเลย !! เพราะว่าข้อมูลมันเปลี่ยนอยู่ตลอดเวลา ดังนั้นจึงเกิดแนวคิดใหม่ ๆ เพื่อแก้ไขปัญหา

การแก้ไขปัญหาในเบื้องต้นคือ

คือการ denormalize ข้อมูลจากนั้น เขียนข้อมูลไปที่ Cassanda อ่านข้อมูลจาก Memcached ส่วนเรื่องของการ vote นั้น จะส่งไปยัง Vote queue (RabbitMQ) ทำให้การระบบทำงานได้ดีขึ้น caching มีประสิทธิภาพดีขึ้น

แต่ว่าปัญหาเกิดขึ้นมาอีกเมื่อกลางปี 2012

พบว่ามีช่วงที่การใช้งานสูงมาก ๆ ทำให้การ vote ช้ามาก ๆ เนื่องจากมีงานค้างใน Vote queue สูงมาก บางงานรอนานถึง 1 ชั่วโมง ซึ่งโดนผู้ใช้งานด่ามาอย่างมาก !! การแก้ไขคือ เพิ่มจำนวน processor consumer ให้มากขึ้น วิธีการนี้กลับทำให้แย่ลง !! ดังนั้นจึงต้องคิดใหม่ ประกอบไปด้วย
  • ทำการ lock vote processor/consumer ไม่ให้ทำงานในช่วงเวลาหนึ่ง หรือการตั้ง timer นั่นเอง ให้เท่ากับเวลาประมวลผล
  • ทำการแบ่งของ Job queue ออกตาม Subreddit
ทำให้สถานการณ์ของระบบดีขึ้น กลับมาปกติ

แต่ว่าปลายปี 2012 ก็เกิดปัญหาขึ้นมาอีก !!

ระบบการทำงานช้าลงอีกแล้ว เมื่อดูข้อมูลจากค่าเฉลี่ยของเวลาการ lock และ processing ก็ดูดี แต่ปัญหาที่แท้จริงอยู่ที่ 99th percentile นั่นคือการ vote ในกลุ่มย่อย ๆ เข้าไปอีก ทำงานช้ามาก ๆ เมื่อลงไปดูในรายละเอียดพบว่า มีการ post link ของ domain อื่น ๆ เข้ามายัง Reddit.com เยอะมาก ๆ หนึ่งในนั้นคือ imgur.com ซึ่งส่งผลต่อการเปลี่ยนแปลงการ caching ของ Listing ดังนั้นจำเป็นต้องแยก Job queue ออกตาม domain เพิ่มเข้ามาอีก ในตอนนี้ระบบ Job queue จะแยกตาม
  • Subreddit
  • Domain
  • Profile

สิ่งที่ทีมพัฒนาได้เรียนรู้คือ

การใช้ lock/partition และ timer ช่วยให้สามารถแก้ไขปัญหาเบื้องต้นไปได้ การ lock มีผลต่อจำนวน throughput ที่ลดลง ดังนั้นใช้เท่าที่จำเป็น การทำ partition หรือแบ่งข้อมูลเป็นส่วน ๆ ช่วยทำให้จำนวนข้อมูลในการทำงานน้อยลง 99th percentile ช่วยทำให้เจอต้นเหตุของปัญหา แสดงรูปแบบการเรียนรู้ของ Listing service

สิ่งที่กำลังจะทำต่อไปเกี่ยวกับ Listing service คือ

  • หา data model ใหม่ ๆ ที่ลดการ lock ข้อมูล
  • ใช้ machine learning และ offline batching ในการทำ personalized listing
ยังมีเรื่องอื่น ๆ ที่น่าสนใจ แนะนำให้ลองไปฟังดูครับสนุกดี The Evolution of Reddit.com's Architecture

เขียน Unit testing แบบไหนถึงดี ?

$
0
0

เห็นใน facebook มีคำถามว่า เขียน Unit testing แบบไหนถึงดี ? เป็นคำถามที่ตอบยากมาก ๆ เพราะว่าคำว่า "ดี" นั้นแตกต่างกันเหลือเกิน แต่คิดว่ามันเป็นสิ่งที่ดีนะ จึงเริ่มด้วยคำถามก่อนว่า
ทำไมการทดสอบ code ของเราจึงมีความสำคัญ ?

การทดสอบ code ที่เราเขียนนั้น

น่าจะเป็นสิ่งที่ดีมาก ๆ เพื่อเป็นการพิสูจน์และแสดงให้เห็นว่า สิ่งที่เรากำลังพัฒนา สิ่งที่กำลังจะส่งมอบไปยังลูกค้าเป็นอย่างไร เป็นสิ่งที่จะช่วยบอกให้เรารู้สิ่งที่ผิดพลาดได้เร็ว เพื่อทำการแก้ไขและปรับปรุงต่อไป แต่หลาย ๆ คนบอกว่า เราไม่ทำการตรวจสอบ code แบบนี้หรอกนะ มันเสียเวลา เราจะเขียน code ให้เสร็จก่อน จากนั้นจึงทำการตรวจสอบทีเดียวเลย มันจะได้ไม่เปลืองเวลา ระหว่างนั้นก็นั่งจินตนาการในหัวไปว่ามันทำงานได้นะ เมื่อเขียนเสร็จก็ run สิครับ พบว่า code ที่เขียนมากมายนั้น มันทำงานผิด สิ่งที่เกิดขึ้นคือ แก้ไข code สิ แต่ยังก่อน !! ตรงไหนละที่ผิด ? เดี๋ยวของ debug code ก่อนนะ !! งงไหมละ คนอะไร debug code ที่ตัวเองเขียน !! คำถามคือ ใช้เวลานานไหม ? ส่วนใหญ่ก็บอกว่า ไม่นานนะ !! ถ้าเป็นแบบนี้ก็เอาที่สบายใจนะ คิดว่าดีก็ทำต่อไป !! กลับมาเรื่องของ Unit testing กันต่อดีกว่า

ถ้าต้องการเขียน Unit testing แล้วมีคำแนะนำดี ๆ มาฝาก

ก่อนจะเขียนกรุณาทำความเข้าใจกับ requirement/feature และ business goal ก่อนนะ มาดูกันว่ามีอะไรบ้าง ?

1. โครงสร้างของ test ที่ดี ถือว่าเป็นการเริ่มต้นที่ดี

ช่วยทำให้ test อ่านง่ายขึ้น ใช้ได้กับทุก ๆ ภาษา และ ทุก ๆ รูปแบบการทดสอบ ปกติจะใช้ AAA (Arrange Act Assert) เป็นหลัก Arrange สำหรับกำหนดค่าเริ่มต้นของการทดสอบ Act สำหรับ execute ส่วนที่ต้องการทดสอบหรือ business logic Assert สำหรับการตรวจสอบว่า ผลการทำงานตรงตามที่คาดหวังหรือไม่ ต้องมีทุก test นะขาดไม่ได้ ที่สำคัญแต่ละ test ต้องมีเป้าหมายเพียงอย่างเดียวด้วย

2. การทดสอบต้องเร็ว ถึง เร็วมาก

เป็นหัวใจหลักของการทดสอบเลย ยิ่งเร็วมากเท่าไร นั่นคือ เราได้ feedback เร็วมากเท่านั้น ดังนั้นมันจะสะท้อนว่า แต่ละ test ต้องสั้นกระชับ ไม่ซับซ้อน และเน้นที่ business logic ของระบบ ถ้า test คุณช้า นั่นแหละคือปัญหาแรก ๆ ที่ต้องแก้ไข

3. การทดสอบที่ถูกต้อง

คำถามที่น่าสนใจคือ เราจะรู้ได้อย่างไรว่า test มันถูกต้อง ? ตอบได้ยากมาก ๆ แต่มีแนวทางหนึ่งคือ เขียน test ก่อนสิ เพื่อให้ test มัน fail หรือไม่ผ่าน จากนั้นถึงเขียน code เพื่อให้ test ผ่าน คุ้น ๆ กับวิธีการไหม ?

4. เพิ่มการทดสอบไปใน build pipeline ด้วยเสมอ

แนวคิดง่าย ๆ คือ เมื่อ code มีการเปลี่ยนแปลงแล้ว จะทำการ build และ test อยู่เสมอ บางทีมก็มีระบบ Continuous Integration แนะนำให้เพิ่มการทดสอบเข้าไปด้วย บางทีม ถ้าการเปลี่ยนแปลงเกิดผิดพลาด ก็จะทำการ rollback code ใน repository กลางทันที

5. อย่าลืมจัดการ dependency ต่าง ๆ ให้ดี

ก่อนที่จะทำการทดสอบควรจัดการ dependency ต่าง ๆ ให้ดี ทั้ง state และ data เพื่อทำให้ test ทำงานได้อย่างถูกต้อง ลองคิดดูสิว่า ถ้าบางครั้งทดสอบผ่าน ถ้าบางครั้งทดสอบไม่ผ่าน ผลที่ตามมาคือ ไม่มีใครเชื่อถือ test แน่นอน
สุดท้ายแล้วอย่างลืมว่า การทดสอบมีหลายระดับนะ เพียง Unit testing อย่างเดียวไม่พอนะครับ ทั้ง Integration test , Regression test และ Performance test เป็นต้น
ก่อนอื่นวันนี้คุณเขียนหรือยัง ? เข้าใจคุณค่าหรือยัง ? ยิ่ง code มีขนาดใหญ่มากเท่าไร test ยิ่งสำคัญมาก ๆ ขอให้สนุกกับการ coding ครับ

Storybook 3.3 สนับสนุน Angular แล้วนะ

$
0
0

หลังจากที่ Storybook 3.2 นั้นสนับสนุน Vue.js ไปแล้ว ถึงคิวของ Angular บ้างสำหรับ Storybook 3.3 (ตอนนี้ไปถึง 3.3.3 แล้ว) แต่ใช้ได้กับ Angular version 4 ขึ้นไปเท่านั้น โดยมีการ addons ต่าง ๆ เพิ่มมานิดหน่อย เช่น
  • Viewport ทำให้สามารถจำลองการทำงานบน device ขนาดต่าง ๆ
  • Jest สำหรับการแสดงผลการทดสอบ
  • Story panel
  • Storyshot ของแต่ละ story
  • สนับสนุน Markdown ใน story
ดูเพิ่มเติมได้ที่ Storybook Release

สิ่งที่ขอแนะนำคือ สนับสนุน Angular นั่นเอง

น่าจะเป็นสิ่งที่ชาว Angular รอคอยอยู่มั้ง แต่ใช้ได้กับ version 4 ขึ้นไปเท่านั้น สามารถใช้งานง่าย ๆ ด้วยการติดตั้ง Storybook ก่อน [code] $npm i -g @storybook/cli [/code] เข้าไปยัง angular project จากนั้นเริ่มใช้งาน [code] $getstorybook $yarn run storybook [/code] หรือทำการสร้าง Angular project ใหม่ก็ได้ [code] $ng new hello $cd hello $getstorybook $yarn run storybook [/code] แสดงผลการทำงานของ Storybook ดังนี้

ลองติดตั้ง View port add-on นิดหน่อยสิ

[code] npm i --save-dev @storybook/addon-viewport [/code] มีให้เลือกทั้ง iPhone 5, 6, iPad และ Android phone แสดงดังรูป

ในตอนนี้ Storybook สนับสนุน JavaScript framework หลักทั้ง 3 ตัวแล้วนะ

คือ React, Vue และ Angular วันนี้ใครยังไม่ใช้ Storybook บ้าง ?

Slide เรื่อง Agile in Real World ที่นำไปแบ่งปันในค่าย YWC#15

$
0
0

มีโอกาสไปแบ่งปันเรื่อง Agile in Real World ในค่าย Young Webmaster Camp ครั้งที่ 15 นำประสบการณ์ที่ได้รับทั้งดีและไม่ดีให้น้อง ๆ ได้ฟัง เผื่อว่าจะมีประโยชน์บ้างนะครับ จึงทำการสรุปแบบสั้น ๆ และ slide ไว้นิดหน่อย หัวข้อที่แบ่งปันประกอบไปด้วย
  • Agile in real world
  • Agile Manifesto 4 ข้อ และ principle อีก 12 ข้อ
  • Agile Umbrella ทั้ง Scrum, XP, Kanban เป็นต้น
  • Build Measure Learn ในกรอบเวลาสั้น ๆ
  • Learn Learn Learn
  • Agile in real world ว่ามีปัญหาอย่างไรบ้าง
  • Project Management Triangle คือ Time vs Cost vs Scope เพื่อให้ได้ซึ่งคำว่า quality หรือคุณภาพ
  • คุณเลือกอะไร ?
ปิดท้ายด้วยการสรุปสั้น ๆ คือ การส่งมอบ Business Value ให้บ่อย ๆ ด้วย Technical excellence
[slideshare id=85753704&doc=sck-agile-in-real-world-180105090451&w=640&h=480] ขอให้สนุกกับการ coding ครับ

สรุปเรื่อง The Practice of Data Science

$
0
0

จากบทความเรื่อง Demystifying Data Science For All ทำการบักทึกการพูดเกี่ยวกับ The Practice of Data Science หรือแนวปฏิบัติของ Data Science ประกอบไปด้วย
  • People คือ คน หน้าที่ และ ความสามารถ ต้องทำงานเป็นทีม
  • Process คือขั้นตอนการทำงานของ Data Science
  • Tool คือเครื่องมือและ platform ต่าง ๆ
มีความน่าสนใจอย่างมาก จึงทำการแปลและสรุปไว้นิดหน่อย

Data Science คืออะไร

คือแนวทางในการ extract value หรือการสะกัดเอาคุณค่า ความรู้และ insight จากข้อมูล โดยใช้วิธีการจาก Computer Science และสถิติ ประโยชน์ที่ได้รับคือ ช่วยให้เราตัดสินใจได้ดีขึ้น พร้อมทั้งการสร้างและปรับปรุง algorithm ต่าง ๆ เพื่อให้ผลลัพธ์ที่ได้ดีขึ้นอีกด้วย

ทำไม Data Science จึงมีความสำคัญ

มี 2 เหตุผลหลักคือ 1. จำนวนข้อมูลที่มีจำนวนเยอะมาก ๆ (Big Data) 2. ประสิทธิภาพของหน่วยประมวลผลที่สูงมาก ๆ (Technology เช่น GPU และ High Performance Computing) ดังนั้นสิ่งที่เราต้องการคือ Data professional (คนที่มีความสามารถใน Data Science) ซึ่งสามารถนำ data และ technology มาใช้ เพื่อเข้าถึง insight และเข้าใจของสิ่งต่าง ๆ ที่ยังไม่รู้ แน่นอนว่า มีความต้องการคนในด้านนี้สูงมาก ๆ ในบทความจะอธิบาย Data Science ไว้ 3 ส่วนคือ People, Process และ Tool

1. People

จากผลการสำรวจจาก Data professional กว่า 500 คนว่า ทำอะไรบ้าง ? เพื่อต้องการทำความเข้าใจว่า ทำงานอะไร อย่างไร ? มีตำแหน่ง หน้าที่รับผิดชอบอะไรบ้าง ? มีความสามารถอะไรบ้าง ? ได้ผลดังนี้
  • ตำแหน่ง Researcher มากที่สุด ( Scientist และ นักสถิติ )
  • ตำแหน่งรองลงมาคือ Domain Expert, Creative และ Developer
  • ความสามารถใน Data Science แบ่งออกเป็น 25 เรื่อง
  • แบ่งกลุ่มความสามารถใน Data Science ออกเป็น 5 กลุ่ม ประกอบไปด้วย Business Domain, Math/Statistic, Technology และ Programming
แสดงดังรูป ในแต่ละตำแหน่งก็จะมีความสามารถที่แตกต่างกันไป ยกตัวอย่างเช่น กลุ่มของ Researcher หรือนักวิจัย มีความสามารถเด่นในกลุ่ม Math/Statistic กลุ่มของ Data pros หรือ Developer มีความสามารถเด่นในกลุ่มของ Technology/Programming กลุ่มของ Business manager หรือ Domain Expert มีความสามารถเด่นในกลุ่มของ Domain knowledge
ปล. ในบทความบอกว่า ไม่ชอบตำแหน่ง Data Scientist เนื่องจากมันเป็นชื่อที่คลุมเครือหรือไม่ชัดเจนเลย ว่าต้องมีหน้าที่และความสามารถอะไรบ้าง ?
การที่จะหาคนที่มีความสามารถเด่นในทุกกลุ่มนั้นมันยากมาก ๆ ดังนั้นการทำงานเป็นทีมจึงมีความสำคัญอย่างมากนั่นคือ Domain Expert เพื่อช่วยกำหนดปัญหา ตั้งสมมุติฐาน และอธิบายผล Developer เพื่อช่วยเข้าถึงข้อมูลในส่วนต่าง ๆ ที่ต้องการ Researcher เพื่อช่วยสร้างและรวมข้อมูล วิเคราะห์ข้อมูล และอธิบายผล

2. Process

ขั้นตอนเพื่อให้ได้มาซึ่ง insight และความรู้จากข้อมูลมันสำคัญมาก ๆ ทั้ง Analytic, Data mining และ Data science workflow โดยที่ Data professional ควรมีขั้นตอนการทำงานที่ชัดเจน จากผลการสำรวจพบว่าขั้นตอนที่ได้รับความนิยมประกอบไปด้วย
  • CRISP-DM (CRoss Industry Standard Process for Data Mining)
  • SEMMA (Sample Explore Modify Model Assess)
  • KDD (Knowledge Discovery in Databases)
ในแต่ละวิธีการนั้นทำการอธิบายขั้นตอนการทำงานต่าง ๆ ทั้ง data selection ทั้ง data preparation ทั้ง data modeling ทั้ง data model deployment
ความแตกต่างที่เห็นได้อย่างชัดเจนของทั้ง 3 วิธีการคือ CRISP-DM นั้นจะเริ่มด้วยความรู้ความเข้าใจทาง business ก่อน เพื่อช่วยให้การทำงานในขั้นตอนอื่น ๆ ชัดเจนมากยิ่งขึ้น
แสดงดังรูป โดยที่วิธีการต่าง ๆ นั้นคล้ายกับ Scientific Method เลย เป็นสิ่งที่นักวิทยาศาสตร์ใช้กันมานานแล้ว สำหรับการเข้าถึง insight ของข้อมูล เพื่อให้ได้ความรู้ใหม่ ๆ เพื่อให้ได้ความถูกต้องมากยิ่งขึ้น เพื่อนำเอาความรู้ที่มีอยู่มารวมหรือทำงานร่วมกัน มีการทำงาน 5 ขั้นตอนดังนี้ 1. Formulate a question 2. Generate a hypothesis 3. Gather/Generate data 4. Analyze data 5. Communicate results หรือ Take action จากข้อสรุปต่าง ๆ แสดงดังรูป
ปล. ในบทความอธิบายว่า คำว่า Data Science นั้นใช้คำซ้ำกันเกินไป เนื่องจาก Science นั้นต้องใช้ข้อมูลอยู่แล้ว เพื่อทำการทดสอบข้อสันนิษฐานและแนวคิดต่าง ๆ นั่นคือ Data หรือข้อมูล คือหัวใจของ Science ดังนั้น Data Science คือ Science

3. Tool

สิ่งที่ขาดไม่ได้เลยคือ เครื่องมือ และ platform เพื่อช่วยทำให้เข้าถึงข้อมูลได้ตามที่ต้องการ ทั้งการจัดการข้อมูล ทั้งการรวมข้อมูลจากกลากหลายแหล่ง ทั้งการวิเคราะห์ ทั้งการแสดงผล Data Science Tool เป็นเครื่องมือที่ใช้ในการเข้าถึงและวิเคราะห์ข้อมูล จากผลการสำรวจพบว่า เครื่องมือที่เหล่า Developer หรือ Data pros นิยมใช้ประกอบไปด้วย R, Python, SQL, IBM SPSS และ SAS Data Science Platform เป็นสิ่งที่ทำให้ Data professional จากหลากหลายส่วน ทำงานร่วมกันได้อย่างราบรื่นและมีประสิทธิภาพ ทั้งการจัดการข้อมูล ทั้งการรวมข้อมูลจากกลากหลายแหล่ง ทั้งการวิเคราะห์ ทั้งการแสดงผล
โดย platform ที่อยู่ในอันดับต้น ๆ ประกอบไปด้วย IBM, SAS, RapidMiner และ KNIME
แสดงดังรูป ขอให้สนุกกับโลกของ Data ครับ

สิ่งที่ Java Developer ควรศึกษาไว้ อย่าให้พลาด

$
0
0

ในปัจจุบันเทคโนโลยีต่าง ๆ มันเยอะเหลือเกิน โลกของ Java ก็เช่นเดียวกัน (น่าจะเรียกโลกของ JVM ดีกว่านะ) ดังนั้นมาดูกันหน่อยว่า สำหรับ Java Developer แล้วควรต้องศึกษาอะไรบ้าง ? เพื่อให้ทันโลกในปี 2018 นี้ เริ่มด้วยภาษาเครื่องมือและ framework ต่าง ๆ
  • Java 1.8, 1.9 และภาษา Kotlin
  • Git สำหรับจัดการ version ของ source code และ document ต่าง ๆ
  • Spring Framework 5 มีความสามารถต่าง ๆ เยอะมาก ทั้ง Reactive, Unit test ที่ดี และสนับสนุน Java 1.8 และ 1.9 รวไปถึงภาษา Kotlin
  • Spring Boot 2
  • Gradle คือ build tool และ dependency management ของระบบงาน
  • JavaScript framework เช่น React และ Angular สำหรับ Frontend
  • Android ตอนนี้เขียนได้ทั้ง Java และ Kotlin นะ รวมไปถึง Groovy ด้วย
  • Apache Spark และ Kafka หนีไม่พ้นสำหรับโลกของ Big Data
  • Docker และ Kubernetes จำเป็นอย่างมากในโลกของ Cloud native application
แนวปฏิบัติต่าง ๆ ที่จำเป็น
  • Automated testing
  • Continuous Deployment
  • RESTful API
สำหรับ Java Developer ลองตรวจสอบกันหน่อยว่า สิ่งต่าง ๆ เหล่านี้เรารู้หรือยัง ถ้ายังไม่รู้ ให้เริ่มทำการศึกษากันอย่างจริงจังได้แล้วนะ
แต่ถ้าใครยังใช้ JDK ต่ำกว่า 1.7 ก็ขอให้โชคดีครับ (1.8 ดีกว่า) ใครยังไม่ใช้ build tool เช่น Gradle และ Apache Maven ใช้ซะ ใครใช้ Spring framework แล้วยังไม่เขียน test ก็เขียนซะ ถ้ายังเถียงกันว่าใช้ IDE อะไรดี ก็ให้ไปใช้ Text Editor ซะ ใครยัง compile code เองไม่เป็น ก็หัดซะ ขอให้สนุกกับ coding ครับ

เมื่อ Developer อยู่ภายใต้ความกดดัน จะเลือกทางไหน ?

$
0
0

มีโอกาสไปแบ่งปันเรื่อง Agile มานิดหน่อย โดยทำการหยิบยกปัญหาที่ Developer มักต้องพบเจอมาถาม เมื่อ Developer อยู่ภายใต้ความกดดันแล้ว หนึ่งในความกดดันที่พบบ่อย ๆ คือ Deadline สิ่งที่จะเลือกทำมีอะไรบ้าง เพื่อให้เสร็จตามเวลา ? ซึ่งคำตอบส่วนใหญ่เป็นดังนี้
  • ขอเวลาเพิ่มนั่นคือ OT ( Over Time )
  • ขอคนเพิ่ม ไม่น่าจะช่วยไหม ? คนมากก็ทำงานได้มาก หรือ มากคนมากความ หรือ งานก็ไม่เสร็จอยู่แล้วต้องมาสอนอีก
  • ลดคุณภาพของงานที่ทำ ไม่น่าจะดีนะ !!
  • ลดงานสิ เจ้าของ requirement จะยอมหรือ ?
  • ไม่มีสิทธิ์เลือก !!
คำถามคือ ปกติเราหรือทีมหรือใครก็ตามที่มีอำนาจในการตัดสินใจ จะเลือกแบบไหน ?

แต่ไม่ว่าจะอย่างไร สิ่งที่ขอแนะนำคือ

ไม่ว่าจะโดนกดดันหรือบีบคั้นจาก Deadline อย่างไรก็ตาม อย่ารีบ อย่าเผางาน สุกเอาเผากิน อย่าใช้ทางลัด เพราะว่ามันยิ่งทำให้สร้างหนี้ก้อนโตขึ้นมา ซึ่งมันส่งผลให้คุณส่งมอบงานได้ช้าลงอย่างต่อเนื่อง
ดังนั้นสิ่งที่ทีมพัฒนาควรสร้างคือ เรื่องของคุณภาพมันต่อรองไม่ได้ มันจะส่งผลดีต่อทีมทั้งในอนาคตอันใกล้และไกลแน่นอน
รู้นะว่ามันยาก แต่ถ้าไม่ทำวันนี้ วันหน้าก็ต้องทำ แถมหนักขึ้นหลายเท่าตัว ขอให้สนุกกับการ coding ครับ

ว่าง ๆ มาลองดูค่า Code Coverage ใน .Net Core บน Linux/Mac กัน

$
0
0

Code Coverage เป็นสิ่งหนึ่งที่สำคัญ เพื่อช่วยทำให้ทีมพัฒนารู้ว่า code ส่วนใด ที่ยังไม่ถูกทดสอบหรือ execute บ้าง แต่สำหรับ .Net Core บน Mac และ Linux นั้น กลับไม่มี Code Coverage tool ให้ใช้งานเลย มีเฉพาะบน Windows เท่านั้น แต่โชคดีมีผู้ใหญ่ใจดี สร้างเครื่องมือไว้ให้ ยกตัวอย่างเช่น ดังนั้นลองมาใช้งาน MiniCover กันหน่อย เนื่องจากขนาดเล็กและง่ายดี แต่ว่าความสามารถมันน้อยนะ โดยที่ code ตัวอย่างอยู่ที่ Github :: Demo ในระบบงานประกอบไปด้วย
  • Hello สำหรับ code ของระบบงาน
  • HelloTests สำหรับชุดการทดสอบ
มาเริ่มใช้งานกัน

ขั้นตอนที่ 1 เพื่อ dependency ของ MiniCover ใน HelloTests project

[gist id="3e8043e4a803d7bfc8bb99bb326cb285" file="1.txt"]

ขั้นตอนที่ 2 เขียนชุดการทดสอบ

จากนั้นทำการทดสอบ และ run code coverage ด้วย MiniCover จากตัวอย่างกำหนด threshold ของ code coverage 90% ทำการสร้าง report ในสองแบบคือ 1. HTML 2. แสดงออกมาที่ console ดังนี้ [gist id="3e8043e4a803d7bfc8bb99bb326cb285" file="build.sh"] เพียงเท่านี้ก็สามารถใช้แล้ว แสดงผลออกมาทาง console ได้ดังนี้ ขอให้สนุกกับการ coding ครับ

สวัสดีกับ Kubernetes บน Docker for Mac 17.12 CE Edge

$
0
0

ออกมาแล้วสำหรับ Kubernetes บน Docker for Mac 17.12 CE Edge ประกอบไปด้วย standalone Kubernetes server และ client ทำให้สามารถ run Kubernetes server บน Docker instance ได้เลย แต่เป็นแบบ local หรือ single node cluster นะ ดังนั้นมาลองใช้งานดูกันหน่อย

เริ่มด้วยการเปิด Kubernetes บน Docker for Mac

ถ้าใช้งาน minikube อยู่แล้ว จะต้องเปลี่ยน context และ namespace ก่อนนะ

มิเช่นนั้นจะใช้ไม่ได้ !! จากค่า default คือ minikube เป็น docker-for-desktop ดังนี้ [code] $kubectl config use-context docker-for-desktop [/code] สิ่งหนึ่งที่แตกต่างกันระหว่าง Docker Swarm กับ Kubernetes คือ Kubernetes จะสนับสนุน namespace โดยค่า default จะมี namespace ชื่อว่า system จากนั้นดู container ที่ run อยู่ ด้วยคำสั่ง [code] $kubectl get all --all-namespaces [/code] แสดงผลการทำงาน ซึ่งมี service ต่าง ๆ ทำงานอยู่เยอะมาก ๆ [gist id="021189bc878dc143b2e983f2c60558e1" file="1.txt"] ส่วน version ของ Kubernetes คือ 1.8 ซึ่งไม่ใช่ version ล่าสุด !! สามารถดูด้วยคำสั่ง [code] $kubectl version [/code]

มาดูการใช้งานกันหน่อย

Docker นั้นพยายามทำให้ Kubernetes ใช้งานง่าย ๆ ในมุมมองของคนใช้ Docker Swarm มาก่อน นั่นคือ ไม่ต้องเปลี่ยนแนวคิด หรือ คำสั่งมากนัก ด้วยการ integrate ระหว่าง Docker stack ใน Docker Swarm กับ Kubernetes native service/deployment เข้าด้วยกัน ผ่าน CRD (Custom Resource Definition)  ดังนั้นสามารถใช้งานผ่านคำสั่ง [gist id="021189bc878dc143b2e983f2c60558e1" file="2.txt"] จากนั้นทำการ deploy stack ตัวอย่างนิดหน่อย ใช้ตัวอย่างจาก web ของ Docker ซึ่งสามารถใช้ไฟล์ docker-compose.yml เหมือนเดิมได้เลย มาดูหน้าตาของไฟล์ docker-compose.yml กัน [gist id="021189bc878dc143b2e983f2c60558e1" file="docker-compose.yml"] ทำการสร้าง stack ด้วยคำสั่ง [code] $docker stack deploy demo -c ./docker-compose.yml [/code] ผลการทำงาน [gist id="021189bc878dc143b2e983f2c60558e1" file="3.txt"] ต่อมาทำการตรวจผลการทำงาน ทั้งการสร้าง stack ใหม่ และ pods ต่าง ๆ [gist id="021189bc878dc143b2e983f2c60558e1" file="4.txt"] สุดท้ายเข้าใช้งานระบบตัวอย่างผ่าน http://localhost เพียงเท่านี้ก็ใช้งานได้แล้ว ง่ายไหมละ !! โดยที่แนวคิดและแนวทางของคนที่ใช้ Docker Swarm มาก่อนแล้ว ไม่ต้องเปลี่ยนเยอะ ทั้งความเรียบง่าย ทั้งความเร็ว ดังนั้นมาลองใช้กันดูครับ

บันทึกสิ่งที่มักทำ[ผิด]พลาดในการพัฒนา software

$
0
0

ทุกคนย่อมเคยทำผิดพลาดมาก่อนเสมอ ยิ่งในการพัฒนา software แล้ว ความผิดพลาดมักเกิดขึ้นมากมายและบ่อยครั้ง ยังไม่พอเรามักจะเห็นความผิดพลาดที่เกิดขึ้นอยู่บ่อย ๆหรือ ซ้ำ ๆ ดังนั้นจึงทำการสรุปไว้นิดหน่อย

เรื่องของ Compatibility

ระบบที่พัฒนานั้นสามารถทำงานใน device แต่ละชนิดได้อย่างถูกต้องหรือไม่ เนื่องจากในปัจจุบันมี device จำนวนมาก รวมไปถึงขนาดหน้าจอ ยกตัวอย่างเช่น Web browser และ Mobile คำถามที่น่าสนใจคือ เราทำการทดสอบมากน้อยเพียงใด device ที่ใช้ในการทดสอบมีเท่าไร วันนี้ระบบที่พัฒนามานั้นมัน Compatibility หรือไม่ ?

เรื่องของการสะกดคำ หรือ ประโยคที่ผิด

เป็นสิ่งที่เกิดขึ้นบ่อยมาก ๆ สิ่งที่น่าสนใจคือ จะลดความผิดพลาดเหล่านี้ลงไปได้อย่างไร การมานั่งตรงจสอบทั้งระบบในครั้งเดียวไม่น่าจะใช่ทางที่ดี !! หนักกว่าสะกดผิดคือ ใช้ Google translate มา !!

เรื่องของระบบ network

ใน mobile app นั้นเรื่องของ network มีปัญหาอย่างมาก ทั้งเรื่องของความเสถียร ทั้งเรื่องของความเร็วของระบบ network ที่ใช้งาน เช่น WIFI, 4G/3G, EDGE เป็นต้น สิ่งที่น่าสนใจคือ นักพัฒนาจัดการกับเรื่อง network อย่างไร ? หรือปล่อยให้ระบบ crash ไป เคยทดสอบใน network ที่ช้า ๆ หรือไม่ ? เคยทดสอบใน network ที่ไม่เสถียรหรือไม่ ?

การจัดการเรื่องของ input และ output

ทำการ validate input จากผู้ใช้บ้างไหม ? บางคนทำแล้ว แต่ว่ามันครอบคลุมหรือไม่ ? มิเช่นนั้น อาจจะส่งผลร้ายต่อระบบอย่างมาก ส่วน output ก็เช่นกัน ทำการ validate ก่อนหรือไม่ ? มิฉะนั้นผู้ใช้งานจะได้รับประสบการณ์ที่แย่ไปนะ หนักกว่านั้น การตรวจสอบทั้งระบบไม่เหมือนกันอีก !!

การจัดการเรื่องของ resource เช่น memory

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

ไม่สนใจ guideline ต่าง ๆ เลย

ในการพัฒนา software พบว่า จะมี guideline ต่าง ๆ มากมาย แต่ทีมพัฒนา รวมไปถึงผู้ให้ requirement และ คนออกแบบ ไม่ได้ให้ความสำคัญกับมันเลย สนใจแต่ จะเอา จะเอา จะเอาแบบนี้ ผลที่ตามมาคือ ผู้ใช้งานไม่ใช้งาน หรือ จำนวนการใช้ลดลงไป นักพัฒนาเช่นกัน มี guideline ต่าง ๆ มากมาย เช่น Coding standard คำถามคือ นำมาใช้หรือไม่ ?

Consistency

ปัญหาที่เจอมาก ๆ คือ Mobile app พบว่าหลาย ๆ app จะมีทั้ง iOS และ Android แต่กลับพบว่า app หน้าตาเหมือนกันเลย !! ซึ่งหลาย ๆ ส่วนมันไม่ได้เข้ากับพฤติกรรมการใช้งานของแต่ละ platform เลย คำถามคือ เราหลงลืมอะไรกันไหม ?

การ update version

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

ปิดท้ายด้วย มีขั้นตอนการทำงานและใช้งานที่ซับซ้อนไปไหม

เรามักบอกว่า ระบบงานที่เราคิดและพัฒนาขึ้นมานั้น เพื่อช่วยแก้ไขปัญหาของผู็ใช้งานหรือลูกค้า แต่ทำไมสิ่งที่คิดและสร้างขึ้นมา มันจึงมีขั้นตอนที่ซับซ้อนขนาดนั้น คำถามคือ จะช่วยแก้ไขปัญหา หรือ สร้างปัญหากว่าเดิมกันแน่ บางครั้งหา menu เข้าไปยังไม่เจอเลย !! รวมไปถึงขึ้นการการทำงานภายในของระบบด้วย ถ้ายิ่งมีความซับซ้อนสูง การพัฒนาก็นาน ค่าใช้จ่ายสูง แน่นอนการดูแลรักษาและเปลี่ยนแปลงก็ยากนะ
วันนี้เราทำอะไรผิดบ้าง ? ลองปรับปรุงกันดูบ้างนะ

สรุปจาก VDO เรื่อง 7 ineffective coding habits

$
0
0

วันนี้เห็น tweet ใน Twitter เรื่อง Seven Ineffective Coding Habits of Many Programmers ทำการสรุป 7 อุปนิสัยที่ไม่ดีสำหรับการ coding เก่าหน่อยแต่ก็ยังมีประโยชน์ เนื่องจากการพัฒนา software ซึ่งมีความซับซ้อนนั้น นักพัฒนาต้องมีอุปนิสัยที่ดี เพื่อที่จะได้นำมาใช้ในการพัฒนา software ได้อย่างคล่องแคล่วและเป็นธรรมชาติ ทั้งการตั้งชื่อ ทั้งรูปแบบของ code ทั้งโครงสร้างที่ดี ทั้งการ comment เพื่ออธิบาย code ทั้งการเขียน unit testing ทั้ง ... มันเยอะมาก ยากนะ
ดังนั้นใน VDO นี้จะทำการอธิบาย 7 อุปนิสัยที่ไม่ดีซึ่งไม่ควรทำ จึงสรุปไว้นิดหน่อย

1. การเขียน comment ที่ไม่ดี หรือ ไม่มีประโยชน์

ส่งผลให้ code อ่านและทำความเข้าใจยาก หรือทำให้เข้าใจผิดได้ง่าย ที่สำคัญ code ควรอธิบายการทำงานของมันเองให้ได้ดีก่อน ยกตัวอย่างที่เจอมา [code] // Step 1 step1(); // Step 2 step2(); // Step 3 step3(); [/code]

2. แต่ละบรรทัดยาวเกินหน้าจอ

มันดูและอ่านยาก พูดง่าย ๆ คือ ในการดู code ไม่ควรต้อง scroll ในแนวนอน หรือไม่เกินหน้าจอนั่นเอง หรือถ้าจอใครมันกว้าง ก็ให้ code แต่ละบรรทัดยาวแค่ครึ่งจอก็พอ ลองเอา code ขึ้น projector ดูนะครับ จะเห็นว่า code อ่านยากหรือง่าย

3. การจัดการ argument ของ method ไม่ดี

[gist id="c63b27d1cd207a71be2fcfae8f593b4e" file="1.java"]

4. การตั้งชื่อที่แย่ หรือ abstraction ที่แย่

ยกตัวอย่างเช่น int number ตัวแปรชื่อ number มีชนิดเป็น int มันดูแปลก ๆ ไหม ? หรือใช้คำกลาง ๆ เช่น Manage, Proxy, Factory, Service และ Process !! คำมันกว้างไปนะ ดังนั้นสิ่งที่ควรทำคือ ชื่อต่าง ๆ นั้นควรอธิบาย domain ของ business ว่าเป็นอย่างไร ทดสอบง่าย ๆ ด้วยการดูว่าใน code ของระบบงานนั้น มีคำอะไรเยอะ ๆ นั่นจะบอกว่า คุณตั้งชื่อได้ดีหรือแย่

5. สร้าง method ที่ซับซ้อน พร้อมต้องส่ง parameter จำนวนมากเข้าไป

ใน VDO ขอว่า 326 คือจำนวนของ parameter ที่ต้องส่งเข้าไปยัง method !! เยอะไปไหน ? ยังไม่พอนะใน method ชอบให้ส่ง boolean parameter เข้าไปเช่น methodName(true, false, true) คำถามคือ มันคืออะไร ? ทำไมไม่แยกเป็น method ย่อย ๆ ทำไมไม่ลดจำนวน parameter ลงไป

6. การ Encapsulate ที่แย่

นักพัฒนาคือว่า การ encapsulate คือ ไม่ให้ access ตัวแปรใน class ตรง ๆ ได้ ดังนั้นจึงสร้าง getter/setter method มาให้ใช้ มันใช่ไหม ? ยกตัวอย่างเช่น [gist id="c63b27d1cd207a71be2fcfae8f593b4e" file="2.java"] คำถามคือ มันใช่การ encapsulate หรือไม่นะ ?

7. ชุดการทดสอบต้องสะท้อน function หรือการทำงานของระบบนะ

แค่ให้เขียนชุดการทดสอบก็ยากพอดูแล้ว การเขียนให้ดีมันยิ่งยาก และสำคัญมาก ๆ เพื่อให้ง่ายต่อการอ่านและทำความเข้าใจ ดังนั้นชื่อการทดสอบต้องเข้าใจได้ง่าย เช่น testcase0001 ไม่น่าจะรู้เรื่องนะ should_success/should_fail ก็ไม่น่าจะรู้เรื่อง should_be_empty_after_delete_all_item_in_basket น่าจะอ่านรู้เรื่องกว่าไหม ?

สรุปขั้นตอนในการพัฒนาระบบ REST API ด้วยภาษา Go ที่น่าจะดี

$
0
0

จากบทความเรื่อง Write a Kubernetes-ready service from zero step-by-step ทำการสรุป workflow หรือขั้นตอนของการพัฒนาระบบ REST API ด้วยภาษา Go เริ่มตั้งแต่การพัฒนา API แบบง่าย ๆ จากนั้นทำการเพิ่มความสามารถที่จำเป็นต้องมีทั้ง logging, health check และ graceful shutdown รวมไปถึงการ deploy ระบบงาน ซึ่งในตัวอย่างจะทำการสร้าง Docker Image และทำการ deploy ด้วย Kubernetes จึงทำการแปลและสรุปในแบบที่เข้าใจไว้นิดหน่อย มาเริ่มกันเลย

ขั้นตอนที่ 1 สร้างระบบ API แบบง่าย ๆ ด้วย Hello World

อย่าลืมทำการทดสอบว่า ทำงานได้ตามที่ต้องการด้วย มี code ดังนี้ [gist id="5d8a524111c8a6f453a3cbffb1190d07" file="1.go"]

ขั้นตอนที่ 2 อย่าลืมการเขียน logging ของระบบ

ทำตั้งแต่เริ่มจะได้งาม ๆ จะได้รู้ว่าควรหรือไม่ควรเขียนอะไร !! มี library หรือ framework ให้ใช้เพียบเช่น log, glog และ logrus เป็นต้น ตัวอย่างการเพิ่ม log ใน API แบบง่าย ๆ คือ
  • การ start service
  • service start เรียบร้อย
  • service เกิด error ขึ้นมา
Code น่าจะดูดีขึ้นนะ [gist id="5d8a524111c8a6f453a3cbffb1190d07" file="2.go"]

ขั้นตอนที่ 3 ทำการเพิ่ม router ของ API เข้าไป

ในระบบ API นั้นจะมี endpoint หรือของการทำงานจำนวนมาก ซึ่งจะกำหนดไว้ในส่วนที่เรียกว่า router ถ้ายังทำใน package main หรือในไฟล์เดียว มันจะเยอะเกินไป ทำให้ดูและและจัดการยาก ดังนั้นแยกออกมาดีกว่า ส่วนการพัฒนา router ของ API ขึ้นอยู่ที่ความชอบว่าจะใช้ library หรือ framework อะไร เช่น gorilla/mux เป็นต้น หรือจะเขียนเองเด้วย package net/http ก็ได้ เอาที่สบายใจ ในการเขียน code นั้นส่วนการจัดการ router ไม่น่าจะอยู่ใน package main นะ !! ตรงนี้คือการแบ่งหน้าที่รับผิดชอบไปในแต่ละ package ซึ่งเป็นแนวปฏิบัติที่ดี ข้อดีคือแก้ไขและดูแลรักษาได้ง่าย ใคร ๆ เขาก็ทำกันแบบนี้นะ ใช่หรือเปล่า ? ดังนั้นในระบบของเราจะมี 2 package คือ
  • package main สำหรับเริ่ม
  • package handlers สำหรับจัดการเรื่องของ router
เริ่มด้วยการสร้างไฟล์ handlers.go สำหรับจัดการ router [gist id="5d8a524111c8a6f453a3cbffb1190d07" file="3.go"] ต่อมาสร้างไฟล์ home.go สำหรับทำงานในส่วนของ endpoint ชื่อว่า /home [gist id="5d8a524111c8a6f453a3cbffb1190d07" file="4.go"] จากนั้นทำการแก้ไข main.go เพื่อให้ไปใช้ router ที่สร้างขึ้นมา [gist id="5d8a524111c8a6f453a3cbffb1190d07" file="5.go"] ก่อนใช้งานก็ต้องติดตั้ง github.com/gorilla/mux ก่อนผ่าน go get !!

ขั้นตอนที่ 4 ว่าด้วยเรื่องของการจัดการ dependency หรือ library ต่าง ๆ

สำหรับระบบใหญ่ และ การทำงานเป็นทีม สิ่งที่ควรมีคือ เครื่องมือในการจัดการ dependency หรือ library ต่าง ๆ ที่ใช้งาน ซึ่งใน go นั้นมีให้ใช้เยอะมาก ทั้งการเขียน shell/bat script กับการใช้ go get ทั้งการใช้ตัวจัดการ dependency เช่น dep และ glide เป็นต้น โดยในบทความจะใช้ dep ซึ่งติดตั้งไม่ยาก สามารถใช้งานได้ง่าย ๆ ดังนี้ [gist id="5d8a524111c8a6f453a3cbffb1190d07" file="6.txt"] เพียงเท่านี้ก็มีตัวจัดการ dependency แล้วนะ ง่ายมาก ๆ

ขั้นตอนที่ 5 อย่าลืมชุดการทดสอบ API

เพื่อความสบายใจ สิ่งที่ต้องทำคือ สร้างชุดการทดสอบของ API แรกขึ้นมา การเริ่มต้นที่ดี มีชัยไปกว่าครึ่งนะครับ มาเขียนชุดการทดสอบ API กัน ข้อดีของ go คือมี package ชื่อว่า httptest มาให้ใช้แล้วนะสิ มาเขียนกันเถอะ เริ่มด้วย test case ง่าย ๆ คือ success ไงละ [gist id="5d8a524111c8a6f453a3cbffb1190d07" file="7.go"]

ขั้นตอนที่ 6 จัดการเรื่องของ configuration ของระบบ

ซึ่งจาก The twelve-factor app นั้น แนะนำให้ทำการแยก configuration ออกจาก code หรือระบบงานด้วย นั่นคือให้ใส่ configuration ไว้ในแต่ละ environment แทน จะเห็นได้ว่าใน code ตัวอย่าง ทำการ hard code Port ไว้ ดังนั้นเราสามารถทำการเปลี่ยน port ของ API ไปไว้ใน environment variable จากนั้นใน code ก็เปลี่ยนไปดึงจาก environment variable แทน ทำให้ง่ายต่อการเปลี่ยนแปลงอีกด้วย ดังนี้ [gist id="5d8a524111c8a6f453a3cbffb1190d07" file="8.go"]

ขั้นตอนที่ 7 จัดการเรื่องของ Health check และความพร้อมของ API

เริ่มเข้าสู่เรื่องของ operation ต่าง ๆ ของการ deploy ระบบงาน ในส่วนนี้ทำให้รู้ว่า API ยังมีชีวิตดีอยู่หรือไม่ ถ้าไม่ จะได้ทำการ restart service ใหม่ขึ้นมา รวมทั้งยังตรวจสอบความพร้อมต่าง ๆ ของ API เช่นถ้ามีการใช้ database แล้ว ถ้า API/service ไม่สามารถติดต่อ database ได้ ก็ให้ทำการนำ service นี้ออกไป หรือ ไม่ให้เข้าใช้งานเป็นต้น ตัวอย่างของ health check ของ API [gist id="5d8a524111c8a6f453a3cbffb1190d07" file="9.go"]

ขั้นตอนที่ 8 ว่าด้วยเรื่องของ Graceful shutdown

เมื่อต้องการที่จะลบหรือหยุดการทำงานของ API แล้ว สิ่งที่ต้องทำคือ อย่าไปหยุดหรือขัดการทำงานของงานที่ยังทำไม่เสร็จ ดังนั้นต้องรอจนไปกว่างานทั้งหมดจะทำงานเสร็จ โดยที่ package http.Server ในภาษา go ตั้งแต่ version 1.8 ขึ้นมาสนับสนุน แต่วิธีการเขียนจะยากนิดหน่อย เพราะว่านำ go routine/channel มาใช้ด้วย สามารถเขียนได้ดังนี้ [gist id="5d8a524111c8a6f453a3cbffb1190d07" file="10.go"] มาถึงตรงนี้จะเห็นได้ว่า ในการพัฒนาระบบ API นั้นจำเป็นต้องมีสิ่งต่าง ๆ มากกว่า feature นะครับ ซึ่งทีมพัฒนาต้องให้ความสำคัญด้วยมาก ๆ อย่าไปทำในช่วงท้าย หรือ ก่อนทำการ deploy ให้คิด วางแผน และ ลงมือทำตั้งแต่เนิ่น ๆ จะได้รู้และเข้าใจปัญหา เพื่อแก้ไขกันต่อไป

เข้าสู่ขั้นตอนการ build, ship และ run หรือการ deploy

โดยขั้นตอนเหล่านี้มักจะเรียกว่า Continuous Integration และ Continuous Delivery/Deployment มาดูกันว่าเป็นอย่างไรบ้าง ? ซึ่งในบทความจะใช้ Docker และ Kubernetes มาเริ่มกันเลย

ขั้นตอนที่ 9 ทำการสร้าง Dockerfile เพื่อใช้สำหรับการสร้าง image สำหรับ deploy ต่อไป

เมื่อทุกอย่างพร้อมแล้ว สิ่งที่ต้องกำหนดคือ กระบวนการ build -> test -> run ที่เป็นมาตรฐาน เพื่อให้ทุก ๆ คนในทีมทำงานในรูปแบบเดียวกัน อีกทั้งยังได้ artifact หรือ software package เอาไว้ deploy ต่อไป ในส่วนนี้มีวิธีการมากมาย ทั้ง shell/bat script ทั้ง Makefile ทั้ง manual process แต่ในปัจจุบันสิ่งที่ได้รับความนิยมคือ Containerization เครื่องมือที่ใช้คือ Docker ดังนั้นเรามาทำการสร้าง Dockerfile เพื่อใช้สร้าง Docker Image กัน เพื่อใช้ในการ deploy ต่อไป สิ่งที่ต้องการคือ
  • สร้าง Dockerfile
  • ทำการ compile -> test -> build software package
  • ทำการสร้าง image ไว้สำหรับการ deploy
ซึ่งเราสามารถใช้ Docker multi-stage build ได้ ยกตัวอย่างเช่น [gist id="5d8a524111c8a6f453a3cbffb1190d07" file="Dockerfile"] จะเห็นได้ว่า กระบวนการต่าง ๆ ทั้ง compile, test และ สร้าง software package อยู่ในนี้ ที่สำคัญ version ต่าง ๆ ของ software ถูกกำหนดไว้ชัดเจนอีกด้วย ดังนั้นปัญหาน่าจะลดไปได้มาก การใช้งานก็ง่ายมาก ๆ ดังนี้ [code] $docker build -t api:1.0 . $docker run --rm -p 8080:8080 api:1.0 [/code] ตอนนี้เราได้ Docker Image ที่พร้อมเอาไป deploy แล้วนะ ทั้งใช้ Docker (ในตัวอย่าง run ไปแล้ว) ทั้งใช้ Docker Swarm ทั้งใช้ Kubernetes เอาที่สบายใจนะครับ

ขั้นตอนที่ 10 ทำการ deploy ระบบ API ด้วย Kubernetes

ในการ deploy ด้วย Kubernetes ต้องจัดเต็ม ทั้ง service ทั้ง deployment ทั้ง ingress ซึ่งสามารถทำการ configuration ได้ดังนี้ ซึ่งสามารถแยกไฟล์ หรือ รวมไฟล์ได้ประมาณนี้ [gist id="5d8a524111c8a6f453a3cbffb1190d07" file="tmp.yaml"] เมื่อทุกอย่างพร้อม ทำการ deploy ด้วย Kubernetes ในตัวอย่างจะใช้ minikube เพื่อให้ run แบบ local/stanalone ได้ และทดสอบซะ [gist id="5d8a524111c8a6f453a3cbffb1190d07" file="11.txt"]

เพียงเท่านี้เราก็ได้ระบบ API แบบง่าย ๆ

ที่พัฒนาด้วยภาษา Go มีทั้ง logging, health check และ graceful shutdown ไปจนถึงการสร้าง Docker Image และ deploy ด้วย Kubernetes อีกด้วย น่าจะทำให้เห็น workflow หรือขั้นตอนการพัฒนาที่ดีกว่าเดิม ขอให้สนุกกับการ coding ครับ ปล. สิ่งที่ไม่ได้อธิบายคือ เรื่องของ versioning และ Makefile นะครับ
Viewing all 1997 articles
Browse latest View live