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

DDD สำหรับ​เรา

อยาก​เก่ง​ขึ้น​ใน​งาน​ที่​ทำ อยาก​ให้ project ประสบ​ความ​สำเร็จ​มาก​ขึ้น อยาก​ช่วย​ให้​ธุรกิจ​ของ​ตัวเอง​แข่งขัน​ใน​ระดับ​ที่​สูง​ขึ้น​ด้วย​ซอฟต์แวร์​ที่​สร้าง​ขึ้น​มา​เอง อยาก​เขียน​ซอฟต์แวร์​ที่​ไม่​เพียง “เข้าใจ​สิ่ง​ที่​ธุรกิจ​ต้องการ​อย่าง​ถูกต้อง” แต่​ยัง​ทำงาน​ได้ที่​ระดับ scale บน​สถาปัตยกรรม​สมัย​ใหม่​ที่สุด — การ​เรียนรู้ Domain-Driven Design (DDD)Domain-Driven Design (DDD)แนวทาง​พัฒนา​ซอฟต์แวร์​ที่​เน้น​สร้าง domain model ซึ่ง​เข้าใจ​กฎ​และ​กระบวนการ​ของ​ธุรกิจ​อย่าง​ลึกซึ้ง แล้ว​เขียน​ลง​ใน code จริง บัญญัติ​โดย Eric Evans (2003) แบ่ง​เป็น Strategic และ Tactical DesignStrategic Design และ​เรียนรู้​ได้​อย่าง​รวดเร็ว คือ​เส้นทาง​ที่​พา​ไป​ถึง​ทั้งหมด​นั้น​และ​มากกว่า​นั้น

DDD คือ​กล่อง​เครื่องมือ​ที่​ช่วย​ออกแบบ​และ​สร้าง​ซอฟต์แวร์​ซึ่ง​ให้​คุณค่า​สูง ทั้ง​ใน​เชิงกลยุทธ์ (strategic) และ​เชิง​ยุทธวิธี (tactical) องค์กร​เก่ง​ทุก​เรื่อง​ไม่​ได้ จึง​ต้อง เลือก​อย่าง​รอบคอบ​ว่า​จะ​โดด​เด่น​เรื่อง​อะไร เครื่องมือ​เชิงกลยุทธ์​ของ DDD ช่วย​ให้​ทีม​เลือก​แนวทาง​ออกแบบ​และ​ตัดสิน​ใจ​เรื่อง​การ​เชื่อม​ต่อ​ระบบ​ที่​ได้​เปรียบ​ใน​การ​แข่งขัน​ที่สุด​สำหรับ​ธุรกิจ องค์กร​จะ​ได้​ประโยชน์​มาก​ที่สุด​จาก​ซอฟต์แวร์ model ที่​สะท้อน ความ​สามารถ​หลัก (core competencies) ของ​ตัวเอง​ออก​มา​อย่าง​ชัดเจน ส่วน​เครื่องมือ​เชิง​ยุทธวิธี​ก็​ช่วย​ให้​ทีม​ออกแบบ​ซอฟต์แวร์​ที่​จำลอง​กระบวนการ​เฉพาะ​ตัว​ของ​ธุรกิจ​ได้​อย่าง​แม่นยำ และ​นำ​ไป deploy ได้​หลากหลาย​รูปแบบ ทั้ง​บน​เครื่องใน​องค์กร​เอง​หรือ​บน​คลา​วด์

หนังสือ​เล่ม​นี้ (เขียน​โดย Vaughn Vernon) คือ DDD ฉบับ “กลั่น​เข้มข้น” — ครอบคลุม​ทั้ง​เครื่องมือ​เชิงกลยุทธ์​และ​เชิง​ยุทธวิธี แต่​บีบ​ให้​กระชับ เพราะ​ผู้​เขียน​เข้าใจ​ดี​ว่า​งาน​พัฒนา​ใน​อุตสาหกรรม​ที่​เร่งรีบ​นั้น​ไม่​เปิด​โอกาส​ให้​ใคร​หยุด​ไป​นั่ง​อ่าน​ตำรา​เรื่อง DDD เป็น​เดือนๆ ทั้ง​ที่​ก็​ยัง​อยาก​ลงมือ​ใช้ DDD ให้​เร็ว​ที่สุด​เท่า​ที่​จะ​ทำได้

ที่มา​ของ​ฉบับ​กลั่น

Vaughn Vernon คือ​ผู้​เขียน Implementing Domain-Driven Design [IDDD] ที่​ขาย​ดี และ​เป็น​ผู้​สอน​เวิร์กช็อป IDDD สาม​วัน​ให้​นัก​พัฒนา​ทั่ว​โลก หนังสือ​เล่ม​นี้​คือ DDD ใน​รูปแบบ​ที่ “บีบ​อัด​อย่าง​ถึงที่สุด” ส่วน​หนึ่ง​ของ​ความ​ตั้งใจ​ที่​จะ​พา DDD ไป​สู่​ทุก​ทีม​พัฒนา​ซอฟต์แวร์ — รวม​ถึง​พา​มา​ถึง​เรา​ทุก​คน​ด้วย


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

ภาพประกอบ: DDD ไม่จำเป็นต้องเจ็บปวด — เหมือนเปียโนที่กำลังหล่นลงมา แต่ถ้ารู้วิธีก็หลบทัน

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

