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

กลั่น problem domain ออก​มา

บท​ที่​แล้ว​เรา​เห็น​ว่า DDD แยก​การ​แก้​ปัญหา​ออก​เป็น problem spaceProblem Space“พื้นที่​ปัญหา” — สิ่ง​ที่​ธุรกิจ​ต้องการ​แก้ไข อยู่​ใน​รูป​ของ Domain และ Subdomain (ยัง​ไม่​พูด​ถึง​วิธี​แก้)Strategic Design และ solution spaceSolution Space“พื้นที่​คำ​ตอบ” — วิธี​ที่​เรา​เลือก​แก้​ปัญหา อยู่​ใน​รูป​ของ Bounded Context และ model 1 subdomain อาจ​มี​ได้​หลาย​คำ​ตอบStrategic Design บท​นี้​เจาะ​ลง​ไป​ที่​ครึ่ง​แรก — เรา​จะ “เข้าใจ” problem domain ที่​ซับซ้อน​ได้​อย่างไร ก่อน​จะ​ลงมือ​เขียน code แม้แต่​บรรทัด​เดียว

หัวใจ​ของ​คำ​ตอบ​คือ​คำ​ว่า Knowledge CrunchingKnowledge Crunchingการ​บด​เคี้ยว​ความ​รู้ — ศิลปะ​การกลั่น​ข้อมูล​ที่​เกี่ยวข้อง​ออก​จาก problem domain ร่วม​กับ domain expert เพื่อ​สร้าง model ที่​มี​ประโยชน์​ต่อ business use caseProcess — “การ​บด​เคี้ยว​ความ​รู้” ร่วม​กับ​คน​ที่​เข้าใจ​ธุรกิจ​อย่าง​แท้จริง การ​พิมพ์ code ไม่​เคย​เป็น​ส่วน​ที่​ยาก​ที่สุด ส่วน​ที่​ยาก​คือ​การกลั่น​ความ​รู้​มหาศาล​ใน domain ออก​มา​ให้​เหลือ​เฉพาะ สิ่ง​ที่​สำคัญ​ต่อ​การ​แก้​ปัญหา แล้ว​หล่อ​มัน​ลง​เป็น modelDomain ModelModel ของ Domain ที่​ฝัง​กฎ​และ​กระบวนการ​ทาง​ธุรกิจ​ไว้​ใน code จริง หัวใจ​ของ DDD คือ​การ​พัฒนา domain model ที่ “เข้าใจ​ธุรกิจ​อย่าง​ลึกซึ้ง”Strategic Design ที่​ใช้ได้​จริง


DomainDomainขอบเขต​ของ​ปัญหา​หรือ​ธุรกิจ​ที่​ซอฟต์แวร์​ของ​เรา​เข้าไป​แก้ไข เช่น การ​ขนส่ง​สินค้า การ​ธนาคาร e-commerce — คือ “โลก​ของ​ผู้​ใช้” ที่​โปรแกรม​ต้อง​เข้าใจStrategic Design ที่​ซับซ้อน​เต็ม​ไป​ด้วย​ข้อมูล ส่วน​ใหญ่​ของ​ข้อมูล​นั้น ไม่​เกี่ยวข้อง กับ​ปัญหา​ที่​เรา​กำลัง​แก้ และ​จะ​คอย​รบกวน​สมาธิ​ใน​การ​สร้าง model Knowledge Crunching คือ​ศิลปะ​ของ​การกลั่น​เอา​เฉพาะ​ข้อมูล​ที่ “เกี่ยวข้อง” ออก​มา เพื่อ​สร้าง model ที่​ตอบ​โจทย์ business use case ได้

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

ดัง​รูป​ที่ 2-1 กระบวนการ​เริ่ม​จาก กระบวนการ​ธุรกิจ (business process) ทีม​เดิน​ผ่าน use case/story/scenario ร่วม​กับ​ธุรกิจ​บน​กระ​ดานไวต์บอร์ด ค่อยๆ ทำให้ model “ง่าย​ลง” เมื่อ​เข้าใจ problem domain มาก​ขึ้น จน​ได้ model ที่​ใช้​แก้​ปัญหา​ได้​จริง

