วันอาทิตย์ที่ 4 ตุลาคม พ.ศ. 2552

แพทเทิร์น Agile - ปิงปองโปรแกรมมิ่ง

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

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

ดังนั้น

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

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

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

เทคนิคในทางปฏิบัติ
การ เขียนโปรแกรมแบบปิงปอง จะได้ผลดีเมื่อเราใช้แนวการพัฒนาโปรแกรมโดยการเขียนเทสต์ก่อน (test driven design) โดยคนหนึ่งเขียนเทสต์ให้อีกคนเขียนโค้ดเพื่อรันเทสต์ให้ผ่าน การเขียนเทสต์เหมือนกับการกำหนดอินเตอร์เฟซว่าเราจะต้อง Implement อะไรบ้าง และเป็นการทำให้รู้ว่าควรเขียนโค้ดอย่างไรให้รันเทสต์ผ่าน ไม่ควรเขียนโค้ดเผื่อสิ่งที่ไม่ได้เขียนเทสต์ครอบคลุมไว้ และพยายาม refactor โค้ดเมื่อเห็นโอกาส

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

แพทเทิร์นที่เกี่ยวข้อง
Agile แบ่งงานออกเป็นเรื่องๆ (User story) ที่มีขอบเขตเนื้อหาสำหรับเขียนไม่มากนัก เช่นใช้เวลาในหน่วยวันสองวัน การใช้โปรแกรมมิ่งแบบปิงปองเป็นรูปแบบหนึ่งของการเขียนโปรแกรมทีละสองคน และสนับสนุนให้เขียนโปรแกรมโดยการเขียนเทสต์ก่อน การเขียนเทสต์ควรใช้ไลบรารี่อย่าง unit testing, mock objects ร่วมกับ continuous integration tool การเขียนโค้ดควรต้องมี IDE ที่สนับสนุน Refactoring, version control

ที่มา http://www.thaidev.org/?p=70