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

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: การกระทำ​ของ​ฝ่าย​ต้นน้ำ​ส่ง​ผล​ต่อ​ปลาย​น้ำ แต่​ไม่ใช่​ใน​ทาง​กลับ​กัน ลอง​เลือก​แต่ละ​รูปแบบ​ใน​ไดอะแกรม​ด้าน​ล่าง​เพื่อ​ดู​ความหมาย​และ​การ​เชื่อม​ต่อ

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 มีลักษณะอย่างไร?