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

Know Where You Are Going

อย่า​เขียน code โดย​ปิด​ตา — เข้าใจ​ว่า​สิ่ง​ที่​สร้าง​จะ​ถูก​ใช้​แก้​ปัญหา​อะไร

“Know Where You Are Going” คือ​แนว​ปฏิบัติ​ที่​เตือน​นัก​พัฒนา​ไม่​ให้​เขียน code โดย​สวม​ที่​บังตา (blinders) — จง​เข้าใจ​ก่อน​ลงมือ​ว่า​สิ่ง​ที่​กำลัง​สร้าง​จะ​ถูก​ใช้​อย่างไร และ​มัน​มี​ไว้​แก้​ปัญหา​อะไร​ให้​ใคร แนวคิด​นี้​ไม่ใช่​เรื่อง​ใหม่ นักวิชาการ​ด้าน requirements engineering อย่าง Barry Boehm เคย​แยก​งาน​สอง​แบบ​ไว้​ตั้งแต่​ปี 1981 ว่า requirements engineering คือ​การ “ออกแบบ​สิ่ง​ที่​ถูกต้อง” (designing the right thing) ใน​ขณะ​ที่ software engineering คือ​การ “ออกแบบ​ให้​ถูก​วิธี” (designing the thing right) — สอง​อย่าง​นี้​เป็น​คนละ​ทักษะ คนละ​ความ​เสี่ยง และ​ล้มเหลว​ได้​คนละ​แบบ

ปัญหา​คือ​นัก​พัฒนา​มัก​ถูก​ดึงดูด​เข้า​สู่ tunnel vision โดย​ธรรมชาติ​ของ​อาชีพ​เอง โจทย์​เชิง​เทคนิค​ที่​ท้าทาย​หรือ​น่า​ตื่นเต้น (เช่น ลอง pattern ใหม่ เขียน abstraction ที่​สวยงาม หรือ optimize ส่วน​ที่​ไม่มี​ใคร​วัด) ดึง​ความ​สนใจ​ไป​จาก​คำถาม​ที่​สำคัญ​กว่า: งาน​นี้​เพิ่ม​คุณค่า​ให้​ผู้​ใช้​จริง​หรือ​ไม่? ผลลัพธ์​ที่​พบ​บ่อย​เมื่อ​หลง​ทาง​คือ over-engineering — สร้าง​สิ่ง​ที่​ซับซ้อน​เกิน​ความ​จำเป็น หรือ​แย่​ยิ่ง​กว่า​นั้น​คือ​สร้าง ของ​ผิด​ตัว ไป​เลย ทำงาน​ถูกต้อง​ตาม spec ทุก​กระเบียด​นิ้ว แต่​ไม่มี​ใคร​ต้องการ​มัน

Steve Smith (ผู้​เขียน​ต้นฉบับ​ของ​แนว​ปฏิบัติ​นี้​ใน DevIQ) ขยาย​ความ​เรื่อง​นี้​ใน block ส่วนตัว​ของ​เขา​ว่า​องค์กร​มัก​ตก​อยู่​ใน false dichotomy ระหว่าง “Build The Right Thing” (การ​ค้นหา​ว่า​ลูกค้า​ต้องการ​อะไร​จริง ๆ ผ่าน lean product development) กับ “Build The Thing Right” (การ​ส่ง​มอบ​อย่าง​มี​ประสิทธิภาพ​ผ่าน continuous delivery) — ทีม​ที่​ประสบ​ความ​สำเร็จ​ต้อง​พัฒนา​ทั้ง​สอง​ความ​สามารถ​ไป​พร้อม​กัน เพราะ​ทีม​ที่​ส่ง​มอบ​เก่ง​แต่​ไม่รู้​ว่า​จะ​สร้าง​อะไร​ก็​สูญเสีย​ความ​ได้​เปรียบ​ใน​ตลาด​พอ ๆ กับ​ทีม​ที่​รู้​ว่า​ควร​สร้าง​อะไร​แต่​ส่ง​มอบ​ไม่ทัน

