ข้าม​ไป​ยัง​เนื้อหา

Brooks’s Law

การ​เพิ่ม​คน​เข้า project ที่​ล่าช้า​อยู่​แล้ว ยิ่ง​ทำให้​ช้า​ลง

Fred Brooks เสนอ​กฎ​นี้​ใน​หนังสือ​คลาสสิก​ปี 1975 The Mythical Man-Month: Essays on Software Engineering ซึ่ง​เรียบเรียง​จาก​ประสบการณ์​ตรง​ของ​เขา​ใน​ฐานะ​ผู้จัดการ project พัฒนา OS/360 ให้ IBM project ระบบ​ปฏิบัติการ​ขนาด​ใหญ่​ที่​ล่าช้า​อย่าง​หนัก​แม้​จะ​ทุ่ม​กำลัง​คน​เพิ่ม​เข้าไป​เรื่อย ๆ

“การ​เพิ่ม​กำลัง​คน​เข้าไป​ใน project ซอฟต์แวร์​ที่​ล่าช้า​อยู่​แล้ว ยิ่ง​ทำให้​มัน​ช้า​ลง​ไป​อีก”

— Fred Brooks, The Mythical Man-Month (1975)

Brooks เอง​เรียก​กฎ​นี้​ว่า​เป็น “an outrageous oversimplification” หรือ​การ​ทำให้​เรื่อง​ซับซ้อน​ง่าย​เกิน​ไป​อย่าง​เกิน​เลย แต่​ก็​ยอมรับ​ว่า​มัน​จับใจความ​สำคัญ​ของ​ปัญหา​ได้​ตรง​จุด นั่น​คือ​แนวคิด man-month ซึ่ง​ใช้​คำนวณ​ระยะ​เวลา project จาก​จำนวน​คน​คูณ​จำนวน​เดือน​นั้น เป็น “the mythical man-month” — หน่วย​วัด​ใน​ตำนาน​ที่​ไม่มี​อยู่​จริง เพราะ​งาน​คน​กับ​เวลา​ไม่​ได้​แลกเปลี่ยน​กัน​ได้​เสมอ​ไป (interchangeable) แบบ​ที่​สูตร​คณิตศาสตร์​ง่าย ๆ จะ​บอก

Brooks อธิบาย​ว่า​เหตุ​ใด​การ​เพิ่ม​คน​จึง​มัก​ทำให้ project ที่​ล่าช้า​อยู่​แล้ว​ยิ่ง​ช้า​ลง ผ่าน​สาม​กลไก​หลัก

1. Ramp-up time (เวลา​ปรับ​ตัว) — คน​ใหม่​ต้อง​ใช้​เวลา​ทำความ​เข้าใจ domain สถาปัตยกรรม และ code ที่​มี​อยู่ ก่อน​จะ​เริ่ม​สร้าง​คุณค่า​ได้​จริง ระหว่าง​นั้น​พวก​เขา​ต้อง​พึ่งพา​คน​เก่า​ใน​ทีม​คอย​สอน​งาน ซึ่ง​ดึง​เวลา​ที่​คน​เก่า​ควร​ใช้​ทำงาน​จริง​ออก​ไป ใน​ช่วง​แรก​คน​ใหม่​อาจ​สร้าง​ผลลัพธ์​สุทธิ​เป็น​ลบ​ด้วย​ซ้ำ เพราะ code ที่​ยัง​ไม่​เข้าใจ​บริบท​มัก​มา​พร้อม bug และ​งาน rework

2. Communication overhead (ต้นทุน​การ​สื่อสาร) — ยิ่ง​ทีม​ใหญ่ ช่อง​ทาง​สื่อสาร​ที่​ต้อง​ดูแล​ยิ่ง​เพิ่ม​แบบ​ไม่​เป็น​เชิง​เส้น ตาม​สูตร n(n−1)/2 เมื่อ n คือ​จำนวน​คน เช่น​ทีม 10 คนมี 45 คู่​สื่อสาร​ที่​อาจ​ต้อง​ประสาน​กัน แต่​ทีม 50 คน​กลับ​มี​ถึง 1,225 คู่ การ​ประชุม การ​รีวิว code และ​การ​ซิงค์​ความ​เข้าใจ​จึง​กิน​เวลา​มาก​ขึ้น​แบบ​ทวีคูณ ไม่ใช่​แค่​บวก​เพิ่ม​ตาม​จำนวน​คน

