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

The Law of Diminishing Returns

ยิ่ง​ทุ่ม​ทรัพยากร​เพิ่ม​เข้าไป​เรื่อย ๆ ผล​ตอบแทน​ส่วน​เพิ่ม​ยิ่ง​ลด​ลง

กฎ​ว่าด้วย​ผล​ตอบแทน​ที่​ลด​น้อย​ถอย​ลง (Law of Diminishing Returns) มี​ราก​มา​จาก​เศรษฐศาสตร์​คลาสสิก แนวคิด​นี้​ถูก​กล่าว​ถึง​ครั้ง​แรก ๆ โดย​นัก​เศรษฐศาสตร์​ชาว​ฝรั่งเศส Jacques Turgot ใน​ศตวรรษ​ที่ 18 และ​ถูก​นำ​มา​ใช้​อย่าง​เป็น​ระบบ​โดย David Ricardo, Thomas Malthus และ​เพื่อน​ร่วมสมัย​ใน​ต้น​ศตวรรษ​ที่ 19 เมื่อ​วิเคราะห์​ค่า​เช่า​ที่ดิน​ทำการ​เกษตร

ใจความ​คือ: เมื่อ​เพิ่ม​ปัจจัย​การ​ผลิต​หนึ่ง​ตัว​เข้าไป​เรื่อย ๆ โดย​ให้​ปัจจัย​อื่น​คงที่ (เช่น เพิ่ม​แรงงาน​ลง​ใน​ที่ดิน​ผืน​เดิม) ผลผลิต​ส่วน​เพิ่ม (marginal output) จาก​หน่วย​ที่​เพิ่ม​เข้า​มา​แต่ละ​หน่วย​จะ​ค่อย ๆ ลดลง แม้​ผลผลิต​รวม​อาจ​ยัง​เพิ่ม​ขึ้น​อยู่​ก็ตาม พูด​อีก​แบบ​คือ “ผล​ตอบแทน​ยัง​เป็น​บวก แต่​ลด​น้อย​ลง​เรื่อย ๆ” — ต่าง​จาก​ผล​ตอบแทน​ติดลบ (negative returns) ซึ่ง​การ​เพิ่ม​ปัจจัย​กลับ​ทำให้​ผลผลิต​รวม​ลด​ลง

ใน​เชิง​ทฤษฎี​การ​ผลิต (production theory) เส้น​โค้ง​ของ​ผลผลิต​ส่วน​เพิ่ม​มัก​ถูก​แบ่ง​เป็น​สาม​ช่วง: ช่วง​แรก​ผล​ตอบแทน​ส่วน​เพิ่ม เพิ่ม​ขึ้น (increasing returns — ปัจจัย​แรก ๆ ที่​ใส่​เข้าไป​ช่วย​ขจัด​คอ​ขวด​ที่​ชัดเจน​ที่สุด​ก่อน), ช่วง​กลาง​ผล​ตอบแทน​ส่วน​เพิ่ม ลดลง แต่​ยัง​เป็น​บวก (diminishing returns — นี่​คือ​ช่วง​ที่​กฎ​นี้​ตั้ง​ชื่อ​ตาม), และ​ช่วง​ท้าย​ที่​ผล​ตอบแทน​ส่วน​เพิ่ม ติดลบ (negative returns — การ​ใส่​ปัจจัย​เพิ่ม​กลับ​ทำให้​ผลผลิต​รวม​ลด​ลง) ทีม​วิศวกรรม​ที่​ดี​ต้อง​รู้​ว่า​งาน​ที่​ทำ​อยู่​กำลัง​อยู่​ใน​ช่วง​ไหน​ของ​เส้น​โค้ง​นี้

ใน​การ​พัฒนา​ซอฟต์แวร์ กฎ​นี้​ปรากฏ​ชัด​ใน​หลาย​มิติ: การ​เพิ่ม​คน​เข้า​โครงการ​ที่​ล่าช้า (เชื่อม​โยง​โดยตรง​กับ Brooks’s Law), การ​ไล่ optimize performance ให้​เร็ว​ขึ้น​อีก​ไม่​กี่​เปอร์เซ็นต์, การ​ไล่ refactor code ให้ “สมบูรณ์​แบบ” ขึ้น​เรื่อย ๆ, หรือ​การ​เพิ่ม test case เพื่อ​ไล่ coverage ให้​ถึง 100% — ทุก​กรณี​มี​จุด​หนึ่ง​ที่​ความ​พยายาม​เพิ่มเติม​ให้​ผล​ตอบแทน​น้อย​ลง​จน​ไม่​คุ้ม​กับ​ต้นทุน​ที่​เสีย​ไป กฎ​นี้​จึง​ไม่ใช่​ข้อ​ห้าม​ไม่​ให้​ลงทุน​เพิ่ม แต่​เป็น​คำ​เตือน​ให้ ติดตาม​อัตรา​ผล​ตอบแทน อยู่​เสมอ ไม่ใช่​ดู​แค่​ทิศทาง (เพิ่ม​ขึ้น​หรือ​ลด​ลง) เพียง​อย่าง​เดียว