วิธี​ที่​ตรง​ไป​ตรง​มา​ที่สุด​ใน​การ​เลี่ยง tunnel vision คือ ไป​นั่ง​กับ​ผู้​ใช้​จริง สังเกต​ว่า​วัน​นี้​พวก​เขา​ใช้​ซอฟต์แวร์​ทำ​อะไร หรือ​ถ้า​ยัง​ไม่มี​ซอฟต์แวร์ ก็​ดู​ว่า​พวก​เขา​ทำงาน​ให้​เสร็จ​โดย​ไม่มี​มัน​ได้​อย่างไร รับฟัง​ไอเดีย​ของ​พวก​เขา​และ​สะท้อน​ไอเดีย​ของ​เรา​กลับ​ไป จาก​นั้น​ถ้า​องค์กร​เอื้อ​อำนวย ให้​ส่ง​ของ​ไป​ให้​ผู้​ใช้​จริง​ลอง​เร็ว​ที่สุด​แม้​จะ​ยัง​ไม่​สมบูรณ์ เพื่อ​เก็บ feedback ให้​เร็ว — ยิ่ง​รู้​เร็ว​ว่า​กำลัง​ออก​นอก​เส้นทาง ก็​ยิ่ง​ใช้​ความ​พยายาม​น้อย​ลง​ใน​การ​ดึง​กลับ​เข้า​ทาง หลักการ​นี้​ตรง​กับ​สิ่ง​ที่ fail fast พูด​ถึง: ล้มเหลว​ให้​เร็ว​และ​ถูก ดี​กว่า​ล้มเหลว​ช้า​และ​แพง

ใน​ทาง​ปฏิบัติ มี​กลไก​หลาย​แบบ​ที่​ช่วย​ให้​ทีม​พัฒนา “รู้​ว่า​กำลัง​ไป​ทาง​ไหน” อย่าง​ต่อ​เนื่อง แทนที่​จะ​พึ่งพา Big Design Up Front (BDUF) ที่​ตั้งใจ​ให้​สมบูรณ์​แบบ​ตั้งแต่​ต้น:

  • สร้าง Minimum Viable Product (MVP) — ตาม​แนวคิด Lean Startup ของ Eric Ries คือ​สร้าง version ที่​เล็ก​ที่สุด​เท่า​ที่​จะ​เก็บ validated learning เกี่ยว​กับ​ผู้​ใช้ได้​มาก​ที่สุด​ด้วย​ความ​พยายาม​น้อย​ที่สุด แล้ว​วน loop Build–Measure–Learn ซ้ำ ๆ
  • ทำ backlog refinement อย่าง​สม่ำเสมอ — ตาม Azure DevOps ของ Microsoft การ​รักษา​ความ​ชัดเจน​ของ user story ที่​อยู่​หัว backlog ล่วงหน้า 2–3 sprint ช่วย​ให้​ทีม​มั่นใจ​ว่า​กำลัง​ทำงาน​ที่​ตรง​กับ​ความ​ต้องการ​ลูกค้า​จริง ไม่ใช่​แค่​ตรง​ตาม spec ที่​เขียน​ไว้​นาน​แล้ว
  • ใช้ dual-track agile — แยก​งาน discovery (ควร​สร้าง​อะไร และ​สร้าง​แบบ​ไหน) ออก​จาก​งาน delivery (สร้าง​อย่างไร​ให้​มี​คุณภาพ) ให้​ทำงาน​คู่​ขนาน​กัน​ตลอด​เวลา ไม่ใช่​ทำ discovery ครั้ง​เดียว​จบ​ก่อน​เริ่ม delivery
  • จัด​ลำดับ​งาน​ด้วย Cost of Delay — เมื่อ​ไม่​แน่ใจ​ว่า​อะไร​คือ “ของ​ถูกต้อง” ให้​วัด​คุณค่า​เชิง​เศรษฐศาสตร์​ของ​แต่ละ​ตัว​เลือก​เทียบ​กับ​ต้นทุน​ที่​เสีย​ไป​หาก​ล่าช้า แทนที่​จะ​เดา​ใจ​เอา​เอง
  • ผูก task กับ acceptance criteria ที่มา​จาก​ผู้​ใช้ ไม่ใช่​จาก​รายละเอียด​ทาง​เทคนิค​เพียง​อย่าง​เดียว เพื่อ​ให้​ทุก​คนใน​ทีม​เห็น​ภาพ​เดียวกัน​ว่า “เสร็จ” หมาย​ถึง​อะไร​จาก​มุมมอง​ของ​คน​ที่​จะ​ใช้งาน​จริง

