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

Strategic Design ด้วย Subdomain

เวลา​ลงมือ​ทำ project DDDDomain-Driven Design (DDD)แนวทาง​พัฒนา​ซอฟต์แวร์​ที่​เน้น​สร้าง domain model ซึ่ง​เข้าใจ​กฎ​และ​กระบวนการ​ของ​ธุรกิจ​อย่าง​ลึกซึ้ง แล้ว​เขียน​ลง​ใน code จริง บัญญัติ​โดย Eric Evans (2003) แบ่ง​เป็น Strategic และ Tactical DesignStrategic Design จะมี Bounded ContextBounded Contextขอบเขต​ที่​ชัดเจน (มัก​เป็น​ระบบ​ย่อย​หรือ​ทีม​หนึ่ง) ที่ model หนึ่ง​ใช้ได้​และ​มี​ความหมาย​แน่นอน ภายใน​ขอบเขต​นี้ Ubiquitous Language สอดคล้อง​กัน 100%Strategic Design หลาย​ตัว​ทำงาน​อยู่​ด้วย​กัน​เสมอ หนึ่ง​ใน​นั้น​คือ Core DomainCore Domainsubdomain ที่​สำคัญ​และ​สร้าง​ความ​ได้​เปรียบ​ใน​การ​แข่งขัน​มาก​ที่สุด เป็น​เหตุผล​ที่​เรา​ต้อง​สร้าง​ซอฟต์แวร์​เอง​แทน​การ​ซื้อ ควร​ทุ่ม​ทีม​เก่ง​ที่สุด​ลง​ตรง​นี้Strategic Design และ​ยัง​มี SubdomainSubdomainส่วน​ย่อย​ของ Domain ใหญ่ เช่น Domain e-commerce แตก​เป็น subdomain การ​สั่ง​ซื้อ การ​ชำระ​เงิน คลัง​สินค้า ฯลฯ อยู่​ใน “พื้นที่​ปัญหา” (problem space)Strategic Design อีก​หลาย​ตัว​กระจาย​อยู่​ใน Bounded Context อื่นๆ บท​ก่อนหน้า​ได้​ชี้​ให้​เห็น​ความ​สำคัญ​ของ​การ​แบ่ง model ต่างๆ ตาม Ubiquitous LanguageUbiquitous Languageภาษา​กลาง​ที่​ทุก​คนใน​ทีม (ทั้ง​นัก​พัฒนา​และ​ผู้เชี่ยวชาญ​ธุรกิจ) ใช้​ร่วม​กัน อิง​กับ domain model โดยตรง คำ​เดียวกัน​ต้อง​หมาย​ถึง​สิ่ง​เดียวกัน และ​สะท้อน​ลง​ใน codeStrategic Design เฉพาะ​ของ​มัน แล้ว​ก่อ​ร่าง​ขึ้น​เป็น​หลาย Bounded Context

ลอง​นึกถึง​ภาพ​รวม​ของ​ระบบ​บริหาร project แบบ Agile ที่​หนังสือ​ยก​มา​เป็น​ตัวอย่าง​หลัก — ใน​ภาพ​นั้น​มี Bounded Context หก​ตัว​และ Subdomain หก​ตัว เพราะ​ใช้ Strategic Design ของ DDD ออกแบบ ทีม​จึง​ได้​องค์​ประกอบ​ของ model ที่​ลงตัว​ที่สุด นั่น​คือ 1 Subdomain ต่อ1 Bounded Context และ1 Bounded Context ต่อ1 Subdomain พูด​อีก​อย่าง​คือ “แกน​หลัก​ของ​ระบบ​บริหาร project แบบ Agile” (Agile Project Management Core) เป็น​ทั้ง Bounded Context ที่​สะอาด​หนึ่ง​ตัว และ​เป็น Subdomain ที่​สะอาด​หนึ่ง​ตัว​ใน​เวลา​เดียวกัน บาง​สถานการณ์​อาจ​มี​หลาย Subdomain อยู่​ใน Bounded Context เดียว แต่​นั่น​ยัง​ไม่ใช่​ผลลัพธ์​ของ​การ​สร้าง model ที่​ดี​ที่สุด

graph LR
  subgraph BC1["Bounded Context #1 — Agile PM Core"]
    SD1["Subdomain (Core Domain)"]
  end
  subgraph BC2["Bounded Context #2"]
    SD2["Subdomain"]
  end
  subgraph BC3["Bounded Context #3"]
    SD3["Subdomain"]
  end
  subgraph BC4["Bounded Context #4"]
    SD4["Subdomain"]
  end
  subgraph BC5["Bounded Context #5"]
    SD5["Subdomain"]
  end
  subgraph BC6["Bounded Context #6"]
    SD6["Subdomain"]
  end
  BC1 --- BC2
  BC2 --- BC3
  BC3 --- BC4
  BC4 --- BC5
  BC5 --- BC6
Subdomain อยู่​ฝั่ง​ปัญหา ไม่ใช่​ฝั่ง​คำ​ตอบ