ข่าวดี​คือ DDD ไม่​จำเป็น​ต้อง​เจ็บ​ปวด ใน​เมื่อ​เรา​ต้อง​รับมือ​กับ​ความ​ซับซ้อน​ใน project อยู่​แล้ว​ทุก​วัน DDD นี่แหละ​ที่​จะ​ช่วย ลด​ความ​เจ็บ​ปวด จาก​การ​เอาชนะ​ความ​ซับซ้อน​นั้น​ลง​ได้

หัวใจ​ของ​บท​นี้

DDD ไม่ใช่ “ความ​หรูหรา​ทาง​วิชาการ” แต่​คือ กล่อง​เครื่องมือ​เชิง​ปฏิบัติ ที่​ช่วย​ให้​ทีม​เลือก​แนวทาง​ออกแบบ​และ​การ​เชื่อม​ต่อ​ระบบ​ที่​ได้​เปรียบ​ใน​การ​แข่งขัน​ที่สุด​สำหรับ​ธุรกิจ องค์กร​เก่ง​ทุก​เรื่อง​ไม่​ได้ — DDD ช่วย​ให้​เรา ลงแรง​ตรง​จุด​ที่​สำคัญ​ที่สุด


คน​เรา​มัก​พูด​กัน​ถึง design ที่​ดี​และ design ที่​แย่ แต่​ทีม​พัฒนา​จำนวน​มาก​กลับ​แทบ​ไม่​ได้​คิด​เรื่อง design เลย สิ่ง​ที่​ทำ​กัน​จริง​คือ​สิ่ง​ที่ Vernon เรียก​ว่า “การ​สับ Post-it บน​บอร์ด” (task-board shuffle) — ทีม​มี​รายการ task อยู่​ใน backlog แบบ Scrum แล้ว​ก็​แค่​ลาก Post-it จาก​ช่อง “To Do” ไป​ช่อง “In Progress” การ​คิด backlog item ขึ้น​มา​แล้ว​ทำ “task-board shuffle” นี้​กลาย​เป็น “ความคิด​เชิง​ลึก​ทั้งหมด” ที่​ทีม​มี ที่​เหลือ​ก็​ปล่อย​ให้​เป็น​วีรกรรม​การ​เขียน code ของ​โปรแกรมเมอร์​ที่ “ลุย​พ่น code กัน​ออก​มา” ผลลัพธ์​จึง​แทบ​ไม่​เคย​ดี​อย่าง​ที่​ควร​จะ​เป็น และ​ธุรกิจ​ที่​ต้อง​จ่าย​ราคา​แพง​ที่สุด​ให้​กับ design ที่​ไม่​เคย​มี​อยู่​จริง

เรื่อง​นี้​มัก​เกิด​จาก​แรง​กดดัน​ให้​ส่ง​มอบ​ซอฟต์แวร์​ตาม​ตาราง​ที่​ไม่​ยอม​ผ่อนปรน ฝ่าย​บริหาร​ใช้ Scrum เพื่อ คุม​ไทม์​ไลน์ เป็น​หลัก แทนที่​จะ​เปิด​ทาง​ให้​เกิด​สิ่ง​ที่​เป็น​หนึ่ง​ใน​หัวใจ​สำคัญ​ที่สุด​ของ Scrum นั่น​คือ “การ​ได้​มา​ซึ่ง​ความ​รู้” (knowledge acquisition)

สัญญาณ​อันตราย​ที่ DDD ช่วย​ให้​ทีม​หลีก​เลี่ยง​ได้

