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

Hofstadter’s Law

มัน​ใช้​เวลา​นานกว่าที่​คุณ​คิด​เสมอ แม้​จะ​เผื่อ​กฎ​นี้​ไว้​แล้ว​ก็ตาม

Douglas Hofstadter เสนอ​กฎ​นี้​ใน​หนังสือ​ปี 1979 Gödel, Escher, Bach: An Eternal Golden Braid — หนังสือ​ที่​คว้า​รางวัล Pulitzer และ​วนเวียน​อยู่​กับ​ธีม​เรื่อง recursion, self-reference และ strange loop ตลอด​ทั้ง​เล่ม กฎ​ข้อ​นี้​ปรากฏ​อยู่​ใน​บทสนทนา​สไตล์ Achilles กับ Tortoise ซึ่ง​เป็น​รูปแบบ​เฉพาะ​ตัว​ที่ Hofstadter ใช้​อธิบาย​แนวคิด​เชิง​ปรัชญา​และ​ตรรกะ​ตลอด​เล่ม

“มัน​ใช้​เวลา​นานกว่าที่​คุณ​คาด​เสมอ แม้ว่า​คุณ​จะ​เผื่อ​กฎ​ของ Hofstadter ไว้​แล้ว​ก็ตาม”

— Douglas Hofstadter

คำ​กล่าว​เชิง​วน​ซ้ำ (recursive) นี้​ชี้​ถึง​อคติ​ของ​มนุษย์​ที่​มัก ประเมิน​เวลา​ที่​ต้อง​ใช้​กับ​งาน​ซับซ้อน​ต่ำ​เกิน​ไป โดย​เฉพาะ​เมื่อ​มี​ความ​ซับซ้อน​และ​ปัญหา​ที่​คาด​ไม่​ถึง​เข้า​มา ความ​น่า​สนใจ​ของ​กฎ​นี้​อยู่​ที่​โครงสร้าง​การ​อ้างอิง​ตัวเอง (self-reference) — ต่อ​ให้​คุณ​รู้จัก​กฎ​นี้​และ​พยายาม​เผื่อ​เวลา​ตาม​กฎ​นี้​แล้ว งาน​ก็​ยัง​มัก​ใช้​เวลา​นานกว่าที่​คุณ​คาด​ไว้ “หลัง​เผื่อ​แล้ว” อยู่ดี เพราะ​ปัญหา​ที่แท้​จริง​ไม่ใช่​การ​ขาด​วินัย​ใน​การ​เผื่อ​เวลา แต่​คือ​การ​ที่​มนุษย์ ไม่​สามารถ​คาด​การณ์​สิ่ง​ที่​ยัง​ไม่รู้​ว่า​มี​อยู่ (unknown unknowns) ได้​ล่วงหน้า

Hofstadter เอง​ยก​ตัวอย่าง​จาก​วงการ​หมากรุก​คอมพิวเตอร์​เป็น​ภาพประกอบ นัก​วิจัย​ด้าน AI ใน​ยุค​นั้น​ทำนาย​ซ้ำ​แล้ว​ซ้ำ​เล่า​ว่า “คอมพิวเตอร์​จะ​เอาชนะ​แชมป์​โลก​หมากรุก​ได้​ภายใน​สิบ​ปี” — และ​คำ​ทำนาย​นี้​ก็​ยัง “อีก​สิบ​ปี” อยู่​แบบ​นั้น​ต่อ​เนื่อง​หลาย​ทศวรรษ (ใน​ที่สุด Deep Blue ก็​เอาชนะ Garry Kasparov ได้​จริง​ใน​ปี 1997 ซึ่ง​เป็นการ​ยืนยัน​ภายหลัง​ว่าการ​ประมาณ​การ​ซ้ำ ๆ ที่​ผิดพลาด​ตลอด​หลาย​สิบ​ปี​นั้น​เป็น​ของ​จริง ไม่ใช่​เรื่อง​เล่น)

กฎ​ของ Hofstadter เกี่ยวโยง​กับ​แนวคิด​ทาง​จิตวิทยา​ที่​เรียก​ว่า planning fallacy (Kahneman & Tversky) ซึ่ง​อธิบาย​ว่า​มนุษย์​มัก​วางแผน​โดย​ยึด​สถานการณ์​ที่​ดี​ที่สุด (best-case scenario) เป็น​ฐาน แทนที่​จะ​พิจารณา​ข้อมูล​จาก​อดีต​หรือ​ความ​ล่าช้า​ที่​เคย​เกิด​ขึ้น​ใน​โครงการ​คล้าย​กัน ผล​คือ​การ​ประมาณ​เวลา​มัก “มอง​โลก​ใน​แง่​ดี​เกิน​จริง” อย่าง​เป็น​ระบบ ไม่ใช่​แค่​บาง​ครั้ง​บาง​คราว

