XP101 : 2 – A Development Episode

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

เช้าวันนี้ก็เหมือนทุกๆ วัน ผมเริ่มทำงานด้วยการดูที่ task cards ที่เรียงเป็นตับ ใบบนสุดเขียนว่า “Export Quarter-to-date Withholding” ใน stand-up meeting เมื่อเช้านี้ผมจำได้ว่าคุณบอกว่า เพิ่งจะทำเรื่อง “Quarter-to-date calculation” เสร็จไป ผมก็เลยชวนคุณมาช่วยกันทำเรื่อง export, “ได้เลย!” คุณตอบ, ก็แน่ละ กฏของเราก็คือ ถ้าคุณถูกขอให้ช่วยคำตอบมีคำเดียวคือ “Yes” นี่นา เราก็เลยเป็น คู่ Pair Programming กัน สำหรับวันนี้

เราใช้เวลา สองสามนาทีคุยกันเรื่องงาน ที่คุณได้ทำไปเมื่อวาน คุณบอกเกี่ยวกับ bins ที่คุณเพิ่มเข้าไปในโค้ด ส่วน test เป็นอย่างไร และอีกเล็กน้อยเกี่ยวกับประสบการณ์ จากการทำ pair เมือวานว่า ถ้าเลื่อนจอ monitor ถอยไปสักฟุตหนึ่ง จะทำงานได้ลื่นขึ้น

คุณถาม “แล้ว test cases สำหรับงานนี้จะมีอะไรบ้าง?”

ผมตอบ “ตอนที่เรารัน export station นี่ ค่าที่อยู่ใน export record ควรจะ match กับค่าที่อยู่ใน bins”

“fields ไหนที่เราต้อง populate?” คุณถามต่อ

“ผมไม่รู้ ไปถาม เอ็ดดี้ กัน”

เราไปถามเอ็ดดี้ ได้คำตอบมาใน 30 วินาที เขาอธิบายถึง 5 fields ที่เขารู้เกี่ยวกับ quarter-to-date

เรากลับมานั่งดูเกี่ยวกับ test cases ที่มีอยู่แล้วที่เกี่ยวกับการ export เราเจออันที่เกือบจะตรงกับสิ่งที่เราต้องการ ถ้าเพียงเรา ทำการ abtracting สร้าง superclass ขึ้นมา เราก็จะ implement test cases ได้ง่ายขึ้น เราทำการ refactor แล้วลองรัน test cases ดู ทั้งหมดผ่าน (เจ๋ง!)

เราสังเกตเห็นอีกว่ามี test cases เกี่ยวกับการ export หลายตัวที่ใช้ประโยชน์จาก superclass ที่เพิ่งสร้างขึ้นมาได้ เราก็เลยจัดการ เขียนเพิ่มลงใน to-do card ของเราว่า “Retrofit AbstractExportTest” (จะเห็นว่าเวลาเห็นสิ่งน่าทำเราจะไม่ทำในทันทีเพราะไม่ใช่ priority ทำสิ่งสำคัญก่อน สิ่งน่าทำไว้ทำทีหลัง)

ทีนี้ก็มาถึงขั้นตอนการเขียน test case เพราะว่าเราทำ test case superclass การเขียน test case ใหม่ก็เลยง่ายขึ้นจม แค่ไม่กี่นาทีก็เสร็จแล้ว ได้มาครึ่งทางล่ะ ผมพูด “ผมเห็นชัดเจนเลยว่าตรงนี้จะ implement ยังไง, เราทำอย่างนี้นะ…”

“ทำ test cases ให้เสร็จก่อนสิ” คุณขัดขึ้น ในขณะที่เรากำลังเขียน test cases ถ้ามีไอเดียอะไรก็จงจดไว้ใน to-do card

ในที่สุดเราก็ทำ test cases เสร็จ เราลองรันมันดู Fail ก็แน่ล่ะ ยังไม่ได้เขียนโค้ดนี่นา “เดี๋ยวก่อน!” คุณพูด “เมื่อวาน Ralph กับผมทำเกี่ยวกับ calculator กันตอนเช้า เราเขียน 5 test cases ที่เราคิดว่าต้องไม่ผ่าน แต่อันหนึ่งดันผ่าน”

เราเรียก debugger ขึ้นมารัน test case นั้น เราดูที่ object ที่เราต้องคำนวณด้วย

ผมเขียนโค้ด (หรือคุณจะเขียนก็ได้ ขึ้นกับว่าใครมีภาพของโปรแกรมในหัวชัดเจนกว่ากัน) ในขณะกำลังเขียนนั้นเราพบว่า น่าจะเพิ่ม test cases อีกสองสามอัน เราจดไว้ใน to-do card ในที่สุด test cases ที่เขียนไว้ตอนแรกก็รันผ่าน

เราทำวนเวียนอยู่แบบนี้(หมายถึง หยิบงานจาก to-do card เขียน test cases รัน fail เขียนโค้ด รันผ่าน) ผ่านไปสักพักเราก็กลับไปดู to-do card ของเราก็เหลือ item เดียว คือ “restructing the other test cases” ทุกอย่างดูไปได้สวย เราเริ่มทำงานสุดท้ายนี้ต่อทันที

พอเสร็จแล้ว to-do list คราวนี้ก็ว่างล่ะ เราเห็นว่า เครื่องสำหรับทำ integration test ว่าง เราก็เลย เอาโค้ดเราขึ้นที่เครื่องนั้น แล้ว รัน test cases ทั้งหมด ทั้ง test cases ของเราและของคนอื่น มีอันหนึ่ง fail “มันแปลกแฮะ, มันมากกว่าหนึ่งเดือนแล้วที่เราไม่เคยมี test fail ตอนทำ integration” คุณพูด แต่ไม่มีปัญหา เรา debug test case แล้วก็แก้โค้ด แล้วรัน test suite ใหม่อีกครั้งหนึ่ง คราวนี้ก็ผ่านทั้งหมด เราจึง release โค้ดของเรา

หัวข้อสำคัญ

– Pair Programming โปรแกรมเมอร์ทำงานด้วยกันเป็นคู่

– เขียน test ก่อน แล้วจึงเขียนโค้ด จนกว่าจะ test ผ่าน และคุณคิด test cases ใหม่ที่ควรจะ fail ไม่ออกแล้ว จึงเรียกได้ว่างานเสร็จ

– Pairs ไม่ได้เพียงแค่ทำให้ test cases รันผ่าน จะต้องช่วยกันออกแบบระบบด้วย (system design) การแก้ไขไม่ได้จำกัดอยู่แค่ส่วนใดส่วนหนึ่ง(หรือมอดุลหนึ่ง) Pairs มีหน้าที่เพิ่มคุณค่า (add value) ให้กับระบบในส่วนที่ระบบต้องการ ด้วยการเพิ่มคุณค่าในกระบวนการ analysis, design, implementation, และ testing ระบบ

– การทำ integration จะต้องเกิดขึ้นทันทีหลังจากการ develop และต้องทำ integration testing ด้วย

Advertisements

ใส่ความเห็น

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out /  เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out /  เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out /  เปลี่ยนแปลง )

Connecting to %s