สิ่ง​สำคัญ​คือ​ต้อง​แยก​สอง​แนวคิด​ที่​มัก​ถูก​ปน​กัน:

  • Diminishing returns (ผล​ตอบแทน​ลด​ลง) — ผลผลิต​ส่วน​เพิ่ม​ยัง​เป็น​บวก แต่​เพิ่ม​ขึ้น​ใน​อัตรา​ที่​ช้า​ลง​เรื่อย ๆ ต่อ​หน่วย​ปัจจัย​ที่​ใส่​เข้าไป
  • Negative returns (ผล​ตอบแทน​ติดลบ) — จุด​ที่​การ​เพิ่ม​ปัจจัย​กลับ​ทำให้​ผลผลิต​รวม ลดลง ไม่ใช่​แค่​เพิ่ม​ช้า​ลง

Brooks’s Law คือ​ตัวอย่าง​ที่​ก้าว​ข้าม​จาก diminishing ไป​สู่ negative returns ได้​ชัดเจน​ที่สุด​ใน​วงการ​ซอฟต์แวร์: การ​เพิ่ม​โปรแกรมเมอร์​เข้าไป​ใน​โครงการ​ที่​ล่าช้า​อยู่​แล้ว​ใน​ช่วง​แรก​อาจ​ยัง​ช่วย​ได้​บ้าง (แต่​ช่วย​น้อย​ลง​เรื่อย ๆ ต่อ​คน​ที่​เพิ่ม) เพราะ​ภาระ​การ​สื่อสาร​ระหว่าง​สมาชิก​ทีม​โต​ขึ้น​แบบ quadratic (ทีม n คน​มี​คู่​การ​สื่อสาร​ที่​เป็น​ไป​ได้​ประมาณ n คูณ n ลบ 1 หาร​ด้วย 2) จนถึง​จุด​ที่​คน​ใหม่​ต้อง​ใช้​เวลา​ของ​คน​เก่า​ใน​การ​สอน​งาน​มากกว่าที่​คน​ใหม่​จะ​ผลิต​งาน​ได้​เอง ผล​ตอบแทน​จึง​ติดลบ และ​โครงการ​ยิ่ง​ช้า​ลง​กว่า​เดิม

อีก​มุม​หนึ่ง​ที่​เกี่ยวโยง​กัน​คือ Amdahl’s Law ซึ่ง​อธิบาย​ว่าการ​เพิ่ม​จำนวน processor เพื่อ​เร่ง​ความเร็ว​โปรแกรม​แบบ​ขนาน​ก็​เจอ​ผล​ตอบแทน​ลด​ลง​เช่น​กัน เพราะ​ส่วน​ของ code ที่​ยัง​ต้อง​รัน​แบบ sequential (serial fraction) จะ​กลาย​เป็น​คอ​ขวด​ที่​จำกัด​เพดาน​ความเร็ว​สูงสุด ไม่​ว่า​จะ​ทุ่ม core เพิ่ม​อีก​กี่​ตัว​ก็ตาม — เป็น version ทาง​คณิตศาสตร์​ที่​เข้มงวด​กว่า​ของ​กฎ​เดียวกัน