รูปที่ 2-1: วงจร Knowledge Crunching — เริ่มจาก business use case นำความรู้จาก business expert และทีมพัฒนามาบดเคี้ยวร่วมกัน แล้วกลั่นออกมาเป็น model ที่ตอบโจทย์ use case และทำให้ง่ายขึ้นเมื่อเข้าใจมากขึ้น

หัวใจ​ของ Knowledge Crunching

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


ผลลัพธ์​สำคัญ​อย่าง​หนึ่ง​ของ Knowledge Crunching คือ Ubiquitous LanguageUbiquitous Languageภาษา​กลาง​ที่​ทุก​คนใน​ทีม (ทั้ง​นัก​พัฒนา​และ​ผู้เชี่ยวชาญ​ธุรกิจ) ใช้​ร่วม​กัน อิง​กับ domain model โดยตรง คำ​เดียวกัน​ต้อง​หมาย​ถึง​สิ่ง​เดียวกัน และ​สะท้อน​ลง​ใน codeStrategic Design (UL) — ภาษา​กลาง​ที่​อุดม​ไป​ด้วย​ศัพท์​เฉพาะ​ของ domain เมื่อ​สร้าง model ร่วม​กับ​ผู้เชี่ยวชาญ ทุก​คน​ต้อง​ตั้งใจ​ใช้​คำ​ชุด​เดียวกัน​ให้​สม่ำเสมอ ทั้ง​ตอน​อธิบาย model ตอน​คุย​กัน และ​ที่​สำคัญ — ตอน​เขียน code คำ​เดียวกัน​ต้อง​ไป​ปรากฏ​เป็น​ชื่อ class ชื่อ property และ​ชื่อ method

UL ผูก “model ใน code” เข้า​กับ “model เชิง​แนวคิด” ที่​ธุรกิจ​เข้าใจ ทำให้​เรา​ไม่​ต้อง​คอย​แปล​ไป​มาระหว่าง model ทาง​เทคนิค​กับ model ทาง​ธุรกิจ — ซึ่ง​ทุก​ครั้ง​ที่​แปล insight สำคัญ​ย่อม​มี​โอกาส​หลุด​หาย​ไป (เรา​จะ​ลง​ลึก​เรื่อง UL ในบท Model-Driven Design)

🚢 ฟัง “คำ” ของ​คน​ขนส่ง

ใน session Knowledge Crunching กับ​บริษัท​ขนส่ง คุณ​จะ​ได้ยิน​คำ​ว่า “จอง (book) การ​ขนส่ง” “วางแผน​เดินทาง (itinerary)” “ขา (leg) การ​ขนส่ง​แต่ละ​ช่วง” “บันทึก​การ​จัดการ (handling) ที่​ท่าเรือ” คำ​เหล่า​นี้​ไม่ใช่​ศัพท์​ที่​เรา​คิด​เอง แต่​เป็น​ภาษา​ที่​พนักงาน​ใช้​กัน​จริง — มัน​คือ​เมล็ด​พันธุ์​ของ Ubiquitous Language ที่​จะ​กลาย​เป็น Cargo, Itinerary, Leg, HandlingEvent ใน code ต่อ​ไป

บทบาท​ของ Business Analyst ยัง​จำเป็น​ไหม?

ยัง​จำเป็น BA ช่วย​ให้​ผู้​มี​ส่วน​ได้​ส่วน​เสีย​ขยาย​ไอเดีย​ตั้งต้น และ​เก็บ input/output ของ​ระบบ​ได้ และ​ถ้า​นัก​พัฒนา​เขิน​อาย​ไม่​กล้า​คุย​กับ domain expert ก็​ใช้ BA เป็น​ผู้​อำนวย​ความ​สะดวก (facilitator) ได้ สิ่ง​ที่ ต้อง​ไม่​ทำ คือ​เอา BA มา​คั่น​กลาง​จน​ตัดขาด​การ​สื่อสาร​โดยตรง​ระหว่าง​ทีม​พัฒนา​กับ​คน​ที่​เข้าใจ​ธุรกิจ​มาก​ที่สุด


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

รูป​ที่ 2-2 ชี้​ความ​ต่างชัดๆ: stakeholder บอกว่า​ระบบ “ควร​ทำ​อะไร” — พวก​เขา​โฟกัส​ที่ input และ output (นี่​คือ problem space: ความ​ต้องการ) ส่วน domain expert ทำงาน​กับ​เรา​เพื่อ​สร้าง model ที่​ตอบ​โจทย์​นั้น​ได้ (นี่​คือ solution space)

