fail-fast
เรามักจะได้ยินคำว่า Fail Fast Lea[r]n Fast
ในการพัฒนา software แบบ incremental และ interactive
นั้นเราต้องการ feedback ที่รวดเร็วที่สุดเท่าที่จะทำได้
เพื่อทำให้เรารู้ว่า สิ่งที่ทำอยู่นั้นมันถูกต้อง และ เป็นสิ่งที่ต้องการ

ในการพัฒนา software เราต้องการรู้สิ่งต่าง ๆ เหล่านี้อย่างรวดเร็ว

  • สิ่งที่เราสร้างทำงานได้อย่างถูกต้อง ?
  • สิ่งที่คนอื่นสร้างทำงานได้อย่างถูกต้อง ?
  • เมื่อ deploy ระบบงานแล้วยังทำงานได้ ?
  • สิ่งที่พัฒนานั้นมันตรงกับความต้องการของลูกค้า ?
  • ทำให้ business มันดีขึ้น ?

ดังนั้นเรามาตอบคำถามต่าง ๆ เหล่านี้กันดีกว่า

1. สิ่งที่เราสร้าง สามารถทำงานกับส่วนอื่น ๆ ได้อย่างถูกต้อง ?

คำตอบสำหรับผมคือ คุณทำการตรวจสอบ code ที่เขียนหรือไม่ ?
นั่นคือการเขียน Unit test และ Integration test นั่นเอง
มันทำให้คุณมั่นใจได้ว่า ส่วนเล็ก ๆ ที่คุณสร้างขึ้นมานั้น
ยังสามารถทำงานได้ตามความคาดหวัง
และยังทำงานกับ code ส่วนอื่น ๆ ได้อีกด้วย

โดย feedback ในส่วนนี้จะได้รับ feedback ที่รวดเร็วมากถึงมากที่สุด
อยู่ในระดับวินาทีกันไปเลย

2. สิ่งที่แต่ละคนในทีมสร้างขึ้นมานั้น เมื่อนำมารวมกันยังทำงานได้อย่างถูกต้องหรือไม่ ?

คำตอบสำหรับผมคือ Continuous Integration (CI) ไงล่ะ
ไม่ใช่ทำการ integrate ส่วนต่าง ๆ ในช่วงท้ายของการพัฒนา
แต่เราจะทำการ integrate ส่วนต่าง ๆ กันอย่างบ่อย ๆ
บ่อยเท่าใดล่ะ ก็ทุกครั้งที่เกิดการเปลี่ยนแปลงนั่นเอง

เพื่อทำให้เรารู้ว่า
เมื่อนำส่วนการทำงานต่าง ๆ มารวมกันแล้ว
ระบบงานยังคงทำงานได้อย่างถูกต้อง
ทำให้เราไม่ต้องเสียเวลาในการแก้ไขเป็นสัปดาห์ หรือ เป็นเดือน !!

แสดงการทำงานดังรูป

fail-fast-continuous-integration

3. เมื่อทำการ deploy ระบบยังทำงานได้อย่างถูกต้อง​ ?

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

ซึ่งในตอนนี้เรามี Unit test, Integrate test และระบบ Continuous Integration
มันทำให้เรามั่นใจว่า ระบบทำงานได้ดีใน development environment
แน่นอนว่า เราต้องทำการ deploy และ ทดสอบใน environment อื่น ๆ ด้วย
เพื่อทำให้เรามั่นใจ ก่อนที่จะนำขึ้น production server

จากรูป ทำอย่างไรเพื่อให้ได้ feedback ที่รวดเร็ว ?

fail-fast-continuous-delivery

คำตอบคือ
ต้องจัดการและเตรียม Deployment Pipeline
เพื่อทำให้เราสามารถ deploy และ ทดสอบในแต่ละ environment ได้อย่างรวดเร็ว
และจะทำให้เรามั่นใจ และ เชื่อมั่นต่อ code และ ระบบมากยิ่งขึ้น

โดยในแต่ละ environment นั้นควรทำการทดสอบอบบขนาน (Parallel testing)
เพื่อให้ได้รับ feedback ที่รวดเร็วมากขึ้น

4. สิ่งที่เราพัฒนาขึ้นมานั้นตรงกับความต้องการของลูกค้า และ ทำให้ธุรกิจดีขึ้น ?

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

คำถาม
เราจะได้รับ feedback ต่าง ๆ จากลูกค้า และ ผู้ใช้งานได้รวดเร็วอย่างไร ?
คำตอบ
คุณต้องทำการ deploy และ release บ่อย ๆ ไงล่ะ
นั่นคือ คุณต้องเรียนรู้และนำแนวคิด Continuous Delivery (CD) และ Continuous Deployment (CD) มาใช้งาน

โดยเราสามารถนำเอาแนวคิด CD และ Deployment pipeline มาใช้
ก็จะช่วยให้คุณได้รับ feedback กลับมาอย่างรวดเร็ว
หรือช่วยตอบคำถามหรือข้อสงสัยของคุณได้เร็วยิ่งขึ้น
รวมทั้งยังช่วยให้คุณสามารถปรังปรุง และ เปลี่ยนแปลง business model ได้ดีอีกด้วย

สุดท้ายแล้ว มีสองสิ่งที่จะช่วยทำให้คุณได้รับ feedback อย่างรวดเร็ว

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

graph

ลองคิดดูสิว่า
ถ้าเราสามารถทำบ่อย ๆ ได้ แสดงว่า
งานเหล่านั้นต้องมีขนาดเล็ก ๆ
รวมทั้งทำให้เราสามารถนำ feedback ไปปรับปรุงได้อย่างรวดเร็ว
และทำให้เราสร้างสิ่งที่ใช่มากขึ้น

สิ่งที่สองคือ ต้องทำงานแบบอัตโนมัติ
ถ้ายังทำงานแบบ manual หรือใช้คนมาก ๆ แล้ว
เป็นไปไม่ได้เลยที่จะได้รับ feedback อย่างรวดเร็ว และ บ่อย ๆ
เพราะว่า คนมีชีวิตจิตใจ สร้างความผิดพลาดได้เสมอ
ดังนั้น งานอะไรที่ทำซ้ำ ๆ ก็ ลด ละ เลิก
และให้ทำงานแบบอัตโนมัติซะ

ดังนั้นเมื่อเข้าใจขั้นตอนการทำงานต่าง ๆ แล้ว
จึงไปศึกษา และ เลือกเครื่องมือที่เหมาะสมกับความต้องการต่อไป
อย่าเริ่มจากเครื่องมือนะครับ !!

สิ่งที่ต้องถามตัวเราเอง คือ
เรารู้ feedback ในเรื่องต่าง ๆ อย่างไร และรวดเร็วเพียงใด ?

Reference Website
https://blog.snap-ci.com/blog/2016/03/22/fail-fast/
https://www.thoughtworks.com/insights/blog/fail-fast-learn-fast
http://martinfowler.com/bliki/FrequencyReducesDifficulty.html
https://www.theguardian.com/info/developer-blog/2015/jan/05/delivering-continuous-delivery-continuously