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

Death March

project ที่​แทบ​ไม่มี​หวัง​สำเร็จ แต่​ทุก​คน​ถูก​บังคับ​ให้​เดิน​หน้า​ต่อ

Death March คือ project ที่ แทบ​ไม่มี​ความ​หวัง​จะ​สำเร็จ​ตาม​เงื่อนไข​ที่​ตั้ง​ไว้ — เกิน​งบ เกิน​กำหนด​เวลา ขอบเขต​งาน​บวม​เกิน​จริง หรือ​ขาด​คน​ที่​มี​ฝีมือ​พอ จน​แทบ​ทุก​คน​ที่​เกี่ยวข้อง​รู้​ดี​ว่า​มัน​คือ​หายนะ​ที่​รอ​วัน​เกิด​ขึ้น แต่​ผู้​บริหาร​กลับ​ปฏิเสธ​ไม่​ยอมรับ​ความ​จริง​นั้น

Edward Yourdon ผู้​บัญญัติ​ศัพท์​นี้​ใน​หนังสือ Death March (1997) ให้​นิยาม​เชิง​ปริมาณ​ไว้​ว่า project จะ​ถือ​เป็น death march เมื่อ “parameter ของ project” อย่าง​น้อยหนึ่ง​อย่าง — เวลา งบประมาณ กำลัง​คน หรือ​ขอบเขต feature — เบี่ยง​เบน​ไป​จาก​ค่าที่​สม​เหตุ​สม​ผลอย่าง​น้อย 50% เช่น ทีม​ที่​ควร​มี 10 คน​กลับ​มี​แค่ 5 คน หรือ​กำหนด​ที่​ควร​ใช้​เวลา 12 เดือน​กลับ​ถูก​บีบ​ให้​เหลือ 6 เดือน