รูปที่ 2-2: บทบาทสามฝ่าย — stakeholder + ทีมพัฒนาสื่อสารเป้าหมายและ input/output ออกมาเป็น business use case แล้ว domain expert + ทีมพัฒนา crunch ความรู้ร่วมกันจนได้ model ที่ตอบโจทย์ use case นั้น

การ​ทำงาน​กับ domain expert ไม่​ได้​ช่วย​แค่​ทีม​พัฒนา แต่​ยัง​ช่วย​ให้​ตัว domain expert เอง “จับ​ต้อง” ความ​เข้าใจ​ของ​ตัวเอง​ได้​ชัด​ขึ้น แนวคิด​ที่​ธุรกิจ​เคย​เข้าใจ​กัน​แบบ implicit จะ​ถูก​นิยาม​ออก​มา​เป็น​คำ​ที่​ชัดเจน ทำให้การ​สื่อสาร​ภายใน​ธุรกิจ​ดี​ขึ้น​ด้วย

Knowledge Crunching เป็นกระบวนการ​ต่อ​เนื่อง ไม่ใช่​ทำ​ครั้ง​เดียว​จบ

การ​ร่วมมือ​กับ​ธุรกิจ​ไม่​ควร​จำกัด​อยู่​แค่​ช่วง​เริ่ม project insight ที่​ลึกซึ้ง​และ​การ “ทะลุ​กรอบ” แบบ design breakthrough มัก​เกิด​ขึ้น​หลัง​จาก​ใช้​ชีวิต​คลุกคลี​อยู่​กับ​ปัญหา​ผ่าน​หลาย iteration model ไม่มี​คำ​ว่า​สมบูรณ์​แบบ มี​เพียง model ที่​ตอบ​โจทย์​ปัญหา ณ ขณะ​นี้​เท่านั้น ทุก iteration ความ​ต้องการ​ใหม่​ย่อม​เข้า​มา และ model ต้อง​วิวัฒน์​ตาม


การ​สร้าง model เป็น​งาน​ที่​ต้อง​อาศัย​ความ​ร่วมมือ แต่​ผู้​ใช้​ฝั่ง​ธุรกิจ​มัก​มี​งาน​รัดตัว​และ​อาจ​รู้สึก​ว่า​มัน​น่า​เบื่อ เรา​จึง​ต้อง​ทำให้ session สนุก​และ​ชวน​ให้​มี​ส่วนร่วม ต่อ​ไป​นี้​คือ​เทคนิค​ที่ DDD practitioner ใช้​กัน

อย่า​ไล่​อ่าน requirement ที​ละ​ข้อ​ให้ domain expert ฟัง​จน​เบื่อ เวลา​ของ​พวก​เขา​มี​ค่า ให้​เริ่ม​จาก​ส่วน​ที่ “ทำให้​ธุรกิจ​นอน​ไม่​หลับ” — ส่วน​ที่​เป็น core ต่อ​ความ​สำเร็จ​ของ​ระบบ ลอง​ถาม​ว่า​ส่วน​ไหน​ของ​ระบบ​ปัจจุบัน​ใช้งาน​ยาก งาน​ที่​ต้อง​ทำ​ด้วย​มือ​แบบ​ไหน​ที่​ขัด​ขวาง​ไม่​ให้​เขา​ไป​สร้าง​คุณค่า​ได้ หรือ​อะไร​จะ​ช่วย​เพิ่ม​รายได้/ลด​ต้นทุน เคล็ด​ลับ​คือ “ตาม​เงิน​ไป” (follow the money)

วิธี​ที่​ดี​ที่สุด​ใน​การ​เข้าใจ domain ใหม่​คือ​การ​วาด use case ออก​มา​เป็นขั้นๆ ฟัง​หา domain terminology ระหว่าง​นั้น เพราะ​มัน​คือ​จุด​เริ่ม​ของ​ภาษา​กลาง อย่า​รีบ​กระโดด​ไป​หา solution ก่อน​เข้าใจปัญหาจริงๆ และ​อย่า​ลืม​ถาม​คำถาม​ที่​เปิดเผย “เจตนา” เบื้องหลัง เช่น

  • ความ​ต้องการ​ระบบ​นี้​มา​จาก​ไหน?
  • ระบบ​นี้​จะ​สร้าง​คุณค่า​ให้​ธุรกิจ​อย่างไร?
  • ถ้า​ไม่​สร้าง​ระบบ​นี้ จะ​เกิด​อะไร​ขึ้น?