ใน​วงการ​ซอฟต์แวร์ กฎ​นี้​ถูก​อ้าง​ถึง​คู่​กับ The Mythical Man-Month ของ Fred Brooks และ​แนวคิด extreme programming อยู่​บ่อย​ครั้ง เพราะ​ทั้ง​สาม​พูด​ถึง​ปัญหา​เดียวกัน​จาก​มุม​ต่าง​กัน: งาน​ซอฟต์แวร์​มี​ความ​ซับซ้อน​แฝง (hidden complexity) ที่​มอง​ไม่​เห็น​จนกว่า​จะ​ลงมือ​ทำ​จริง — การ​รวม API ที่​เอกสาร​ไม่​ตรง​กับ​พฤติกรรม​จริง, edge case ที่ requirement ไม่​ได้​พูด​ถึง, code เก่า​ที่​ทีม​ลืม​ไป​แล้ว​ว่า​ซับซ้อน​แค่​ไหน ทั้งหมด​นี้​โผล่​ขึ้น​มาระหว่าง​ทาง​เสมอ

กฎ​นี้​ยัง​มี​ความ​ตึงเครียด​ที่​น่า​สนใจ​กับ Parkinson’s Law ที่​ว่า “งาน​จะ​ขยาย​เวลา​จน​เต็ม​เวลา​ที่​มี​ให้” — สอง​กฎ​นี้​ดูเหมือน​ขัด​กัน (กฎ​หนึ่ง​บอกว่า​งาน​ใช้​เวลา​นานกว่าที่​คาด อีก​กฎ​บอกว่า​งาน​จะ​ยืด​ให้​เต็ม​เวลา​ที่​ตั้ง​ไว้) แต่​จริง ๆ แล้ว​เสริม​กัน: การ​เผื่อ buffer มาก​เกิน​ไป​เพื่อ​รับมือ Hofstadter’s Law อาจ​ทำให้​ทีม​หย่อน​วินัย​ตาม Parkinson’s Law และ​ใช้​เวลา​ที่​เผื่อ​ไว้​จน​หมด​โดย​ไม่​จำเป็น จุด​สมดุล​จึง​อยู่​ที่​การ​เผื่อ​เวลา​อย่าง​มี​เหตุผล ไม่ใช่​เผื่อ​แบบ​ไม่มี​ที่​สิ้นสุด

