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

Domain Storytelling

ให้​ผู้เชี่ยวชาญ​เล่า​เรื่อง แล้ว​วาด workflow ออก​มา​เป็น​ภาพ

การ​สื่อสาร​สำคัญ​มาก​ใน DDD โดย​เฉพาะ​ใน​การ​พัฒนา ubiquitous language Domain Storytelling เปิด​โอกาส​ให้ ผู้เชี่ยวชาญ domain เล่า​เรื่อง จับ​ภาพ workflow และ​วาด​เรื่องราว​เหล่า​นั้น​ออก​มา

Domain Storytelling ถูก​คิดค้น​และ​ตกผลึก​เป็น​วิธี​ปฏิบัติ​ที่​มีชื่อ​โดย Stefan Hofer และ Henning Schwentner (ผู้​เขียน​หนังสือ Domain Storytelling: A Collaborative, Visual, and Agile Way to Build Domain-Driven Software, Addison-Wesley, 2022 ใน​ซีรีส์​ที่ Vaughn Vernon เป็น​บรรณาธิการ) เทคนิค​นี้​ประกอบ​ด้วย​สอง​ส่วน​ที่​แยก​กัน​แต่​เสริม​กัน คือ pictographic language (ภาษา​เชิง​ภาพ) สำหรับ​บันทึก​เรื่องราว และ workshop format (รูปแบบ​เวิร์กช็อป) สำหรับ​ดำเนิน​การ session

Domain Story คือ​แผนภาพ​ที่​แสดง​ว่า ใคร (actor) ทำ​อะไร (activity) กับ​สิ่ง​ใด (work object) เรียง​ตาม​ลำดับ​เหตุการณ์​ที่​มี​หมายเลข​กำกับ วาด​ขึ้น​สด ๆ ระหว่าง​ที่​ผู้เชี่ยวชาญ domain เล่า​เรื่อง​จริง​จาก​งาน​ประจำ​วัน​ของ​ตน โดย​มี Moderator เป็น​ผู้​จับ​ภาพ

องค์​ประกอบ​หลัก​ของ​ภาษา​เชิง​ภาพ​มี​เพียง​ไม่​กี่​แบบ ทำให้​เรียนรู้​ได้​เร็ว:

  • Actor — icon รูป​คน​หรือ​ระบบ​ที่​ลงมือ​ทำ​กิจกรรม
  • Work object — สิ่งของ​หรือ​ข้อมูล​ที่ actor ทำงาน​ด้วย เช่น ใบสั่ง​ซื้อ อีเมล เอกสาร
  • Activity — ลูกศร​พร้อม​คำ​กริยา เชื่อม​จาก actor ไป​ยัง work object หรือ actor อีกราย
  • Sequence number — ตัวเลข​กำกับ​ลำดับ​เหตุการณ์ ทำให้​เรื่องราว​อ่าน​เป็น​ขั้นตอน​ได้ ไม่ใช่​ภาพนิ่ง​เดียว
  • Annotation — หมายเหตุ​ประกอบ เพิ่ม​รายละเอียด​หรือ​เงื่อนไข​ที่​ไม่ใช่​กระแส​หลัก​ของ​เรื่อง

เรื่องราว​ถูกวาด​ด้วย icon และ​ลูกศร​พร้อม label เหล่า​นี้ ระหว่าง​เล่า​เรื่อง​ผ่าน​บทสนทนา​และ​เวิร์กช็อป เป้าหมาย​ที่​บรรลุ​ได้แก่ ubiquitous language ค่อย ๆ ก่อ​ตัว​ขึ้น​จาก​คำ​ที่​ผู้เชี่ยวชาญ​ใช้​จริง bounded context อาจ​ถูก​ระบุ​จาก​ขอบเขต​ของ​เรื่อง​ที่​เล่า และ​ข้อ​กำหนด​กับ scope เริ่ม​ชัดเจน​ขึ้น​เพราะ​ทุก​คน​เห็น​ภาพ​เดียวกัน

Domain Storytelling มี​เครื่องมือ open-source ชื่อ Egon.io สำหรับ​วาด​เรื่องราว​แบบ​ดิจิทัล​บน​เว็บ ทำให้​ทีม​ที่​กระจาย​กัน​ทาง​ภูมิศาสตร์​ก็​ทำ session ร่วม​กัน​ได้