Greg Young — powerful questions

Greg Young มี​บทความ​ชื่อ​ดัง​เรื่อง “powerful questions” ที่​รวม​ตัวอย่าง​คำถาม​ดีๆ ซึ่ง​ช่วย​ปลด​ล็อก​ความ​รู้​ใน domain ออก​มา​ได้ — คำถาม​ที่​ถูกต้อง​มี​ค่า​มากกว่า​คำ​ตอบ​ที่​รีบเร่ง

คน​เรา​มัก​เข้าใจ​ได้​เร็ว​ขึ้น​เมื่อ​เห็น​ภาพ การ​วาด sketch ง่ายๆ บนไวต์บอร์ด​ช่วย​เร่ง session ได้​มาก หลัก​สำคัญ​ข้อ​เดียว​คือ คุม​ระดับ​รายละเอียด (granularity) ให้​อยู่​ใน​ระนาบ​เดียวกัน — ถ้า​กำลัง​คุย​ภาพ​ใหญ่​ว่า​ระบบ​สื่อสาร​กัน​อย่างไร ก็​อย่า​หลุด​ลง​ไป​ถึง​ระดับ​ชื่อ class และ​อย่า​ใช้​เครื่องมือ​ทางการ​อย่าง Visio/UML ที่​ละเอียด​เกิน​ไป​สำหรับ session ที่​ต้อง​ลอง​ผิด​ลอง​ถูก​หลาย​รอบ — เพราะ​คุณ​จะ “เสียดาย” ไดอะแกรม​ที่​ลงแรง​วาด​ทั้ง​เช้า มากกว่า sketch ที่​ใช้​เวลา​เพียง​นาที​เดียว

อีก​เครื่องมือ​คือ CRC card (Class-Responsibility-Collaboration) แต่ละ​ใบ​บันทึก​สาม​ส่วน: ชื่อ class (แทน​แนวคิด​ใน domain), หน้าที่​ของ​มัน, และ class อื่น​ที่​ต้อง​ทำงาน​ด้วย — ดึง​ให้​ทีม​และ​ธุรกิจ​คิด​ใน​รูป​ของ “ภาษา” ของ​แนวคิด

เลื่อน​การ​ตั้ง​ชื่อ​ออก​ไป​ก่อน

การ​ตั้ง​ชื่อ​เร็ว​เกิน​ไป​เป็น​กับดัก เพราะ​คำ​ที่​เลือก​จะ “ครอบงำ” วิธี​คิด​ของ​คุณ จน​เมื่อ crunch ความ​รู้​เพิ่ม​แล้ว​พบ​ว่า​แนวคิด​ไม่​ตรง​กับ​ชื่อ ก็​เปลี่ยน​ได้​ยาก Greg Young แนะนำ​ให้​ใช้​คำ​ที่​ไม่มี​ความหมาย (gibberish) หรือ​ใช้​สี​แทน​ชื่อ​จริง​ไป​ก่อน จนกว่า​จะ​เข้าใจ​หน้าที่​และ​ข้อมูล​ของ​มัน​ครบถ้วน และ พึง​ระวัง​ชื่อ​ที่​ว่างเปล่า​อย่าง XxxService หรือ XxxManager — หาก​เผลอ​จะ​เติม “Service/Manager” ให้​กลับ​มา​คิด​ใหม่ และ​มอง​หา​เจตนา​ที่แท้​จริง​เบื้องหลัง​ชื่อ​นั้น