เวลา​ไป​ให้​คำ​ปรึกษา​หรือ​สอน​ตาม​องค์กร​ต่างๆ Vernon มัก​เจอ​สถานการณ์​เดิมๆ คือ project อยู่​ใน​ภาวะ​เสี่ยง และ​ทั้ง​ทีม​ถูก​จ้าง​มา​เพียง​เพื่อ​ประคอง​ให้​ระบบ​ยัง​เดิน​ต่อ​ได้ คอย​ปะ code และ​ข้อมูล​กัน​ทุก​วัน นี่​คือ​ปัญหา​ร้ายกาจ​ที่​พบ​บ่อย (ไล่​จาก​ระดับ​ธุรกิจ​ลง​มา​ถึง​ระดับ​เทคนิค) — และ​น่า​สนใจ​ว่า​ล้วน​เป็น​สิ่ง​ที่ DDD ช่วย​ให้​หลีก​เลี่ยง​ได้:

  • มอง​งาน​พัฒนา​ซอฟต์แวร์​เป็น ศูนย์​ต้นทุน (cost center) ไม่ใช่​ศูนย์​สร้าง​กำไร เพราะ​ธุรกิจ​มอง​คอมพิวเตอร์​และ​ซอฟต์แวร์​เป็น “ภาระ​จำเป็น” มากกว่า​จะ​เป็น​แหล่ง​ความ​ได้​เปรียบ​เชิงกลยุทธ์ (ถ้า​เป็น​วัฒนธรรม​องค์กร​ที่​ฝัง​ลึก​แล้ว อาจ​ไม่มี​ทาง​แก้)
  • นัก​พัฒนา​หมกมุ่น​กับ​เทคโนโลยี​มาก​เกิน​ไป พยายาม​แก้​ปัญหา​ด้วย​เทคโนโลยี​แทน​การ​คิด​และ​ออกแบบอย่าง​รอบคอบ จน​ไล่​ตาม “ของ​เล่นใหม่ๆ” (shiny objects) คือ​เทรนด์​เทคโนโลยี​ล่าสุด​ไป​ต่อ​เนื่อง
  • ให้​ความ​สำคัญ​กับ ฐาน​ข้อมูล มาก​เกิน​ไป จน​การ​คุย​เรื่อง​ทางออก​หมุน​รอบ database และ data model แทนที่​จะ​เป็นกระบวนการ​ทาง​ธุรกิจ
  • ไม่​ใส่ใจ​ตั้ง​ชื่อ object และ operation ให้​ตรง​กับ​เจตนา​ทาง​ธุรกิจ​ที่​มัน​รองรับ เกิด​เป็น ช่องว่าง​กว้าง ระหว่าง mental model ที่​ธุรกิจ​เป็น​เจ้าของ กับ​ซอฟต์แวร์​ที่​นัก​พัฒนา​ส่ง​มอบ
  • ปัญหา​ข้าง​ต้น​มัก​เป็น​ผล​จาก​การ ร่วมมือ​กับ​ฝั่ง​ธุรกิจ​น้อย​เกิน​ไป ผู้​มี​ส่วน​ได้​ส่วน​เสีย​ทาง​ธุรกิจ​หมก​ตัว​ทำงาน​แยก​เดี่ยว ผลิต specification ที่​ไม่มี​ใคร​ได้​ใช้ หรือ​นัก​พัฒนา​เอา​ไป​ใช้ได้​เพียง​บาง​ส่วน
  • การ​ประมาณ​การ (estimate) เป็น​ที่​ต้องการ​สูง และ​การ​ทำ​มัน​บ่อยๆ ก็​กิน​เวลา​และ​แรง​ไป​มาก จน​ทำให้การ​ส่ง​มอบ​ซอฟต์แวร์​ล่าช้า นัก​พัฒนา​เลย​หัน​ไป​ใช้ “task-board shuffle” แทน​การ​ออกแบบอย่าง​มี​ความคิด ผล​คือ​ได้ Big Ball of MudBig Ball of Mudระบบ​ที่​ปนเป​กัน​ยุ่งเหยิง​ไม่มี​ขอบเขต​ชัด ให้​ลาก​เส้น​ล้อม​ไว้​แล้ว​ยอมรับ​สภาพ ไม่​พยายาม​ทำ model ละเอียด​ใน​นั้น และ​ระวัง​ไม่​ให้​ลาม​ไป context อื่นStrategic Design แทนที่​จะ​แยก model ตาม​ตัว​ขับ​เคลื่อน​ทาง​ธุรกิจ​อย่าง​เหมาะสม
  • ยัด ตรรกะ​ทาง​ธุรกิจ (Business Logic) ไว้​ใน​คอมโพเนนต์ของ UI และ​ชั้น persistence อีก​ทั้ง​ยัง​มัก​ทำงาน persistence แทรก​กลาง​ตรรกะ​ทาง​ธุรกิจ
  • มี query ฐาน​ข้อมูล​ที่​พัง ช้า และ​ล็อก จน​ผู้​ใช้​ทำงาน​ทาง​ธุรกิจ​ที่​ไว​ต่อ​เวลา​ไม่​ได้
  • เกิด abstraction ผิดๆ เพราะ​นัก​พัฒนา​พยายาม​รองรับ​ทั้ง​ความ​ต้องการ​ปัจจุบัน​และ​ที่​จินตนาการ​ว่า​จะ​เกิด​ใน​อนาคต ด้วย​การ generalize มาก​เกิน​ไป แทนที่​จะ​แก้​ความ​ต้องการ​ทาง​ธุรกิจ​ที่​เป็น​รูปธรรมจริงๆ
  • มี service ที่​ผูก​กัน​แน่น​เกิน​ไป operation หนึ่ง​ทำ​ใน service หนึ่ง แล้ว service นั้น​เรียก​ตรง​ไป​ยัง​อีก service เพื่อ​ทำงาน​ชดเชย การ​ผูก​กัน​แบบ​นี้​มัก​นำ​ไป​สู่​กระบวนการ​ธุรกิจ​ที่​พัง ข้อมูล​ที่​ไม่​ตรง​กัน และ​ระบบ​ที่​ดูแล​รักษา​ยาก​มาก

ทั้งหมด​นี้​มัก​เกิด​ขึ้น​ภาย​ใต้​ความ​เชื่อ​ว่า “ไม่​ออกแบบ​แล้ว​ซอฟต์แวร์​จะ​ถูก​ลง” และ​บ่อย​ครั้ง​มัน​เป็น​เพียง​เพราะ​ธุรกิจ​และ​นัก​พัฒนา​ไม่รู้​ว่า​มี​ทาง​เลือก​ที่​ดี​กว่า​นี้​มาก “ซอฟต์แวร์​กำลัง​กลืน​กิน​โลก” (Software is eating the world) และ​เรา​ควร​ตระหนัก​ว่า​ซอฟต์แวร์​ก็​กลืน​กิน​กำไร​ของ​เรา​ได้​เช่น​กัน — หรือ​จะ​ป้อน​กำไร​ให้​เรา​อย่าง​เต็ม​อิ่ม​ก็ได้

