วันนี้มาแนะนำการพัฒนาระบบงานด้วยแนวคิด TDD (Test-Driven Development)
จึงทำการสรุปข้อดีและข้อเสียของแนวคิดนี้ไว้นิดหน่อย
เพื่อทำให้เข้าใจกันมากขึ้น
เริ่มต้นด้วยข้อดี
ทำให้เราเขียน code เท่าที่จำเป็นเท่านั้น ถ้าเราปฏิบัติตามกฏและแนวคิดของ TDD คือ เราจะไม่เขียน production code ใด ๆ ถ้า test ทั้งหมดทำงานไม่ผ่าน ถ้าต้องการเพิ่ม feature ให่เข้าไป ต้องเริ่มจากการเขียน test ก่อนเสมอ โดยที่ production code ต้องเป็น code ที่เรียบง่าย หรือเพียงพอที่ทำให้ test ผ่าน ซึ่งจะทำให้เราได้ production code ที่จำเป็นจริง ๆ เท่านั้น ทำให้ code แยกกันอย่างชัดเจน เนื่องจากเราเริ่มต้นจากการเขียน test ดังนั้นถ้าต้องการทดสอบได้ง่าย ๆ แล้ว code แต่ละส่วนต้องไม่ผูกมัดกันแน่นจนเกินไป code ส่วนไหนควรอยู่ด้วยกันก็ไม่จำเป็นต้องแยกออกจากกัน ทำให้ code อยู่เป็นสัดเป็นส่วน เป็นกลุ่มเป็นก้อน ซึ่งเรามักจะเรียกว่า modular นั่นเอง ทำให้ง่ายต่อการดูแลรักษา เมื่อ code แยกกันอยู่ในที่ที่มันควรจะอยู่ ทำให้เมื่อทำการเพิ่ม featureและแก้ไขแล้ว จะลดผลกระทบลงไปอย่างมาก ตลอดจนมีชุดของการทดสอบที่ครอบคลุม ทำให้เรามั่นใจได้ว่า สิ่งที่แก้ไขมันทำงานถูกต้องหรือไม่ ทำให้เรามั่นใจได้ว่า สิ่งที่แก้ไขมันกระทบการทำงานส่วนอื่น ๆ หรือไม่ ข้อดีอีกอย่างคือ ทำให้เรามีความมั่นใจเมื่อต้อง refactor code หรือการปรับปรุงโครงสร้างของ code ให้ดีขึ้น สิ่งที่ตามมาก็คือ Test Coverage ที่สูงขึ้น Test coverage คือค่าที่บอกว่า test ที่เขียนมานั้น ครอบคลุม production code มากน้อยเพียงใด ซึ่งมันทำให้เรามั่นใจได้มากขึ้น ว่า test ที่เราเขียนมันไปครอบคลุม code ส่วนไหนบ้าง หรือไม่ครอบคลุมส่วนไหนบ้าง และถ้าเขียน test ดี ๆ แล้ว มันจะเป็นเอกสารชั้นดีเลย เนื่องจากใน test นั้น จะทำการอธิบายว่า production code ทำงานอย่างไร ? production code ใช้งานอย่างไร ? production code มีพฤติกรรมการทำงานอย่างไรบ้าง ? สุดท้ายจะช่วยทำให้ลดการ debugging ลงไปเยอะมาก ๆ ลองถามตัวเราเองสิว่า ใช้เวลาไปกับการ debug เยอะไหม ? ใช้เวลากับการ copy ข้อความจากการ debug เพื่อไปค้นหาผ่าน internet เยอะไหม ? ทำการ debug บ่อยไหม ? ถ้าตอบว่าใช่ ลองมาเขียน test เพื่อทดสอบกันไหม เพื่อทำให้เราเห็นข้อผิดพลาดเหล่านั้น จากนั้นจึงลงมือแก้ไขต่อไปปิดด้วยข้อเสีย
ทุกสิ่งทุกอย่างเมื่อมีข้อดีก็ย่อมมีข้อเสียเช่นกัน มาดูกันว่ามีข้อเสียอะไรบ้าง TDD นั้นไม่ใช่จะช่วยเราเสมอไป ถ้าเราเองไม่เข้าใจปัญหาที่ต้องการจะแก้ไข แล้วพยายามเขียน test มันก็ไม่ได้ช่วยอะไรมาก เช่นถ้าเข้าใจผิดก็เขียน test ผิด ส่งผลให้เขียน production code ผิดเช่นกัน หรือการเขียน test ช่วยให้เราหาข้อผิดพลาดได้ง่ายขึ้น แต่ไม่ได้บอกว่า จะช่วยหาข้อผิดพลาดใน test นะ ในช่วงแรกของการเริ่มต้นจะช้ามาก ๆ เนื่องจากเราต้องคิดก่อนว่า จะทำอะไร ? จะแก้ไขปัญหาอะไร ? จะเขียนอย่างไร ? จะสร้างอะไรบ้าง ? จากนั้นจึงเริ่มลงมือเขียน test จากนั้นจึงเขียน production code ต่อไป และวนแบบนี้เรื่อยไป ทำให้บางครั้งต้องใช้เวลาที่เยอะขึ้นกับงานที่ง่าย ๆ ทุกคนในทีมจำเป็นต้องทำตามแนวคิด TDD ซึ่งไม่ง่ายเลย บ่อยครั้งทำให้เกิดข้อขัดแย้งและโต้เถียงกันได้ ดังนั้นก่อนอื่นควรทำให้ทุกคนในทีม เห็นความสำคัญของการเขียน test ก่อน เมื่อ requirement เปลี่ยน จำเป็นต้องดูแลรักษา test code ด้วยนะ สิ่งแรกที่ทำเมื่อ requirement เปลี่ยนคือ การแก้ไข test code ก่อน จากนั้นจึงแก้ไข production code ต่อไป ซึ่งทำให้ทุกคนมองว่า จะเป็นต้องใช้เวลามากขึ้นนั่นเองวันนี้คุณเขียน test แล้วหรือยัง ?