จำ​ให้​แม่น​ว่า SubdomainSubdomainส่วน​ย่อย​ของ Domain ใหญ่ เช่น Domain e-commerce แตก​เป็น subdomain การ​สั่ง​ซื้อ การ​ชำระ​เงิน คลัง​สินค้า ฯลฯ อยู่​ใน “พื้นที่​ปัญหา” (problem space)Strategic Design อยู่​ใน พื้นที่​ปัญหา (Problem Space)Problem Space“พื้นที่​ปัญหา” — สิ่ง​ที่​ธุรกิจ​ต้องการ​แก้ไข อยู่​ใน​รูป​ของ Domain และ Subdomain (ยัง​ไม่​พูด​ถึง​วิธี​แก้)Strategic Design — มัน​คือ “สิ่ง​ที่​ธุรกิจ​ต้อง​แก้” ส่วน Bounded ContextBounded Contextขอบเขต​ที่​ชัดเจน (มัก​เป็น​ระบบ​ย่อย​หรือ​ทีม​หนึ่ง) ที่ model หนึ่ง​ใช้ได้​และ​มี​ความหมาย​แน่นอน ภายใน​ขอบเขต​นี้ Ubiquitous Language สอดคล้อง​กัน 100%Strategic Design อยู่​ใน พื้นที่​คำ​ตอบ (Solution Space)Solution Space“พื้นที่​คำ​ตอบ” — วิธี​ที่​เรา​เลือก​แก้​ปัญหา อยู่​ใน​รูป​ของ Bounded Context และ model 1 subdomain อาจ​มี​ได้​หลาย​คำ​ตอบStrategic Design — มัน​คือ “วิธี​ที่​เรา​เลือก​แก้” เป้าหมาย​ของ DDD คือ​ทำให้​ทั้ง​สอง​ฝั่ง​จับ​คู่​กัน​แบบ​หนึ่ง​ต่อ​หนึ่ง​ให้​ได้​มาก​ที่สุด


SubdomainSubdomainส่วน​ย่อย​ของ Domain ใหญ่ เช่น Domain e-commerce แตก​เป็น subdomain การ​สั่ง​ซื้อ การ​ชำระ​เงิน คลัง​สินค้า ฯลฯ อยู่​ใน “พื้นที่​ปัญหา” (problem space)Strategic Design คือ ส่วน​ย่อย​ของ โดเมน (Domain)Domainขอบเขต​ของ​ปัญหา​หรือ​ธุรกิจ​ที่​ซอฟต์แวร์​ของ​เรา​เข้าไป​แก้ไข เช่น การ​ขนส่ง​สินค้า การ​ธนาคาร e-commerce — คือ “โลก​ของ​ผู้​ใช้” ที่​โปรแกรม​ต้อง​เข้าใจStrategic Design ทาง​ธุรกิจ​โดย​รวม มอง​มัน​เป็น “model ของ domain เชิง​ตรรกะ​หนึ่ง​ชุด” ได้​เลย domain ทาง​ธุรกิจ​ส่วน​ใหญ่​มักใหญ่​และ​ซับซ้อน​เกิน​กว่า​จะ​คิด​ทั้ง​ก้อน​พร้อม​กัน​ได้ ฉะนั้น​โดย​ทั่วไป​จึง​สนใจ​เฉพาะ Subdomain ที่​จำเป็น​ต้อง​ใช้​ภายใน project เดียว​เท่านั้น Subdomain จึง​เป็น​เครื่องมือ แบ่ง domain ทั้งหมด​ออก​เป็น​ส่วนๆ ใน​เชิง​ตรรกะ เพื่อ​ให้​เข้าใจ​พื้นที่​ปัญหา​บน project ขนาด​ใหญ่​ที่​ซับซ้อน​ได้

อีก​มุม1 Subdomain คือ พื้นที่​ความ​เชี่ยวชาญ​ที่​ชัดเจน โดย​ถือว่า​มัน​รับผิดชอบ​การ​ให้​คำ​ตอบ​กับ​ส่วน​หลัก​ส่วน​หนึ่ง​ของ​ธุรกิจ นั่น​แปล​ว่า Subdomain หนึ่งๆ จะมี ผู้เชี่ยวชาญ​ธุรกิจ (Domain Expert)Domain Expertผู้เชี่ยวชาญ​ธุรกิจ​ที่​รู้​กฎ กระบวนการ และ​ความ​ต้องการ​ของ domain อย่าง​ลึกซึ้ง เป็น​แหล่ง​ความ​รู้​สำคัญ​ที่​ทีม​พัฒนา​ต้อง​ร่วม​งาน​ด้วย​อย่าง​ใกล้​ชิด​ใน DDDStrategic Design อย่าง​น้อยหนึ่ง​คน​ที่​เข้าใจ​แง่​มุม​ของ​ธุรกิจ​ซึ่ง Subdomain นั้น​รองรับ​เป็น​อย่าง​ดี และ​แต่ละ Subdomain ก็มี ความ​สำคัญ​เชิงกลยุทธ์​ต่อ​ธุรกิจ​มาก​น้อย​ต่าง​กัน

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