Behaviour-Driven DevelopmentBehaviour-Driven Development (BDD)กระบวนการ​พัฒนา​ที่​ต่อยอด​จาก TDD โดย​โฟกัส​ที่​การ​จับ ‘พฤติกรรม’ ของ​ระบบ​แล้ว​ขับ​การ​ออกแบบ​จาก​ภายนอก​เข้า​สู่​ภายใน ใช้​ภาษา GWT (Given–When–Then) จัด​โครงสร้าง​บทสนทนา​กับ domain expert ต่าง​จาก DDD ตรง​ที่ BDD เน้น​พฤติกรรม ส่วน DDD เน้น domain model ที่​ทำให้​พฤติกรรม​เป็น​จริงProcess (BDD) เป็นกระบวนการ​ที่​ต่อยอด​จาก TDD โดย​โฟกัส​ที่​การ​จับ พฤติกรรม​ของ​ระบบ (system behaviour) แล้ว​ขับ​เคลื่อน​การ​ออกแบบ​จาก​ภายนอก​เข้า​สู่​ภายใน ความ​ต่าง​จาก DDD คือ BDD โฟกัส​ว่า “ระบบ​ควร​ทำงาน​อย่างไร” ส่วน DDD โฟกัส​ที่ domain model ใจกลาง​ซึ่ง​ทำให้​พฤติกรรม​นั้น​เป็น​จริง​ได้ — ต่าง​กัน​เพียง​เล็กน้อย​แต่​สำคัญ

BDD มี​รูปแบบ​ภาษา​เฉพาะ​คือ GWT (Given–When–Then) ที่​ช่วย​จัด​โครงสร้าง​บทสนทนา​กับ domain expert และ​เผย​พฤติกรรม​ที่แท้​จริง​ของ domain ออก​มา feature แต่ละ​ตัว​อธิบาย​พฤติกรรม​ที่​ส่ง​มอบ​คุณค่า​ต่อ​ธุรกิจ พร้อม​ระบุ “บทบาท” (ใคร) และ “ประโยชน์” (ทำไม)

🛒 BDD scenario — ส่ง​ฟรี​เมื่อยอด​ถึง​เกณฑ์

ลอง​ดู feature “ส่ง​ฟรี​สำหรับ​คำ​สั่ง​ซื้อ​ยอด​สูง” เขียน​เป็น scenario แบบ GWT:

free-delivery.feature
Feature: ส่งฟรีสำหรับคำสั่งซื้อยอดสูง
Scenario: ลูกค้ายอดถึงเกณฑ์ส่งฟรี
Given เกณฑ์ส่งฟรีตั้งไว้ที่ 60 บาท
And ฉันมีตะกร้ารวม 50 บาท
When ฉันเพิ่มสินค้าราคา 11 บาทลงตะกร้า
Then ฉันควรได้รับสิทธิ์ส่งฟรี

scenario แบบ​นี้​ทำ​หน้าที่​สอง​อย่าง: เป็น acceptance criteria ที่ dev/tester ใช้​ระบุ​ว่า feature เสร็จ​สมบูรณ์​เมื่อใด และ​เป็น​เครื่อง​ยืนยัน​ว่า​ทีม “เข้าใจ​ตรง​กัน” กับ​ธุรกิจ — ทั้ง​ยัง​ตอกย้ำ domain language ไป​ใน​ตัว


ผู้​ใช้​ฝั่ง​ธุรกิจ​มัก​ชอบ​เห็น mock-up หน้า​จอ​มากกว่า​อ่าน​เอกสาร เพราะ​มัน​เผย​เจตนา​เบื้องหลัง​ได้​ชัดเจน​กว่า อีก​รูปแบบ​หนึ่ง​คือ​สิ่ง​ที่ Greg Young เรียก​ว่า “code as analysis” — เขียน code เพื่อ​จับ requirement สดๆ ต่อ​หน้า​ธุรกิจ การ​ลงมือ​เขียน​ช่วย​ให้ session โฟกัส พิสูจน์ model และ​หลีก​เลี่ยง analysis paralysis (อาการ​จม​อยู่​กับ​การ​คิด​เชิง​นามธรรม​จน​ไม่​ลงมือ​ทำ)

code ที่​เขียน​ตอน​วิเคราะห์​คือ code สำหรับ​โยน​ทิ้ง (throw-away code)

จง​สร้าง code model เฉพาะ​ส่วน​ที่​เกี่ยวข้อง​และ​อยู่​ใน context ที่​กำลัง​แก้ เท่านั้น — เรา​ไม่​อาจ​จำลอง​ทั้ง domain ได้ ให้​คิด​ที​ละ​ส่วน​เล็กๆ สร้าง​รอบๆ กฎ แล้ว​ค่อย​ต่อยอด ที่​สำคัญ: นี่​คือ code สำหรับ​โยน​ทิ้ง (throw-away code) อย่า​หยุด​อยู่​ที่ model แรก​ที่​พอใช้ได้ และ​อย่า​ยึด​ติด​กับ​ไอเดีย​ดีๆ อัน​แรก​จน​เกิน​ไป

