ประสบการณ์ TDD
มันมีบางชั่วขณะ ที่ผมอินกับ Test-Driven Development (TDD) มาก จนอยากจะแนะนำทักษะนี้ให้คนเขียนโค้ดทั่วโลกที่สนใจเลย ผมคิดว่า ทักษะนี้มีผลเยอะมาก ๆ กับความรู้ความชำนาญในการเขียนโค้ดของผมทุกวันนี้ แต่ที่ผมไม่เคยอธิบายเป็นคำพูดออกมาได้คือ ทำไมนะ?
เมื่อเช้าตอนกำลังอ่านเกี่ยวกับ remove waste ในหัวข้อ kaizen ในหนังสือ Scaling Lean & Agile Development: Thinking and Organizational Tools for Large-Scale Scrum อยู่ดี ๆ ก็คลิ๊กขึ้นมาว่าทำไม ผมถึงรู้สึกว่า TDD นั้นสำคัญขนาดนี้
ก่อนรู้จัก TDD
ก่อนที่ผมจะรู้จัก TDD ผมก็ให้ความสำคัญกับการฝึกฝนนะ ผมอ่านหนังสือในเวลาว่าง และทุก ๆ วันผมก็ไปทำงาน พยายามเขียนโค้ดอย่างดีที่สุด แต่หลายปีผ่านไป ย้อนมองดูตัวเอง ผมไม่รู้สึกว่าผมเก่งขึ้นเรื่อย ๆ ตามเวลาที่ผ่านไปเลย บางครั้งผมแซวตัวเองในใจว่า ผมไม่เหมือนคนมีประสบการณ์เขียนโค้ดมา 5 ปี เหมือนคนมีประสบการณ์ปีเดียว วน loop 5 รอบมากกว่า 55555
มองให้ลึกกว่านั้น ผมเห็นว่า หลาย ๆ อย่างที่ผมคิด ที่ผมเชื่อ มันมาจากสมมติฐาน มันเวิร์คเพราะแบบนี้มั๊ง มันพังเพราะแบบนี้มั๊ง ออกแบบแบบนี้ดีกว่ามั๊ง ไม่น่าจะทำแบบนี้เลย แต่ถามว่าผมรู้ไหมว่าความเชื่อเหล่านั้นเป็นจริง ผมลองแก้เป็นอีกแบบเพื่อ validate assumption ไหม ไม่มีเวลาหรอกครับ แค่จะทำให้ทันก็จะตายแล้ว
ผมเสียเวลาเยอะนะ กับการ debug เวลามันมีปัญหา แต่ของมันพังก็ต้องซ่อมนี่นา นี่เป็น cost ที่จำเป็น
หลังจากที่ได้รู้จัก TDD นั่งทำ programming kata ฝึกฝนในเวลาว่าง จนชำนาญพอที่จะเอาไปใช้ในการทำงานจริงได้ จนกระทั่งมีประสบการณ์ใช้ทักษะ TDD ในงานจริงมาซักปี ผมก็พบว่าผมเก่งขึ้นกว่าเดิมมาก ผมเป็นคนเขียนโค้ดที่มีประสบการณ์ 2 ปีได้แล้ว แทนที่จะเป็น 1 ปีวน 2 รอบ ผมได้เรียนรู้ว่า…
ทุกแดง คือการประหยัดเวลา debug
ทุกครั้งที่ผม run test แล้วเห็น test fail ผมรู้ทันทีว่าผมทำอะไรผิดไป และเพราะระยะเวลาระหว่าง action กับ feedback มันสั้นมาก มันสนับสนุนการเรียนรู้อย่างทวีคูณเลยถ้าเทียบกับวิธีเดิม
ทุกเขียวเติมความมั่นใจ
ทุกครั้งที่เขียว ผมไม่ต้องเดาว่าเวิร์คมั๊ง ผมมั่นใจว่าทุก ๆ สมมติฐานที่ผมใส่ไว้ใน test case ทั้งหลาย ยังเป็นจริงอยู่ ผมไม่ได้สร้างความเข้าใจบนผืนทรายของสมมติฐานอีกต่อไป ผมสร้างองค์ความรู้จากพื้นฐานแน่น ๆ ของข้อเท็จจริง
ความมั่นใจที่ถูกเติมครั้งละนิด ๆ ราวกับหยดน้ำนี่แหละ ที่ค่อย ๆ สะสมไปหลาย ๆ ปีจนกลายเป็นทะเลสาบ เป็นออร่าแห่งความมั่นใจ เป็นฮาคิราชันย์ :D
จากสองสิ่งเล็ก ๆ ในทุกแดงและทุกเขียวนี่แหละ ที่ทำให้ผมได้เรียนรู้อย่างก้าวกระโดด วันนี้ที่ผมทำ kata ได้หลายภาษา เช่น PHP, Java, Ruby, Python, Golang, swift, kotlin, C++ เป็นต้น ส่วนหนึ่งเป็นเพราะอาชีพ technical โค้ชเปิดโอกาสให้ได้พบเจอ context ที่หลากหลาย และอีกส่วนหนึ่งก็ต้องขอบคุณ feedback loop อันรวดเร็วในพริบตาจากการทำ TDD นี่แหละ