ภายใน project หนึ่ง มี Subdomain หลักๆ สาม​ประเภท:

  • Core DomainCore Domainsubdomain ที่​สำคัญ​และ​สร้าง​ความ​ได้​เปรียบ​ใน​การ​แข่งขัน​มาก​ที่สุด เป็น​เหตุผล​ที่​เรา​ต้อง​สร้าง​ซอฟต์แวร์​เอง​แทน​การ​ซื้อ ควร​ทุ่ม​ทีม​เก่ง​ที่สุด​ลง​ตรง​นี้Strategic Design: จุด​ที่​เรา​ลงทุน​เชิงกลยุทธ์​กับ model ของ domain ชุด​เดียว​ที่​นิยาม​ไว้​อย่าง​ดี ทุ่ม​ทรัพยากร​จำนวน​มาก​เพื่อ​ประดิษฐ์ Ubiquitous LanguageUbiquitous Languageภาษา​กลาง​ที่​ทุก​คนใน​ทีม (ทั้ง​นัก​พัฒนา​และ​ผู้เชี่ยวชาญ​ธุรกิจ) ใช้​ร่วม​กัน อิง​กับ domain model โดยตรง คำ​เดียวกัน​ต้อง​หมาย​ถึง​สิ่ง​เดียวกัน และ​สะท้อน​ลง​ใน codeStrategic Design อย่าง​พิถีพิถัน​ใน Bounded ContextBounded Contextขอบเขต​ที่​ชัดเจน (มัก​เป็น​ระบบ​ย่อย​หรือ​ทีม​หนึ่ง) ที่ model หนึ่ง​ใช้ได้​และ​มี​ความหมาย​แน่นอน ภายใน​ขอบเขต​นี้ Ubiquitous Language สอดคล้อง​กัน 100%Strategic Design ที่​ชัดเจน นี่​คือ​สิ่ง​ที่​อยู่​อันดับ​ต้นๆ ใน​รายการ project ของ​องค์กร เพราะ​มัน​คือ​สิ่ง​ที่​ทำให้​องค์กร แตก​ต่าง​จาก​คู่แข่ง​ทั้งหมด ใน​เมื่อ​องค์กร​ไม่​อาจ​โดด​เด่น​ใน​ทุก​เรื่อง​ที่​ทำ Core Domain จึง​เป็น​เส้น​แบ่ง​ที่​บอกว่า “องค์กร​ต้อง​เก่ง​ที่สุด​ตรง​ไหน” การ​จะ​ไป​ถึง​ระดับ​การ​เรียนรู้​และ​ความ​เข้าใจ​ที่​ลึก​พอ​จะ​ตัดสิน​เรื่อง​นี้​ได้ ต้อง​อาศัย​ทั้ง​ความ​มุ่งมั่น การ​ร่วมมือ​กัน และ​การ​ทดลอง นี่​คือ​จุด​ที่​องค์กร​ควร​ลงทุน​กับ​ซอฟต์แวร์​อย่าง​ไม่​กั๊ก​ที่สุด

  • Supporting SubdomainSupporting Subdomainส่วน​ที่​จำเป็น​และ​เฉพาะ​กับ​ธุรกิจ​เรา แต่​ไม่ใช่​จุด​ที่​สร้าง​ความ​ได้​เปรียบ ไม่มี​ของ​สำเร็จรูป​ที่​พอดี จึง​ต้อง​ทำ​เอง แต่​ลงทุน​น้อย​กว่า coreStrategic Design: สถานการณ์​ที่​ต้อง​พัฒนา​ขึ้น​เอง (custom development) เพราะ​ไม่มี​ของ​สำเร็จรูป​ที่​ตอบ​โจทย์ แต่​ก็​ยัง​ไม่​ลงทุน​หนัก​เท่ากับ​ที่​ลง​ให้ Core Domain อาจ​พิจารณา​จ้าง​ทำ​ภายนอก (outsource) สำหรับ Bounded Context ประเภท​นี้ เพื่อ​ไม่​ให้​เผลอ​เข้าใจ​ผิด​ว่า​มัน​เป็น​จุด​สร้าง​ความ​แตก​ต่าง​เชิงกลยุทธ์​แล้ว​ทุ่ม​ลงทุน​มาก​เกิน​ไป ถึง​อย่าง​นั้น​มัน​ก็​ยัง​เป็น model ซอฟต์แวร์​ที่​สำคัญ เพราะ Core Domain จะ​สำเร็จ​ไม่​ได้​เลย​หาก​ขาด​มัน

  • Generic SubdomainGeneric Subdomainปัญหา​ที่​แก้​กัน​มา​แล้ว​ทั่วไป เช่น ระบบ login บัญชี การ​แจ้ง​เตือน — ควร​ใช้​ของ​สำเร็จรูป​หรือ library แทน​การ​เขียน​เองStrategic Design: ทางออก​ประเภท​ที่​อาจ​หา​ซื้อ​สำเร็จรูป​ได้ หรือ​จ้าง​ทำ​ภายนอก หรือ​แม้แต่​พัฒนา​เอง​ภายใน​โดย​ทีม​ที่​ไม่​จำเป็น​ต้อง​เป็น​นัก​พัฒนา​ระดับ​หัว​กะทิ​แบบ​ที่​จัด​ให้ Core Domain หรือ​แม้แต่ Supporting Subdomain ที่​สำคัญ​รอง​ลง​มา ระวัง​อย่า​เข้าใจ​ผิด​ว่า Generic Subdomain เป็น Core Domain เพราะ​เรา​ไม่​ควร​ทุ่ม​ลงทุน​แบบ​นั้น​ที่​นี่

