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

Strategic Design

เมื่อ domain ใหญ่​ขึ้น การ​สร้าง model เดียว​ที่​ครอบ​ทุก​อย่าง​จะ​ยาก​ขึ้น​ต่อ​เนื่อง Evans บอก​ว่า “การ​รวม model ทั้ง​ระบบ​ให้​เป็น​หนึ่ง​เดียว​มัก​ไม่​คุ้ม​และ​เป็น​ไป​ไม่​ได้” ทางออก​คือ​แบ่ง​เป็น​เครือ​ข่าย​ของ Bounded ContextBounded Contextขอบเขต​ที่​ชัดเจน (มัก​เป็น​ระบบ​ย่อย​หรือ​ทีม​หนึ่ง) ที่ model หนึ่ง​ใช้ได้​และ​มี​ความ​หมาย​แน่นอน ภายใน​ขอบเขต​นี้ Ubiquitous Language สอดคล้อง​กัน 100%Strategic Design

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

🛒 คำ​ว่า “Product” ใน​แต่ละ context

ใน context catalog “Product” คือ​ชื่อ รูป คำ​อธิบาย ราคา​ตั้ง; ใน context คลัง​สินค้า “Product” คือ SKU น้ำ​หนัก ตำแหน่ง​จัด​เก็บ; ใน context การ​จัด​ส่ง “Product” คือ​ขนาด​กล่อง​และ​น้ำ​หนัก​เพื่อ​คิด​ค่า​ส่ง — คนละ model แต่​ชื่อ​เดียวกัน นี่​คือ​เหตุผล​ที่​ต้อง​มี​ขอบเขต

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

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

ซื้อ​ของ​สำเร็จรูป​มา​ใช้ได้​โดย​ไม่​เสีย​ความ​ได้​เปรียบ​ไหม? → Generic · ตรรกะ​ธุรกิจ​ง่าย​ไหม? → Supporting · ซื้อ​ไม่​ได้ และ​ตรรกะ​ซับ​ซ้อน? → Core

🚢 อะไร​คือ Core ของ​บริษัท​ขนส่ง?

การ “หา​เส้น​ทาง​ที่​ดี​ที่สุด” (routing/optimization) มัก​เป็น Core DomainCore Domainsubdomain ที่​สำคัญ​และ​สร้าง​ความ​ได้​เปรียบ​ใน​การ​แข่งขัน​มาก​ที่สุด เป็น​เหตุผล​ที่​เรา​ต้อง​สร้าง​ซอฟต์แวร์​เอง​แทน​การ​ซื้อ ควร​ทุ่ม​ทีม​เก่ง​ที่สุด​ลง​ตรง​นี้Strategic Design เพราะ​คือ​จุด​ที่​สร้าง​ความ​ได้​เปรียบ ส่วน “การ​ออก​ใบ​แจ้ง​หนี้” เป็น supporting และ “การ​ยืนยัน​ตัว​ตน​ผู้​ใช้” เป็น generic — ควร​ซื้อ​มา​ใช้

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


เมื่อ​มี​หลาย Bounded ContextBounded Contextขอบเขต​ที่​ชัดเจน (มัก​เป็น​ระบบ​ย่อย​หรือ​ทีม​หนึ่ง) ที่ model หนึ่ง​ใช้ได้​และ​มี​ความ​หมาย​แน่นอน ภายใน​ขอบเขต​นี้ Ubiquitous Language สอดคล้อง​กัน 100%Strategic Design เรา​ต้อง​นิยาม​ว่า​แต่ละ​คู่​สัมพันธ์​กัน​อย่างไร Context MapContext Mapแผนภาพ​ที่​แสดง Bounded Context ทั้งหมด​และ​ความ​สัมพันธ์​ระหว่าง​กัน ช่วย​ให้​เห็น​ภาพ​รวม​และ​จุด​เชื่อม​ต่อ/แปล​ภาษา​ใน​ระบบ​ใหญ่Strategic Design คือ​แผนภาพ​ที่​แสดง​สิ่ง​นี้ เริ่ม​จาก​บทบาท Upstream/DownstreamUpstream / Downstreamความ​สัมพันธ์​ที่​การก​ระ​ทำ​ของ​ฝ่าย​ต้นน้ำ (upstream) ส่ง​ผล​ต่อ​ฝ่าย​ปลาย​น้ำ (downstream) แต่​ไม่ใช่​ใน​ทาง​กลับ​กัน — ทิศ​ของ​อิทธิพลStrategic Design: การก​ระ​ทำ​ของ​ฝ่าย​ต้นน้ำ​ส่ง​ผล​ต่อ​ปลาย​น้ำ แต่​ไม่ใช่​ใน​ทาง​กลับ​กัน ลอง​เลือก​แต่ละ​รูป​แบบ​ใน​ไดอะแกรม​ด้าน​ล่าง​เพื่อ​ดู​ความ​หมาย​และ​การ​เชื่อม​ต่อ