ที่​สำคัญ​คือ​ต้อง​เข้าใจ​ว่า “เศรษฐศาสตร์​ของ​การ​ไม่​ออกแบบ” (No Design) ที่​คิด​กัน​ไป​เอง​นั้น​เป็น​เรื่อง​ลวง ที่​หลอก​คน​ซึ่ง​กดดัน​ให้​ผลิต​ซอฟต์แวร์​โดย​ไม่​คิด​ออกแบบ​ได้​อย่าง​แนบเนียน เพราะ design ยัง​คง​ไหล​ออก​จาก​สมอง​ของ​นัก​พัฒนา​แต่ละ​คน​ผ่าน​ปลาย​นิ้ว​ขณะ​ที่​เขา​ปล้ำ​กับ code โดย​ไม่มี input จาก​ใคร​เลย รวม​ถึง​จาก​ฝั่ง​ธุรกิจ​ด้วย คำ​กล่าว​นี้​สรุป​สถานการณ์​ได้​ดี:

คำถาม​ที่​ว่า design จำเป็น​หรือ​คุ้ม​ค่า​หรือ​ไม่ ล้วน​ไม่​ตรง​ประเด็น เพราะ design เป็น​สิ่ง​ที่​หลีก​เลี่ยง​ไม่​ได้ ทาง​เลือก​ของ design ที่​ดี​คือ design ที่​แย่ ไม่ใช่​การ​ไม่มี design เลย

— Douglas Martin, Book Design: A Practical Introduction

แม้​คำ​พูด​ของ Martin จะ​ไม่​ได้​พูด​ถึง​การ​ออกแบบ​ซอฟต์แวร์​โดยตรง แต่​ก็​ใช้ได้​กับ​งาน​ของ​เรา ที่​ซึ่ง​ไม่มี​อะไร​มา​ทดแทน​การ​ออกแบบอย่าง​มี​ความคิด​ได้ ใน​สถานการณ์​ที่​เพิ่ง​เล่า​ไป ถ้า​มี​นัก​พัฒนา​ห้า​คนใน project “การ​ไม่​ออกแบบ” จะ​ให้​ผล​เป็นการ​ผสม design ห้า​แบบ​เข้า​ด้วย​กัน — คือ​ได้​ภาษา​ทาง​ธุรกิจ​ที่​ต่าง​คน​ต่าง​กุ​ขึ้น​มา​เอง5 version ปน​กัน โดย​ไม่​ได้​รับ​ประโยชน์​จาก ผู้เชี่ยวชาญ​ธุรกิจ (Domain Expert)Domain Expertผู้เชี่ยวชาญ​ธุรกิจ​ที่​รู้​กฎ กระบวนการ และ​ความ​ต้องการ​ของ domain อย่าง​ลึกซึ้ง เป็น​แหล่ง​ความ​รู้​สำคัญ​ที่​ทีม​พัฒนา​ต้อง​ร่วม​งาน​ด้วย​อย่าง​ใกล้​ชิด​ใน DDDStrategic Design ตัว​จริง​เลย

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

ถ้า​กลัว​ว่าการ​ผลิต​ซอฟต์แวร์​ด้วย​การ​ออกแบบอย่าง​มี​ความคิด​จะ​แพง ลอง​นึกดู​ว่า​มัน​จะ​แพง​กว่า​แค่​ไหน​ที่​ต้อง​ทน​อยู่​กับ — หรือ​ต้อง​ไป​แก้ — design ที่​แย่ ยิ่ง​เป็น​ซอฟต์แวร์​ที่​ต้อง​สร้าง​ความ​แตก​ต่าง​จาก​คู่แข่ง​และ​สร้าง​ความ​ได้​เปรียบ​ใน​การ​แข่งขัน​อย่าง​มี​นัย​สำคัญ ยิ่ง​จริง​เข้าไป​ใหญ่

คำ​ที่​ใกล้​เคียง​กับ “ดี (good)” คือ “ได้​ผล (effective)” และ​มัน​อาจ​อธิบาย​สิ่ง​ที่​เรา​ควร​ไขว่​คว้า​ใน​การ​ออกแบบ​ซอฟต์แวร์​ได้​แม่นยำ​กว่า — นั่น​คือ effective design (design ที่​ได้​ผล) คือ design ที่​ตอบ​สนอง​ความ​ต้องการ​ของ​องค์กร​ได้​ถึง​ขั้น​ทำให้​องค์กร สร้าง​ความ​แตก​ต่าง​เหนือ​คู่แข่ง​ด้วย​ซอฟต์แวร์ มัน​บังคับ​ให้​องค์กร​เข้าใจ​ว่า​ตัวเอง​ต้อง​โดด​เด่น​เรื่อง​อะไร แล้ว​ใช้​ความ​เข้าใจ​นั้น​นำทางการ​สร้าง model ซอฟต์แวร์​ที่​ถูกต้อง