เมื่อ​พูด​ถึง project ที่​นำ DDD มา​ใช้ เรา​มัก​กำลัง​พูด​ถึง Core DomainCore Domainsubdomain ที่​สำคัญ​และ​สร้าง​ความ​ได้​เปรียบ​ใน​การ​แข่งขัน​มาก​ที่สุด เป็น​เหตุผล​ที่​เรา​ต้อง​สร้าง​ซอฟต์แวร์​เอง​แทน​การ​ซื้อ ควร​ทุ่ม​ทีม​เก่ง​ที่สุด​ลง​ตรง​นี้Strategic Design

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

SubdomainSubdomainส่วน​ย่อย​ของ Domain ใหญ่ เช่น Domain e-commerce แตก​เป็น subdomain การ​สั่ง​ซื้อ การ​ชำระ​เงิน คลัง​สินค้า ฯลฯ อยู่​ใน “พื้นที่​ปัญหา” (problem space)Strategic Design คือ​เครื่องมือ​แยก domain ใหญ่​ออก​เป็น​ส่วน​เชิง​ตรรกะ​ใน พื้นที่​ปัญหา และ​แบ่ง​เป็น​สาม​ประเภท​ตาม​ความ​สำคัญ​เชิงกลยุทธ์ — Core DomainCore Domainsubdomain ที่​สำคัญ​และ​สร้าง​ความ​ได้​เปรียบ​ใน​การ​แข่งขัน​มาก​ที่สุด เป็น​เหตุผล​ที่​เรา​ต้อง​สร้าง​ซอฟต์แวร์​เอง​แทน​การ​ซื้อ ควร​ทุ่ม​ทีม​เก่ง​ที่สุด​ลง​ตรง​นี้Strategic Design คือ​จุด​ที่​ต้อง​โดด​เด่น​เหนือ​คู่แข่ง (ทุ่ม​ทีม​เก่ง​ที่สุด), Supporting SubdomainSupporting Subdomainส่วน​ที่​จำเป็น​และ​เฉพาะ​กับ​ธุรกิจ​เรา แต่​ไม่ใช่​จุด​ที่​สร้าง​ความ​ได้​เปรียบ ไม่มี​ของ​สำเร็จรูป​ที่​พอดี จึง​ต้อง​ทำ​เอง แต่​ลงทุน​น้อย​กว่า coreStrategic Design จำเป็น​แต่​ไม่ใช่​จุด​ต่าง (ทำ​เอง​แต่​ลงทุน​น้อย​กว่า), Generic SubdomainGeneric Subdomainปัญหา​ที่​แก้​กัน​มา​แล้ว​ทั่วไป เช่น ระบบ login บัญชี การ​แจ้ง​เตือน — ควร​ใช้​ของ​สำเร็จรูป​หรือ library แทน​การ​เขียน​เองStrategic Design เป็น​ปัญหา​ทั่วไป (ควร​ซื้อ​หรือ outsource) กฎ​ทอง​คือ อย่า​เข้าใจ​ผิด​ว่า​ของ​ทั่วไป​คือ​แก่น


ขอบเขต​บาง​ส่วน​ของ​ระบบ​ภายใน domain ทาง​ธุรกิจ​มี​โอกาส​สูง​มาก​ที่​จะ​เป็น ระบบ legacy ไม่​ว่า​จะ​เป็น​ระบบ​ที่​องค์กร​สร้าง​เอง​หรือ​ซื้อ license มา ณ จุด​นี้​เรา​อาจ​ทำ​อะไร​กับ​การ​ปรับปรุง​ระบบ legacy เหล่า​นั้น​ไม่​ได้​มาก​นัก แต่​ก็​ยัง​ต้อง “คิดถึง​มัน” เมื่อ​มัน​ส่ง​ผลกระทบ​ต่อ project Core DomainCore Domainsubdomain ที่​สำคัญ​และ​สร้าง​ความ​ได้​เปรียบ​ใน​การ​แข่งขัน​มาก​ที่สุด เป็น​เหตุผล​ที่​เรา​ต้อง​สร้าง​ซอฟต์แวร์​เอง​แทน​การ​ซื้อ ควร​ทุ่ม​ทีม​เก่ง​ที่สุด​ลง​ตรง​นี้Strategic Design ของ​เรา และ​วิธี​คิดถึง​มัน​ก็​คือ — ใช้ SubdomainSubdomainส่วน​ย่อย​ของ Domain ใหญ่ เช่น Domain e-commerce แตก​เป็น subdomain การ​สั่ง​ซื้อ การ​ชำระ​เงิน คลัง​สินค้า ฯลฯ อยู่​ใน “พื้นที่​ปัญหา” (problem space)Strategic Design เป็น​เครื่องมือ​ใน​การ​พูด​คุย​เกี่ยว​กับ​พื้นที่​ปัญหา