แนวคิด​ที่​เกี่ยวข้อง​อีก​อย่าง​คือ cone of uncertainty ใน​การ​บริหาร​โครงการ — ยิ่ง​อยู่​ใน​ช่วง​ต้น​ของ​โครงการ ค่า​ประมาณ​เวลา​มี​ความ​ไม่​แน่นอน​สูง​มาก (อาจ​คลาดเคลื่อน​ได้​หลาย​เท่าตัว) และ​ค่อย ๆ แคบ​ลง​เมื่อ​มี​ข้อมูล​มาก​ขึ้น​ระหว่าง​ทาง Hofstadter’s Law เป็นการ​ยืนยัน​เชิง​ประสบการณ์​ของ​ปรากฏการณ์​นี้: การ​ประมาณ​ช่วง​ต้น​มัก​ผิด​ไป​ใน​ทิศทาง​เดียว คือ “สั้น​เกิน​จริง” เสมอ ไม่ใช่​สุ่ม​ไป​ทั้ง​สอง​ทาง

  • การ​พยากรณ์ AI เอาชนะ​หมากรุก — ตัวอย่าง​ดั้งเดิม​ของ Hofstadter เอง ที่​นัก​วิจัย​ทำนาย​ซ้ำ ๆ ว่า “อีก​สิบ​ปี” อยู่​นาน​หลาย​ทศวรรษ ก่อน​ที่ Deep Blue จะ​เอาชนะ Kasparov ได้​จริง​ใน​ปี 1997
  • Feature ที่​ประเมิน​ไว้​หนึ่ง​เดือน — ทีม​เผื่อ buffer เป็น​หก​สัปดาห์​เพื่อ​ความ​ปลอดภัย แต่​สุดท้าย​โครงการ​ลาก​ยาว​ไป​สาม​ถึง​หก​เดือน เพราะ​การ​รวม API ที่​มี​ปัญหา, พนักงาน​ลา​ป่วย​กะทันหัน, และ​แนวทาง​แรก​ที่​ลอง​แล้ว​ใช้​ไม่​ได้​ต้อง​เริ่ม​ใหม่
  • Deadline ของ​ซอฟต์แวร์​ขนาด​ใหญ่ — โครงการ​ซอฟต์แวร์​ที่​มีชื่อเสียง​หลาย​โครงการ (ระบบ​ปฏิบัติการ, เกม AAA, ระบบ​องค์กร​ขนาด​ใหญ่) มัก​เลื่อน​กำหนด​ส่ง​ซ้ำ​แล้ว​ซ้ำ​เล่า แม้​ทีม​พัฒนา​จะ​มี​ประสบการณ์​สูง​และ​รู้ตัว​ว่า​เคย​พลาด​มา​ก่อน
  • Sprint ที่ “เกือบ​เสร็จ” ทุก​สัปดาห์ — ใน​ทีม Agile ทั่วไป งาน​ที่​ถูก​ประเมิน​ว่า​จะ​เสร็จ​ใน sprint นี้​มัก​ถูก​เลื่อน​ไป sprint ถัด​ไป​ด้วย​เหตุผล​คล้าย​เดิม​ซ้ำ ๆ (dependency ที่​ไม่​คาด​คิด, การ​รีวิว code ที่​พบ​ปัญหา​เชิง​โครงสร้าง, requirement ที่​เปลี่ยน​กลาง​ทาง)
  • อย่า​วางแผน​บน​สมมติฐาน​ที่​ดี​ที่สุด ให้​ใช้​ข้อมูล​จริง​จาก​งาน​ที่​คล้าย​กัน​ใน​อดีต (historical velocity) แทน​การ​เดา​ตาม​ความ​รู้สึก
  • แสดง​ค่า​ประมาณ​เป็น​ช่วง ไม่ใช่​ตัวเลข​เดี่ยว เช่น “22 ชั่วโมง ± 20%” เพื่อ​สื่อสาร​ความ​ไม่​แน่นอน​อย่าง​ตรง​ไป​ตรง​มา แทนที่​จะ​ให้​ตัวเลข​เดียว​ที่​ดู​แม่นยำ​เกิน​จริง
  • แบ่ง​งาน​ให้​เล็ก​ลง ค่า​ประมาณ​ของ​งาน​ที่​ใช้​เวลา​หลาย​เดือน​มัก​คลาดเคลื่อน​มาก ใน​ขณะ​ที่​งาน​ที่​แบ่ง​เป็น​ชิ้น​เล็ก ๆ ระดับ​วัน​หรือ​สัปดาห์​จะ​ประมาณ​ได้​แม่นยำ​กว่า — หลักการ​ง่าย ๆ คือ​งาน​สอง​นาที​ให้​ทำ​ทันที งาน​ไม่​กี่​นาที​ให้​เผื่อ​เป็น​ชั่วโมง งาน​ไม่​กี่​ชั่วโมง​ให้​เผื่อ​เป็น​วัน
  • ใช้​เทคนิค​ประมาณ​การ​แบบ​กลุ่ม เช่น Wideband Delphi หรือ planning poker เพื่อ​ลด bias ของ​คน​คน​เดียว และ​เปิด​ให้​ทีม​ถกเถียง​สมมติฐาน​ที่​ต่าง​กัน​ก่อน​สรุป​ตัวเลข
  • เมื่อ​พลาด​กำหนด​ก็​ให้ อัปเดต​แผน ตาม​จริง ไม่ใช่​ดันทุรัง​ตาม​แผน​เดิม​ที่​พิสูจน์​แล้ว​ว่า​ผิด การ​ยอมรับ​ความ​ล่าช้า​เร็ว​และ​ปรับ​แผน​ใหม่​ดี​กว่า​การ​ซ่อน​ปัญหา​ไว้​จน​สาย​เกิน​แก้
  • ใช้ Timeboxing ควบคู่​กับ feedback loop สั้น ๆ เพื่อ​ทบทวน​และ​ปรับ​ประมาณ​การ​บ่อย​ครั้ง แทนที่​จะ​วางแผน​ระยะ​ยาว​แบบ​ตายตัว​ตั้งแต่​ต้น
  • ระวัง​ไม่​ให้ buffer ที่​เผื่อ​ไว้​กลาย​เป็น​ข้อ​อ้าง​ให้​หย่อน​วินัย ตาม Parkinson’s Law — เผื่อ​เวลา​อย่าง​มี​เหตุผล​จาก​ข้อมูล ไม่ใช่​เผื่อ​แบบ​เดาสุ่ม​จน​เสีย​ความ​น่า​เชื่อถือ​ของ​ค่า​ประมาณ