นอกจาก​นี้​อย่า​มอง​ข้าม​ระบบ​กระดาษ (paper-based) ที่​ใช้​อยู่ — ภาษา​ที่​ธุรกิจ​ใช้​ใน​นั้น​มี​คุณค่า และ​บาง edge case ที่​พบ​นานๆ ครั้ง อาจ​คุ้ม​กว่า​ถ้า “คืน​อำนาจ” ให้​กระบวนการ​ที่​ทำ​ด้วย​มือ แทนที่​จะ​ลงแรง​สร้าง model ซับซ้อน​เพื่อ​รองรับ​มัน

มอง​หา model ที่​มี​อยู่​แล้ว — อย่า​คิด​ล้อ​ใหม่

ถ้า​ทำงาน​ใน domain ที่​มี​มา​ยาวนาน (เช่น สถาบัน​การเงิน) มี​ความ​เป็น​ไป​ได้​สูง​ว่า​มี model มาตรฐาน​อยู่​แล้ว หนังสือ Analysis Patterns ของ Martin Fowler รวบรวม model ทั่วไป​ใน​หลาย domain ที่​ใช้​เป็น​จุด​ตั้งต้น​ได้ และ​ใน​องค์กร​เอง​ก็​อาจ​มี process map/workflow เดิม​อยู่ — ลอง​ขอ​มา​ดู แล้ว​สร้าง knowledge base (เช่น wiki) เก็บ​คำ​และ​นิยาม​ไว้​ใช้​ร่วม​กัน​ใน​ทีม


EventStormingEventStormingเวิร์กช็อป​แบบ​ร่วมมือ (Alberto Brandolini, 2013) ใช้​กระดาษ​โน้ต​สี​ติด​บน​ผนัง: ส้ม=event, น้ำเงิน=command, เหลือง=aggregate ฯลฯ เพื่อ​ค้น​พบ model และ​ขอบเขต​ของ contextProcess เป็น​กิจกรรม​เวิร์กช็อป​ที่ Alberto Brandolini คิด​ขึ้น เพื่อ​สร้าง​ความ​เข้าใจ problem domain อย่าง​รวดเร็ว​และ​สนุก โดย​ให้ domain expert (ผู้​มี​คำ​ตอบ) กับ​ทีม​พัฒนา (ผู้​มี​คำถาม) มา​ทำงาน​ร่วม​กัน​ใน​พื้นที่​เปิด​โล่ง​ที่​มี​ผนัง/กระดาษ​ยาวๆ ช่วย​กัน​สร้าง​แบบ​จำลอง​ให้​เห็น​ภาพ​ร่วม​กัน​ด้วย​ตา​เปล่า

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

flowchart LR
  C["command<br/>(สีน้ำเงิน)<br/>BookCargo"] --> A["aggregate<br/>(สีเหลือง)<br/>Cargo"]
  A --> E["domain event<br/>(สีส้ม)<br/>CargoWasBooked"]
  E --> P["policy/reaction<br/>เมื่อจองแล้ว<br/>ต้องวาง itinerary"]
  P --> C2["command<br/>AssignRoute"]
🚢 EventStorming ระบบ​ขนส่ง

ติด​บน​ผนัง: CargoWasBookedRouteWasAssignedCargoWasLoadedCargoWasUnloadedCargoWasClaimed เมื่อ​เรียง domain event เป็น​เส้น​เวลา ทีม​จะ​เห็น​ทันที​ว่า “การ​จอง” กับ “การ​จัดการ​จริง​ที่​ท่าเรือ (handling)” เป็น​คนละ​เรื่อง​ที่​อาจ​อยู่​คนละ subdomain — insight แบบ​นี้​หา​ได้​ยาก​มาก​หาก​เพียง​นั่ง​อ่าน requirement เฉยๆ


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