น่า​เสียดาย​แต่​ก็​เป็น​ความ​จริง​ว่า ระบบ legacy บาง​ตัว​ขัด​กับ​วิถี DDD ที่​ออกแบบ​ด้วย Bounded ContextBounded Contextขอบเขต​ที่​ชัดเจน (มัก​เป็น​ระบบ​ย่อย​หรือ​ทีม​หนึ่ง) ที่ model หนึ่ง​ใช้ได้​และ​มี​ความหมาย​แน่นอน ภายใน​ขอบเขต​นี้ Ubiquitous Language สอดคล้อง​กัน 100%Strategic Design ถึง​ขนาด​ที่​เรียก​มัน​ได้​ว่า​เป็น “ระบบ legacy ที่​ไร้​ขอบเขต (unbounded legacy systems)” เพราะ​ระบบ​แบบ​นั้น​ก็​คือ​สิ่ง​ที่​เรียก​กัน​ว่า Big Ball of MudBig Ball of Mudระบบ​ที่​ปนเป​กัน​ยุ่งเหยิง​ไม่มี​ขอบเขต​ชัด ให้​ลาก​เส้น​ล้อม​ไว้​แล้ว​ยอมรับ​สภาพ ไม่​พยายาม​ทำ model ละเอียด​ใน​นั้น และ​ระวัง​ไม่​ให้​ลาม​ไป context อื่นStrategic Design เอา​เข้า​จริง​ระบบ​เดียว​นั้น​เต็ม​ไป​ด้วย model หลาย​ชุด​ที่​พัน​กัน​ยุ่งเหยิง ทั้ง​ที่​ควร​ถูก​ออกแบบ​และ implement แยก​จาก​กัน แต่​กลับ​ถูก​ยำ​รวม​กัน​เป็นกอง​ที่​ซับซ้อน​และ​เกี่ยวพัน​กัน​ไป​หมด

graph TB
  subgraph BBOM["Unbounded Legacy — Big Ball of Mud"]
    direction LR
    subgraph S1["Accounts Subdomain (บัญชี)"]
      A1[" "] --> A2[" "]
    end
    subgraph S2["Orders Subdomain (คำสั่งซื้อ)"]
      B1[" "] --> B2[" "]
    end
    subgraph S3["Catalog Subdomain (catalog)"]
      C1[" "] --> C2[" "]
    end
    subgraph S4["Fulfillment Subdomain (การเตรียมจัดส่ง)"]
      D1[" "] --> D2[" "]
    end
    subgraph S5["Shipping Subdomain (การจัดส่ง)"]
      E1[" "] --> E2[" "]
    end
    A2 -.->|"พันกันข้าม model"| B1
    B2 -.-> C1
    C2 -.-> D1
    D2 -.-> E1
  end

พูด​อีก​แบบ​หนึ่ง​คือ เมื่อ​พูด​ถึง​ระบบ legacy หนึ่ง​ตัว ภายใน​นั้น​มี​แนวโน้ม​จะ​มี model ของ domain เชิง​ตรรกะ​อยู่​บ้าง หรือ​กระทั่ง​มากมาย​หลาย​ชุด ให้​มอง model เชิง​ตรรกะ​แต่ละ​ชุด​เป็น Subdomain หนึ่ง​ตัว ใน​ภาพ​ข้าง​ต้น Subdomain เชิง​ตรรกะ​แต่ละ​ตัว​ที่​อยู่​ใน​ระบบ legacy แบบ monolith ไร้​ขอบเขต (Big Ball of MudBig Ball of Mudระบบ​ที่​ปนเป​กัน​ยุ่งเหยิง​ไม่มี​ขอบเขต​ชัด ให้​ลาก​เส้น​ล้อม​ไว้​แล้ว​ยอมรับ​สภาพ ไม่​พยายาม​ทำ model ละเอียด​ใน​นั้น และ​ระวัง​ไม่​ให้​ลาม​ไป context อื่นStrategic Design) ถูก​ขีด​ล้อม​ไว้​ด้วย​กรอบ​เส้น​ประ ทั้งหมด​มี model เชิง​ตรรกะ​หรือ Subdomain อยู่​ห้า​ชุด การ​ปฏิบัติ​ต่อ Subdomain เชิง​ตรรกะ​ใน​ลักษณะ​นี้​ช่วย​ให้​จัดการ​กับ​ความ​ซับซ้อน​ของ​ระบบ​ขนาด​ใหญ่​ได้ เพราะ​มัน​ทำให้​เรา​มอง​พื้นที่​ปัญหา​ราวกับ​ว่า​มัน​ถูก​พัฒนา​ด้วย DDD และ​มี​หลาย Bounded Context

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

จาก​ตรง​นี้​แนวคิด Subdomain เดียวกัน​ยัง​พา Core Domain ที่​เรา​กำลัง​ทำ​มา​วาง​เทียบ​กับ Subdomain ตัว​อื่น​ใน​ภาพ​เดียวกัน​ได้​ด้วย เรื่อง​นี้​จะ​ชัด​ขึ้น​ใน​หัวข้อ​ถัด​ไป​เมื่อ​จับ​แต่ละ Bounded Context ให้​ตรง​กับ Subdomain หนึ่ง​ตัว

🛒 ผ่า Big Ball of Mud ของ​ร้าน​ค้า​ออนไลน์