ใน Scrum การ​ได้​มา​ซึ่ง​ความ​รู้ (knowledge acquisition) เกิด​จาก​การ​ทดลอง​และ​การ​เรียนรู้​ร่วม​กัน เรียก​อีก​อย่าง​ว่า “การ​ซื้อ​ข้อมูล” (buying information) ความ​รู้​ไม่​เคย​ได้​มาฟรีๆ แต่​หนังสือ​เล่ม​นี้​ช่วย​ให้​เรา​เร่ง​วิธี​ได้​มา​ซึ่ง​ความ​รู้​นั้น​ได้ และ​เผื่อ​ใคร​ยัง​สงสัย​ว่า effective design สำคัญ​จริง​ไหม อย่า​ลืม​ข้อคิด​จาก​คน​ที่​ดู​จะ​เข้าใจความ​สำคัญ​นี้​เป็น​อย่าง​ดี:

คน​ส่วน​ใหญ่​เข้าใจ​ผิด​ว่า design คือ​สิ่ง​ที่​มัน “หน้าตา​เป็น​อย่างไร” คิด​ว่า​มัน​เป็น​แค่​เปลือก​นอก — ราวกับ​ว่า​ยื่น​กล่อง​ให้​ดีไซเนอร์​แล้ว​บอกว่า “ทำให้​มัน​สวย” นั่น​ไม่ใช่​ความหมาย​ของ design สำหรับ​เรา design ไม่​ได้​เป็น​แค่​หน้าตา​หรือ​สัมผัส แต่ design คือ “วิธี​ที่​มัน​ทำงาน”

— Steve Jobs

ใน​งาน​ซอฟต์แวร์ effective design สำคัญ​ที่สุด และ​เมื่อ​ทาง​เลือก​มี​เพียง​ทาง​เดียว Vernon แนะนำ​ให้​เลือก effective design


DDD เริ่ม​ที่​ระดับ กลยุทธ์ (strategic design) ซึ่ง​สำคัญ​อย่าง​ยิ่ง เพราะ​แทบ​เป็น​ไป​ไม่​ได้ที่​จะ​นำ tactical design ไป​ใช้​อย่าง​ได้​ผล​ถ้า​ไม่​ได้​เริ่ม​จาก strategic design ก่อน Strategic design เปรียบ​เหมือน​การ​ลง​พู่กัน​ด้วย​ฝี​แปร​งก​ว้างๆ ก่อน​จะ​ลง​รายละเอียด​ของ​การ implement มัน​ชี้​ให้​เห็น​ว่า​อะไร​สำคัญ​เชิงกลยุทธ์​ต่อ​ธุรกิจ จะ​แบ่ง​งาน​ตาม​ความ​สำคัญ​อย่างไร และ​จะ​เชื่อม​ต่อ​กัน​ให้​ดี​ที่สุด​ได้​อย่างไร

ภาพประกอบ: ภายใน Bounded Context 1 model ทุกชิ้นพูดภาษาเดียวกันคือ Ubiquitous Language

สิ่ง​แรก​ที่​จะ​ได้​เรียน​คือ​การ​แยก domain model ออก​จาก​กัน​ด้วย pattern เชิงกลยุทธ์​ที่​ชื่อ Bounded ContextBounded Contextขอบเขต​ที่​ชัดเจน (มัก​เป็น​ระบบ​ย่อย​หรือ​ทีม​หนึ่ง) ที่ model หนึ่ง​ใช้ได้​และ​มี​ความหมาย​แน่นอน ภายใน​ขอบเขต​นี้ Ubiquitous Language สอดคล้อง​กัน 100%Strategic Design (ขอบเขต​ที่ model หนึ่ง​ใช้ได้​และ​มี​ความหมาย​แน่นอน) และ​คู่​กัน​อย่าง​แนบแน่น​คือ​การ​พัฒนา Ubiquitous LanguageUbiquitous Languageภาษา​กลาง​ที่​ทุก​คนใน​ทีม (ทั้ง​นัก​พัฒนา​และ​ผู้เชี่ยวชาญ​ธุรกิจ) ใช้​ร่วม​กัน อิง​กับ domain model โดยตรง คำ​เดียวกัน​ต้อง​หมาย​ถึง​สิ่ง​เดียวกัน และ​สะท้อน​ลง​ใน codeStrategic Design (ภาษา​กลาง) ให้​เป็น domain model ภายใน​ขอบเขต​นั้น

นอกจาก​นั้น​ยัง​จะ​ได้​เห็น​ความ​สำคัญ​ของ​การ​ดึง​ทั้ง​นัก​พัฒนา​และ ผู้เชี่ยวชาญ​ธุรกิจ (Domain Expert)Domain Expertผู้เชี่ยวชาญ​ธุรกิจ​ที่​รู้​กฎ กระบวนการ และ​ความ​ต้องการ​ของ domain อย่าง​ลึกซึ้ง เป็น​แหล่ง​ความ​รู้​สำคัญ​ที่​ทีม​พัฒนา​ต้อง​ร่วม​งาน​ด้วย​อย่าง​ใกล้​ชิด​ใน DDDStrategic Design เข้า​มา​ร่วม​กัน​พัฒนา Ubiquitous Language ของ model การ​รวม​พลัง​ของ​คน​เก่ง​และ​มี​ไฟ​จาก​ทั้ง​สอง​ฝั่ง​นี้​คือ​ส่วนผสม​สำคัญ​ที่​ทำให้ DDD ให้​ผลลัพธ์​ที่​ดี​ที่สุด ภาษา​ที่​พัฒนา​ร่วม​กัน​จะ​กลาย​เป็น​ภาษา​กลาง​ที่​แทรกซึม​อยู่​ทั่ว​ทั้ง​การ​สื่อสาร​ด้วย​วาจา​ใน​ทีม​และ​ใน​ซอฟต์แวร์ model

