Screen Shot 2558-05-07 at 9.34.53 PM
ในงาน Agile Thailand 2014 และ Bug Day 2014 นั้น
ได้เปิด session สำหรับการฝึกเขียนโปรแกรมด้วยแนวคิดของ TDD
โดยได้นำแนวคิดต่างๆ มาจากงาน XP Conference และ Agile Testing Day
และในงาน Agile Thailand 2015 ก็คิดไว้ว่าจะเปิด session แบบเดิมอีกเช่นกัน
แต่ติดภารกิจสำคัญจึงไปร่วมงานไม่ได้
เลยมาเขียนสรุปแนวทางของ workshop ไว้ที่นี่ล่ะกัน

ปล. ไม่รู้จะมีคนสนใจ workshop บ้างหรือเปล่านะ -+-

เป้าหมายหลักของ workshop

การฝึกเขียนโปรแกรมด้วยแนวคิด TDD
โดยนำเงื่อนไขต่างๆ มาจาก

  • Code Kata
  • Coding Dojo
  • Code Retreat

นั่นคือ จะต้องเขียน test ที่มัน fail ก่อน (Red)
ต่อมาทำการเขียน code เพื่อให้ test ผ่าน (Green)
ทำการ refactor code ที่มันแย่ๆ ให้ดีขึ้น
แล้วทำซ้ำไปเรื่อยๆ

ส่วนเงื่อนไขก็นำมาจาก Code Retreat ดังนี้

ต้องทำงานแบบ pair programming
ใส่เงื่อนไขต่างๆ เข้าไปในโจทย์ปัญหา

  • No naked primitive
  • No conditional statement หรือ No IFs
  • No loop
  • Refactoring policy
  • 4 Line of code per method

และอื่นๆ อีกมากมาย
การกำหนดกติกาต่างๆ ในการทำ workshop เช่น

  • Verb instead of Noun
  • Code swap
  • TDD as if you meant it

จากเงื่อนไขต่างๆ เหล่านี้
สามารถนำมารวมกัน เพื่อฝึกฝนต่อไปได้อีกด้วย
ซึ่งใน workshop ก็จะนำเงื่อนไขต่างๆ มารวมเช่นกัน ประกอบไปด้วย

  • TDD as if you meant it
  • No IFs
  • No naked primitive

ดังนั้นมาทำความรู้จักกับ 3 เรื่องนี้ก่อนไหม ?

1. TDD as if you meant it

มีเป้าหมายเพื่อฝึกตามแนวคิดของ TDD อย่างเคร่งครัด

เป็น workshop สำหรับการฝึก TDD ขั้นกว่า จากคุณ Keith Braithwaite
มันคือ TDD ที่เริ่มต้นจากการ คิด ก่อนว่าเราจะทำอะไร เช่น
จะสร้าง class อะไร
จะสร้าง function/method อะไร
หลังจากนั้นจึงเริ่มต้นเขียน test ที่มัน fail
เพิ่มเข้าสู่รอบการทำงานของ TDD
พัฒนาแบบ small step ไปเรื่อยๆ

โดยใน workshop นี้
จะช่วยทำให้ผู้ร่วมฝึกไม่คิดแบบ Big Design Up Front (BDUP)
และทำให้เกิด Emergent design จากการ Refactoring code
แน่นอนว่า workshop นี้มันยากมากๆ แต่มีประโยชน์มากเช่นกัน
เหมือนกับคำที่ว่า ยาดีมันต้องขม นั่นเอง
สุดท้ายของ workshop นี้มันจะทำให้คุณไปถึงจุดที่คุณคาดไม่ถึงเช่นกัน

บอกแบบนี้มันไม่เห็นภาพนะครับ
มันต้องลองลงมือทำด้วยตนเอง …

2. No IFs

เป็นเงื่อนไขการเขียนโปรแกรมที่สนุกและท้าทายมากๆ
แน่นอนว่า ยากมากเช่นเดียวกัน
เนื่องจากแต่ละเงื่อนไข มันขัดแย้งกับแนวคิดของ developer ส่วนใหญ่
โดยเงื่อนไขนั้นห้ามใช้พวก if, while, do-while, switch-case และพวก ternary operator

เนื่องจาก statement เหล่านี้มันทำให้เกิด code ที่ซับซ้อน
และยากเกินจะบรรยาย เช่น PHP Street fighter

if

จาก workshop ที่เคยทำมานั้น
มักจะพบว่า developer ส่วนใหญ่คิดไม่ออกว่าจะแก้ไขปัญหาอย่างไร
แต่นั่นคือ หนทางที่ developer ทุกคนต้องฝึก
เพื่อก้าวออกมาหาวิธีการแก้ไขอื่นๆ ด้วย
เพื่อลดความซับซ้อนของ code ที่เขียนลงไป

3. No naked primitive

เป็นเงื่อนไขที่สนุกมากๆ และ ดีมากๆ
โดยที่พวก primitive value ต่างๆ เช่น

  • Number
  • Boolean
  • String
  • Array
  • List
  • Map, Hashmap
  • Object

จะต้องถูกหุ้มด้วย class ต่างๆ ที่เราต้องสร้างขึ้นมาเองเสมอ
เนื่องจากเงื่อนไขนี้ มีเป้าหมายเพื่อ ฝึกทักษะเกี่ยวกับ Object-Orieted
ดังนั้นใน workshop นี้จะเกิด class ต่างๆ มากมาย เช่น Value Object เป็นต้น
รวมทั้งพวก data structure ต่างๆ จะถูก encapsulate ไว้อีกด้วย
ลองมาฝึกกันดูครับ

ลองคิดดูสิว่า ถ้าเอาทั้ง 3 เงื่อนไขมารวมกัน จะเกิดอะไรขึ้นบ้าง ?

แน่นอนว่ามันยากมากมาย …
แต่ถ้าคุณเริ่มสร้างจากจากส่วนเล็กๆ
ด้วยแนวคิดของ TDD และกลับมา refactor code อยู่อย่างเสมอ
เพื่อหาเส้นทางตามที่กำหนดไว้ในเงื่อนไข
มันจะทำให้คุณทำการ refactor code ไปทีละเล็กทีละน้อย
รวมทั้ง design ของระบบจะค่อยๆ ก่อกำเนิดขึ้นมา
นั้นคือ ลดปัญหาเรื่อง Big Design Up Front (BDUP) ลงไปได้
สุดท้าย คุณจะได้ design ของระบบที่ถูกปรับปรุงมาอย่างต่อเนื่อง

โดยสรุปแล้ว

จากแนวคิดของ workshop นี้
ใครมาอ่านและพบเจอก็ต้องบอกว่า มันยากมากๆ
เพราะว่า มีเงื่อนไขเต็มไปหมดเลย
ซึ่งเป็นเรื่องที่ปกติมากๆ เพราะว่ามันยากจริงๆ
ผมจึงเขียนอธิบายความหมายของแต่ละเรื่องใน blog นี้ไว้ก่อน

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

เสียดายที่ไม่ได้ไปร่วมงาน และ เปิด session นี้ในงาน Agile Thailand 2015
แต่งานต่อๆ ไปไม่น่าพลาดกับ session นี้ครับ