อ่านมาก็หลายครั้ง เห็นมาก็หลายหนกับคำแนะนำที่ว่า “เราควรใช้ข้อมูลและตัวเลขเก่าๆมาช่วยในการทำ Software Estimation” ก็ฟังดูดีนะครับแต่หลังจากได้ลองผิดลองถูกมากขึ้น ประสบการณ์บอกให้ผมรู้ว่าหลักการแบบนี้อันตรายทีเดียว … ทำไมถึงเป็นแบบนั้น? ก็กฎง่ายๆที่ว่า “Bad In – Bad Out” คุณภาพของข้อมูลห่วย ผลลัพธ์ก็ห่วยตามเป็นธรรมดา ขอขยายความแบบนี้ครับ
Requirement Characteristic กับ Software Estimation
การได้มาของข้อมูลเป็นเรื่องสำคัญมากครับ ลองถามตัวเองว่าเราทำ Software Estimation กันอย่างไร? ถ้าเป็นแบบนี้อาจมีปัญหาได้นะ
- ได้ Requirement มาก็อาศัยความที่เป็นผู้อาวุโสรวบหัวรวบหางเริ่มต้นการ Estimate ทันที
- อ่าน Requirement แล้วเริ่มวิเคราะห์ว่า เอ่อ มันต้องทำอะไรมั่งวะเนี่ยะ … Analyze ต่ออีกหน่อยพร้อมๆกับ Design อืม ต้องแก้ Code เยอะเหมือนกันนะเนี่ยะ ทั้ง Server แล้วก็ UI แต่ยังโชคดีที่ Test ไม่ยากเท่าไร
- คิดได้ดังนั้นแล้วก็ … 15 วันคงเสร็จมั้ง
จบกระบวนการทำ Estimation อย่างรวดเร็ว ปัญหาที่จะตามมาจากกระบวนการนี้มีเยอะแยะ เช่น 1. คิดคนเดียวแน่ใจหรอว่าถูก 2. นี่คุณเป็น Developer นะ ไปคิดแทน QA เค้าได้ยังไงว่ามันจะ Test ง่าย 3. เออ คุณเก่งแล้วนี่ทำงานมานาน ถ้าให้น้องใหม่ที่เพิ่งเข้ามาทำงานได้ 2 เดือนมันจะทำได้เร็วแบบคุณมั้ยเนี่ยะ? และอื่นๆ อีกมาก
เอาหละ เอาหละ ผมจะพยายามมองข้ามปัญหานี้ไปแล้วสรุปเลยว่าคุณผู้อาวุโสคนนี้แม่นมาก Estimate มา 15 วันงานก็เสร็จตามนั้นเลย แต่ปัญหาที่ยังอยู่คือการเอาตัวเลขนี้ไปใช้ในอนาคตเพราะเราไม่สามารถเปรียบเทียบความเหมือนและความแตกต่างของ Requirement เก่าและใหม่ได้อย่างชัดเจนเพียงพอที่จะบอกว่า เจ้า Requirement ตัวใหม่นี้มันคล้ายๆกับ Requirement ตัวเก่าตัวนี้ที่เราเคย Estimate ว่ามันต้องใช้เวลาทำ 15 วัน ปัญหานี้เกิดขึ้นเพราะว่าเราใช้การ Estimate แบบนั่งเทียนนี่แหละครับ
การนำตัวเลขเก่าๆมาใช้อย่างมีประสิทธิภาพได้นั้น ผมมองว่าจำเป็นต้องมีหลักการในการเปรียบเทียบความเหมือนของ Requirement สองตัวที่ดีพอสมควร บางครั้ง Requirement ที่ดูว่าเหมือนกัน แต่ปัจจัยตัวอย่างเหล่านี้จะทำให้ตัวเลข Estimation ต่างกันได้
| ปัจจัย | คำอธิบาย |
|---|---|
| Requirement Stability | ความแน่นอนของ Requirement นี้มีมากน้อยแค่ไหน ถ้าน้อยเราคงต้องเผื่อเวลาไว้สำหรับ Change บ้าง |
| Data Migration | Requirement ตัวนี้ต้องมีการทำ Data Migration ด้วยมั้ย ถ้ามีเราก็ต้องเผื่อเวลาเพิ่มเข้าไปอีก |
| Application Experience | คนที่จะมาทำ Requirement นี้มีประสบการณ์ในงานมากน้อยแค่ไหน ถ้าน้อยเราก็ต้องเผื่อเวลาเข้าไปอีก |
| Technology Experience | คนที่จะมาทำ Requirement นี้มีประสบการณ์ใน Technology ที่จะใช้มากน้อยแค่ไหน ถ้าน้อยเราก็ต้องเผื่อเวลาเข้าไปอีก |
| Maturity of Technology | Technology ที่เราเลือกใช้มันเป็นที่ยอมรับและได้รับการพิสูจน์ว่าดีจริงมาแล้วรึยัง ถ้ายังเราต้องเผื่อเวลาไว้สำหรับปัญหาที่จะเกิดขึ้นด้วย |
| Reusable Components | เราสามารถจะเอาของที่มีอยู่แล้วมาใช้กับ Requirement นี้บ้างได้มั้ย เช่น Code หรือ Test Case ถ้ามีอยู่แล้วก็ดี เราจะได้ไม่ต้องเสียเวลาทำทุกอย่างใหม่หมด |
สิ่งที่ผมพยายามจะสื่อให้เห็นคือ ถ้าเราอยากหวังจะพึ่งพิงตัวเลขเก่าๆมาช่วยในการทำ Software Estimation แล้วหละก็ นอกจากตัวเลขที่บอกว่างานนี้ใช้เวลาทำกี่วันแล้ว เราควรจะต้องเก็บ Requirement Characteristic นั่นก็คือสมมติฐานที่เราใช้เพื่อให้ได้มาซึ่งตัวเลขนี้ด้วยครับ งานยักษ์เลยหละ แล้วสุดท้ายก็จะลงเอยที่ไม่มีใครยอมทำและไม่มีเวลาทำ … ตัวเลขที่ได้มาจากการนั่งเทียนเลยเป็นตัวเลขที่อันตรายตามไปด้วย
Estimate กับ Actual มันคนละเรื่องกัน
ความสับสนในเรื่องตัวเลขและความหมายของมันมีส่วนสำคัญมากนะครับ เราต้องทำความเข้าใจก่อนว่าไม่ใช่แค่ Estimate แล้วจะจบเรื่องกันไป ความจริงแล้วตัวเลขที่ Estimate ออกมานั้นไร้ประโยชน์เลยด้วยซ้ำ เช่น ถ้าเรา Estimate ว่า Requirement นี้ต้องใช้เวลา Coding 10 วัน … แต่เอาเข้าจริงใช้เวลาไป 15 วัน เพื่อนๆคิดว่าตัวเลขไหนที่ควรจะเอามาพิจารณาตอนทำ Estimation ครั้งหน้าครับ? … มันก็ต้อง 15 วันเซ่ ก็ของจริงหรือ Actual มันใช้เท่านั้นนี่ เห็นมั้ยครับว่าเลข 10 ที่ได้จากการทำ Estimation มันไม่มีประโยชน์อะไรเลย แต่ปัญหาที่ตามมามันอยู่ตรงนี้แหละว่าเราจะเก็บค่า Actual ได้ให้กับทุกงานใน Project ได้อย่างครบถ้วนหรือไม่?
นี่เป็นหลักฐานแสดงให้เห็นถึงความเข้มแข็งของการทำ Project Tracking และความอุตสาหะอย่างยิ่งของ Project Manager กันเลยทีเดียวครับ ฮ่าๆ ก็เพราะมันไม่ใช่เรื่องง่ายนะที่ต้องเก็บข้อมูลทั้งหมดนี้ ยิ่งกับ Project ใหญ่ๆที่มี Task เยอะๆ … สำหรับใครที่ใช้ Microsoft Project เป็นตัวช่วยก็อาจจะง่ายหน่อย เราทำ Baseline Plan ไว้แล้วก็มากรอกข้อมูล Actual เข้าไปตอนทำ Tracking มันก็จะเห็นได้ว่า Estimate ไว้กี่วัน Actual กี่วัน (แล้วจะตกใจกับความแตกต่าง ฮ่าๆ) สำรหรับคนที่ใช้ Microsoft Excel ก็อาจจะยากหน่อยเพราะต้องเตรียม Template เองเป็นต้น
ความยากมันยังไม่หมดไปเพราะว่าเราต้องใช้ความพยายามสูงเลยหละที่จะไปตามเก็บข้อมูลพวกนี้มาใส่ Project Plan ของเราครับ ถ้ายิ่งมีงานเยอะมีสมาชิกเยอะก็ลำบากเข้าไปอีก บางครั้งงานบางงานต้องทำโดยคนที่อยู่ต่างประเทศก็ไปกันใหญ่ ถ้าไม่มั่นใจว่าเราได้ค่า Actual มา ผมว่าการเอา Historical Data ที่เป็นค่า Estimation มาใช้นั้นผิดอย่างมากเลยหละ
Actual Effort ที่ได้มาถูกต้องแล้วหรอ?
ถ้าเรามีเวลาและความพยายามตามเก็บค่า Actual Effort ของทุกงานที่อยู่ใน Project ได้ก็ยังมีปัญหาให้ปวดหัวต่อไปอีกว่า แล้วตัวเลขที่ได้มาเนี่ยะมันถูกต้องและเชื่อถือได้มากน้อยแค่ไหน? เรื่องนี้พูดยากมากเลย … เริ่มยังไงดี? … มันเป็นเรื่อง Effort – Duration – Calendar Day ซึ่งเป็นตัวเลขสามตัวที่เกี่ยวข้องกันในมุมมอง Project Management ครับ ประเด็นคือการที่เราจะบอกว่างานนี้ใช้เวลาทำ 1 วันหมายความว่ายังไงครับ?
- ก็ต้องมาดูว่าวันนึงเราทำงานกี่ชั่วโมง ดังนั้นเราจะพูดได้เต็มปากว่างานนี้จะใช้เวลาทำหนึ่งวันนั้นคือเราทำงานนั้นต่อเนื่องเป็นเวลา 8 ชั่วโมง นี่คือ Effort ที่ต้องใช้
- แล้วถ้าเราทำงานนี้วันละ 4 ชั่วโมง 2 วันหละ แปลว่างานนี้ต้องใช้ 2 วันรึเปล่า? … ไม่ใช่ครับ Effort ที่เกิดขึ้นก็ยังเป็น 8 ชั่วโมงซึ่งแปลงกลับมาได้เป็นแค่ 1 วันทำงานอยู่ดี
ปัญหามันอยู่ตรงนี้แหละ เพราะว่าใน Project Plan ของเราจะมีวันเริ่ม-วันจบของงานอยู่ซึ่งวันจบงานนี้บอกเราไม่ได้ว่า Effort ที่เกิดขึ้นจริงเป็นเท่าไร เช่น ผมขี้เกียจอะ ทำงานนี้วันละ 1 ชั่วโมง กว่าจะเสร็จก็ 8 วัน … แปลว่างานนี้ต้องทำ 8 วันรึเปล่า? ไม่ใช่หรอกแต่ใน Project Plan จะบอกว่าเริ่มงานวันที่ 1 แล้วเสร็จวันที่ 8 อะครับ นี่แหละปัญหาที่ว่าการเก็บค่า Actual Effort มันไม่ง่าย
และต่อให้เราทุ่มเทมากขึ้นกว่าเดิมด้วยการมีระบบ Time Tracking ที่ขอความร่วมมือ (แกมบังคับ) ให้สมาชิกในทีมเข้ามากรอกข้อมูลว่าแต่ละวันทำงานอะไรไปบ้าง อย่างละกี่ชั่วโมง ตัวเลขที่ได้จะละเอียดขึ้นครับว่า Requirement นี้ใครมีส่วนร่วมทำบ้าง แล้วทำคนละกี่ชั่วโมงต่อวัน อะไรประมาณนี้ แต่ปัญหา (อีกแล้ว) คือรู้ได้ยังไงว่าตัวเลขที่สมาชิกในทีมกรอกมามันตรงกับความจริง … นั่งเทียนกันมาทั้งนั้นแหละครับ ใครจะมานั่งจำว่าวันๆนึงทำงานอะไรไปเท่าไรกันบ้าง เนอะ ฮ่าๆๆ
Lesson Learned in Software Estimation
เป้าหมายของบทความนี้คือห้ามไม่ให้เพื่อนเอาตัวเลขเก่าๆมาใช้ในการทำ Software Estimation เลยหรอ? ไม่ขนาดนั้นหรอก ผมแค่ต้องการจะชี้ให้เห็นถึงปัญหาที่เป็นอยู่กับการเอาตัวเลขที่อาจจะไม่มีความถูกต้องมากนักมาใช้เป็นหลักยึดในการทำ Software Estimation ครับ แต่ถ้าใครที่มองแล้วว่า Project ตัวเองมีการทำ Software Estimation ที่ถูกต้อง มีการเก็บข้อมูลที่ดีและครบถ้วน บวกกับไม่ลืมเรื่องการทำ Project Tracking เพื่อเก็บ Actual Effort แล้วหละก็ … ยินดีด้วยครับ (อิจฉาด้วยแหละ) ที่ตัวเลขที่เพื่อนๆมีในมือนั้นถือว่าเป็นขุมทรัพย์เลยหละ
ส่วนตัวผมเองก็ต้องบอกตามตรงว่าทำไม่ได้ขนาดนั้นหรอก ตัวเลขที่ได้มาแต่ละครั้งก็นั่งเทียนบ้างอะไรบ้าง การเก็บ Actual Effort ก็ขาดไปเยอะ ดังนั้นสิ่งที่ผมใช้แทนตัวเลขเหล่านี้ตอนทำ Estimation ก็คือ Lesson Learned ครับ บทเรียนที่ว่าคือ ถ้าทำอะไรดีเราก็ทำต่อ ถ้าอะไรทำแล้วไม่เข้าท่าเราก็พยายามปรับปรุงหรือไม่ก็เลิกใช้ไป … Lesson Learned สำหรับ Software Estimation ที่ผมมีก็ …
- การใช้เวลาในการ Estimate มากไม่ได้เป็นการการันตีว่าจะได้ผลที่ถูกต้องมากขึ้น
- ใช้ PERT ในการทำ Estimation แล้วถือว่าโอเคนะแต่ใช้เวลาพอสมควร
- ใช้ Delphi ในการทำ Estimation ก็ดีเหมือนกันเพราะได้ความคิดเห็นจากคนมากกว่าหนึ่งคน มีการเปิดช่องให้พูดคุยเพื่อทำความเข้าใจในงานระหว่างกันด้วย แต่เสียเวลามากเลย
- เคยเอาคนทั้งทีมมาช่วยกันทำ Estimation นะ นั่งรวมกันในห้องประชุมแล้วก็ Estimate ร่วมกัน เสียเวลา เสียแรง ผลที่ได้ก็ใช่จะตรงเป๊ะ ไม่คุ้มเท่าไร
- ตอนหลังเลยเปลี่ยนเป็นจับคู่กัน Estimate ส่วนใหญ่จะเป็น Senior + Junior คู่กันช่วยกัน Estimate เฉพาะงานที่ได้รับมอบหมายให้ทำ ประหยัดเวลาได้มากขึ้น ผลลัพธ์ที่ได้ก็โอเค ถือว่าคุ้มค่าที่จะทำต่อ
- สำคัญมากว่าควรจะให้คนทำได้มีสิทธิมีเสียงในการ Estimate ด้วย ไม่ใช่ว่าใครก็ไม่รู้จับงานมายัดใส่มือพร้อมกับเวลาที่น้อยเกินไป
- หลังๆเริ่มมีการรวมกลุ่มระหว่าง Developer และ QA เข้ามาช่วยกัน Estimate เพื่อเปิดมุมมองของอีกฝั่งหนึ่ง ประโยชน์ที่ได้รับก็คือการทำ Requirement Analysis และ Design ไปในตัวเลย
- เคยทำ Planning Game ของ Agile Development แล้วด้วย สนุกมาก เสียเวลามาก และด้วยความที่เป็น Project แรก ตัวเลขที่ได้ออกมาก็มั่วมากด้วย ฮ่าๆๆ
- Story Point ที่ได้ออกมามันไม่ค่อยตรง และด้วยความคุ้นเคยทุกคนจะถามคำถามเดียวกันว่า “5 แต้มนี่มันใช้เวลาทำกี่วัน แล้วต้องเสร็จเมื่อไร?” สุดท้ายเลยต้องเปลี่ยนจาก Point มาเป็น Ideal Day แทน ทั้งที่พอรู้มาบ้างว่าเราไม่ควรไปยึดติดกับแนวคิดเดิมที่มองอะไรเป็นวัน แต่ต้านกระแสมหาชนไม่อยู่จริงๆ
- ได้ด้วเลขมาแล้วก็อย่าลืมคิดเรื่องวันหยุดราชการ วันลาพักร้อนและวันลาป่วยเผื่อๆไว้ด้วย
- ได้ตัวเลขมาแล้วก็อย่าลืมบวก Buffer ไปด้วยนะ ไม่งั้นเดี๋ยวมี Change เข้ามาแล้วจะยุ่ง
- อย่ามองว่า Software Estimation คือกระบวนการที่ทำครั้งเดียวเสร็จ หมั่นตรวจสอบผลการ Estimate อยู่เรื่อยๆเพราะบ่อยครั้งตัวเลขที่ได้มามันไม่ตรงหรอก ถ้า Requirement แรกก็คลาดเคลื่อนไปมากกว่า 30% แล้วเราควรจะมานั่งพิจารณาหน่อยว่า เฮ้ย แล้วไอ้ Requirement ที่เหลือมันจะตรงมั้ยวะเนี่ยะ ฮ่าๆๆ กระบวนการนี้เรียกว่า Re-Estimation
- ถ้า Requirement ไม่ค่อยชัดเจนหรือคาดการณ์แล้วว่าต้องมีการเปลี่ยนแปลงเกิดขึ้นเรื่อยๆ แนะนำให้ใช้ Iterative จะดีกว่า การทำ Estimation จะยืดหยุ่นมากขึ้นด้วย
- ถ้าเป็นไปได้ก็พยายามแบ่ง Requirement ออกมาเป็นส่วนย่อยๆแล้วค่อย Estimate จากงานที่เล็กๆ ตัวเลขที่ได้จะแม่นยำกว่าเดิม
- ถ้าไม่แน่ใจว่างานนี้ยากง่ายแค่ไหน ลองปรึกษาผู้เชี่ยวชาญดูก่อน จะทีมเดียวกันหรือต่างทีมก็ได้นะ
สรุปง่ายๆว่า Software Estimation เป็นเรื่องยากมากสำหรับผมนะ เพื่อนๆคิดว่าไงกันมั่งครับ?