Domain Storytelling ทำงาน​ใน​ช่วง​ต้น​ของ​กระบวนการ DDD โดย​เฉพาะ​ใน strategic design และ​การ​ค้นหา domain ก่อน​ที่​จะ​ลง​ลึก​ไป​ถึง tactical patterns:

  • สร้าง Ubiquitous Language — คำ​ศัพท์​ที่​ผู้เชี่ยวชาญ​ใช้​เล่า​เรื่อง (คำ​กริยา​บน activity, ชื่อ​ของ work object) กลาย​เป็น​คำ​ศัพท์​ร่วม​ที่​ทีม​พัฒนา​นำ​ไป​ใช้​ตั้ง​ชื่อ class method และ​ตัวแปร​ใน code
  • ช่วย​ค้นหา Bounded Context — เมื่อ​เรื่องราว​หลาย​เรื่อง​เกี่ยวพัน​กับ​กลุ่ม​ของ actor และ work object ที่​ต่าง​กัน มัก​บ่ง​ชี้​ว่า​มี context แยก​กัน​ซ่อน​อยู่ ซึ่ง​ต่อยอด​ไป​สู่​การ​ทำ Context Mapping
  • ตรวจสอบ​ความ​เข้าใจ​แบบ​ทันที — เพราะ​ภาษา​เชิง​ภาพ​เรียบ​ง่าย ผู้เชี่ยวชาญ domain อ่าน​แผนภาพ​ที่ moderator วาด​ได้​ทันที​และ​แก้ไข​ความ​เข้าใจ​ผิด​ได้​สด ๆ ระหว่าง session ไม่​ต้อง​รอ​จนถึง​รอบ​รีวิว​ใน​ภายหลัง
  • เป็น​จุด​ตั้งต้น​ให้ Domain Model — เรื่องราว (work object และ activity) มัก​กลาย​เป็น​วัตถุดิบ​สำหรับ​ออกแบบ Entity Value Object และ Aggregate ใน​ขั้น tactical design ต่อ​ไป

บทบาท​ใน session เวิร์กช็อป​ได้แก่:

  • Moderator / Facilitator — ดำเนิน session ถาม​คำถาม​ให้​เรื่องราว​ไหล​ลื่น และ​วาด​หรือ​ควบคุม​การ​วาด
  • Modeler — ผู้​จับ​ภาพ​เรื่องราว​ลง​ใน​ภาษา​เชิง​ภาพ (บาง​ครั้ง​เป็น​คน​เดียว​กับ Moderator)
  • Domain Experts — ผู้​เล่า​เรื่อง​จริง​จาก​ประสบการณ์​ทำงาน เป็น​แหล่ง​ความ​รู้​หลัก
  • Listeners — ผู้​เข้า​ร่วม​อื่น ๆ เช่น​นัก​พัฒนา ที่​ฟัง​และ​อาจ​ถาม​คำถาม​เพื่อ​ความ​ชัดเจน

สมมติ​ทีม​กำลัง​สร้าง​ระบบ​สั่ง​ซื้อ​ออนไลน์ และ​จัด​เวิร์กช็อป Domain Storytelling กับ​พนักงาน​คลัง​สินค้า เรื่องราว​ที่​ได้​อาจ​มี​ลำดับ​ดังนี้: (1) ลูกค้า ส่ง​ใบสั่ง​ซื้อ ให้ ระบบ​สั่ง​ซื้อ, (2) ระบบ​สั่ง​ซื้อ แจ้ง​เตือน พนักงาน​คลัง ด้วย​รายการ​ที่​ต้อง​จัด, (3) พนักงาน​คลัง หยิบ​สินค้า จาก​ชั้น​วาง, (4) พนักงาน​คลัง บรรจุ สินค้า​ใส่​กล่อง, (5) พนักงาน​คลัง ส่ง​มอบ พัสดุ​ให้​กับ บริษัท​ขนส่ง

graph LR
  Customer((ลูกค้า))
  OrderSystem[ระบบสั่งซื้อ]
  WarehouseStaff((พนักงานคลัง))
  PurchaseOrder[[ใบสั่งซื้อ]]
  Shelf[[ชั้นวางสินค้า]]
  Package[[พัสดุ]]
  Carrier((บริษัทขนส่ง))

  Customer -- 1 ส่ง --> PurchaseOrder
  PurchaseOrder -- รับโดย --> OrderSystem
  OrderSystem -- 2 แจ้งเตือน --> WarehouseStaff
  WarehouseStaff -- 3 หยิบสินค้าจาก --> Shelf
  WarehouseStaff -- 4 บรรจุใส่ --> Package
  WarehouseStaff -- 5 ส่งมอบให้ --> Carrier