เมื่อ​ก้าว​ลึก​ขึ้น​ใน​เชิงกลยุทธ์ เรา​จะ​ได้​เรียน​รู้เรื่อง SubdomainSubdomainส่วน​ย่อย​ของ Domain ใหญ่ เช่น Domain e-commerce แตก​เป็น subdomain การ​สั่ง​ซื้อ การ​ชำระ​เงิน คลัง​สินค้า ฯลฯ อยู่​ใน “พื้นที่​ปัญหา” (problem space)Strategic Design และ​วิธี​ที่​มัน​ช่วย​รับมือ​กับ​ความ​ซับซ้อน​ไร้​ขอบเขต​ของ​ระบบ legacy รวม​ถึง​ปรับปรุง​ผลลัพธ์​ใน project ใหม่ (greenfield) โดย​เฉพาะ​การ​ระบุ Core DomainCore Domainsubdomain ที่​สำคัญ​และ​สร้าง​ความ​ได้​เปรียบ​ใน​การ​แข่งขัน​มาก​ที่สุด เป็น​เหตุผล​ที่​เรา​ต้อง​สร้าง​ซอฟต์แวร์​เอง​แทน​การ​ซื้อ ควร​ทุ่ม​ทีม​เก่ง​ที่สุด​ลง​ตรง​นี้Strategic Design — ส่วน​ที่​สำคัญ​ที่สุด​ที่​ควร​ทุ่ม​แรง​ลง​ไป และ​จะ​ได้​เห็น​วิธี​เชื่อม​ต่อ​หลาย Bounded Context เข้า​ด้วย​กัน​ด้วย​เทคนิค​ที่​เรียก​ว่า Context MappingContext Mappingกิจกรรมการ​ระบุ Bounded Context และ​นิยาม​ความ​สัมพันธ์​ระหว่าง​กัน (เช่น Partnership, Shared Kernel, ACL) เพื่อ​จัดการ​การ​เชื่อม​ต่อ​ระหว่าง​ทีม/ระบบStrategic Design ซึ่ง Context Map จะ​นิยาม​ทั้ง​ความ​สัมพันธ์​ระหว่าง​ทีม​และ​กลไก​ทาง​เทคนิค​ที่​อยู่​ระหว่าง2 Bounded Context ที่​เชื่อม​ต่อ​กัน

🚢 ลอง​นึกถึง​ระบบ​ขนส่ง​สินค้า

ใน​ระบบ​ขนส่ง​ตู้ container คำ​ว่า “Customer” ใน​บริบท การ​จอง (ผู้​ว่าจ้าง​ขนส่ง) กับ​ใน​บริบท การ​ออก​ใบ​แจ้ง​หนี้ (ผู้​ที่​ต้อง​ชำระ​เงิน) อาจ​ไม่ใช่​สิ่ง​เดียวกันเป๊ะ การ​ขีด Bounded ContextBounded Contextขอบเขต​ที่​ชัดเจน (มัก​เป็น​ระบบ​ย่อย​หรือ​ทีม​หนึ่ง) ที่ model หนึ่ง​ใช้ได้​และ​มี​ความหมาย​แน่นอน ภายใน​ขอบเขต​นี้ Ubiquitous Language สอดคล้อง​กัน 100%Strategic Design ให้​ชัด​ช่วย​ให้​แต่ละ​ทีม​มี​ภาษา​ของ​ตัวเอง​โดย​ไม่​ตี​กัน


หลัง​จากวาง​รากฐาน​ที่​มั่นคง​ด้วย strategic design แล้ว เรา​จึง​จะ​ได้​ค้น​พบ​เครื่องมือ​เชิง​ยุทธวิธี (tactical design) ที่​โดด​เด่น​ที่สุด​ของ DDD ถ้า strategic design คือ​ฝี​แปรง​กว้าง tactical design ก็​เปรียบ​เหมือน​การ​ใช้​พู่กัน​เส้น​เล็ก​ระบาย​รายละเอียด​อัน​ประณีต​ของ domain model หนึ่ง​ใน​เครื่องมือ​ที่​สำคัญ​ที่สุด​ใช้​สำหรับ​รวม Entity และ Value Object เข้า​ด้วย​กัน​เป็นกลุ่ม​ที่ “ขนาด​พอเหมาะ” นั่น​คือ pattern ชื่อ AggregateAggregate RootEntity หนึ่ง​ตัว​ที่​เป็น “ประตู​เดียว” เข้า​สู่ Aggregate การ​อ้างอิง​จาก​ภายนอก​ทำได้​กับ root เท่านั้น root จึง​ควบคุม​กฎ​ความ​ถูกต้อง​ของ​ทั้ง​กลุ่มTactical Design

ภาพประกอบ: ภายใน Bounded Context มีหลาย Aggregate และเมื่อเกิด Domain Event ก็ส่งต่อไปยัง Bounded Context อื่นได้

