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

Smoke and Mirrors

โชว์​ลูกค้า​สิ่ง​ที่​ยัง​ไม่มี​จริง แล้ว​หวัง​ว่า​ทีม​จะ​สร้าง​มัน​ขึ้น​มา​ทัน

Smoke and Mirrors คือ​แอนตี้​แพทเทิร์น​ระดับ​การ​จัดการ project (project management antipattern) ที่ William J. Brown และ​คณะ​บันทึก​ไว้​ใน​หนังสือ AntiPatterns: Refactoring Software, Architectures, and Projects in Crisis (1998) โดย​นิยาม​สั้น ๆ ว่า​คือ​การ “demonstrating how unimplemented functions will appear” — สาธิต​ให้​ลูกค้า​หรือ​ผู้​บริหาร​ดู​ว่า feature ที่ ยัง​ไม่​ถูก​สร้าง​ขึ้น​จริง จะ​มีหน้าตา​และ​ทำงาน​อย่างไร โดย​ไม่​ได้​บอก​ตรง ๆ ว่า​มัน​คือ​ของ​ปลอม

รูปแบบ​ทั่วไป​คือ demo ที่​ดู​สมบูรณ์​แบบ ปุ่ม​กด​ได้ หน้า​จอ​เปลี่ยน​ลื่น​ไหล แต่​เบื้องหลัง​กลับ​เป็น​แค่ wireframe, mockup, หรือ​แอนิเมชัน​ที่ hardcode ค่า​ไว้​ล่วงหน้า ไม่มี business logic จริง ไม่มี​การ​เชื่อม​ต่อ​ฐาน​ข้อมูล​จริง ทีม​ขาย​หรือ​ฝ่าย​การ​ตลาด​จึง​มัก​เรียก​แนวทาง​นี้​ว่า Marketing Driven Development — พัฒนา​สิ่ง​ที่ “ขาย​ได้” ก่อน แล้ว​ค่อย​หา​ทาง​ทำให้​มัน​ทำงาน​ได้​จริง​ทีหลัง