3. Task divisibility (ความ​แบ่ง​งาน​ไม่​ได้) — งาน​บาง​อย่าง​ไม่​สามารถ​แบ่ง​ให้​คน​หลาย​คน​ทำ​พร้อม​กัน​ได้ ไม่​ว่า​จะ​มี​คน​กี่​คน​ก็ตาม Brooks เปรียบเทียบ​ไว้​อย่าง​คมคาย​ว่า “nine women can’t make a baby in one month” — แม้​จะ​มี​แม่​เก้า​คน แต่ละ​คน​ก็​ยัง​ใช้​เวลา​ตั้ง​ครรภ์ 9 เดือน​เท่า​เดิม งาน​ซอฟต์แวร์​ที่​มี​ลำดับ​ขั้นตอน​ต่อ​เนื่อง​กัน (sequential dependency) เช่น​การ​ออกแบบ​สถาปัตยกรรม​หลัก หรือ​การ debug ปัญหา​เชิง​ตรรกะ​ที่​ซับซ้อน ก็​มี​ธรรมชาติ​แบบ​เดียวกัน

ข้อ​สำคัญ​คือ​กฎ​นี้​ใช้ได้​กับ project ที่ ล่าช้า​อยู่​แล้ว เป็น​หลัก การ​เพิ่ม​คน​ตั้งแต่​ต้น project หรือ​การ​เผื่อ​กำลัง​คน​สำรอง​ไว้​ล่วงหน้า ไม่​ได้​อยู่​ใน​ขอบเขต​ของ​กฎ​นี้​โดยตรง — ปัญหา​เกิด​เมื่อ​องค์กร “ตื่น​ตระหนก” แล้ว​โยน​คน​เข้าไป​แก้​ปัญหา​เฉพาะ​หน้า​โดย​ไม่​คิดถึง​ต้นทุน​แฝง​ของ​การ​เพิ่ม​คนกลางคัน

ด้าน​ล่าง​คือ​วงจร​ป้อน​กลับ (feedback loop) ที่ Brooks’s Law อธิบาย