หัวใจ​ของ DDD คือ​การ​จำลอง domain ให้​ชัดเจน​ที่สุด​เท่า​ที่​จะ​ทำได้ การ​ใช้ Domain EventDomain Eventสิ่ง​ที่ “เกิด​ขึ้น​แล้ว” ใน domain ซึ่ง​ส่วน​อื่น​สนใจ แทน​ด้วย​อ็อบเจ็กต์ที่​เปลี่ยนแปลง​ไม่​ได้ ตั้ง​ชื่อ​เป็น​อดีต เช่น CargoWasRouted ใช้​สื่อสาร​ข้าม AggregateTactical Design ช่วย​ทั้ง​การ​สร้าง model อย่าง​ชัดเจน และ​การ​แบ่งปัน “สิ่ง​ที่​เกิด​ขึ้น​แล้ว” ภายใน model ไป​ยัง​ระบบ​อื่น​ที่​จำเป็น​ต้อง​รู้ ผู้​ที่​สนใจ event นั้น​อาจ​เป็น Bounded Context ของ​เรา​เอง หรือ Bounded Context อื่น​ที่​อยู่​ระยะ​ไกล​ออก​ไป​ก็ได้

🛒 เทียบ​กับ e-commerce

เมื่อ​ลูกค้า​กด​สั่ง​ซื้อ Aggregate ชื่อ Order จะ​บังคับ​ใช้​กฎ (เช่น ยอด​รวม​ต้อง​ตรง​กับ​รายการ​สินค้า) แล้ว​ปล่อย Domain EventDomain Eventสิ่ง​ที่ “เกิด​ขึ้น​แล้ว” ใน domain ซึ่ง​ส่วน​อื่น​สนใจ แทน​ด้วย​อ็อบเจ็กต์ที่​เปลี่ยนแปลง​ไม่​ได้ ตั้ง​ชื่อ​เป็น​อดีต เช่น CargoWasRouted ใช้​สื่อสาร​ข้าม AggregateTactical Design ชื่อ OrderPlaced ออก​มา — context อื่น​อย่าง “คลัง​สินค้า” หรือ “การ​จัด​ส่ง” ก็​รับ event นี้​ไป​ทำงาน​ต่อ​ได้ โดย​ไม่​ต้อง​ผูกมัด​กัน​แน่น​จน​เกิน​ไป


การ​เรียนรู้​และ​การกลั่น​ความ​รู้ (The Learning Process and Refining Knowledge)

หัวข้อ​ที่​มีชื่อ​ว่า “การ​เรียนรู้​และ​การกลั่น​ความ​รู้ (The Learning Process and Refining Knowledge)”

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

ภาพประกอบ: การกลั่น (distillation) — เทกองข้อมูลและตำรามหาศาลลงกรวยสีแดง เพื่อให้เหลือเฉพาะ "แก่น" ที่สำคัญ

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

เล่ม​นี้​คือ​ฉบับ​กลั่น

นี่​คือ DDD ฉบับ​เข้มข้น​ที่​กลั่น​มา​จาก Implementing Domain-Driven Design [IDDD] ของ​ผู้​เขียน​เอง — แน่นอน​ว่า​หนังสือ​เล่ม​เดียว​สอน​ทุก​อย่าง​เกี่ยว​กับ DDD ไม่​ได้ เพราะ​ตั้งใจ​กลั่น​เทคนิค​ให้​กระชับ เหมาะ​เป็น “จุด​เริ่ม” และ “คู่มือ​อ้างอิง​เร็ว” ส่วน​รายละเอียด​เชิง​ลึก​ค่อย​ตาม​อ่าน​ใน​เล่ม​ใหญ่​หรือ​เวิร์กช็อป IDDD สาม​วัน​ได้


แม้​จะ​เป็นการ​นำ​เสนอ​แบบ​กระชับ แต่​ก็​ยัง​มี​เรื่อง​ของ DDD ให้​เรียนรู้​อีก​มาก เรา​จะ​เริ่มต้น​ใน​บท​ถัด​ไป​ด้วย​เรื่อง Strategic Design ผ่าน Bounded ContextBounded Contextขอบเขต​ที่​ชัดเจน (มัก​เป็น​ระบบ​ย่อย​หรือ​ทีม​หนึ่ง) ที่ model หนึ่ง​ใช้ได้​และ​มี​ความหมาย​แน่นอน ภายใน​ขอบเขต​นี้ Ubiquitous Language สอดคล้อง​กัน 100%Strategic Design และ Ubiquitous LanguageUbiquitous Languageภาษา​กลาง​ที่​ทุก​คนใน​ทีม (ทั้ง​นัก​พัฒนา​และ​ผู้เชี่ยวชาญ​ธุรกิจ) ใช้​ร่วม​กัน อิง​กับ domain model โดยตรง คำ​เดียวกัน​ต้อง​หมาย​ถึง​สิ่ง​เดียวกัน และ​สะท้อน​ลง​ใน codeStrategic Design