รูป​แบบ​ทั้ง​เก้า​มี​ดังนี้ — ไดอะแกรม​ด้าน​ล่าง​แสดง​ทิศทาง​ของ​ลูก​ศร​และ​บทบาท​ของ​แต่ละ​ฝ่าย​ให้​ดู​ควบคู่​กัน

  • PartnershipPartnershipสอง​ทีม​ที่​หาก​ฝ่าย​ใด​ล้ม​เหลว​อีก​ฝ่าย​ก็​ส่ง​งาน​ไม่​ได้ จึง​ต้อง​วางแผน​และ​จัดการ​การ​เชื่อม​ต่อ​ร่วม​กัน feature ที่​พึ่งพา​กัน​ถูก​จัด​ให้​เสร็จ​ใน release เดียวกันStrategic Design — สอง​ทีม​สำเร็จ​พร้อม​กัน​และ​ล้ม​พร้อม​กัน จึง​ต้อง​วางแผน​และ​ปล่อย​ของ​ด้วย​กัน
  • Shared KernelShared Kernelสอง​ทีม​ตกลง​แบ่ง model ส่วน​เล็ก ๆ มา​ใช้​ร่วม​กัน​โดย​มี​ขอบเขต​ชัดเจน ส่วน​นี้​ห้าม​แก้​โดย​ไม่​ปรึกษา​กัน เพราะ​กระทบ​ทั้ง​สอง​ฝ่ายStrategic Design — แบ่ง model ก้อน​เล็ก​ก้อน​หนึ่ง​มา​ใช้​ร่วม​กัน ฝ่าย​เดียว​แก้​เอง​ไม่​ได้
  • Customer/SupplierCustomer / Supplierความ​สัมพันธ์​ที่​ทีม​ต้นน้ำ (supplier) รับ​ความ​ต้องการ​ของ​ทีม​ปลาย​น้ำ (customer) เข้าไป​วางแผน​ด้วย มี​การ​เจรจา​และ​จัด​ลำดับ​งาน​ให้​ชัดเจนStrategic Design — ต้นน้ำ​เป็น​ผู้​ส่ง ปลาย​น้ำ​เป็น​ลูกค้า​ที่​ต่อ​รอง​ความ​ต้องการ​ของ​ตัว​เอง​ได้
  • ConformistConformistทีม​ปลาย​น้ำ​ยอม “ตามใจ” model ของ​ทีม​ต้นน้ำ​ทั้งหมด​เพื่อ​ตัด​ความ​ซับ​ซ้อน​ใน​การ​แปล​ภาษา ใช้​เมื่อ​ทีม​ต้นน้ำ​ไม่มี​แรง​จูงใจ​จะ​รองรับ​เราStrategic Design — ปลาย​น้ำ​ยอมรับ model ของ​ต้นน้ำ​ทั้ง​ดุ้น ไม่​ต่อ​รอง​และ​ไม่​แปล
  • Anticorruption LayerAnticorruption Layer (ACL)ชั้น​กั้น​ที่​ทีม​ปลาย​น้ำ​สร้าง​ขึ้น​เพื่อ​แปลง model ของ​ระบบ​อื่น​ให้​เป็น​ภาษา​ของ model ตัว​เอง ป้องกัน​ไม่​ให้ model ภายนอก​มา “ปน​เปื้อน” model เราStrategic Design — ปลาย​น้ำ​สร้าง​ชั้น​แปล​กั้น​ไว้ ไม่​ให้ model ของ​ต้นน้ำ​รั่ว​เข้า​มา​ปน​เปื้อน
  • Open Host ServiceOpen Host Service (OHS)ทีม​ต้นน้ำ​เปิด​บริการ​เป็น​โพ​ร​โท​คอล/API ที่​นิยาม​ไว้​ชัดเจน ให้​ทุก​คน​ที่​ต้อง​เชื่อม​ต่อ​มา​ใช้ได้ เหมาะ​กับ​ระบบ​ที่​มี​ผู้​ใช้​หลาย​ฝ่ายStrategic Design — ต้นน้ำ​เปิด​บริการ​ที่​มี​โพ​ร​โท​คอล​ชัดเจน​ให้​ผู้​ใช้​ทุก​ราย​ใช้​เหมือน​กัน
  • Published LanguagePublished Languageภาษา​กลาง​ที่​จัด​ทำ​เป็น​เอกสาร​ชัดเจน ใช้​เป็น​สื่อ​แลก​เปลี่ยน​ข้อมูล​ระหว่าง context เช่น มาตรฐาน​ข้อมูล​ของ​อุตสาหกรรม มัก​ใช้​คู่​กับ OHSStrategic Design — ทั้ง​สอง​ฝ่าย​ตกลง​ใช้​ภาษา​กลาง​ที่​เผย​แพร่​ไว้​เป็น​ตัว​แลก​เปลี่ยน​ข้อมูล
  • Separate WaysSeparate Waysประกาศ​ว่า Bounded Context นี้​ไม่​เชื่อม​ต่อ​กับ​อัน​อื่น​เลย เพื่อ​ให้​แต่ละ​ฝ่าย​หา​ทาง​แก้​แบบ​ง่าย ๆ เฉพาะ​ของ​ตน ใช้​เมื่อ​ค่า​ใช้​จ่าย​การ​เชื่อม​ต่อ​ไม่​คุ้มStrategic Design — ตัดสิน​ใจ​ไม่​เชื่อม​กัน​เลย เพราะ​ต้นทุน​ของ​การ​เชื่อม​สูง​กว่า​ประโยชน์​ที่​ได้
  • Big Ball of MudBig Ball of Mudระบบ​ที่​ปนเป​กัน​ยุ่งเหยิง​ไม่มี​ขอบเขต​ชัด ให้​ลาก​เส้น​ล้อม​ไว้​แล้ว​ยอมรับ​สภาพ ไม่​พยายาม​ทำ model ละเอียด​ใน​นั้น และ​ระวัง​ไม่​ให้​ลาม​ไป context อื่นStrategic Design — ไม่มี​ขอบเขต model ปน​กัน​จน​แยก​ไม่​ออก รูป​แบบ​นี้​มี​ไว้​ให้​กัน ไม่ใช่​ให้​เลียน​แบบ

