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

Waterfall

วิธี​พัฒนา​แบบ​ขั้นตอน​ตายตัว ที่​ผู้​เสนอ​ตั้งใจ​ให้​เป็น​ตัวอย่าง “สิ่ง​ที่​ไม่​ควร​ทำ”

Waterfall (บาง​คน​เรียก​เชิง​ประชด​ว่า “Waterfail”) เป็น​ระเบียบ​วิธี​วงจร​ชีวิต​ซอฟต์แวร์​ที่ แข็ง​ทื่อ​และ​ไหล​ไป​ใน​ทิศทาง​เดียว โดย​ดัน​กิจกรรม​ทั้งหมด​ผ่าน​ชุด​ขั้นตอน​ตายตัว​เรียง​ต่อ​กัน​เป็น​เส้นตรง แต่ละ​ขั้น​ต้อง “ปิด” ให้​เสร็จ​สมบูรณ์​และ​ผ่าน​การ​อนุมัติ​ก่อน จึง​จะ​อนุญาต​ให้​เริ่ม​ขั้น​ถัด​ไป ลำดับ​คลาสสิก​คือ

รวบรวม​ข้อ​กำหนด (requirements) → ออกแบบ (design) → พัฒนา (implementation) → ทดสอบ (testing) → ส่ง​มอบ/ติดตั้ง (deployment) → ดูแล​รักษา (maintenance)

ภาพ​ที่​มัก​มา​กับ model นี้​คือ​น้ำตก​ที่​ไหล​ลง​จาก​ชั้น​หนึ่ง​ไป​อีก​ชั้น ไม่มี​ทาง​ไหล​ย้อน​ขึ้น เมื่อ​เซ็น​อนุมัติ​ข้อ​กำหนด​แล้ว​ก็​ถือว่า “แช่แข็ง” ห้าม​แตะ ทีม​ออกแบบ​รับช่วง​ต่อ เสร็จ​แล้ว​ส่ง​ต่อ​ให้​ทีม​พัฒนา แล้ว​จึง​ส่ง​ให้​ทีม​ทดสอบ​เป็น​ด่าน​สุดท้าย งาน​ถูก​แบ่ง​ตาม ชนิด​ของ​กิจกรรม ไม่ใช่​ตาม คุณค่า​ที่​ส่ง​มอบ ผล​คือ​กว่า​จะ​ได้​ซอฟต์แวร์​ที่​รัน​ได้​จริง​ให้​ผู้​ใช้​เห็น ก็​มัก​เป็น​ช่วง​ท้าย​สุด​ของ​โครงการ

จุด​ที่​หลาย​คน​ไม่รู้: บทความ​แรก​ที่​วาด​ไดอะแกรม model นี้​อย่าง​เป็น​ทางการ (ปี 1970 โดย Dr. Winston W. Royce) กลับ​เสนอ​มัน​ใน​ฐานะ ตัวอย่าง​ของ​สิ่ง​ที่​ไม่​ควร​ทำ Royce เขียน​ตรง ๆ ว่า​แนวทาง​แบบ​ผ่าน​ครั้ง​เดียว​จบ (single-pass) นั้น “เสี่ยง​และ​เชื้อเชิญ​ความ​ล้มเหลว” แล้ว​ใช้​เนื้อหา​ที่​เหลือ​ของ​บทความ​อธิบาย​ว่า​ต้อง​เพิ่ม iteration, feedback loop, การ​ทำ​แต่ละ​ขั้น “สอง​ครั้ง” และ​การ​ดึง​ลูกค้า​เข้า​มา​ร่วม​ตลอด​ทาง เขา​ไม่​เคย​ใช้​คำ​ว่า “waterfall” ด้วย​ซ้ำ (คำ​นี้​ปรากฏ​ภายหลัง​ราว​ปี 1976) แต่​ประวัติศาสตร์​กลับ​จดจำ​เขา​ผิด ใน​ฐานะ​บิดา​ของ model ที่​เขา​เตือน​ให้​ระวัง ต่อ​มา​มัน​ถูก​ทำให้​เป็น​ทางการ​ยิ่ง​ขึ้น​ผ่าน​มาตรฐาน​อย่าง DOD-STD-2167 ของ​กระทรวงกลาโหมสหรัฐฯ ในปี 1985 และ​แพร่หลาย​ไป​ทั่ว​อุตสาหกรรม