Impact Mapping เป็น​เทคนิค​ที่​ช่วย​ใน​จุด​นี้ แทนที่​จะ​เริ่ม​จาก​เอกสาร requirement เรา​เริ่ม​จาก “ผลกระทบ (impact)” ที่​ธุรกิจ​อยาก​สร้าง เช่น “เพิ่ม​ยอด​ขาย​จักรยาน 25%” แล้ว​แตก​ออก​เป็นชั้นๆ: ใคร (actor) ที่​ช่วย​ได้ → เขา​ช่วย​ได้​อย่างไร → งาน​จริง​ที่​ลงมือ​ทำ ดัง​รูป​ที่ 2-3 มัน​คือ mind map ที่​ทำ​ร่วม​กับ​ธุรกิจ ช่วย​ให้​เรา​ตั้ง​คำถาม​ได้​คม​ขึ้น​เพราะ​รู้​ชัด​ว่า​ธุรกิจ​ต้องการ​อะไร

รูปที่ 2-3: Impact map ตัวอย่าง — เริ่มจากผลกระทบ “ขายจักรยานเพิ่ม 25%” แตกไปยัง actor (Developers, Data Scientists) แล้วแตกต่อเป็นวิธีที่แต่ละฝ่ายช่วยได้ และงานจริงที่ลงมือทำ

อีก​เครื่องมือ​คือ Business Model Canvas ของ Alexander Osterwalder ที่​ย่อย model ธุรกิจ​ออก​เป็น 9 ช่อง (รูป​ที่ 2-4) ตั้งแต่​ลูกค้า​เป้าหมาย คุณค่า​ที่​ส่ง​มอบ ช่อง​ทาง ไป​จนถึง​โครงสร้าง​ต้นทุน​และ​ช่อง​ทาง​รายได้ — นัก​พัฒนา​น้อย​คน​นัก​ที่​จะ​ลงทุน​เวลา​ทำความ​เข้าใจ model ธุรกิจ​ของ​นายจ้าง​ตัวเอง ทั้ง​ที่​มัน​บอก​ชัด​ว่า “อะไร​สำคัญ​ต่อ​ธุรกิจ” และ​ช่วย​ให้​เรา​ตั้ง​คำถาม​ที่​มี​ความหมาย​ต่อ domain expert ได้

รูปที่ 2-4: Business Model Canvas ของร้านอุปกรณ์กีฬาออนไลน์ — แบ่ง model ธุรกิจเป็น 9 ส่วน ตั้งแต่ Key Partners, Value Propositions ไปจนถึง Cost Structure และ Revenue Streams


Dan North (ผู้​คิด BDD) เสนอ Deliberate Discovery — แทนที่​จะ​หมกมุ่น​กับ​พิธีกรรม​ของ agile อย่าง planning poker ให้​ทุ่ม​เวลา​เรียนรู้​ส่วน​ของ domain ที่​เรา “ไม่รู้” เขา​กล่าว​ว่า “ความ​ไม่รู้​คือ​อุปสรรค​ใหญ่​ที่สุด​ของ throughput” ตั้งแต่​เริ่ม project ทีม​ควร​ตั้งใจ​ค้นหา​ว่า unknown unknowns อยู่​ตรง​ไหน แล้ว​จัดการ​มัน​ให้​เร็ว​ใน session Knowledge Crunching

ส่วน Eric Evans เสนอ Model Exploration Whirlpool — ไม่ใช่​ระเบียบ​วิธี​สร้าง model แต่​เป็น​สิ่ง​ที่​หยิบ​มา​ใช้ “เมื่อ​เจอ​ปัญหา” ระหว่าง​สร้าง model (เช่น สื่อสาร​กับ​ธุรกิจ​ล้มเหลว design ซับซ้อน​เกิน​เหตุ หรือ​ทีม​ขาด​ความ​รู้​ใน domain) ประกอบ​ด้วย​กิจกรรม​ที่​หมุน​วน​กัน:

  1. Scenario Exploring — domain expert เล่า scenario ที่​ทีม​กังวล ด้วย​ตัวอย่าง​รูปธรรม แล้ว​ทีม map ออก​มา​แบบ EventStorming
  2. Modeling — ตรวจ​ว่า model ปัจจุบัน​แก้ scenario นั้น​ได้​ดี​แค่​ไหน
  3. Challenging the Model — ท้าทาย model ด้วย scenario เพิ่ม​เพื่อ​พิสูจน์​ว่า​ใช้ได้​จริง
  4. Harvesting & Documenting — เก็บ scenario สำคัญๆ ไว้​เป็น reference scenario (แต่​ไม่​ต้อง​เก็บ​ทุก​การ​ตัดสิน​ใจ บาง​ไอเดีย​ควร​ทิ้ง​ไว้​ที่​กระดาน)
  5. Code Probing — เมื่อ​เกิด design breakthrough ให้​พิสูจน์​ใน code ว่า implement ได้​จริง