Context Mapping — เลือกดูทั้ง 9 รูปแบบ

context map
partnerpartnerContext AContext B
Partnership: สองทีมที่หากฝ่ายใดล้มเหลวอีกฝ่ายก็ส่งงานไม่ได้ จึงต้องวางแผนและจัดการการเชื่อมต่อร่วมกัน feature ที่พึ่งพากันถูกจัดให้เสร็จใน release เดียวกัน
Context Mapping — ความสัมพันธ์ระหว่างบริบท (Bounded Context) ทั้ง 9 รูปแบบ
EventStorming — เครื่อง​มือ​ค้น​พบ​ขอบเขต

EventStormingEventStormingเวิร์​กช็อป​แบบ​ร่วม​มือ (Alberto Brandolini, 2013) ใช้​กระดาษ​โน้ต​สี​ติด​บน​ผนัง: ส้ม=event, น้ำเงิน=command, เหลือง=aggregate ฯลฯ เพื่อ​ค้น​พบ model และ​ขอบเขต​ของ contextProcess (Alberto Brandolini, 2013) คือ​เวิร์​กช็อป​ที่​ใช้​กระดาษ​โน้ต​สี​ติด​ผนัง เริ่ม​จาก​ไล่ “Domain EventDomain Eventสิ่ง​ที่ “เกิด​ขึ้น​แล้ว” ใน domain ซึ่ง​ส่วน​อื่น​สนใจ แทน​ด้วย​อ็อบเจ็กต์​ที่​เปลี่ยนแปลง​ไม่​ได้ ตั้ง​ชื่อ​เป็น​อดีต เช่น CargoWasRouted ใช้​สื่อสาร​ข้าม AggregateTactical Design” (โน้ต​สี​ส้ม เขียน​เป็น​อดีต) บน​เส้น​เวลา แล้ว​ค่อย​ค้น​พบ command, AggregateAggregateกลุ่ม​ของ Entity และ Value Object ที่​ถูก​มอง​เป็น​หนึ่ง​หน่วย​เดียว​เพื่อ​รักษา​ความ​ถูก​ต้อง​ของ​ข้อมูล มี​ขอบเขต​ชัดเจน และ​เป็น​หน่วย​ของ transactionTactical Design, policy ฯลฯ จุด​ที่​แต่ละ​แผนก​ใช้​ภาษา​ต่าง​กัน​สำหรับ​สิ่ง​คล้าย​กัน มัก​เป็น​รอย​ต่อ​ของ Bounded ContextBounded Contextขอบเขต​ที่​ชัดเจน (มัก​เป็น​ระบบ​ย่อย​หรือ​ทีม​หนึ่ง) ที่ model หนึ่ง​ใช้ได้​และ​มี​ความ​หมาย​แน่นอน ภายใน​ขอบเขต​นี้ Ubiquitous Language สอดคล้อง​กัน 100%Strategic Design พอดี

ด้าน​ล่าง​คือ​กระดาน​จำลอง​แบบ EventStorming ลาก​กล่อง context ไป​วาง​ได้​ตามใจ แล้ว​เชื่อม​ความ​สัมพันธ์​โดย​เลือก​สอง​กล่อง​และ​กำหนด​รูป​แบบ ลอง​ออกแบบ​แผนที่​บริบท​ของ​ระบบ e-commerce ดู