สิ่ง​สำคัญ​ที่​ต้อง​แยก​ให้​ออก: ปัญหา​ไม่​ได้​อยู่​ที่​การ​มี​กิจกรรม​อย่าง analysis, design หรือ testing — ทุก​โครงการ​ต้อง​ทำ​สิ่ง​เหล่า​นี้​อยู่​แล้ว ปัญหา​อยู่​ที่​การ บังคับ​ให้​มัน​เกิด​เป็น​เฟส​ก้อน​ใหญ่​เรียง​ต่อ​กัน​ครั้ง​เดียว ไหล​ทาง​เดียว และ​ห้าม​ย้อน​กลับ ใน​ทาง​กลับ​กัน การ​พัฒนา​แบบวน​ซ้ำ​ก็​ไม่​ได้​แปล​ว่า “ไม่มี​แผน” หรือ​ลุย​เขียน code มั่ว ๆ แต่​คือ​การ​ทำ​กิจกรรม​เดิม​ทั้งหมด​นั่นแหละ เพียง​แต่​ย่อย​ให้​เล็ก​ลง​และ​วน​ทำซ้ำ​หลาย​รอบ เพื่อ​ให้​ได้ feedback จาก​ของ​จริง​เร็ว​ขึ้น เส้น​แบ่ง​ของ​แอน​ติ pattern นี้​จึง​อยู่​ที่​ความ​แข็ง​ทื่อ​และ​ความ​ยาว​ของ loop ไม่ใช่​ที่​ตัว​กิจกรรม​เอง

  • ให้​ความ​รู้สึก​คาด​เดา​ได้​และ​ควบคุม​ได้ — เมื่อ​วาด​แผน​เป็น​ขั้นตอน​เรียง​กัน​ชัดเจน ผู้​บริหาร​สามารถ​ชี้​ได้​ว่า​ตอน​นี้​โครงการ​อยู่ “เฟส​ไหน” ประเมิน timeline และ​งบประมาณ​ล่วงหน้า​ได้​เป็น​ตัวเลข​สวยงาม ดูเหมือน​ทุก​อย่าง​อยู่​ใน​กำมือ
  • เข้า​กับ​สัญญา​แบบ fixed-price — โครงการ​รับเหมา​หรือ​โครงการ​ภาค​รัฐ​มัก​ต้องการ​เอกสาร spec ตายตัว​เพื่อ​ผูกมัด​ขอบเขต​งาน​ตั้งแต่​วัน​แรก Waterfall จึง​ดู​เหมาะ​เพราะ​มี​เอกสาร​ข้อ​กำหนด​ที่ “ปิด” ให้​เซ็น​ได้
  • เลียน​แบบ​วิศวกรรม​ดั้งเดิม — คน​จำนวน​มาก​เทียบ​ซอฟต์แวร์​กับ​การ​สร้าง​ตึก​หรือ​สะพาน ที่​ต้อง​มี​พิมพ์เขียว​ครบ​ก่อน​ลงมือ​เท​คอนกรีต จึง​รู้สึก​ว่าการ “ออกแบบ​ให้​จบ​ก่อน​สร้าง” คือ​วิธี​ที่​มือ​อาชีพ โดย​ลืม​ไป​ว่า​ซอฟต์แวร์​เปลี่ยนแปลง​ง่าย​กว่า​คอนกรีต​มาก และ​ความ​ไม่​แน่นอน​ของ​มัน​อยู่​คนละ​ระดับ
  • แบ่ง​งาน​ตาม​ความ​เชี่ยวชาญ​ได้​ง่าย — องค์กร​ใหญ่​ชอบ​โครงสร้าง​ที่​มี​ทีม analyst, ทีม designer, ทีม developer, ทีม QA แยก​กัน​ชัด ส่ง​งาน​ต่อ​กัน​เป็น​ทอด ๆ ดู​เป็น​ระเบียบ​และ​จัด​คน​ได้​ง่าย​บน​กระดาษ
  • เอกสาร​ครบ​ให้​ความ​อุ่นใจ — การ​มี​เอกสาร​หนา ๆ ใน​แต่ละ​เฟส​ให้​ความ​รู้สึก​ว่า​มี​หลักฐาน​ความ​คืบ​หน้าที่​จับ​ต้อง​ได้ แม้ว่า​เอกสาร​เหล่า​นั้น​จะ​ยัง​ไม่​เคย​ถูก​พิสูจน์​ด้วย​การ​รัน​จริง​เลย​ก็ตาม
  1. ความ​เสี่ยง​ถูก​เลื่อน​ไป​โผล่​ตอน​ท้าย​สุด — ใน model นี้ การ​ทดสอบ​และ​การ integration คือ​เฟส​สุดท้าย ซึ่ง Royce ชี้​ว่า​เป็น​ครั้ง​แรก​ที่​เรื่อง​เวลา หน่วย​ความ​จำ และ​พฤติกรรม​จริง​ถูก “สัมผัส” แทนที่​จะ​ถูก “วิเคราะห์​บน​กระดาษ” ถ้า​เจอ​ปัญหา​ระดับ​สถาปัตยกรรม​ตอน​นั้น การ​แก้​ย่อม​ลาม​ย้อน​กลับ​ไป​ทุก​เฟส​ก่อนหน้า Martin Fowler เรียก​สอง​เฟส​ท้าย​นี้​ว่า​เป็น​ส่วน​ที่​คาด​เดา​ได้​ยาก​ที่สุด​ของ​โครงการ
  2. ยิ่ง​เจอ bug ช้า ยิ่ง​แพง — ตาม​ที่ Wikipedia สรุป​งาน​วิจัย​ไว้ ข้อ​บกพร่อง​ที่​ถูก​พบ​ใน​เฟส​ท้าย​อาจ​มี​ต้นทุน​แก้ไข​สูง​กว่า​การ​พบ​ตั้งแต่​ต้น​ถึง 50–200 เท่า Waterfall เป็น​โครงสร้าง​ที่​จงใจ (โดย​ไม่​ตั้งใจ) เลื่อน​การ​ค้น​พบ​ข้อ​บกพร่อง​ไป​ไว้​ใน​จุด​ที่​แพง​ที่สุด
  3. ข้อ​กำหนด​ที่​สมบูรณ์​ล่วงหน้า​เป็น​ภาพลวง — ลูกค้า​มัก​ไม่​สามารถ​บอก​ความ​ต้องการ​ทั้งหมด​ได้​อย่าง​ถูกต้อง​ตั้งแต่​วัน​แรก และ​การ​ลงมือ​เขียน code จริง​มัก​เปิดเผย​เคส​ขอบ​และ​ข้อ​จำกัด​ที่​นัก​วิเคราะห์​มอง​ไม่​เห็น การ​แยก analysis ออก​จาก programming อย่าง​เด็ดขาด​จึง​เป็น​ไป​ไม่​ได้​ใน​ทาง​ปฏิบัติ Fowler ย้ำ​ว่า “การ​ส่ง​มอบ feature เพียง​บาง​ส่วน​ช่วย​ให้​เห็น​ชัด​ว่า​ต้อง​ทำ​อะไร​ต่อ” ได้​ดี​กว่า​การ​นั่ง​เดา​ทั้งหมด​ล่วงหน้า
  4. ไม่มี​ซอฟต์แวร์​ที่​ใช้ได้​จริง​จนกว่า​จะ​สาย — คุณค่า​ที่แท้​จริง (ซอฟต์แวร์​ที่​รัน​ได้) ปรากฏ​ช้า​มาก ผู้​ใช้​และ​ผู้​มี​ส่วน​ได้​ส่วน​เสีย​ไม่​ได้​เห็น​ของ​จริง​จน​เกือบ​จบ​โครงการ ทำให้ feedback loop ยาว​เป็น​เดือน​หรือ​เป็น​ปี ตรง​ข้าม​กับ​หลักการ agile ที่​ว่า “working software คือ​มาตร​วัด​ความ​คืบ​หน้า​หลัก”
  5. มอง​ความ​คืบ​หน้า​จริง​ไม่​ออก — Fowler ชี้​ว่า​มัน “ง่าย​เกิน​ไป​ที่​จะ​ประกาศ​ว่า​เฟส​หนึ่ง​เสร็จ​แล้ว” ทั้ง​ที่​ยัง​มี​งาน​ซ่อน​อยู่​มาก โครงการ​อาจ​ดูเหมือน​คืบ​ไป 90% บน​เอกสาร​มา​หลาย​เดือน แล้ว​ค้าง​อยู่​ที่ 90% นั้น​ตลอด​ไป​เมื่อ​ถึง​เฟส integration — อาการ​เดียว​กับ Death by Planning
  6. ต้านทาน​การ​เปลี่ยนแปลง​โดย​ธรรมชาติ — เมื่อ​ทุก​อย่าง​ผูก​กับ​เอกสาร​ที่​เซ็น​อนุมัติ​แล้ว การ​เปลี่ยน requirement กลาง​ทาง​กลาย​เป็น​เรื่อง​ราคา​แพง​และ​น่า​กลัว ทั้ง​ที่​ใน​โลก​จริง​ความ​ต้องการ​ทาง​ธุรกิจ​เปลี่ยน​ตลอด agile จึง​เลือก “ต้อนรับ​การ​เปลี่ยนแปลง​แม้​ใน​ช่วง​ท้าย” แทนที่​จะ​สู้​กับ​มัน
  7. บ่ม​เพาะ​แอน​ติ pattern อื่น​ต่อ​เนื่อง — เฟส design ที่​ต้อง​ปิด​ให้​สมบูรณ์​ก่อน​เขียน code คือ​แหล่ง​กำเนิด​โดยตรง​ของ Big Design Up Front และ​ความ​พยายาม​ทำ​เอกสาร​ให้ “ครบ​และ​ถูก 100%” ก็​ลาก​ไป​สู่ Analysis Paralysis ได้​ง่าย ยิ่ง​เพิ่ม​คน​เข้าไป​เร่ง​โครงการ​ที่​ล่าช้า​ใน​กรอบ​นี้ ก็​ยิ่ง​ช้า​ลง​ตาม Brooks’s Law