ต่อ​ไป​นี้​คือ​ลำดับ​ความคิด​แบบ​สั้น ๆ ที่​ช่วย​เช็ค​ตัวเอง​ก่อน​เริ่ม​งาน​แต่ละ​ชิ้น:

flowchart TD
    Start[เริ่มงานใหม่] --> Ask{รู้หรือไม่ว่าใครใช้และทำไม}
    Ask -->|ไม่รู้| Talk[ไปคุยกับผู้ใช้หรือ product owner]
    Talk --> Ask
    Ask -->|รู้| Build[สร้างส่วนที่เล็กที่สุดที่พิสูจน์ประโยชน์ได้]
    Build --> Ship[ส่งให้ผู้ใช้จริงได้ลองเร็วที่สุด]
    Ship --> Feedback{ตรงกับที่ผู้ใช้ต้องการหรือไม่}
    Feedback -->|ไม่ตรง| Adjust[ปรับทิศทางตอนที่ต้นทุนยังต่ำ]
    Adjust --> Build
    Feedback -->|ตรง| Continue[ทำซ้ำรอบถัดไป]

สมมติ​ทีม​ได้​รับ requirement คลุมเครือ​ว่า “ทำ​ระบบ​แจ้ง​เตือน​ลูกค้า​เมื่อ​สินค้า​ใกล้​หมด” นัก​พัฒนา​ที่​ทำงาน​แบบ​ปิด​ตา​อาจ​รีบ​กระโดด​ไป​ออกแบบ generic notification engine ที่​รองรับ​ทุก channel (email, SMS, push, webhook) พร้อม template engine และ retry policy ที่​ซับซ้อน — เพราะ​มัน​เป็น​โจทย์​ที่​ท้าทาย​ทาง​เทคนิค แต่​ยัง​ไม่มี​ใคร​ถาม​ผู้​ใช้​เลย​ว่า​จริง ๆ แล้ว​พวก​เขา​ต้องการ​รู้​ล่วงหน้า​กี่​วัน หรือ​แค่​ต้องการ​เห็น​ตัวเลข​บน​หน้า dashboard ที่​เปิด​อยู่​แล้ว​ทุก​วัน​ก็​พอ

แนวทาง​ที่​สอดคล้อง​กับ “Know Where You Are Going” คือ​เริ่ม​จาก​คำถาม​ง่าย ๆ ก่อน​ออกแบบ แล้ว​ปล่อย version เล็ก​ที่สุด​ที่​พิสูจน์​คุณค่า​ได้​ก่อน:

