บทที่ 2 · Part 1 — Foundations and Economics
Why DDD and When It Pays
เชื่อม DDD กับ business outcome, cost of change และความเสี่ยง พร้อมรู้ว่าเมื่อใดไม่ควรลงทุนเพิ่ม
Why DDD and When It Pays
บริษัท Fintech แห่งหนึ่งใช้เวลา 3 เดือนเพิ่ม refund แบบบางส่วน แม้หน้าจอใหม่มีเพียง
ไม่กี่ช่อง ปัญหาไม่ได้อยู่ที่เขียน endpoint ช้า แต่คำว่า Refund, Reversal, Void
และ Credit Note หมายถึงคนละอย่างใน Product, Operations, Finance และ Engineering
ทุก change จึงต้องประชุมแก้ความเข้าใจ ทดสอบซ้ำ และตามซ่อมข้อมูลที่แต่ละระบบตีความต่างกัน
DDD มีโอกาสคุ้มค่าในสถานการณ์นี้ เพราะต้นทุนหลักคือ ความซับซ้อนของความหมายและการเปลี่ยนแปลง ไม่ใช่เพราะบริษัทต้องการ folder template ใหม่ แต่หากทีมเล็กกำลังทำ CRUD หลังบ้านที่กฎนิ่ง การเพิ่ม Aggregate, Repository และ workshop ทุกสัปดาห์อาจแพงกว่าปัญหาที่มีจริง
จบบทนี้คุณจะ
เชื่อม DDD กับ business outcome และ cost of change ประเมินต้นทุนทั้งฝั่ง Business, Product, Risk, Operations และ Engineering เลือกว่าจะใช้ DDD มากน้อยเพียงใด และเขียน investment hypothesis ที่มีสัญญาณหยุดหรือขยายผลได้
[!IMPORTANT] DDD ไม่รับประกันผลตอบแทน ตารางและ score ในบทนี้เป็น Heuristic/Trade-off สำหรับตั้งสมมติฐาน ไม่ใช่สูตร ROI จากมาตรฐานสากล ผลจริงต้องวัดในบริบทบริษัท และต้องแยกผลของ DDD ออกจากการเปลี่ยนทีม, platform, process หรือ architecture ที่เกิดพร้อมกัน
สิ่งที่ธุรกิจกำลังซื้อจริง
DDD Reference วาง Ubiquitous Language, Model-Driven Design, Bounded Context และ Core Domain ไว้เป็นแกน สิ่งที่องค์กรซื้อจากการลงทุน จึงไม่ใช่ diagram แต่เป็นความสามารถ 4 ด้าน:
- เรียนรู้ปัญหาเร็วขึ้น — คนที่รู้ policy กับคนที่สร้างระบบตรวจ model เดียวกันได้
- ลดความกำกวมตอนส่งต่องาน — ชื่อใน conversation, example, contract, code และ test สื่อความหมายเดียวกันภายใน context
- ปกป้องกฎสำคัญ — invariant และ authoritative decision อยู่กับ owner ที่ชัด
- เปลี่ยนส่วนต่าง ๆ ได้อิสระขึ้น — model boundary และ contract ลดเหตุที่ change หนึ่ง ต้องลากทั้งองค์กรมา deploy พร้อมกัน
เอกสาร Domain Analysis ของ Microsoft Azure อธิบาย Strategic DDD และ Tactical DDD เป็นกระบวนการต่อเนื่องสำหรับจัดระบบรอบ business capability ไม่ใช่ขั้นตอนที่ให้คำตอบเชิงกลไก ส่วนกรณี DOMA ของ Uber แสดงปัญหาอีกระดับ: เมื่อองค์กรมี service จำนวนมาก ความเป็นอิสระที่เคยได้อาจกลายเป็น network of dependencies จึงต้องจัดกลุ่ม ownership, gateway และ dependency ใหม่ตาม domain นี่เป็น case study ของ Uber ไม่ใช่หลักฐานว่าบริษัททุกแห่งควรมี microservices หรือคัดลอก DOMA
Business Value Chain ของ DDD
คำว่า “ทำให้ business กับ tech คุยกันรู้เรื่อง” ยังวัดไม่ได้ ให้เขียน causal chain ก่อนลงทุน:
| Practice | พฤติกรรมที่คาดว่าจะเปลี่ยน | ผลลัพธ์ใกล้ตัว | Business outcome ที่ต้องพิสูจน์ |
|---|---|---|---|
| Scenario + Ubiquitous Language | ทีมถามความหมายก่อนแตก ticket | requirement churn ลด | lead time ของ policy change สั้นลง |
| Subdomain portfolio | แยกสิ่งที่ควรสร้างเองจากของทั่วไป | งบและคนไปอยู่จุดสร้างความต่าง | time-to-market ของ Core capability ดีขึ้น |
| Bounded Context + ownership | decision มี owner และ contract | cross-team handoff ลด | release frequency เพิ่มโดย incident ไม่เพิ่ม |
| Aggregate + invariant tests | invalid state สร้างยากขึ้น | defect เรื่องกฎลด | loss, rework และ manual correction ลด |
| Anti-Corruption Layer | vendor model หยุดที่ boundary | เปลี่ยน provider กระทบวงแคบ | integration change คาดการณ์ได้ขึ้น |
แถวสุดท้ายไม่ได้แปลว่าเปลี่ยน provider จะ “ง่าย” เสมอ หาก semantic capability ต่างกันมาก adapter ก็ต้องซับซ้อน คุณค่าที่หวังคือทำให้ความต่างนั้นอยู่ในจุดที่เห็นและทดสอบได้
ต้นทุนที่ต้องนับให้ครบ
DDD สร้างต้นทุนทั้งก่อนและหลัง merge:
- เวลาของ Domain Expert, Product, Operations, Risk และ Engineer ใน modelling session
- facilitation, preparation และการตามคำถามที่ไม่มี owner
- การสร้างและดูแล glossary, examples, Context Map, decision record และ contracts
- code ที่ซับซ้อนขึ้นเมื่อใช้ Entity, Aggregate, port หรือ event โดยยังไม่มีแรงรองรับ
- migration จาก shared model/table และการรองรับ contract มากกว่า 1 version
- cognitive load เมื่อศัพท์เฉพาะมากเกินไปหรือ boundary ละเอียดเกินทีมดูแล
- governance และ platform ที่องค์กรใหญ่ต้องใช้เพื่อให้ autonomy ไม่กลายเป็นความกระจัดกระจาย
ดังนั้น “ใช้ DDD” ไม่ใช่ binary ทีมอาจใช้ scenario กับ Ubiquitous Language โดยยังเขียน Transaction Script ใน module เดียว หรือทำ Context Map ระดับองค์กรโดยให้ Supporting Subdomain ใช้ SaaS ไม่ต้องสร้าง Rich Domain Model
Fit Test ก่อนเริ่ม
ให้คะแนนแต่ละข้อ 0 = ต่ำ, 1 = เริ่มเห็น, 2 = สูง โดยต้องใส่หลักฐาน 1 ประโยค:
| แรง | คำถามที่ใช้หา evidence |
|---|---|
| Domain complexity | policy, state transition และ exception ต้องอธิบายหลายเงื่อนไขหรือไม่ |
| Volatility | กฎและ product proposition เปลี่ยนบ่อยเพียงใด |
| Ambiguity | ฝ่ายต่าง ๆ ใช้คำเดียวต่างความหมายจนเกิด rework หรือ incident หรือไม่ |
| Coordination | 1 outcome ต้องส่งต่อหลายทีมและไม่มี owner end-to-end หรือไม่ |
| Risk | model ผิดทำให้เงิน, สิทธิ์, compliance หรือความเชื่อมั่นเสียหายเพียงใด |
| Differentiation | capability นี้สร้างข้อได้เปรียบที่บริษัทตั้งใจลงทุนเองหรือไม่ |
- ผลรวม
0– 3: เริ่มจาก clear naming, examples และ simple module; ยังไม่ต้องมี DDD program - ผลรวม
4– 7: ใช้ lightweight discovery กับ capability ที่เจ็บจริง และตั้ง review date - ผลรวม
8– 12: ลงทุน Strategic DDD, policy ownership, context contracts และ Tactical DDD เฉพาะ model ที่ซับซ้อน
ช่วงคะแนนเป็น Course Convention ไม่ใช่ benchmark ความแตกต่างของ score ช่วยบังคับให้ทีม อธิบายหลักฐาน แต่ไม่ควรใช้ตัดสินแทนคน เช่น capability ที่ไม่สร้างความต่างแต่มี financial risk สูงอาจต้องลงทุนด้าน correctness และ control มาก แม้ไม่เรียกว่า Core Subdomain
ความคุ้มค่าต่อแต่ละบทบาท
| บทบาท | สิ่งที่ควรได้รับ | สัญญาณว่า DDD กลายเป็นภาระ |
|---|---|---|
| Business owner | เห็นว่า capability ใดสร้างความต่างและ policy ใครตัดสิน | workshop ผลิตศัพท์แต่ไม่ช่วยตัดสิน portfolio |
| Product | scenario และ exception ที่พร้อม validate | ทุก ticket ต้องรอ architecture committee |
| Risk/Compliance | policy source, effective date และ decision boundary | engineer เดา threshold แล้วเรียกว่า domain rule |
| Operations/Finance | lifecycle, unknown state และ repair action ที่ตรงกับงานจริง | happy path สวยแต่ manual operation หายจาก model |
| Engineer | module, invariant, contract และ test ที่สะท้อนภาษา | class จำนวนมากแต่ change ยังกระจายเท่าเดิม |
| Leadership | ownership และ dependency ที่จัดงบ/ทีมได้ | วัดจำนวน Aggregate หรือ workshop เป็นความสำเร็จ |
Model ไม่ได้กำหนด Financial Policy
เพดาน refund, KYC threshold, retention และ maker-checker rule ต้องมาจาก accountable owner หรือ regulator พร้อมชื่อ เอกสาร และวันที่ DDD ช่วยทำให้ owner และตำแหน่งบังคับใช้ policy ชัดขึ้น แต่ไม่ทำให้ทีม Engineering มีอำนาจคิดค่าดังกล่าวเอง
แบบฝึกปฏิบัติ: DDD Investment Memo
เลือก capability เดียว เช่น Partial Refund และเขียน memo 1 หน้า:
Business outcome:
Observed pain and baseline:
Terms or policies currently disputed:
Capability / candidate subdomain:
Smallest DDD practices to try:
People and time cost:
Expected behavior change:
Leading evidence after 4– 6 weeks:
Business evidence after 1 quarter:
Stop / simplify / expand criteria:
Owner and review date:
ตัวอย่าง leading evidence คือจำนวน policy questions ที่ได้ owner ก่อน implementation, change set ที่ไม่ต้องแก้ข้าม module และ production correction ที่ trace กลับ scenario ได้ อย่าเลือกจำนวน sticky notes, classes หรือ microservices เพราะเป็น output ไม่ใช่ outcome
รายการตรวจสอบ
- ระบุ pain ที่เกิดจริงแทนการเริ่มจากความนิยมของ pattern
- เชื่อม practice กับพฤติกรรมและ business outcome เป็น causal chain
- นับเวลาของ Business, Product, Operations, Risk และ Engineering เป็น cost
- ใช้ DDD แบบไล่ระดับ ไม่บังคับ Tactical Pattern ทุกจุด
- แยก differentiation ออกจาก operational/compliance criticality
- มี baseline, owner, review date และเงื่อนไขหยุด
- ไม่ใช้จำนวน artifact เป็นตัวแทนความสำเร็จ
สรุปบทนี้
DDD คุ้มเมื่อ shared understanding, model boundary และการปกป้อง invariant ลดต้นทุน ของความกำกวมและการเปลี่ยนแปลงได้มากกว่าต้นทุน modelling และ governance ทีมควรซื้อ practice ที่เล็กที่สุดซึ่งแก้ pain ที่เห็น วัดผล แล้วค่อยขยาย ไม่ต้องประกาศ transformation ทั้งบริษัทเพื่อเริ่มปรับภาษาใน 1 capability
อ่านเพิ่มเติม
- DDD Reference — vocabulary และ pattern ต้นทางของ Eric Evans
- Use Domain Analysis to Model Microservices — guidance ปัจจุบันของ Microsoft เรื่อง strategic/tactical analysis
- Introducing Domain-Oriented Microservice Architecture — first-party case ของ Uber เมื่อ service landscape มีความซับซ้อนสูง
- Domain Logic and SQL — trade-off ระหว่าง logic ที่เรียบง่ายกับ Domain Model