ลอง​นึกถึง​โครงการ​ระบบ order-processing ที่​วางแผน​ไว้ 12 เดือน​แบบ Waterfall เต็ม​รูปแบบ

  • เดือน​ที่ 1–2 ทีม business analyst เก็บ requirement จน​ได้​เอกสาร spec หนา​หลาย​ร้อย​หน้า ผู้​มี​ส่วน​ได้​ส่วน​เสีย​เซ็น​อนุมัติ ข้อ​กำหนด​ถูก “แช่แข็ง”
  • เดือน​ที่ 3–5 ทีม​สถาปนิก​ออกแบบ​ทุก class ทุก interface ทุก​ตาราง​ฐาน​ข้อมูล​บน​กระดาษ ส่ง​มอบ​เอกสาร design ให้​เซ็น​อีก​ครั้ง
  • เดือน​ที่ 6–9 ทีม​พัฒนา​เขียน code ตาม design โดย​แทบ​ไม่มี​ใคร​รัน​ทั้ง​ระบบ​พร้อม​กัน แต่ละ​คน​ทำ module ของ​ตัวเอง​ตาม spec
  • เดือน​ที่ 10 ถึง​เวลา integration ครั้ง​แรก module ทั้งหมด​ถูก​นำ​มา​ต่อ​กัน แล้ว​ความ​จริง​ก็​ปรากฏ: สมมติฐาน​เรื่อง throughput ผิด, กติกา​ส่วนลด​ที่​ธุรกิจ​ใช้​เปลี่ยน​ไป​ตั้งแต่​เดือน​ที่ 4, และ interface ระหว่าง​ทีม​ไม่​เข้า​กัน​ใน​หลาย​จุด
  • เดือน​ที่ 11–12 ทีม​เข้า​สู่​โหมด Death March เร่ง​แก้​ย้อน​กลับ​ไป​ทุก​เฟส ทำงาน​ล่วง​เวลา ตัด feature ทิ้ง เพื่อ​พยายาม​ส่ง​มอบ​ให้​ทัน​เส้นตาย