ผล​ที่​ตาม​มา​คือ​ทีม​พัฒนา​ถูก​บังคับ​ให้​ทำงาน​ต่อ มัก​ถูก​เรียก​ให้​ทุ่มเท​แบบ​วีรบุรุษ (heroic effort) เพื่อ​ไล่​ตาม​กำหนด​ที่​มอง​โลก​ใน​แง่​ดี​เกิน​จริง เช่น ทำงาน 60-80 ชั่วโมง​ต่อ​สัปดาห์ ทำงาน​วัน​หยุด​สุด​สัปดาห์​และ​วัน​หยุด​ยาว​ต่อ​เนื่อง​หลาย​เดือน ยิ่ง​ทุก​คน​ยอมรับ​ความ​จริง​ว่า​กำลัง​อยู่​ใน death march เร็ว​เท่าไร ก็​ยิ่ง​จัดการ​สถานการณ์​ได้​ดี​เท่านั้น — เพราะ​ทาง​เลือก​ที่แท้​จริง​มี​แค่​เจรจา​ลด​ขอบเขต/เลื่อน​กำหนด หรือ​ยอมรับ​ว่า project นี้​จะ​พัง​ไม่​ว่า​จะ​พยายาม​แค่​ไหน

  • “เดี๋ยว​ก็​ผ่าน​ไป” — ผู้​บริหาร​มอง​ว่าการ​กดดัน​ให้​ทำงาน​หนัก​ขึ้น​เป็น​ทางออก​ชั่วคราว​ที่​ราคา​ถูก​ที่สุด ไม่​ต้อง​เจรจา​ลด​ขอบเขต​หรือ​ขอ​งบ​เพิ่ม
  • ความ​กลัว​เสีย​หน้า — การ​ยอมรับ​ว่า​กำหนด​เดิม​เป็น​ไป​ไม่​ได้ หมาย​ถึง​ต้อง​แจ้ง​ลูกค้า​หรือ​ผู้​บริหาร​ระดับ​สูง​กว่า ซึ่ง​ดูเหมือน​ความ​ล้มเหลว​ส่วน​บุคคล​ของ​ผู้จัดการ project
  • Sunk cost — ทีม​ลงทุน​เวลา​และ​เงิน​ไป​มาก​แล้ว การ​หยุด​หรือ​รีสโคป​ดูเหมือน​ทำให้​สิ่ง​ที่​ลงทุน​ไป​สูญเปล่า ทั้ง​ที่​จริง​คือ “ต้นทุน​จม” ที่​ไม่​ควร​มี​ผล​ต่อ​การ​ตัดสิน​ใจ​ไป​ข้าง​หน้า
  • วัฒนธรรม​ฮีโร่ — องค์กร​บาง​แห่ง​ให้​รางวัล​คน​ที่ “กู้​วิกฤต” ด้วย​การ​ทำงาน​หาม​รุ่ง​หาม​ค่ำ ทำให้การ​ทำงาน​เกิน​ขีด​จำกัด​ถูก​มอง​เป็น​ความ​ดี​ความ​ชอบ​แทนที่​จะ​เป็น​สัญญาณ​เตือน​ของ​การ​วางแผนที่​ผิดพลาด
  • ความ​เชื่อ​ผิดๆ ว่า​คน​เพิ่ม = งาน​เร็ว​ขึ้น — ตาม​กฎ​ของ Brooks การ​โยน​คน​เข้าไป​เพิ่ม​กลาง project ที่​ล่าช้า​มัก​ทำให้​ล่าช้า​กว่า​เดิม เพราะ​ต้นทุน​สื่อสาร/ onboarding แต่​ผู้​บริหาร​ที่​ไม่​คุ้น​งาน​พัฒนา​ซอฟต์แวร์​มัก​คิด​ว่า​เป็น​ทาง​แก้​ที่​ตรง​ไป​ตรง​มา
  • คุณภาพ​ร่วง​ลง​เรื่อยๆ — เมื่อ​คน​เหนื่อย​ล้า​สะสม bug เพิ่ม​ขึ้น การ​ทดสอบ​ถูก​ข้าม ทาง​ลัด​สกปรก (shortcuts) ถูก​ใช้​แทน​วิธี​ที่​ถูกต้อง หนี้​ทาง​เทคนิค​พอกพูน​เร็ว​กว่า​ที่​ทีม​จะ​จัดการ​ไหว
  • Productivity ไม่​ได้​เพิ่ม​ตาม​ชั่วโมง — งาน​วิจัย​ด้าน software engineering ชี้​ซ้ำ​แล้ว​ซ้ำ​เล่า​ว่าการ​ทำงาน​เกิน ~40-45 ชั่วโมง/สัปดาห์​ต่อ​เนื่อง​ทำให้​ผลผลิต​ต่อ​ชั่วโมง​ลด​ลง จน​สุดท้าย​ทำงาน​ได้​ผลลัพธ์​น้อย​กว่า​ทีม​ที่​ทำงาน​ตาม​เวลา​ปกติ
  • คน​เก่ง​ลาออก​ก่อน — คน​ที่​มี​ตัว​เลือก​ใน​ตลาด​แรงงาน​มัก​ลาออก​จาก death march ก่อน​ใคร เหลือ​แต่​คน​ที่​ไม่มี​ทาง​เลือก ทำให้​ทีม​ยิ่ง​อ่อนแอ​ลง​ใน​จังหวะ​ที่​ต้องการ​ฝีมือ​มาก​ที่สุด
  • สื่อสาร​พัง — เมื่อ​เป้าหมาย​เปลี่ยน​ไป​เรื่อยๆ และ​ไม่มี​ใคร​กล้า​รายงาน​สถานะ​ที่แท้​จริง (เพราะ​กลัว​ถูก​ตำหนิ) ผู้​บริหาร​ก็​ยิ่ง​ตัดสิน​ใจ​ผิดพลาด​ต่อ​เนื่อง​ด้วย​ข้อมูล​ที่​ไม่​ตรง​ความ​จริง
  • สุขภาพ​และ​ความ​สัมพันธ์​พัง — ผลกระทบ​ไม่​ได้​จำกัด​แค่ project แต่​ลาม​ไป​ถึง​สุขภาพ​กาย สุขภาพ​จิต และ​ความ​สัมพันธ์​ใน​ครอบครัว​ของ​สมาชิก​ทีม
  • แม้ “สำเร็จ” ก็​ยัง​แพ้ — ต่อ​ให้​ทีม​ฝ่าฟัน​จน​ส่ง​งาน​ได้​ทัน​เวลา สิ่ง​ที่​ส่ง​มอบ​มัก​เต็ม​ไป​ด้วย​หนี้​ทาง​เทคนิค​และ bug ซ่อน​อยู่ ต้นทุน​ที่แท้​จริง​เพิ่ง​จะ​เริ่ม​ใน​เฟส​ถัด​ไป และ​ทีม​ก็​หมด​แรง​เกิน​กว่า​จะ​รับมือ

code ด้าน​ล่าง​ไม่ใช่ “pattern code” ใน​ความหมาย​ปกติ แต่​จำลอง​อาการ​ของ death march ที่​ฝัง​อยู่​ใน​ระดับ​กระบวนการ: การ​ประเมิน​งาน​ถูก​เมิน​เพื่อ “เอา​ให้​ทัน” และ​ทาง​ลัด​ถูก​ฝัง​ลง​ใน code จน​กลาย​เป็น​หนี้​เทคนิค​ถาวร