คำ​ว่า “smoke and mirrors” (ควัน​กับ​กระจก) มา​จาก​ศัพท์​ของ​นัก​มายากล ที่​ใช้​ควัน​และ​กระจก​บดบัง​กลไก​ที่แท้​จริง​ของ​กล​ลวงตา — เปรียบเทียบ​ได้​ตรง​ตัว​กับ​การ​สาธิต​ซอฟต์แวร์​ที่​สร้าง​ภาพลวงตา​ว่า​ระบบ​พร้อม​ใช้งาน​แล้ว

  • ปิด​ดีล​ได้​เร็ว — demo ที่​ดู​สมบูรณ์​สร้าง​ความ​ประทับใจ​และ​ความ​มั่นใจ​ให้​ลูกค้า​หรือ​นัก​ลงทุน​ได้​ทันที โดย​ไม่​ต้อง​รอ​ให้​ทีม​พัฒนา​สร้าง​ของ​จริง​ก่อน
  • สร้าง​อุปสงค์ (demand) ล่วงหน้า — ตราบ​ใด​ที่​สิ่ง​ที่​โชว์​ยัง​พอ​ส่ง​มอบ​ได้​จริง​ใน​ภายหลัง มัน​ก็​ช่วย​กระตุ้น​ตลาด​และ​ระดม​ความ​สนใจ​ได้​ดี
  • บีบ​ให้​ทีม​ทำงาน​เร็ว​ขึ้น — ผู้​บริหาร​บาง​คน​เชื่อ​ว่าการ​ตั้ง deadline จาก demo ที่ “ดู​ใกล้​เสร็จ​แล้ว” จะ​กดดัน​ให้​ทีม​โฟกัส​และ​ส่ง​มอบ​เร็ว​ขึ้น
  • เข้าใจ​ผิด​โดย​ไม่​ตั้งใจ — บาง​ครั้ง​คน​ที่​ไม่มี​พื้นฐาน​ด้าน​ซอฟต์แวร์ (เช่น​ผู้​บริหาร​หรือ​นัก​ขาย) เห็น prototype ที่​ทำงาน​ได้​บาง​ส่วน​แล้ว​เข้าใจ​ไป​เอง​ว่า​มัน​คือ​ระบบ​ที่​เสร็จ​สมบูรณ์ ทั้ง​ที่​ใน​ความ​เป็น​จริง​เบื้องหลัง​ยัง​ต้อง​ทำ​อีก​มาก โดย​เฉพาะ​งาน​ที่​มอง​ไม่​เห็น​อย่าง​การ​ออกแบบ​ฐาน​ข้อมูล​หรือ business logic
  • สัญญา​เกิน​จริง​ใน​กรอบ​เวลา​ที่​ไม่​สมจริง — เมื่อ​ลูกค้า​ถูก​บอก​ให้​คาด​หวัง “ทุก​อย่าง​ที่​เห็น​ใน demo” ภายใน​เวลา​สั้น ๆ นั่น​คือ​สูตร​ของ​หายนะ ทีม​พัฒนา​จะ​ต้อง​รับ​ภาระ​สร้าง​ของ​จริง​ให้​ทัน​ทั้ง​ที่ demo นั้น​ไม่​เคย​ผ่าน​การ​ประเมิน​ความ​เป็น​ไป​ได้​ทาง​เทคนิค​มา​ก่อน
  • ผลัก​ภาระ​และ​ความ​ผิด​ไป​ที่​ทีม​พัฒนา — เมื่อ​ผู้​ใช้​ปลายทาง​พบ​ว่า​ของ​จริง​ไม่​ตรง​กับ​ที่​เห็น​ใน demo ฝ่าย​ขาย/การ​ตลาด​มัก​โยน​ความ​ผิด​ให้​ทีม dev ว่า “ทำ​ไม่ทัน​ตาม​ที่​สัญญา​ไว้” ทั้ง​ที่​ทีม dev อาจ​ไม่​เคย​รู้เรื่อง demo นั้น​มา​ก่อน​ด้วย​ซ้ำ
  • บั่นทอน​ความ​ไว้​วางใจ — เมื่อ​ลูกค้า​หรือ​ผู้​ใช้​ค้น​พบ​ว่า feature ที่​เคย​เห็น​ทำงาน​ได้​ลื่น​ไหล​จริง ๆ แล้ว​เป็น​แค่ animation ที่​ไม่มี​อะไร​อยู่​ข้าง​หลัง ความ​เชื่อ​มั่น​ใน​ทีม​และ​องค์กร​จะ​เสียหาย​อย่าง​ถาวร ทั้ง​กับ​ลูกค้า​และ​กับ​ทีม​งาน​ภายใน​เอง
  • เป็น​สัญญาณ​ของ​วัฒนธรรม​ที่​มี​ความ​กลัว — ใน​องค์กร​ที่​ผู้​บริหาร​ดุร้าย​หรือ​ไม่​ยอมรับ​ข่าว​ร้าย ไม่มี​ใคร​กล้า​บอก​ความ​จริง​ว่า​งาน​ยัง​ไม่​เสร็จ ทีม​จึง​เห็น​ทางออก​ทาง​เดียว​คือ “ปลอม demo ให้​ผ่าน​ไป​ก่อน” ซึ่ง​ซ้ำเติม​ปัญหา​แทนที่​จะ​แก้
  • นำ​ไป​สู่​แอนตี้​แพทเทิร์น​อื่น​ต่อ​เนื่อง​กัน — เมื่อ​สัญญา​ไว้​เกิน​จริง​แล้ว ทีม​มัก​ถูก​บีบ​ให้​เข้า​สู่ Death March เพื่อ​ไล่​ตาม deadline ที่​ไม่​สมจริง หรือ​ใช้​ทาง​ลัด​แบบ Fast Beats Right จน​คุณภาพ code พัง
  • vaporware ทำลาย​กระบวนการ​ตัดสิน​ใจ — ใน​บริบท​การ​จัด​ซื้อ​ซอฟต์แวร์ (vendor evaluation) คำ​สัญญา​จาก demo ที่​ยัง​ไม่มี​จริง​สามารถ​ทำให้​ทีม​ประเมิน​และ​ตัดสิน​ใจ​เลือก​ผลิตภัณฑ์​ผิดพลาด เพราะ feature ที่​เห็น​ใน​การนำ​เสนอ​อาจ​ไม่มี​อยู่​จริง​ใน version ที่​จะ​ซื้อ