หัวใจ​ของ​ปัญหา​ไม่​ได้​อยู่​ที่​ทีม​ทำงาน​ไม่​เก่ง แต่​อยู่​ที่ โครงสร้าง​กระบวนการ​เลื่อน​ช่วง​เวลา​แห่ง​การ​เรียนรู้​ไป​ไว้​ท้าย​สุด ทุก​ความ​เสี่ยง​ถูก​กอง​รวม​ไว้​ใน​เดือน​ที่ 10 จุด​เดียว

ถ้า​โครงการ​เดียวกัน​นี้​เดิน​แบบวน​ซ้ำ ทีม​จะ​เลือก feature ที่​สร้าง​คุณค่า​สูงสุด​หนึ่ง​อย่าง (เช่น “รับ​ออร์เดอร์​และ​ตัด​สต็อก​ได้​จริง”) แล้ว​ทำ​ทะลุ​ทุก layer ให้​ผู้​ใช้​ลอง​ใช้​ภายใน​สอง​สัปดาห์​แรก กติกา​ส่วนลด​ที่​เปลี่ยน​และ​ปัญหา throughput จะ​ถูก​ค้น​พบ​ตั้งแต่​เดือน​ที่ 1–2 ใน​ขณะ​ที่ code ยัง​เล็ก​และ​แก้​ได้​ถูก แทนที่​จะ​ระเบิด​พร้อม​กัน​ตอน​เดือน​ที่ 10