// แอนตี้ pattern: จัดการชั่วโมงงานแบบ death march ด้วยการฝืนไล่ตาม deadline
// พร้อมข้ามการตรวจสอบเพื่อ "ประหยัดเวลา"
public class ReleaseManager
{
public ReleaseResult ShipFeature(Feature feature, DateTime hardDeadline)
{
// ผู้บริหารบอกว่า deadline "เลื่อนไม่ได้" ทั้งที่ทีมประเมินไว้ว่าต้องใช้เวลาอีก 3 สัปดาห์
if (DateTime.Now > hardDeadline.AddDays(-2))
{
// ข้าม code review และ automated test เพื่อเร่งให้ทัน
SkipCodeReview(feature);
SkipAutomatedTests(feature);
// บังคับทีมทำงานล่วงเวลาแบบไม่มีกำหนดสิ้นสุด
foreach (var developer in feature.AssignedTeam)
{
developer.MandatoryOvertimeHoursPerWeek = 80;
}
}
// ส่งมอบโดยไม่มีใครรายงานว่าจริงๆ แล้วงานยังไม่เสร็จสมบูรณ์
return new ReleaseResult { Shipped = true, Feature = feature };
}
}
// ทางแก้: ทำให้ต้นทุนที่แท้จริงของขอบเขต/กำหนดเวลา "มองเห็นได้" แต่เนิ่นๆ
// แล้วเจรจา ไม่ใช่ปิดบังด้วยการทำงานหนักเกินขีดจำกัด
public class ReleasePlanner
{
private readonly ICycleTimeTracker _cycleTime;
public ReleasePlanner(ICycleTimeTracker cycleTime) => _cycleTime = cycleTime;
public ReleaseDecision PlanRelease(Feature feature, DateTime requestedDeadline)
{
// ใช้ cycle time จริงของทีม (ไม่ใช่ story point ที่ประเมินแบบมองโลกในแง่ดี)
// เพื่อคาดการณ์วันที่งานจะเสร็จอย่างมีคุณภาพ
var forecast = _cycleTime.ForecastCompletionDate(feature);
if (forecast > requestedDeadline)
{
// เปิดเผยช่องว่างและทางเลือกที่แท้จริงให้ผู้มีอำนาจตัดสินใจ
// แทนที่จะแอบข้ามขั้นตอนคุณภาพ
return ReleaseDecision.NegotiateScopeOrDeadline(
forecast,
options: new[]
{
"ตัดขอบเขตลงให้พอดีกับเวลาที่เหลือ",
"เลื่อนกำหนดให้ตรงกับ forecast",
"เพิ่มการทำงานร่วมกัน (pairing/mobbing) เพื่อลดเวลารอคอยระหว่างงาน",
});
}
return ReleaseDecision.Proceed(feature, forecast);
}
}
  1. ยอมรับ​ความ​จริง​ให้​เร็ว​ที่สุด — ทั้ง​ทีม​และ​ผู้​บริหาร​ต้อง​เรียก​สถานการณ์​ตาม​ที่​มัน​เป็น การ​ปฏิเสธ​ไม่​ได้​ทำให้ deadline เป็น​ไป​ได้​จริง​ขึ้น มี​แต่​ทำให้​เสีย​เวลา​ที่​ควร​ใช้​เจรจาไปฟรีๆ
  2. วัด​ของ​จริง ไม่ใช่​ประเมิน​แบบ​หวังดี — เปลี่ยน​จาก story-point estimation ไป​ใช้ cycle time จริง​ของ​ทีม เพื่อ forecast วัน​เสร็จ​ที่​แม่นยำ แล้ว​นำ​ตัวเลข​นั้น​ไป​เจรจา​กับ​ผู้​มี​ส่วน​ได้​ส่วน​เสีย (ดู pc-updateplan)
  3. เจรจา​สามเหลี่ยม​เวลา-ขอบเขต-ทรัพยากร — เมื่อ parameter ใด​เบี่ยง​เบน​ไป​มาก ต้อง​ยอม​ปรับ​อีก parameter หนึ่ง​เสมอ ตัด scope, เลื่อน​วัน​ส่ง, หรือ​เพิ่ม​ทรัพยากร​ที่​เหมาะสม (ไม่ใช่​แค่ “เพิ่ม​คน” กลาง​ทาง เพราะ กฎ​ของ Brooks ชี้​ว่า​อาจ​ยิ่ง​ช้า​ลง)
  4. ลด​เวลา​รอ​คอย​ด้วย​การ​ทำงาน​ร่วม​กัน — สาเหตุ​หนึ่ง​ที่​ทำให้ project ดู​ช้า​กว่า​ที่​ควร มัก​มา​จาก​เวลา “รอ​คิว” ระหว่าง​ขั้นตอน ไม่ใช่​เวลา​ทำงาน​จริง การ pairing/swarming/mobbing ช่วย​ลด​คอ​ขวด​นี้​ได้​มากกว่า​การ​เพิ่ม​ชั่วโมง​ทำงาน​ต่อ​คน
  5. รักษา​คุณภาพ​ไว้​เป็น​เกราะ​สุดท้าย — อย่า​ข้าม code review หรือ automated test เพื่อ “ประหยัด​เวลา” เพราะ​หนี้​ทาง​เทคนิค​ที่​สะสม​จะ​ทำให้​เฟส​ถัด​ไป​ช้า​ลง​กว่า​เดิม​หลาย​เท่า
  6. ให้​ทาง​เลือก​ออก​อย่าง​มี​ศักดิ์ศรี — ถ้า​สุดท้าย project ต้อง​พัง ควร​ทำให้​ทีม​มอง​เห็น​ตั้งแต่​เนิ่นๆ ว่า​มี​ทาง​เลือก​อื่น​ที่​ดี​กว่า​การ “ตาย​ไป​พร้อม​กัน” เช่น ย้าย​ไป​ทำ project อื่น​ที่​มี​โอกาส​สำเร็จ​จริง