ลอง​นึกถึง​ระบบ retail e-commerce รุ่น​เก่า​ที่​เขียน​ยำ​รวม​กัน​มา​เป็น​ก้อน​เดียว ทั้ง​บัญชี (Accounts) คำ​สั่ง​ซื้อ (Orders) catalog สินค้า (Catalog) การเตรียม​จัด​ส่ง (Fulfillment) และ​การ​จัด​ส่ง (Shipping) ปน​กัน​อยู่​ใน​ฐาน code เดียว เรา​ยัง​แก้ code เก่า​ไม่​ได้​ใน​ตอน​นี้ แต่​ขีด​กรอบ​เส้น​ประ​รอบ model เชิง​ตรรกะ​แต่ละ​ก้อน​เพื่อ​มอง​มัน​เป็น SubdomainSubdomainส่วน​ย่อย​ของ Domain ใหญ่ เช่น Domain e-commerce แตก​เป็น subdomain การ​สั่ง​ซื้อ การ​ชำระ​เงิน คลัง​สินค้า ฯลฯ อยู่​ใน “พื้นที่​ปัญหา” (problem space)Strategic Design ได้ จาก​นั้น​จึง​ค่อย​พา Bounded ContextBounded Contextขอบเขต​ที่​ชัดเจน (มัก​เป็น​ระบบ​ย่อย​หรือ​ทีม​หนึ่ง) ที่ model หนึ่ง​ใช้ได้​และ​มี​ความหมาย​แน่นอน ภายใน​ขอบเขต​นี้ Ubiquitous Language สอดคล้อง​กัน 100%Strategic Design ตัว​ใหม่ (เช่น “คำ​สั่ง​ซื้อ” ที่​สร้าง​ด้วย DDD) มา​เชื่อม​ต่อ​กับ​ระบบ legacy เดิม — แทนที่​จะ​รื้อ​ทั้ง​ก้อน​ใน​คราว​เดียว


พอ​มี​แนวคิด Subdomain อยู่​ใน​มือ เรา​ยัง​วาด Core Domain ที่​กำลัง​ทำ​อยู่​ลง​ไป​ใน​แผนภาพ​ง่ายๆ ภาพ​เดียว​กับ Subdomain ตัวอื่นๆ ได้​ด้วย ตัวอย่าง​จาก​หนังสือ​วาด Subdomain ทั้ง​สาม​ประเภท​ไว้​ข้างๆ กัน — Core Domain คือ “Agile Project Management Context”, Generic Subdomain คือ “Identity and Access Context” (ระบบ​ยืนยัน​ตัวตน​และ​สิทธิ์​การ​เข้าถึง) และ Supporting Subdomain คือ “Collaboration Context” (ระบบ​ทำงาน​ร่วม​กัน) ภาพ​แบบ​นี้​ช่วย​ให้​เห็น​ความ​เกี่ยวพัน​และ​การ​พึ่งพา​กัน​ระหว่าง Subdomain ต่างๆ ส่วน​รายละเอียด​เชิง​ลึก​ขอ​ยก​ไป​ไว้​ใน​บท​ว่าด้วย Context MappingContext Mappingกิจกรรมการ​ระบุ Bounded Context และ​นิยาม​ความ​สัมพันธ์​ระหว่าง​กัน (เช่น Partnership, Shared Kernel, ACL) เพื่อ​จัดการ​การ​เชื่อม​ต่อ​ระหว่าง​ทีม/ระบบStrategic Design

graph LR
  subgraph GEN["Generic Subdomain"]
    IAC(["Identity and Access Context"])
  end
  subgraph CORE["Core Domain"]
    APM(["Agile Project Management Context"])
  end
  subgraph SUP["Supporting Subdomain"]
    COL(["Collaboration Context"])
  end

  classDef dashed stroke-dasharray:6 6;
  class GEN,CORE,SUP dashed;

เมื่อ​ใช้ DDD Bounded ContextBounded Contextขอบเขต​ที่​ชัดเจน (มัก​เป็น​ระบบ​ย่อย​หรือ​ทีม​หนึ่ง) ที่ model หนึ่ง​ใช้ได้​และ​มี​ความหมาย​แน่นอน ภายใน​ขอบเขต​นี้ Ubiquitous Language สอดคล้อง​กัน 100%Strategic Design ควร​จับ​คู่​แบบ หนึ่ง​ต่อ​หนึ่ง (1:1) กับ SubdomainSubdomainส่วน​ย่อย​ของ Domain ใหญ่ เช่น Domain e-commerce แตก​เป็น subdomain การ​สั่ง​ซื้อ การ​ชำระ​เงิน คลัง​สินค้า ฯลฯ อยู่​ใน “พื้นที่​ปัญหา” (problem space)Strategic Design เพียง​ตัว​เดียว นั่น​คือ ถ้า​มี Bounded Context หนึ่ง​ตัว เป้าหมาย​คือ​ให้​มี model Subdomain หนึ่ง​ชุด​อยู่​ใน Bounded Context นั้น มัน​อาจ​ไม่​ได้​ทำได้​เสมอ​ไป​หรือ​ทำได้​จริง​แต่​ตรง​ไหน​ที่​ทำได้​ก็​สำคัญ​ที่​จะ​ออกแบบ​ไป​ใน​ทาง​นั้น เพราะ​จะ​ทำให้ Bounded Context สะอาด​และ​โฟกัส​อยู่​กับ​ความ​ริเริ่ม​เชิงกลยุทธ์​ที่​เป็น​แกน​หลัก