Context Map เริ่ม​ต้น (ภาพ​ประกอบ​แบบ​ข้อความ สำหรับ​การ​เข้า​ถึง​และ​ไม่มี JavaScript)

Bounded Contexts:

  • Catalog
  • Sales
  • Payment
  • Shipping
  • Identity

ความ​สัมพันธ์ (Context Map):

ต้นน้ำรูป​แบบปลาย​น้ำ
Sales Customer/Supplier Shipping
Sales Anticorruption Layer Payment

Sales —[Customer / Supplier]→ Shipping · Sales —[ACL]→ Payment


Strategic Design
  • ขอบเขตที่ชัดเจน (มักเป็นระบบย่อยหรือทีมหนึ่ง) ที่ model หนึ่งใช้ได้และมีความหมายแน่นอน ภายในขอบเขตนี้ Ubiquitous Language สอดคล้องกัน 100%
    • Ubiquitous Languageภาษากลางที่ทุกคนในทีม (ทั้งนักพัฒนาและผู้เชี่ยวชาญธุรกิจ) ใช้ร่วมกัน อิงกับ domain model โดยตรง คำเดียวกันต้องหมายถึงสิ่งเดียวกัน และสะท้อนลงใน code
    • Context Mapแผนภาพที่แสดง Bounded Context ทั้งหมดและความสัมพันธ์ระหว่างกัน ช่วยให้เห็นภาพรวมและจุดเชื่อมต่อ/แปลภาษาในระบบใหญ่
  • ส่วนย่อยของ Domain ใหญ่ เช่น Domain e-commerce แตกเป็น subdomain การสั่งซื้อ การชำระเงิน คลังสินค้า ฯลฯ อยู่ใน “พื้นที่ปัญหา” (problem space)
    • Core Domainsubdomain ที่สำคัญและสร้างความได้เปรียบในการแข่งขันมากที่สุด เป็นเหตุผลที่เราต้องสร้างซอฟต์แวร์เองแทนการซื้อ ควรทุ่มทีมเก่งที่สุดลงตรงนี้
    • Supporting Subdomainส่วนที่จำเป็นและเฉพาะกับธุรกิจเรา แต่ไม่ใช่จุดที่สร้างความได้เปรียบ ไม่มีของสำเร็จรูปที่พอดี จึงต้องทำเอง แต่ลงทุนน้อยกว่า core
    • Generic Subdomainปัญหาที่แก้กันมาแล้วทั่วไป เช่น ระบบ login บัญชี การแจ้งเตือน — ควรใช้ของสำเร็จรูปหรือ library แทนการเขียนเอง
  • กิจกรรมการระบุ Bounded Context และนิยามความสัมพันธ์ระหว่างกัน (เช่น Partnership, Shared Kernel, ACL) เพื่อจัดการการเชื่อมต่อระหว่างทีม/ระบบ
    • Anticorruption Layerชั้นกั้นที่ทีมปลายน้ำสร้างขึ้นเพื่อแปลง model ของระบบอื่นให้เป็นภาษาของ model ตัวเอง ป้องกันไม่ให้ model ภายนอกมา “ปนเปื้อน” model เรา
    • Open Host Serviceทีมต้นน้ำเปิดบริการเป็นโพรโทคอล/API ที่นิยามไว้ชัดเจน ให้ทุกคนที่ต้องเชื่อมต่อมาใช้ได้ เหมาะกับระบบที่มีผู้ใช้หลายฝ่าย
🔗 อ้างอิง​เพิ่ม​เติม​ใน DevIQ

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

  • Bounded Context — นิยาม​และ​ตัวอย่าง​การ “ลาก​เส้น” ขอบเขต​ที่ model หนึ่ง​ใช้ได้ ตรง​กับ​แก่น​ของ​บท​นี้
  • Subdomain — ราย​ละเอียด​การ​แบ่ง Core/Supporting/Generic Subdomain ตาม Problem Space
  • Context Mapping — รูป​แบบ​ความ​สัมพันธ์​ระหว่าง Bounded Context แบบ​ละเอียด​กว่า​ที่​สรุป​ใน​ไดอะแกรม​ด้าน​บน
  • Anti-Corruption Layer — อธิบาย​ชั้น​ป้องกัน model ที่​ใช้​ตอบ​คำ​ถาม​ค​วิซ​ข้อ​สุดท้าย​ของ​บท​นี้
  • Event Storming — เท​คนิคเวิร์​กช็อป​สำหรับ​ค้น​พบ​ขอบเขต Bounded Context ที่​กล่าว​ถึง​ใน​บท​นี้

เช็กความเข้าใจ — Stage 2

ข้อ 1 / 4

ภายใน Bounded Context 1 Ubiquitous Language มีลักษณะอย่างไร?