เปรียบเทียบ​บน​แกน​ที่​สำคัญ

  • ความ​เสี่ยง​ถูก​เปิดเผย​เมื่อไร — Waterfall: กระจุก​ตอน​ท้าย (integration/testing) · แบบวน​ซ้ำ: ทยอย​เปิดเผย​ทุกรอบ​ตั้งแต่​ต้น
  • ความ​ยาว​ของ feedback loop — Waterfall: เป็น​เดือน​ถึง​เป็น​ปี · แบบวน​ซ้ำ: เป็น​วัน​ถึง​เป็น​สัปดาห์
  • ต้นทุน​ของ​การ​เปลี่ยน requirement — Waterfall: สูง​และ​เพิ่ม​ขึ้น​ตาม​เวลา · แบบวน​ซ้ำ: คงที่​และ​จัดการ​ได้​เพราะ​ปรับ​ที​ละ​รอบ
  • มาตร​วัด​ความ​คืบ​หน้า — Waterfall: เอกสาร​ที่​เซ็น​เสร็จ​ใน​แต่ละ​เฟส · แบบวน​ซ้ำ: ซอฟต์แวร์​ที่​รัน​ได้​จริง​และ​ถูก​ใช้งาน

ทาง​แก้​ไม่ใช่​การ​เลิก​วางแผน​หรือ​เลิก​ออกแบบ แต่​คือ​การ เปลี่ยน​จาก​การ​แบ่ง​งาน​ตาม​ชนิด​กิจกรรม มา​เป็นการ​แบ่ง​งาน​ตาม​คุณค่า​ที่​ส่ง​มอบ​ได้ แล้ว​วน loop สั้น ๆ ซ้ำ ๆ ให้​เรียนรู้​จาก​ของ​จริง​เร็ว​ที่สุด นี่​คือ​หัวใจ​ของ​แนวทาง iterative/incremental และ agile — และ​น่า​คิด​ว่า​มัน​คือ​สิ่ง​ที่ Royce เสนอ​ไว้​ตั้งแต่​ปี 1970 อยู่​แล้ว (ทำ​แต่ละ​ขั้น​ซ้ำ, มี feedback, ดึง​ลูกค้า​เข้า​มา​ร่วม)

flowchart TD
    W1[Requirements] --> W2[Design]
    W2 --> W3[Implementation]
    W3 --> W4[Testing]
    W4 --> W5[Deployment]
    W5 --> W6[bug ใหญ่โผล่ตอนท้าย ต้องรื้อย้อนหลัง]

    I1[วางแผนรอบสั้น] --> I2[สร้าง feature ที่ใช้ได้จริง]
    I2 --> I3[ทดสอบและรับ feedback จากผู้ใช้]
    I3 --> I4[ปรับแผนตามของจริง]
    I4 --> I1