สมมติ​ทีม​ขาย​ต้อง​ปิด​ดีล​กับ​ลูกค้า​ราย​ใหญ่ จึง​สร้าง​หน้า​จอ dashboard ที่​ดู​สวยงาม​และ “คลิก​ได้” ทุก​ปุ่ม แต่​ข้อมูล​ทั้งหมด​ถูก hardcode ไว้ ไม่มี​การ​ต่อ API หรือ​ฐาน​ข้อมูล​จริง​เลย แล้ว​สัญญา​กับ​ลูกค้า​ว่า “ระบบ​เต็ม​รูปแบบ​จะ​พร้อม​ใช้งาน​ใน 6 สัปดาห์”

// ตัวอย่างแอนตี้แพทเทิร์น: หน้าจอ demo ที่ hardcode ข้อมูลไว้ล่วงหน้า
// เพื่อให้ดูเหมือนระบบ Order Management ทำงานได้ครบวงจรแล้ว
public class OrderDashboardDemoController
{
// ข้อมูลปลอมถูกฝังไว้ตรง ๆ ไม่มี service หรือ repository จริงรองรับ
private readonly List<OrderSummary> _fakeOrders = new()
{
new OrderSummary { Id = 1001, Customer = "Acme Co.", Status = "Shipped", Total = 4599.00m },
new OrderSummary { Id = 1002, Customer = "Globex", Status = "Processing", Total = 1250.00m },
};
// ปุ่ม "Approve" ใน demo แค่เปลี่ยนสถานะในหน่วยความจำ
// ไม่มี business rule, ไม่มีการตรวจสอบสต็อกจริง, ไม่มีการเชื่อมต่อระบบชำระเงิน
public void ApproveOrder(int orderId)
{
var order = _fakeOrders.Find(o => o.Id == orderId);
if (order != null)
{
order.Status = "Approved"; // แค่ทำให้ดูเหมือนใช้งานได้จริงตอน demo เท่านั้น
}
}
}

ทีม​ขาย​นำ code นี้​ไป​ฉาย demo ให้​ลูกค้า​ดู ลูกค้า​พอใจ​มาก​และ​เซ็น​สัญญา​โดย​เข้าใจ​ว่า​ระบบ​พร้อม​ใช้งาน​เกือบ​ทั้งหมด​แล้ว เหลือ​แค่ “ปรับ​แต่ง​เล็กน้อย” — ทั้ง​ที่​ใน​ความ​เป็น​จริง​ยัง​ไม่มี database schema, ไม่มี integration กับ​ระบบ​คลัง​สินค้า, ไม่มี​การ​จัดการ concurrency หรือ error handling ใด ๆ เลย เมื่อ​ทีม dev ได้​รับ requirement พร้อม deadline 6 สัปดาห์​ที่​ตั้ง​มา​จาก demo ที่​ไม่​เคย​ผ่าน​การ​ประเมิน​ทาง​เทคนิค ทีม​จึง​ตก​อยู่​ใน​สถานการณ์​ที่​ต้อง​เร่งรีบ​สร้าง​ระบบ​จริง​ทั้งหมด​ใน​เวลา​ที่​ไม่​พอ

