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

  • Test-Driven Development (TDD)
  • Continuous Integration (CI)
  • Standup meeting
  • Iteration

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

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

ดังนั้นสิ่งที่เราต้องการก็คือ Feedback ที่ดีและเร็ว
ส่งผลให้ได้ผลลัพธ์ที่ดีกว่าเดิม
และส่งของที่มีคุณค่าให้กับผู้ใช้งานหรือลูกค้าอยู่เสมอ

กลับมาในโลกของการ programming กันบ้าง

เราในฐานนะ programmer ก็ต้องการ feeback ที่รวดเร็วและบ่อยเช่นกัน
แต่เหมือนว่า programmer ส่วนใหญ่มักจะเขียน code เป็นร้อยๆ บรรทัด
ที่ปราศจากการทดสอบ เมื่อเกิดปัญหาขึ้นมาแล้วนั้น
เรามักจะใช้วิธีการ debugging ซึ่งกินเวลายาวนานมากๆ
และอาต้องทำการแก้ไข code มากมายหลายส่วน

นั่นหมายถึง เราได้รับ feedback ที่ช้ามากๆ ทำให้แก้ไขได้ช้าลงไป
แสดงได้ดังรูป

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

ผลที่ได้กลับมาก็คือ เราทำงานได้ช้ามากๆ ถึงแม้จะพิมพ์เร็วเท่าไรก็ตาม

Screen Shot 2557-10-06 at 11.01.17 AM

ลองแบบที่สองกันหน่อย

เมื่อผลที่ได้จากการ coding แบบเดิมๆ ด้วยภาษาโปรแกรมเดิมๆ
ดังนั้นเรานักพัฒนา จำเป็นต้องหาภาษาโปรแกรมที่ง่ายขึ้น
โดยไม่มีต้องทำการ compile ที่ทำอะไรให้วุ่นวายมากนัก เช่น

  • Ruby
  • Groovy
  • Python
  • Scala

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

Screen Shot 2557-10-06 at 11.12.25 AM

ลองแบบที่สามบ้างสิ

เริ่มใช้แนวคิด Test-Driven Development (TDD) มาใช้ในการพัฒนา
โดยนำไปใช้ได้กับทุกๆ ภาษาโปรแกรม นะ
เริ่มด้วยการเขียนการทดสอบในระดับที่เล็กๆ เรียกว่า Unit test
แล้วจึงเริ่มค่อยๆ เขียน code ตามแต่ละ unit test ไปเรื่อยๆ
ไม่ได้เขียน code ยาวๆ เหมือนเดิมแล้วนะ

ในส่วนของการ coding จะมีทั้ง code test และ production code ของเรา
ทำให้ส่วนของการทดสอบและแก้ไขข้อผิดพลาดนั้นใช้เวลาน้อยลงไปมาก
ส่งผลให้ feedback loop ที่ได้รับจะเร็วกว่าเดิมมากๆ
แสดงดังรูป

Screen Shot 2557-10-06 at 11.18.10 AM

มาถึงตรงนี้เราอาจจะคิดว่า มันน่าจะเป็นวิธีการที่ดีที่สุดแล้วนะ

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

Screen Shot 2557-10-06 at 11.21.21 AM

สังเกตว่า จากรูปนี้ ไม่มีเวลาให้หยุดเลย มันจะบ้าหรือเปล่านะ ?
จากรูปนี้กำลังอธิบายคำว่า Continuous Testing  
นั่นหมายถึงเราจะทำการทดสอบอยู่ตลอดเวลา เมื่อมีการแก้ไข code ใดๆ ก็ตาม
ลองกลับไปดูว่า เมื่อเราพัฒนาด้วยแนวคิด TDD
สิ่งที่เรายังทำอยู่ก็คือ Manual process นั่นคือ การไปกดปุ่ม หรือ run command เพื่อ run test หรือระบบ ใช่หรือไม่
นั่นเราเรียกว่า ขยะหรือของเสียที่เกิดขึ้น
ดังนั้นเราสามารถลดมันไปด้วย การใช้สิ่งที่เรียกว่า Continuous Testing

แล้วมันมีอะไรให้เราใช้บ้างล่ะ
สิ่งที่ผมใช้อยู่มี 2 ตัวคือ

  • Watchr ใช้งานได้กับภาษาต่างๆ เพียบ เช่น Ruby และ Python เป็นต้น
  • Infinitest  ใช้ได้กับภาษา Java ซึ่งมี plugin กับ Eclipse, Netbean และ IntelliJ IDE

ดังนั้นลองกลับมาดูตัวเราเองว่า

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

Reference Website
Continuous Testing
Improve feedback loop with continuous testing