code C# ต่อ​ไป​นี้​แสดง​ตัวอย่าง​ว่า​คำ​ศัพท์​จาก​เรื่องราว​ข้าง​ต้น (actor, activity, work object) แปลง​เป็น​แบบ​จำลอง domain เบื้องต้น​ได้​อย่างไร โดย​ยึด​ถ้อยคำ​จาก​เรื่อง​ที่​เล่า​ให้​มาก​ที่สุด:

// work object จากเรื่องราว: ใบสั่งซื้อ (PurchaseOrder)
public class PurchaseOrder
{
public string OrderId { get; }
public string CustomerName { get; }
private readonly List<OrderLine> _lines = new();
public PurchaseOrder(string orderId, string customerName)
{
OrderId = orderId;
CustomerName = customerName;
}
// activity จากเรื่องราว: "ลูกค้าส่งใบสั่งซื้อ"
public void AddLine(string sku, int quantity)
{
_lines.Add(new OrderLine(sku, quantity));
}
}
// actor จากเรื่องราว: พนักงานคลังสินค้า (WarehouseStaff)
public class WarehouseStaff
{
// activity: "พนักงานคลังหยิบสินค้าจากชั้นวาง"
public Package PickAndPack(PurchaseOrder order, Shelf shelf)
{
var package = new Package(order.OrderId);
foreach (var line in order.Lines)
{
var item = shelf.Take(line.Sku, line.Quantity);
package.Add(item);
}
return package;
}
// activity: "พนักงานคลังส่งมอบพัสดุให้บริษัทขนส่ง"
public void HandOverToCarrier(Package package, Carrier carrier)
{
carrier.Accept(package);
}
}

ข้อสังเกต: ชื่อ class และ method ข้าง​ต้น​ดึง​มา​จาก​คำ​ที่​ผู้เชี่ยวชาญ​พูด​ตรง ๆ ระหว่าง​เล่า​เรื่อง (ส่ง, แจ้ง​เตือน, หยิบ, บรรจุ, ส่ง​มอบ) นี่​คือ​กลไก​ที่ Domain Storytelling ใช้​สร้าง ubiquitous language ให้​ไหล​จาก​ปาก​ผู้เชี่ยวชาญ domain เข้า​สู่ code โดยตรง

Domain Storytelling ไม่​ได้​บังคับ​ว่า​ต้อง​ใช้​คู่​กับ DDD เสมอ​ไป แต่​ใน​ทาง​ปฏิบัติ​มัก​ใช้​ร่วม​กัน เพราะ​ทั้ง​สอง​เน้น​ภาษา​ที่​ตรง​กับ​ความ​เข้าใจ​ของ​ผู้เชี่ยวชาญ domain (ubiquitous language) เป็น​แกน​กลาง

เมื่อ​เทียบ​กับ EventStorming ซึ่ง​เป็น​เทคนิค collaborative modeling อีก​แบบ​ที่​ริเริ่ม​โดย Alberto Brandolini ทั้ง​สอง​มี​จุด​ร่วม​คือ​ใช้​การ​เล่า​เรื่อง​เป็น​ลำดับ​เหตุการณ์​เพื่อ​ทำความ​เข้าใจ domain ที่​ซับซ้อน แต่​ต่าง​กัน​ที่ EventStorming เน้น domain event (สิ่ง​ที่​เกิด​ขึ้น​แล้ว​ใน​อดีต) และ​ใช้ sticky note สี​ต่าง ๆ แทน​ภาษา​เชิง​ภาพ​คงที่ ใน​ขณะ​ที่ Domain Storytelling เน้น actor-activity-work object พร้อม​ลำดับ​เลข​กำกับ​ที่​ตายตัว​กว่า ทีม​บาง​ทีม​เลือก​ผสม​ทั้ง​สอง​เทคนิค​เข้า​ด้วย​กัน เช่น ใช้ EventStorming มอง​ภาพ​กว้าง​ทั้ง​องค์กร​ก่อน แล้ว​ใช้ Domain Storytelling ลง​รายละเอียด​เฉพาะ​ส่วน​ที่​ซับซ้อน

graph TD
  DomainStorytelling[Domain Storytelling]
  PictographicLanguage[Pictographic Language]
  WorkshopFormat[Workshop Format]
  UL[Ubiquitous Language]
  BC[Bounded Context]
  EventStorming[EventStorming]
  StrategicDesign[Strategic Design]

  DomainStorytelling --> PictographicLanguage
  DomainStorytelling --> WorkshopFormat
  DomainStorytelling --> UL
  DomainStorytelling --> BC
  DomainStorytelling --> StrategicDesign
  EventStorming --> StrategicDesign
  DomainStorytelling -.complementary.-> EventStorming