ใน​เชิง​การ​บริหาร​ทีม​และ​คุณภาพ​งาน นัย​ยะ​ที่​สำคัญ​คือ เส้น​โค้ง​ของ​ผล​ตอบแทน​ไม่ใช่​เส้นตรง ทีม​ที่​ไม่​ตระหนัก​ถึง​เรื่อง​นี้​มัก​ตกหลุมพราง sunk cost fallacy คือ​ทุ่ม​เวลา​ต่อ​ไป​เพราะ “ลงทุน​ไป​เยอะ​แล้ว” ทั้ง​ที่​ผล​ตอบแทน​ส่วน​เพิ่ม​แทบ​ไม่​เหลือ หรือ​กลับ​กัน​คือ​หยุด​เร็ว​เกิน​ไป​ใน​จุด​ที่​ยัง​มี​ผล​ตอบแทน​คุ้ม​ค่า​เหลือ​อยู่ ทักษะ​ที่แท้​จริง​จึง​ไม่ใช่​การ​เดา​รู้​ว่า​กฎ​นี้​มี​อยู่ (มัน​มี​อยู่​เสมอ) แต่​คือ​การ วัดผล​ตอบแทน​ส่วน​เพิ่ม​อย่าง​ต่อ​เนื่อง เพื่อ​รู้​ว่า​กำลัง​อยู่​ตรง​ไหน​บน​เส้น​โค้ง