flowchart LR
    Sales[ทีมขายสร้าง Demo ปลอม]
    Promise[สัญญา Deadline ที่ไม่สมจริง]
    Dev[ทีม Dev ต้องสร้างของจริงให้ทัน]
    Gap[ช่องว่างระหว่างของจริงกับที่สัญญาไว้]
    DeathMarch[ทีมเข้าสู่ Death March]
    Trust[ลูกค้าเสียความไว้วางใจ]

    Sales --> Promise
    Promise --> Dev
    Dev --> Gap
    Gap --> DeathMarch
    Gap --> Trust
  • Underpromise, overdeliver — สัญญา​น้อย​กว่า​ที่​ทำได้​จริง​เสมอ อย่า​ตั้ง​กรอบ​เวลา​หรือ​ขอบเขต feature จาก demo ที่​ยัง​ไม่​ผ่าน​การ​ประเมิน​ทาง​เทคนิค​จาก​ทีม​พัฒนา
  • ให้​ทีม​พัฒนา​มี​ส่วนร่วม​ก่อน​สัญญา — ฝ่าย​ขาย​หรือ​การ​ตลาด​ต้อง​ปรึกษา​ทีม dev ก่อน​ตั้ง​ความ​คาด​หวัง​ใด ๆ กับ​ลูกค้า เพื่อ​ประเมิน effort และ​ความ​เป็น​ไป​ได้​จริง​ก่อน​พูด​ออก​ไป
  • ทำงาน​ใกล้​ชิด​กับ​ลูกค้า​ตลอด​กระบวนการ — ให้​ลูกค้า​เห็น​ผลิตภัณฑ์ ค่อย ๆ เติบโต จาก​ไอเดีย​สู่​ของ​จริง​ที​ละ​ขั้น (เช่น​ผ่าน iterative delivery หรือ MVP) แทนที่​จะ​เซอร์ไพรส์​ด้วย demo ที่​ดู​สมบูรณ์​ใน​ที​เดียว​แล้ว​พบ​ภายหลัง​ว่า​มัน​คือ​แค่ wireframe
  • บันทึก​สถานะ​ของ​ระบบ​เป็น​ลายลักษณ์​อักษร — ระบุ​ชัดเจน​ว่า feature ไหน “ใช้งาน​ได้​จริง” กับ “แค่​ต้นแบบ” เพื่อ​ป้องกัน​ความ​เข้าใจ​ผิด​โดย​ไม่​ตั้งใจ ทั้ง​จาก​ผู้​บริหาร​และ​จาก​ลูกค้า
  • ระบุ demo เป็น prototype อย่าง​ชัดเจน — หาก​จำเป็น​ต้อง​สาธิต​ของ​ที่​ยัง​ไม่​เสร็จ ต้อง​บอก​ตรง ๆ ว่า​นี่​คือ prototype/mockup ไม่ใช่ version ที่​พร้อม production พร้อม​ระบุ​ด้วย​ว่า​ส่วน​ไหน​ยัง hardcode อยู่
  • ใช้ Shipping Is A Feature เป็น​แนวทาง — ให้​ความ​สำคัญ​กับ​การ​ส่ง​มอบ​ของ​จริง​ที่​ทำงาน​ได้ (แม้​ขอบเขต​เล็ก​กว่า) มากกว่า​การ​สร้าง​ภาพลวงตา​ว่า​เสร็จ​แล้ว​ทั้ง​ระบบ
  • สร้าง​วัฒนธรรม​ที่​กล้า​บอก​ความ​จริง — ผู้​บริหาร​ต้อง​เปิด​ทาง​ให้​ทีม​รายงาน​สถานะ​จริง​ได้​โดย​ไม่​ถูก​ลงโทษ เพื่อ​ไม่​ให้​ใคร​รู้สึก​ว่า​ต้อง “ปลอม demo” เป็น​ทางออก​สุดท้าย