// version แรก: ตอบคำถามของผู้ใช้ให้ตรงจุดที่สุดเท่าที่จำเป็น
// ไม่สร้าง abstraction สำหรับ channel ที่ยังไม่มีใครขอใช้
public sealed class LowStockDashboardBadge
{
private readonly IInventoryReadModel _inventory;
public LowStockDashboardBadge(IInventoryReadModel inventory)
{
_inventory = inventory;
}
// แสดงบนหน้า dashboard ที่ลูกค้าเปิดอยู่แล้วทุกวัน
// เพราะจากการนั่งคุยกับผู้ใช้ พบว่าพวกเขาไม่ได้อยากได้อีเมลเพิ่ม
public IReadOnlyList<LowStockItem> GetItemsBelowThreshold(StoreId storeId)
{
return _inventory
.GetCurrentStock(storeId)
.Where(item => item.QuantityOnHand <= item.ReorderThreshold)
.Select(item => new LowStockItem(item.Sku, item.QuantityOnHand, item.ReorderThreshold))
.ToList();
}
}
public sealed record LowStockItem(string Sku, int QuantityOnHand, int ReorderThreshold);

ถ้า​หลัง​จาก​ปล่อย version นี้​แล้ว​ผู้​ใช้​จริง​บอกว่า​อยาก​ได้​แจ้ง​เตือน​ผ่าน​อีเมล​ด้วย​เมื่อ​ไม่​ได้​เปิด dashboard ทีม​จึง​ค่อย​ขยาย abstraction ให้​รองรับ channel ที่​สอง — ต้นทุน​ของ​การ​เปลี่ยน​ทิศทาง​ตอน​นี้​ต่ำ​กว่า​การ​รื้อ generic notification engine ที่​สร้าง​ไว้​ล่วงหน้า​โดย​ไม่มี​ใคร​ใช้​จริง​มาก

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

ข้อ​ควร​ระวัง​คือ:

  • อย่า​ตีความ​เป็น​ข้อ​อ้าง​สำหรับ BDUF — เป้าหมาย​ไม่ใช่​การ​วางแผน​ทุก​อย่าง​ให้​สมบูรณ์​ก่อน​เริ่ม แต่​คือ​การ​มี วิสัยทัศน์​รวม (overall vision) ที่​ชัด​พอ​จะ​เริ่ม​งาน แล้ว​ปรับปรุง​ต่อ​เนื่อง​เมื่อ​เรียนรู้มาก​ขึ้น
  • การ​พบ​ผู้​ใช้​ต้อง​มี​โครงสร้าง ไม่ใช่​แค่​คุย​เล่น — ถ้า​ไม่มี​คำถาม​หรือ​สมมติฐาน​ที่​ชัดเจน​ก่อน​ไป​คุย อาจ​ได้​ข้อมูล​ที่​ตีความ​ผิด​หรือ noise มากกว่า signal
  • ระวัง survivorship bias จาก​ผู้​ใช้​กลุ่ม​เดียว — ผู้​ใช้​ที่​เข้าถึง​ง่าย​ที่สุด​อาจ​ไม่ใช่​ตัวแทน​ของ​ฐาน​ผู้​ใช้​ทั้งหมด
  • ต้อง​มี​ทั้ง Build The Right Thing และ Build The Thing Right — ทีม​ที่​รู้​ทิศทาง​ถูกต้อง​แต่​ส่ง​มอบ​ช้า​หรือ​คุณภาพ​ต่ำ ก็​เสีย​โอกาส​ใน​ตลาด​ไม่​ต่าง​จาก​ทีม​ที่​หลง​ทาง
  • สมมติฐาน​ตั้งต้น​จะ​ผิด​เสมอ​บาง​ส่วน — นี่​เป็น​เรื่อง​ปกติ​ของ​กระบวนการ​เรียนรู้ ไม่ใช่​สัญญาณ​ว่า​ทีม​ล้มเหลว ตราบ​ใด​ที่​รู้ตัว​เร็ว​และ​ปรับ​ทิศทาง​ได้​ทัน

“ใน​ฐานะ​นัก​พัฒนา เรา​มี​ทาง​ล้มเหลว​อยู่​สอง​ทาง: เรา​สร้าง​ของ​ถูก​วิธี​แต่​ผิด​ตัว หรือ​เรา​สร้าง​ของ​ผิด​ตั้งแต่​แรก”

— Steve Smith