กฎ​นี้​ยัง​มี​ความ​สัมพันธ์​ใกล้​ชิด​กับ​หลักการ Pareto (กฎ 80/20) ซึ่ง​มัก​ถูก​อ้างอิง​คู่​กัน​ใน​บริบท​ซอฟต์แวร์: Pareto บอกว่า​ผลลัพธ์ 80% มัก​มา​จาก​ความ​พยายาม​เพียง 20% แรก ส่วน​กฎ​ว่าด้วย​ผล​ตอบแทน​ที่​ลด​ลง​อธิบาย กลไก ว่า​ทำไม​ถึง​เป็น​เช่น​นั้น — เพราะ 20% แรก​ของ​ความ​พยายาม​มัก​แก้​ปัญหา​ที่​ทรง​คุณค่า​ที่สุด​ก่อน ส่วน​ความ​พยายาม​ที่​เหลือ​อีก 80% จึง​เหลือ​แต่​ปัญหา​ที่​ให้​ผล​ตอบแทน​ต่ำ​ลง​เรื่อย ๆ ทั้ง​สอง​แนวคิด​จึง​เสริม​กัน​มากกว่า​จะ​แข่ง​กัน

  • การ​เพิ่ม​คน​เข้า​โครงการ​ที่​ล่าช้า — ตัวอย่าง​คลาสสิก​จาก Fred Brooks ใน The Mythical Man-Month (1975): โครงการ OS/360 ของ IBM ที่​ล่าช้า​และ​ได้​รับ​การ​เพิ่ม​กำลัง​คน​เข้าไป​แก้​ปัญหา กลับ​ล่าช้า​หนัก​ขึ้น เพราะ​ต้นทุน​การ​สื่อสาร​และ​การ​สอน​งาน​คน​ใหม่​กลืน​กิน​ผลผลิต​ที่​ควร​จะ​ได้​เพิ่ม
  • Performance tuning — การ optimize จาก baseline ที่​แย่​มาก​ไป​สู่ “เร็ว​พอใช้” มักได้​ผล​ตอบแทน​สูง​มาก​ต่อ​ชั่วโมง​ที่​ลงทุน (เช่น แก้ N+1 query, เพิ่ม index) แต่​การ​ไล่​บีบ​จาก 95% เร็ว​ขึ้น​ไป​เป็น 99% มัก​ต้อง​ใช้​ความ​พยายาม​แบบ exponential เพื่อ​แลก​กับ​เปอร์เซ็นต์​ที่​เหลือ​น้อย​นิด (สอดคล้อง​กับ​หลักการ​ที่ deviq.com อธิบาย​ไว้)
  • Test coverage — การ​เพิ่ม test จาก 0% ไป​สู่ 60-70% coverage มัก​จับ bug สำคัญ​ได้​เยอะ​มาก แต่​การ​ไล่​ให้​ครบ 100% coverage มัก​หมาย​ถึง​การ​เขียน​เทส​ให้ getter/setter หรือ code boilerplate ที่​แทบ​ไม่มี​ความ​เสี่ยง ต้นทุน​สูง​แต่​ความ​เสี่ยง​ที่​ลด​ได้​ต่ำ​มาก
  • Code review — reviewer คน​แรก​และ​คน​ที่​สอง​มัก​จับ​ปัญหา​สำคัญ​ต่าง​มุม​กัน แต่ reviewer คน​ที่​ห้า​หรือ​หก​ใน​กลุ่ม​เดียวกัน​มัก​เห็น​สิ่ง​เดียวกัน​ซ้ำ ๆ ผล​ตอบแทน​ส่วน​เพิ่ม​จาก​การ​เพิ่ม​ผู้​รีวิว​จึง​ลด​ลง​เร็ว ขณะ​ที่​ต้นทุน​ด้าน​เวลา​ของ​ทุก​คนใน​ทีม​เพิ่ม​ขึ้น​เป็น​เส้นตรง
  • Amdahl’s Law ใน​การ​คำนวณ​แบบ​ขนาน — ถ้า​โปรแกรม​มี​ส่วน​ที่​ต้อง​รัน sequential อยู่ 10% การ​เพิ่ม processor จาก 4 เป็น 64 ตัว​แทบ​ไม่​ทำให้​เร็ว​ขึ้น​ตาม​สัดส่วน​อีก​ต่อ​ไป เพราะ​เพดาน​ความเร็ว​สูงสุด​ถูก​จำกัด​ด้วย​ส่วน sequential นั้น​เสมอ
  • จำนวน​ผู้​เข้า​ร่วม​ประชุม — การ​ประชุม design review ที่​มี​ผู้​เข้า​ร่วม 4-6 คน​ที่​เกี่ยวข้อง​โดยตรง​มัก​ให้​มุมมอง​ที่​หลากหลาย​และ​ตัดสิน​ใจ​ได้​เร็ว แต่​เมื่อ​เพิ่ม​ผู้​เข้า​ร่วม​เป็น 15-20 คน แต่ละ​คน​พูด​ได้​น้อย​ลง การ​ตัดสิน​ใจ​ช้า​ลง และ​ต้นทุน​เวลา​รวม​ของ​ทั้ง​องค์กร​พุ่ง​สูง​จน​เกิน​คุณค่า​ที่​ได้ ซึ่ง​เป็น​ภาพ​สะท้อน​เดียวกัน​กับ​ปัญหา​ความ​ซับซ้อน​ใน​การ​สื่อสาร​ของ Brooks’s Law
  • การ​เพิ่ม QA tester เข้าไป​ไล่ bug ช่วง​ใกล้​ปล่อย​รุ่น — tester คน​แรก​มัก​เจอ bug สำคัญ​เยอะ​ใน​เวลา​สั้น ๆ แต่​ยิ่ง​เพิ่ม tester เข้าไป​ใน​พื้นที่​ทดสอบ​เดียวกัน โอกาส​เจอ bug ใหม่​ต่อ​คน​ยิ่ง​ลด​ลง (ซ้ำ​กับ​ที่​คน​อื่น​เจอ​ไป​แล้ว) ขณะ​ที่​ภาระ​การ​ประสาน​งาน​และ​การ​จัดการ​รายงาน bug เพิ่ม​ขึ้น​เป็น​เส้นตรง
  • วัดผล​ตอบแทน​ส่วน​เพิ่ม ไม่ใช่​ผล​ตอบแทน​สะสม — ก่อน​ลงทุน​รอบ​ต่อ​ไป (ไม่​ว่า​จะ​เป็น​คน เวลา หรือ compute) ให้​ถาม​ว่า “หน่วย​ถัด​ไป​ที่​ใส่​เข้าไป​จะ​ให้​ผล​ตอบแทน​เท่าไร” ไม่ใช่ “รวม​ทั้งหมด​ที่​ลงทุน​ไป​แล้ว​ได้​ผล​ตอบแทน​เท่าไร” — คำถาม​แรก​ช่วย​ตัดสิน​ใจ​อนาคต คำถาม​หลัง​เป็น​เพียง sunk cost
  • กำหนด​เกณฑ์ “พอแล้ว” ล่วงหน้า — เช่น “coverage ที่ 80% ของ business logic หลัก” หรือ “response time ต่ำ​กว่า 200ms” แทนที่​จะ​ไล่ optimize แบบ​ไม่มี​เพดาน การ​มี​เกณฑ์​ชัดเจน​ช่วย​ให้​ทีม​รู้​ว่า​เมื่อไร​ควร​หยุด​และ​ย้าย​ความ​สนใจ​ไป​งาน​อื่น​ที่​ให้​ผล​ตอบแทน​สูง​กว่า แนวคิด​นี้​ผูก​กับ Tolerance for Imperfection โดยตรง — ยอมรับ​ว่า​ไม่มี​ระบบ​ใด​สมบูรณ์​แบบ และ​การ​ไล่​ตาม​ความ​สมบูรณ์​แบบ​เกิน​จุด​หนึ่ง​คือ​การ​สิ้น​เปลือง
  • อย่า​ขยาย​ทีม​เป็น​วิธี​แก้​ปัญหา​แรก — เมื่อ​โครงการ​ล่าช้า สัญชาตญาณ​แรก​มัก​เป็น “เพิ่ม​คน” แต่​ตาม Brooks’s Law การ​เพิ่ม​คนกลาง​โครงการ​มัก​ให้​ผล​ตอบแทน​ติดลบ​ใน​ระยะ​สั้น​เสมอ เพราะ​ต้อง​เสีย​เวลา​สอน​งาน ควร​พิจารณา​ลด​ขอบเขต​งาน (scope) หรือ​เลื่อน​กำหนด​ส่ง​ก่อน
  • ใช้​หลักการ​เดียวกัน​กับ YAGNIYAGNI เตือน​ไม่​ให้​สร้าง feature หรือ abstraction ล่วงหน้า​เพราะ​ผล​ตอบแทน​ของ​ความ​ยืดหยุ่น​ที่​ยัง​ไม่​ถูก​ใช้งาน​จริง​มัก​ต่ำ​มาก​เมื่อ​เทียบ​กับ​ต้นทุน​ความ​ซับซ้อน​ที่​เพิ่ม​เข้า​มา​ทันที — เป็น​อีก​รูปแบบ​หนึ่ง​ของ​ผล​ตอบแทน​ลด​ลง​ที่​ประเมิน​ล่วงหน้า
  • ระวัง sunk cost fallacy — การ​รู้ตัว​ว่า​กำลัง​อยู่​บน​โซน​ผล​ตอบแทน​ต่ำ (หรือ​ติดลบ) ของ​เส้น​โค้ง แล้ว​ยัง​ลงทุน​ต่อ​เพราะ “ทำ​มา​เยอะ​แล้ว” คือ​กับดัก​ทาง​จิตวิทยา​ที่​พบ​บ่อย​ที่สุด​ใน​ทีม​วิศวกรรม การ​ตัดสิน​ใจ​ที่​ดี​ต้อง​มอง​ไป​ข้าง​หน้า ไม่ใช่​มอง​ย้อนหลัง
  • Timebox แทน​การ​ไล่​ตาม​ความ​สมบูรณ์​แบบ — การ​กำหนด​กรอบ​เวลา​ตายตัว​ให้​งาน​ประเภท optimize/polish (เช่น “สอง​วัน​สำหรับ performance tuning รอบ​นี้”) บังคับ​ให้​ทีม​ต้อง​จัด​ลำดับ​ความ​สำคัญ​ของ​สิ่ง​ที่​จะ​ทำ​ก่อน แทนที่​จะ​ไล่​ทำ​ไป​เรื่อย ๆ จนกว่า​จะ “รู้สึก​ว่า​เสร็จ” ซึ่ง​มัก​เลย​จุด​ที่​ผล​ตอบแทน​คุ้ม​ค่า​ไป​แล้ว
  • แบ่ง​งาน​เป็น​ชิ้น​เล็ก​แล้ว re-prioritize บ่อย ๆ — แทนที่​จะ​ทุ่ม​ทีม​ทั้งหมด​ไป​กับ feature เดียว​จน​สุด​ทาง ให้​ส่ง​มอบ​เป็น vertical slice เล็ก ๆ แล้ว​วัดผล​ตอบแทน​จริง​ก่อน​ตัดสิน​ใจ​ว่า​จะ​ลงทุน​ต่อ​ใน​ทิศทาง​เดิม​หรือ​ย้าย​ไป​ทำ​สิ่ง​อื่น​ที่​ให้​คุณค่า​สูง​กว่า — แนวคิด​นี้​เชื่อม​โยง​กับ​หลัก Agility โดยตรง
flowchart TD
    A[เริ่มลงทุนความพยายามหรือทรัพยากรเพิ่ม] --> B[วัดผลตอบแทนส่วนเพิ่มของหน่วยล่าสุด]
    B --> C{ผลตอบแทนส่วนเพิ่มเทียบกับต้นทุนส่วนเพิ่ม}
    C -->|ยังคุ้มค่ากว่าต้นทุนชัดเจน| D[ลงทุนต่ออีกหน่วย]
    C -->|เริ่มใกล้เคียงกับต้นทุน| E[ทบทวนเกณฑ์พอแล้ว]
    C -->|ต่ำกว่าต้นทุน หรือติดลบ| F[หยุด และย้ายไปงานที่ผลตอบแทนสูงกว่า]
    D --> B
    E --> B