flowchart TD
    A[Project is already late] --> B[Add more engineers]
    B --> C[New hires need ramp up time]
    B --> D[Communication pairs grow as n times n minus 1 over 2]
    C --> E[Senior staff time diverted to teach]
    D --> E
    E --> F[Project falls further behind schedule]
    F --> A
  • OS/360 ที่ IBM — ต้น​กำเนิด​ของ​กฎ​นี้​เอง Brooks บริหาร project พัฒนา​ระบบ​ปฏิบัติการ OS/360 ที่​ล่าช้า​อย่าง​หนัก การ​อัดฉีด​วิศวกร​เพิ่ม​เข้าไป​เรื่อย ๆ ไม่​ได้​ทำให้​กำหนด​ส่ง​มอบดี​ขึ้น แต่​กลับ​ยืด​เวลา​ซ้ำเติม​จาก​ภาระ​การ​สื่อสาร​และ​การ​ประสาน​งาน​ที่​บวม​ขึ้น ประสบการณ์​นี้​กลาย​เป็น​แรง​บันดาล​ใจ​หลัก​ของ​ทั้ง​เล่ม The Mythical Man-Month

  • “Bermuda Plan” ใน​ทาง​กลับ​กัน — Brooks เคย​เสนอ​เล่น ๆ ว่า​วิธี​แก้​ปัญหา project ล่าช้า​อีก​ทาง​คือ​การ ลด คนลง โดย​ส่ง​สมาชิก​ส่วน​ใหญ่​ไป​พัก​ที่​เบอร์มิวดา แล้ว​ปล่อย​ให้​คน​ที่​เหลือ​ไม่​กี่​คน​ซึ่ง​เข้าใจ​งาน​ลึก​ที่สุด​ทำงาน​ต่อ​โดย​ไม่​ถูก​ขัดจังหวะ — สะท้อน​ว่า​ปัญหา​ที่แท้​จริง​มัก​ไม่ใช่ “มี​คน​ไม่​พอ” แต่​คือ “สื่อสาร​กัน​มาก​เกิน​ไป”

  • โครงการ open source ขนาด​ใหญ่​อย่าง Linux kernel — เป็น​ตัวอย่าง​ที่​ดูเหมือน​ขัดแย้ง​กับ Brooks’s Law เพราะ​มี​ผู้​ร่วมพัฒนา​นับ​พัน​คน​แต่​ยัง​คง​เดิน​หน้า​ได้​เร็ว เหตุผล​คือ​ความ​เป็น module สูง (modularity) และ​รูปแบบ​การ contribute แบบ​กระจาย​ศูนย์​ผ่าน maintainer หลาย​ชั้น ทำให้​จำนวน​คู่​สื่อสาร​ที่​ต้อง​ประสาน​กัน​จริง ๆ ต่ำ​กว่า​สูตร n(n−1)/2 มาก นี่​คือ​จุด​ที่ Linus’s Law (“ตา​ยิ่ง​เยอะ bug ยิ่ง​ตื้น”) ทำงาน​คนละ​มิติ​กับ Brooks’s Law ได้​โดย​ไม่​ขัด​กัน

  • ทีม​สตาร์ท​อัพ​ที่​ตื่น​ตระหนก​ก่อน deadline — รูปแบบ​ที่​พบ​บ่อย​ใน​อุตสาหกรรม​คือ​เมื่อ​ทีม​พลาด​กำหนด​ส่ง​มอบ ผู้​บริหาร​มัก​ตอบ​สนอง​ด้วย​การ​จ้าง​คน​เพิ่ม​แบบ​เร่งด่วน ผล​ที่​ตาม​มา​คือ velocity ของ​ทีม​มัก​ลด​ลง​ชั่วคราว​ใน 1-2 sprint แรก เพราะ​ภาระ code review, pairing และ​การ​อธิบาย​บริบท​ให้​คน​ใหม่​เพิ่ม​ขึ้น​เร็ว​กว่า​ที่​ผลผลิต​จาก​คน​ใหม่​จะ​ไล่​ทัน

  • อย่า​ตอบ​สนอง​ความ​ล่าช้า​ด้วย​การ​โยน​คน​เข้าไป โดย​อัตโนมัติ ให้​ถาม​ก่อน​ว่า​คอ​ขวด​คือ​อะไร — ถ้า​เป็น​ปัญหา​การ​สื่อสาร​หรือ dependency เชิง​ลำดับ การ​เพิ่ม​คน​จะ​ยิ่ง​ซ้ำเติม ไม่ใช่​แก้​ปัญหา
  • ถ้า​จำเป็น​ต้อง​เพิ่ม​คนจริง ๆ ให้​เพิ่ม​แต่​เนิ่น ๆ ไม่ใช่​ตอน​ใกล้ deadline และ​ควร​มอบหมาย​งาน​ที่​ไม่​พึ่งพา ramp-up ลึก เช่น​งาน​ทดสอบ (QA) หรือ​เอกสารประกอบ ให้​คน​ใหม่​ช่วย​ก่อน
  • ลด​ต้นทุน​การ​สื่อสาร​ด้วย​สถาปัตยกรรม​ที่​เป็น module แบ่ง​ทีม​ตาม bounded context ที่​ชัดเจน (ดู DDD) เพื่อ​ให้​แต่ละ​ทีม​สื่อสาร​กันเอง​น้อย​ลง — แนวคิด​นี้​เชื่อม​โยง​ตรง​กับ Conway’s Law ที่​บอกว่า​โครงสร้าง​ระบบ​มัก​สะท้อน​โครงสร้าง​ทีม​ที่​สร้าง​มัน
  • พิจารณา​ทาง​เลือก​อื่น​ก่อน​เพิ่ม​คน เช่น​ตัด​ขอบเขต​งาน (scope) เลื่อน deadline หรือ​ปรับปรุง​กระบวนการ​ทำงาน​ของ​ทีม​เดิม​ให้​มี​ประสิทธิภาพ​ขึ้น การ​อัปเดต​แผนงาน​อย่าง​ตรง​ไป​ตรง​มา​ย่อม​ดี​กว่า​การ​ซ่อน​ความ​ล่าช้า​ไว้​ด้วย​กำลัง​คน​ที่​ไม่​ช่วย​อะไร
  • ใช้ whole-team practice และ pairing เพื่อ​กระจาย​ความ​รู้​ตั้งแต่​ต้น ลด​การ​พึ่งพา​บุคคล​ใด​บุคคล​หนึ่ง​เป็น​จุด​คอ​ขวด​ของ​การ​สอน​งาน เมื่อ​ถึง​เวลา​ต้อง​ขยาย​ทีม​จริง ต้นทุน ramp-up จะ​ต่ำ​กว่า​ทีม​ที่​ความ​รู้​กระจุก​อยู่​กับ​คน​เดียว