สรุป​ประเด็น​สำคัญ
  • DDD คือ​กล่อง​เครื่องมือ เชิงกลยุทธ์ + เชิง​ยุทธวิธี เพื่อ​สร้าง​ซอฟต์แวร์​ที่​ให้​คุณค่า​สูง​และ​เข้าใจ​ธุรกิจ​จริง
  • การ​ไม่​ออกแบบ (“task-board shuffle”) ทำให้​ธุรกิจ​จ่าย​ราคา​แพง — design เป็น​สิ่ง​ที่​หลีก​เลี่ยง​ไม่​ได้ เป้าหมาย​คือ effective design ที่​ทำให้​แตก​ต่าง​จาก​คู่แข่ง
  • Strategic มา​ก่อน: Bounded ContextBounded Contextขอบเขต​ที่​ชัดเจน (มัก​เป็น​ระบบ​ย่อย​หรือ​ทีม​หนึ่ง) ที่ model หนึ่ง​ใช้ได้​และ​มี​ความหมาย​แน่นอน ภายใน​ขอบเขต​นี้ Ubiquitous Language สอดคล้อง​กัน 100%Strategic Design + Ubiquitous LanguageUbiquitous Languageภาษา​กลาง​ที่​ทุก​คนใน​ทีม (ทั้ง​นัก​พัฒนา​และ​ผู้เชี่ยวชาญ​ธุรกิจ) ใช้​ร่วม​กัน อิง​กับ domain model โดยตรง คำ​เดียวกัน​ต้อง​หมาย​ถึง​สิ่ง​เดียวกัน และ​สะท้อน​ลง​ใน codeStrategic DesignSubdomainSubdomainส่วน​ย่อย​ของ Domain ใหญ่ เช่น Domain e-commerce แตก​เป็น subdomain การ​สั่ง​ซื้อ การ​ชำระ​เงิน คลัง​สินค้า ฯลฯ อยู่​ใน “พื้นที่​ปัญหา” (problem space)Strategic Design/Core DomainCore Domainsubdomain ที่​สำคัญ​และ​สร้าง​ความ​ได้​เปรียบ​ใน​การ​แข่งขัน​มาก​ที่สุด เป็น​เหตุผล​ที่​เรา​ต้อง​สร้าง​ซอฟต์แวร์​เอง​แทน​การ​ซื้อ ควร​ทุ่ม​ทีม​เก่ง​ที่สุด​ลง​ตรง​นี้Strategic DesignContext MappingContext Mappingกิจกรรมการ​ระบุ Bounded Context และ​นิยาม​ความ​สัมพันธ์​ระหว่าง​กัน (เช่น Partnership, Shared Kernel, ACL) เพื่อ​จัดการ​การ​เชื่อม​ต่อ​ระหว่าง​ทีม/ระบบStrategic Design
  • Tactical ตาม​มา: AggregateAggregate RootEntity หนึ่ง​ตัว​ที่​เป็น “ประตู​เดียว” เข้า​สู่ Aggregate การ​อ้างอิง​จาก​ภายนอก​ทำได้​กับ root เท่านั้น root จึง​ควบคุม​กฎ​ความ​ถูกต้อง​ของ​ทั้ง​กลุ่มTactical Design + Domain EventDomain Eventสิ่ง​ที่ “เกิด​ขึ้น​แล้ว” ใน domain ซึ่ง​ส่วน​อื่น​สนใจ แทน​ด้วย​อ็อบเจ็กต์ที่​เปลี่ยนแปลง​ไม่​ได้ ตั้ง​ชื่อ​เป็น​อดีต เช่น CargoWasRouted ใช้​สื่อสาร​ข้าม AggregateTactical Design
  • แก่น​แท้​คือ วิธี​คิด​และ​การกลั่น​ความ​รู้ ร่วม​กับ​ธุรกิจ​อย่าง​ต่อ​เนื่อง​และ​ให้​เร็ว​ที่สุด

🔗 อ้างอิง​เพิ่มเติม​ใน DevIQ

เจาะ​ลึก​แนวคิด​ใน​บท​นี้​ต่อ​ได้ที่​คลัง​อ้างอิง DevIQ:

  • Bounded Context — ขยาย​ความ pattern เชิงกลยุทธ์​ตัว​แรก​ที่​บท​นี้​แนะนำ คือ​ขอบเขต​ที่ model หนึ่ง​ใช้ได้​และ​มี​ความหมาย​แน่นอน
  • Ubiquitous Language — ภาษา​กลาง​ที่​ต้อง​พัฒนา​ร่วม​กับ Domain Expert ภายใน Bounded Context แต่ละ​แห่ง
  • Context Mapping — เทคนิค​เชื่อม​ต่อ​หลาย Bounded Context เข้า​ด้วย​กัน​ที่​บท​นี้​กล่าว​ถึง​ใน​ช่วง strategic design
  • Aggregate — pattern เชิง​ยุทธวิธี​ที่​รวม Entity และ Value Object เข้า​เป็นกลุ่ม​ขนาด​พอเหมาะ ตาม​ที่​บท​นี้​แนะนำ​ไว้​ใน​ช่วง tactical design
  • Domain Events — กลไก​สื่อสาร “สิ่ง​ที่​เกิด​ขึ้น​แล้ว” ข้าม Bounded Context ที่​บท​นี้​ยก​ตัวอย่าง​ไว้

เช็กความเข้าใจ — บทที่ 1

ข้อ 1 / 4

ตามหนังสือ DDD “ซับซ้อนโดยจำเป็น” หรือไม่?