ลอง ลอง แล้ว​ลอง​อีก

คุณ​จะ​ไม่​ได้ model ที่​ใช้ได้​ตั้งแต่​ความ​พยายาม​ครั้ง​แรก และ​อาจ​ไม่​ได้​แม้​ใน​ครั้ง​ที่​สอง​หรือ​สาม อย่า​กลัว​ที่​จะ​ทดลอง จง​ฝึก​ฉีก design ทิ้ง​แล้ว​เริ่ม​ใหม่ และ​จำ​ไว้​ว่า​ไม่มี “model ที่​ถูกต้อง” มี​แต่ “model ที่​มี​ประโยชน์” ต่อ context และ​ชุด​ปัญหา​ที่​เผชิญ​อยู่ ณ ขณะ​นี้​เท่านั้น


  • Knowledge Crunching คือ​ศิลปะ​การกลั่น​ข้อมูล​ใน domain เพื่อ​คัด​เฉพาะ​ส่วน​ที่​นำ​ไป​สร้าง model ที่​มี​ประโยชน์​ได้ และ​เป็นกระบวนการ ต่อ​เนื่อง ไม่ใช่​ทำ​ตอน​เริ่ม project แล้ว​จบ
  • ความ​รู้​ได้​มา​จาก​การ ร่วมมือ กับ domain expert รอบไวต์บอร์ด ผ่าน brainstorming และ prototyping แล้ว​ตกผลึก​ออก​มา​เป็น Ubiquitous Language
  • stakeholder ให้ requirement (problem space) ส่วน domain expert ช่วย​สร้าง model (solution space) — ทุ่ม​เวลา​ของ domain expert ไป​กับ​ส่วน​ที่​เป็น core หรือ​ซับซ้อน​ที่สุด
  • ตั้ง​คำถาม​ทรง​พลัง​เพื่อ​เข้าใจ เจตนา ของ​ธุรกิจ และ​ทำงาน “ร่วม​กับ” ธุรกิจ ไม่ใช่​ทำงาน “ให้” ธุรกิจ
  • ใช้ BDD/GWT, sketching, EventStorming, Impact Mapping, Business Model Canvas เพื่อ​ทำให้การกลั่น​ความ​รู้​สนุก​และ​เห็น​ภาพ และ​ใช้ Deliberate Discovery ขจัด unknown unknowns ตั้งแต่​เนิ่นๆ
หัวใจ​ของ​บท​นี้

ก่อน​จะ​ออกแบบ solution ที่​ดี​ได้ เรา​ต้อง เข้าใจ problem domain อย่าง​ลึกซึ้ง ผ่าน​การ​ร่วมมือ​กับ domain expert เพราะ insight ที่แท้​จริง​เกิด​จาก​การ​บด​เคี้ยว​ความ​รู้​ซ้ำ​แล้ว​ซ้ำ​เล่า การ​ทดลอง และ​ความ​กล้า​ที่​จะ​ทิ้ง model ที่​ไม่​ดี — model ไม่มี​คำ​ว่า​สมบูรณ์​แบบ มี​เพียง model ที่​ตอบ​โจทย์​ปัญหา ณ ขณะ​นี้​เท่านั้น


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

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

  • Ubiquitous Language — ภาษา​กลาง​ที่​เป็น​ผลผลิต​หลัก​ของ Knowledge Crunching ตาม​ที่​บท​นี้​อธิบาย
  • EventStorming — สรุป​แนวคิด​เวิร์กช็อป​ที่​บท​นี้​ใช้​เป็น​เทคนิค​หลัก​ใน​การ​ค้น​พบ domain event และ command
  • Domain (Subdomain vs Core Domain) — ต่อยอด​จาก​ตอน​ท้าย​บท​ที่ EventStorming ช่วย​เผย subdomain และ core domain ออก​มา​ให้​เห็น

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

ข้อ 1 / 4

Knowledge Crunching คืออะไรในความหมายของ DDD?