หลัก​ปฏิบัติ​ที่​ช่วย​พลิก​จาก Waterfall ไป​สู่​การ​พัฒนา​แบบวน​ซ้ำ:

  • ส่ง​มอบ​เป็น Vertical Slice บาง ๆ ที่​ใช้งาน​ได้​จริง (Vertical Slices) — แทนที่​จะ​ทำ​ทุก layer ให้​ครบ​ที​ละ layer ให้​เลือก feature เดียว​แล้ว​ทำ​ทะลุ​ตั้งแต่ UI จนถึง​ฐาน​ข้อมูล​ให้​ใช้ได้​จริง ผู้​ใช้​จะ​ได้​ของ​ไป​ลอง​และ​ให้ feedback ตั้งแต่​สัปดาห์​แรก ๆ
  • ผสาน analysis, design, code, test เข้า​ไว้​ใน​ทุกรอบ ไม่ใช่​แยก​เป็น​เฟส การ​ทดสอบ​ต้อง​เกิด​ต่อ​เนื่อง ไม่ใช่​ด่าน​สุดท้าย — ใช้ Test-Driven Development และ Behavior-Driven Development เพื่อ​เปลี่ยน​ข้อ​กำหนด​ให้​เป็น​ตัวอย่าง​ที่​รัน​ตรวจ​ได้​ทันที
  • integrate ตลอด​เวลา ไม่ใช่​ครั้ง​เดียว​ตอน​ท้าย (Continuous Integration) — กำจัด​ความ​เสี่ยง big-bang integration ด้วย​การ​รวม code และ​รัน build อัตโนมัติ​ทุก​วัน ปัญหา​การ​เข้า​กัน​ของ module จะ​โผล่​ที​ละ​นิด​ใน​ขณะ​ที่​ยัง​แก้​ง่าย
  • ตัด​รอบ​ให้​สั้น​ด้วย​การ timebox (Timeboxing) — กำหนด​กรอบ​เวลา​คงที่​ต่อ​รอบ (เช่น 1–2 สัปดาห์) แล้ว​ปรับ scope ให้​พอดี​กรอบ แทนที่​จะ​ยืด​เวลา​ออก​ไป​เรื่อย ๆ เพื่อ​ทำ scope ที่​ตายตัว
  • ให้​ทั้ง​ทีม​ทำงาน​ร่วม​กัน​ต่อ​เนื่อง ไม่ใช่​ส่ง​งาน​เป็น​ทอด ๆ (Whole Team Activity) — ทลาย​กำแพง​ระหว่าง analyst, dev, QA และ business ให้​อยู่​ใน loop feedback เดียวกัน สอดคล้อง​กับ​หลักการ agile ที่​ว่า​ธุรกิจ​และ​นัก​พัฒนา​ต้อง​ทำงาน​ด้วย​กัน​ทุก​วัน
  • เก็บ design ระดับ​สูง​ไว้ ปล่อย​รายละเอียด​ให้​ค่อย ๆ งอก — วาง​ทิศทาง​สถาปัตยกรรม​และ​เป้าหมาย​รวม​ไว้ (Architectural Agility) แต่​ไม่​ต้อง​ล็อก​ทุก​รายละเอียด​ล่วงหน้า ให้ design วิวัฒน์​ตาม feedback จริง​ต่อ​เนื่อง
  • สร้าง​ระบบ​ง่าย​ที่​ใช้งาน​ได้​ก่อน แล้ว​ค่อย​วิวัฒน์ (Gall’s Law) — ระบบ​ซับซ้อน​ที่​ทำงาน​ได้​ดี​มัก​วิวัฒน์​มา​จาก​ระบบ​ง่าย​ที่​ทำงาน​ได้​ก่อน​เสมอ ไม่ใช่​ถูก​ออกแบบ​ให้​ครบ​สมบูรณ์​ตั้งแต่​ต้น​แล้ว​เปิด​สวิตช์​ที​เดียว ซึ่ง​เป็น​สมมติฐาน​ที่ Waterfall ตั้ง​ไว้​โดย​ปริยาย

เป้าหมาย​ไม่ใช่ “ไม่มี​แผน” แต่​คือ แผนที่​ปรับ​ได้ ที่​ให้​โอกาส​ระบบ​เรียนรู้​และ​แก้​ทาง​ตั้งแต่​เนิ่น ๆ ก่อน​ที่​ความ​ผิดพลาด​จะ​กลาย​เป็น​ของ​แพง