ถ้า​จำเป็น​ต้อง​สร้าง model ตัว​ที่​สอง​ใน Bounded Context เดียวกัน (ภายใน Core Domain) ควร​แยก model รอง​นั้น​ออก​จาก Core DomainCore Domainsubdomain ที่​สำคัญ​และ​สร้าง​ความ​ได้​เปรียบ​ใน​การ​แข่งขัน​มาก​ที่สุด เป็น​เหตุผล​ที่​เรา​ต้อง​สร้าง​ซอฟต์แวร์​เอง​แทน​การ​ซื้อ ควร​ทุ่ม​ทีม​เก่ง​ที่สุด​ลง​ตรง​นี้Strategic Design ด้วย โมดูล (Module)Moduleการ​จัด​กลุ่ม​แนวคิด​ที่​เกี่ยวข้อง​กัน​ไว้​ด้วย​กัน (เช่น package) ตั้ง​ชื่อ​ให้​เป็น​ส่วน​หนึ่ง​ของ Ubiquitous Language จัด​ตาม​ธุรกิจ ไม่ใช่​ตาม​ชนิด​ทาง​เทคนิคTactical Design ที่​แยก​ออก​จาก​กัน​โดย​สิ้นเชิง (module ใน DDD โดย​พื้นฐาน​ก็​คือ package ใน Scala และ Java และ​คือ namespace ใน F# และ C#) วิธี​นี้​เป็นการ​ประกาศ​ใน​เชิง​ภาษา​อย่าง​ชัดเจน​ว่า model หนึ่ง​คือ​แกน​หลัก ส่วน​อีก model เป็น​เพียง​ตัว​สนับสนุน การ​ใช้​การ​แยก Subdomain ใน​ลักษณะ​นี้​คือ​สิ่ง​ที่​จะ​นำ​มา​ใช้​ใน พื้นที่​คำ​ตอบ (Solution Space)Solution Space“พื้นที่​คำ​ตอบ” — วิธี​ที่​เรา​เลือก​แก้​ปัญหา อยู่​ใน​รูป​ของ Bounded Context และ model 1 subdomain อาจ​มี​ได้​หลาย​คำ​ตอบStrategic Design

graph TB
  subgraph BC["Bounded Context (Core Domain)"]
    CORE["module: model Core (แกนหลัก)"]
    SUPP["module: model Supporting (ตัวสนับสนุน)"]
    CORE -.->|"แยกด้วย Module ชัดเจน"| SUPP
  end
อย่า​ทุ่ม​ทรัพยากร​ผิด​ที่

อันตราย​ที่​พบ​บ่อย​คือ​การ เข้าใจ​ผิด​ว่า Generic SubdomainGeneric Subdomainปัญหา​ที่​แก้​กัน​มา​แล้ว​ทั่วไป เช่น ระบบ login บัญชี การ​แจ้ง​เตือน — ควร​ใช้​ของ​สำเร็จรูป​หรือ library แทน​การ​เขียน​เองStrategic Design หรือ Supporting SubdomainSupporting Subdomainส่วน​ที่​จำเป็น​และ​เฉพาะ​กับ​ธุรกิจ​เรา แต่​ไม่ใช่​จุด​ที่​สร้าง​ความ​ได้​เปรียบ ไม่มี​ของ​สำเร็จรูป​ที่​พอดี จึง​ต้อง​ทำ​เอง แต่​ลงทุน​น้อย​กว่า coreStrategic Design เป็น Core DomainCore Domainsubdomain ที่​สำคัญ​และ​สร้าง​ความ​ได้​เปรียบ​ใน​การ​แข่งขัน​มาก​ที่สุด เป็น​เหตุผล​ที่​เรา​ต้อง​สร้าง​ซอฟต์แวร์​เอง​แทน​การ​ซื้อ ควร​ทุ่ม​ทีม​เก่ง​ที่สุด​ลง​ตรง​นี้Strategic Design แล้ว​ทุ่ม​ทีม​เก่ง​ที่สุด​และ​งบประมาณ​ก้อน​ใหญ่​ลง​ไป ผล​คือ​ไป​สร้าง​ของ​ที่ “ซื้อ​สำเร็จรูป​ก็ได้” ขึ้น​มา​เอง ขณะ​ที่​แก่นจริงๆ กลับ​ขาด​แรง จง​ระบุ​ให้​ชัด​ว่า​จุด​ไหน​ทำให้​ธุรกิจ “ชนะ” แล้ว​ลงแรง​ตรง​นั้น


ใน​บท​นี้​เรา​ได้​เรียนรู้​ว่า SubdomainSubdomainส่วน​ย่อย​ของ Domain ใหญ่ เช่น Domain e-commerce แตก​เป็น subdomain การ​สั่ง​ซื้อ การ​ชำระ​เงิน คลัง​สินค้า ฯลฯ อยู่​ใน “พื้นที่​ปัญหา” (problem space)Strategic Design คือ​อะไร​และ​ถูก​ใช้​อย่างไร ทั้ง​ใน พื้นที่​ปัญหาProblem Space“พื้นที่​ปัญหา” — สิ่ง​ที่​ธุรกิจ​ต้องการ​แก้ไข อยู่​ใน​รูป​ของ Domain และ Subdomain (ยัง​ไม่​พูด​ถึง​วิธี​แก้)Strategic Design และ พื้นที่​คำ​ตอบSolution Space“พื้นที่​คำ​ตอบ” — วิธี​ที่​เรา​เลือก​แก้​ปัญหา อยู่​ใน​รูป​ของ Bounded Context และ model 1 subdomain อาจ​มี​ได้​หลาย​คำ​ตอบStrategic Design เรา​เห็น​ความ​แตก​ต่าง​ระหว่าง Core DomainCore Domainsubdomain ที่​สำคัญ​และ​สร้าง​ความ​ได้​เปรียบ​ใน​การ​แข่งขัน​มาก​ที่สุด เป็น​เหตุผล​ที่​เรา​ต้อง​สร้าง​ซอฟต์แวร์​เอง​แทน​การ​ซื้อ ควร​ทุ่ม​ทีม​เก่ง​ที่สุด​ลง​ตรง​นี้Strategic Design (จุด​ที่​ต้อง​โดด​เด่น​เหนือ​คู่แข่ง​และ​ทุ่ม​ลงทุน​มาก​ที่สุด), Supporting SubdomainSupporting Subdomainส่วน​ที่​จำเป็น​และ​เฉพาะ​กับ​ธุรกิจ​เรา แต่​ไม่ใช่​จุด​ที่​สร้าง​ความ​ได้​เปรียบ ไม่มี​ของ​สำเร็จรูป​ที่​พอดี จึง​ต้อง​ทำ​เอง แต่​ลงทุน​น้อย​กว่า coreStrategic Design (จำเป็นต่อ​ความ​สำเร็จ​ของ​แกน​หลัก​แต่​ไม่ใช่​จุด​สร้าง​ความ​ต่าง), และ Generic SubdomainGeneric Subdomainปัญหา​ที่​แก้​กัน​มา​แล้ว​ทั่วไป เช่น ระบบ login บัญชี การ​แจ้ง​เตือน — ควร​ใช้​ของ​สำเร็จรูป​หรือ library แทน​การ​เขียน​เองStrategic Design (ปัญหา​ทั่วไป​ที่​ควร​ซื้อ​หรือ outsource)

เรา​ได้​เห็น​ว่า​จะ​ใช้ Subdomain ช่วย​คิด​เรื่อง​การ​เชื่อม​ต่อ​กับ​ระบบ legacy แบบ Big Ball of MudBig Ball of Mudระบบ​ที่​ปนเป​กัน​ยุ่งเหยิง​ไม่มี​ขอบเขต​ชัด ให้​ลาก​เส้น​ล้อม​ไว้​แล้ว​ยอมรับ​สภาพ ไม่​พยายาม​ทำ model ละเอียด​ใน​นั้น และ​ระวัง​ไม่​ให้​ลาม​ไป context อื่นStrategic Design ได้​อย่างไร — ด้วย​การ​มอง model เชิง​ตรรกะ​แต่ละ​ก้อน​ใน​ระบบ​ไร้​ขอบเขต​นั้น​เป็น Subdomain หนึ่ง​ตัว เพื่อ​ให้​รับมือ​กับ​ความ​ซับซ้อน​ของ​ระบบ​ใหญ่​ได้​ราวกับ​มัน​ถูก​ออกแบบ​มา​ด้วย DDD และ​ยัง​ย้ำ​ถึง​ความ​สำคัญ​ของ​การ​จับ Bounded ContextBounded Contextขอบเขต​ที่​ชัดเจน (มัก​เป็น​ระบบ​ย่อย​หรือ​ทีม​หนึ่ง) ที่ model หนึ่ง​ใช้ได้​และ​มี​ความหมาย​แน่นอน ภายใน​ขอบเขต​นี้ Ubiquitous Language สอดคล้อง​กัน 100%Strategic Design ให้​ตรง​กับ Subdomain เดียว​แบบ​หนึ่ง​ต่อ​หนึ่ง รวม​ถึง​วิธี​แยก model Supporting Subdomain ออก​จาก model Core Domain ด้วย โมดูล (Module)Moduleการ​จัด​กลุ่ม​แนวคิด​ที่​เกี่ยวข้อง​กัน​ไว้​ด้วย​กัน (เช่น package) ตั้ง​ชื่อ​ให้​เป็น​ส่วน​หนึ่ง​ของ Ubiquitous Language จัด​ตาม​ธุรกิจ ไม่ใช่​ตาม​ชนิด​ทาง​เทคนิคTactical Design ของ DDD ใน​กรณี​ที่​แยก​ออก​เป็น​คนละ Bounded Context ไม่​สะดวก

สำหรับ​เนื้อหา​เชิง​ลึก​ครบถ้วน​เรื่อง Subdomain ดู​ได้​ใน​บท​ที่ 2 ของ​หนังสือ Implementing Domain-Driven Design ของ Vaughn Vernon

— Vaughn Vernon, Domain-Driven Design Distilled

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

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

  • Subdomain — นิยาม​และ​ตัวอย่าง​ของ Subdomain ใน​ฐานะ​ส่วน​ย่อย​เชิง​ตรรกะ​ของ domain ทาง​ธุรกิจ ตรง​กับ​หัวใจ​ของ​บท​นี้
  • Domain — เปรียบเทียบ Subdomain กับ Core Domain ช่วย​ขยาย​ความ​แตก​ต่าง​ระหว่าง​สาม​ประเภท​ของ Subdomain ที่​บท​นี้​อธิบาย
  • Bounded Context — อธิบาย​ฝั่ง​พื้นที่​คำ​ตอบ​ที่​ต้อง​จับ​คู่​แบบ 1:1 กับ Subdomain ตาม​ที่​บท​นี้​เน้น​ย้ำ
  • Big Ball of Mud — แอนตี้​แพทเทิร์น​ของ​ระบบ legacy ไร้​ขอบเขต​ที่​บท​นี้​ใช้ Subdomain ช่วย​แบ่ง​พื้นที่​ปัญหา​ให้​จัดการ​ได้

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

ข้อ 1 / 4

Subdomain อยู่ในพื้นที่ใดของ DDD?