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

เครื่องมือ​เร่ง​ความเร็ว​และ​การ​บริหาร project DDD

การ​ใช้ Domain-Driven Design (DDD)Domain-Driven Design (DDD)แนวทาง​พัฒนา​ซอฟต์แวร์​ที่​เน้น​สร้าง domain model ซึ่ง​เข้าใจ​กฎ​และ​กระบวนการ​ของ​ธุรกิจ​อย่าง​ลึกซึ้ง แล้ว​เขียน​ลง​ใน code จริง บัญญัติ​โดย Eric Evans (2003) แบ่ง​เป็น Strategic และ Tactical DesignStrategic Design คือ​การ​ออก​เดินทาง​เพื่อ เรียนรู้​ให้​ลึก ว่า​ธุรกิจ​ทำงาน​อย่างไร แล้ว​จึง​สร้าง model ซอฟต์แวร์​ขึ้น​จาก​ความ​เข้าใจ​นั้น มัน​คือ​วงจร​ของ​การ​เรียนรู้ ทดลอง ตั้ง​คำถาม เรียนรู้​เพิ่ม แล้ว​สร้าง model ใหม่​อีก​ครั้ง — เรา​ต้อง​บด​และ​กลั่น​ความ​รู้​ปริมาณ​มหาศาล​ให้​กลาย​เป็น design ที่​ตอบ​โจทย์​เชิงกลยุทธ์​ของ​องค์กร​ได้​จริง โจทย์​ที่​ยาก​คือ เรา​ต้อง​เรียนรู้​ให้​เร็ว ใน​อุตสาหกรรม​ที่​ทุก​อย่าง​เร่งรีบ เวลา​เป็น​ตัว​กำหนดการ​ตัดสิน​ใจ​แทบ​ทุก​เรื่อง (อาจ​มาก​เกิน​กว่า​ที่​ควร​ด้วย​ซ้ำ) และ​ถ้า​ส่ง​งาน​ไม่ทัน​กำหนด​หรือ​เกิน​งบ ไม่​ว่า​ซอฟต์แวร์​จะ​ดี​แค่​ไหน​ก็​ดูเหมือน “ล้มเหลว” ใน​สายตา​คน​อื่น

หลาย​คน​พยายาม​โน้มน้าว​ฝ่าย​บริหาร​ว่า การ​ประมาณ​เวลา​ของ project ส่วน​ใหญ่​นั้น​ไร้​ค่า​และ​ใช้​ไม่​ได้​จริง แต่​ใน​ความ​เป็น​จริง ลูกค้า​แทบ​ทุกราย​ที่ Vaughn Vernon ทำงาน​ด้วย​ก็​ยัง​ถูก​กดดัน​ให้​ส่ง​มอบ​ภายใน​กรอบ​เวลา​ที่​ชัดเจน​อยู่ดี ซึ่ง​บังคับ​ให้​เกิด​การ timebox ใน​กระบวนการ​ออกแบบ​และ​พัฒนา อย่าง​ดี​ที่สุด​มัน​ก็​เป็นการ​ดึง​กัน​ไป​มาระหว่าง​ฝ่าย​พัฒนา​และ​ฝ่าย​บริหาร​อยู่​ตลอด

ปฏิกิริยา​ที่​พบ​บ่อย​ต่อ​แรง​กดดัน​นี้​คือ​การ​พยายาม “ประหยัด” ด้วย​การ ตัด​การ​ออกแบบ​ทิ้ง — แต่​จำ​บท​แรก​ได้​ไหม? design เป็น​สิ่ง​ที่​หลีก​เลี่ยง​ไม่​ได้ เรา​จะ​ทำ​มัน​แย่​จน​ได้ design ที่​แย่ หรือ​จะ​ทำ​มัน​ให้​สำเร็จ​ด้วย effective design (หรือ​กระทั่ง design ที่​ดี) ก็ได้ ดังนั้น​สิ่ง​ที่​ควร​ทำ​คือ เผชิญ​กับ​ข้อ​จำกัด​ด้าน​เวลาตรงๆ แล้ว​ออกแบบ​ใน​แบบ​ที่​เร่ง​ความเร็ว​ได้ บท​นี้​จึง​รวบรวม​เครื่องมือ​เร่ง​การ​ออกแบบ​และ​บริหาร project ที่​มี​ประโยชน์​มาก เริ่ม​จาก EventStorming แล้ว​ปิด​ท้าย​ด้วย​วิธี​นำ​ผลลัพธ์​จาก​เวิร์กช็อปนั้น​ไป​สร้าง การ​ประมาณ​การ​ที่​มี​ความหมาย​และ​ทำได้​จริง


EventStormingEventStormingเวิร์กช็อป​แบบ​ร่วมมือ (Alberto Brandolini, 2013) ใช้​กระดาษ​โน้ต​สี​ติด​บน​ผนัง: ส้ม=event, น้ำเงิน=command, เหลือง=aggregate ฯลฯ เพื่อ​ค้น​พบ model และ​ขอบเขต​ของ contextProcess คือ​เทคนิค​ออกแบบ​แบบ​รวดเร็ว​ที่​ออกแบบ​มา​เพื่อ​ดึง​ทั้ง ผู้เชี่ยวชาญ​ธุรกิจ (Domain Expert)Domain Expertผู้เชี่ยวชาญ​ธุรกิจ​ที่​รู้​กฎ กระบวนการ และ​ความ​ต้องการ​ของ domain อย่าง​ลึกซึ้ง เป็น​แหล่ง​ความ​รู้​สำคัญ​ที่​ทีม​พัฒนา​ต้อง​ร่วม​งาน​ด้วย​อย่าง​ใกล้​ชิด​ใน DDDStrategic Design และ​นัก​พัฒนา​เข้า​สู่​กระบวนการ​เรียนรู้​ที่​ไหล​ลื่น​และ​รวดเร็ว จุด​โฟกัส​คือ กระบวนการ​ทาง​ธุรกิจ ไม่ใช่​คำ​นาม​และ​โครงสร้าง​ข้อมูล

ก่อน​จะ​รู้จัก EventStorming, Vernon เคย​ใช้​เทคนิค​ที่​เรียก​ว่า event-driven modeling ซึ่ง​อาศัย​การ​สนทนา, การ​สร้าง​สถานการณ์​รูปธรรม (concrete scenario) และ​การ​สร้าง model ที่​เน้น event ด้วย UML แบบ​เบา​มาก ปัญหา​คือ​คน​ฝั่ง​ธุรกิจ​น้อย​ราย​ที่​อ่าน UML ออก งาน​สร้าง model จึง​ตก​อยู่​กับ​นัก​พัฒนา​เป็น​หลัก จน​ไม่​ดึง​ผู้เชี่ยวชาญ​ธุรกิจ​เข้า​มา​มี​ส่วนร่วม​โดยตรง​ได้​อย่าง​ที่​ควร

Vernon ได้​เรียนรู้ EventStorming ครั้ง​แรก​จาก Alberto Brandolini ผู้​ซึ่ง​ครั้ง​หนึ่ง​ขณะ​ที่​เวลา​ไม่​พอ ตัดสิน​ใจ “โยน UML ทิ้ง” แล้ว​หัน​มา​ใช้ กระดาษ​โน้ต (sticky notes) แทน นั่น​คือ​จุด​กำเนิด​ของ​วิธี​เรียนรู้​และ​ออกแบบ​ซอฟต์แวร์​อย่าง​รวดเร็ว​ที่​ทำให้​ทุก​คนใน​ห้อง​มี​ส่วนร่วม​โดยตรง ข้อดี​ของ​มัน​มี​มากมาย:

  • เป็นการ​ลงมือจับ​ต้อง​จริง ทุก​คน​ได้​กระดาษ​โน้ต​หนึ่ง​ปึก​กับ​ปากกา​หนึ่ง​ด้าม และ​มีหน้าที่​ร่วม​เรียนรู้​และ​ออกแบบ​ไป​ด้วย​กัน คน​ฝั่ง​ธุรกิจ​กับ​นัก​พัฒนา​ยืน​อยู่​บน​พื้นที่​เท่าเทียม​กัน ทุก​คน​ช่วย​กัน​ป้อน ภาษา​กลาง (Ubiquitous Language)Ubiquitous Languageภาษา​กลาง​ที่​ทุก​คนใน​ทีม (ทั้ง​นัก​พัฒนา​และ​ผู้เชี่ยวชาญ​ธุรกิจ) ใช้​ร่วม​กัน อิง​กับ domain model โดยตรง คำ​เดียวกัน​ต้อง​หมาย​ถึง​สิ่ง​เดียวกัน และ​สะท้อน​ลง​ใน codeStrategic Design
  • โฟกัส​ที่ event และ​กระบวนการ​ทาง​ธุรกิจ ไม่ใช่​ที่ class หรือ​ฐาน​ข้อมูล
  • เป็น​ภาพ (visual) ล้วนๆ ตัด code ออก​จาก​การ​ทดลอง ทำให้​ทุก​คน​อยู่​บน​ระนาบ​เดียวกัน​ใน​การ​ออกแบบ
  • เร็ว​และ​ถูก​มาก เรา​สามารถ “พายุ​ไอเดีย” ออก​มา​เป็น Core DomainCore Domainsubdomain ที่​สำคัญ​และ​สร้าง​ความ​ได้​เปรียบ​ใน​การ​แข่งขัน​มาก​ที่สุด เป็น​เหตุผล​ที่​เรา​ต้อง​สร้าง​ซอฟต์แวร์​เอง​แทน​การ​ซื้อ ควร​ทุ่ม​ทีม​เก่ง​ที่สุด​ลง​ตรง​นี้Strategic Design ฉบับ​ร่าง​ได้​ภายใน​ไม่​กี่​ชั่วโมง แทนที่​จะ​กิน​เวลา​เป็น​สัปดาห์ ถ้า​เขียน​อะไร​ไป​แล้ว​ไม่​เวิร์ก ก็​แค่​ขยำ​กระดาษ​โน้ต​ทิ้ง ต้นทุน​ของ​ความ​ผิดพลาด​แค่​หนึ่ง​หรือ​สอง​สตางค์ จึง​ไม่มี​ใคร​หวง​ที่​จะ​แก้ไข​เพราะ “ลงแรง​ไป​แล้ว”
  • ทีม​จะ​เกิด breakthrough ใน​ความ​เข้าใจ เสมอ บาง​คน​มา​ด้วย​ความ​มั่นใจ​ว่า​เข้าใจ core domain ดี​อยู่​แล้ว แต่​ไม่​ว่า​อย่างไร​ก็​จะ​กลับ​ออก​ไป​พร้อม​ความ​เข้าใจ​ที่​ลึก​ขึ้น​และ​มุม​มองใหม่ๆ เกี่ยว​กับ​กระบวนการ​ทาง​ธุรกิจ​เสมอ
  • ทุก​คน​ได้​เรียนรู้​บาง​อย่าง ไม่​ว่า​จะ​เป็น​ผู้เชี่ยวชาญ​ธุรกิจ​หรือ​นัก​พัฒนา ก็​จะ​เดิน​ออก​ไป​พร้อม​ความ​เข้าใจ model ที่​คม​และ​ชัด หลาย project มี​คน​จำนวน​หนึ่ง​ที่​ไม่​เข้าใจ​ว่า​กำลัง​ทำ​อะไร​อยู่​จน​กระทั่ง​สาย​เกิน​ไป​และ​ความ​เสียหาย​ฝัง​อยู่​ใน code แล้ว การ “storm” model ออก​มา​ช่วย​ให้​ทุก​คน​เคลียร์​ความ​เข้าใจ​ผิด​และ​เดิน​ไป​ใน​ทิศทาง​เดียวกัน
  • ระบุ​ปัญหา​ได้​เร็ว​ที่สุด ทั้ง​ใน model และ​ใน​ความ​เข้าใจ รีด​ความ​เข้าใจ​ผิด​ออก แล้ว​เปลี่ยน​ผลลัพธ์​ให้​เป็น​มุมมอง​ใหม่ ทุก​คนใน​ห้อง​ได้​ประโยชน์
  • ใช้ได้​ทั้ง​ระดับ big-picture (ภาพ​รวม) และ design-level (ระดับ​ออกแบบ) — แบบ big-picture จะ​หยาบ​กว่า ส่วน design-level จะ​นำ​ไป​สู่ artifact ของ​ซอฟต์แวร์​ที่​ชัดเจน​ขึ้น
  • ไม่​จำเป็น​ต้อง​จบ​ใน​ครั้ง​เดียว เริ่ม​ด้วย session สอง​ชั่วโมง พักผ่อน นอน​คิด แล้วกลับ​มา​อีก​หนึ่ง​หรือ​สอง​ชั่วโมง​วัน​ถัด​ไป​เพื่อ​ขยาย​และ​กลั่น ทำ​แบบ​นี้​วัน​ละ​สอง​ชั่วโมง​สัก​สาม​ถึง​สี่​วัน จะ​ได้​ความ​เข้าใจ Core Domain และ​จุด​เชื่อม​ต่อ​กับ SubdomainSubdomainส่วน​ย่อย​ของ Domain ใหญ่ เช่น Domain e-commerce แตก​เป็น subdomain การ​สั่ง​ซื้อ การ​ชำระ​เงิน คลัง​สินค้า ฯลฯ อยู่​ใน “พื้นที่​ปัญหา” (problem space)Strategic Design โดย​รอบ​อย่าง​ลึกซึ้ง
คน ความคิด และ​อุปกรณ์​ที่​ต้องเตรียม
  • คน​ที่​ใช่ คือ​สิ่ง​จำเป็น — ต้อง​มี ผู้เชี่ยวชาญ​ธุรกิจDomain Expertผู้เชี่ยวชาญ​ธุรกิจ​ที่​รู้​กฎ กระบวนการ และ​ความ​ต้องการ​ของ domain อย่าง​ลึกซึ้ง เป็น​แหล่ง​ความ​รู้​สำคัญ​ที่​ทีม​พัฒนา​ต้อง​ร่วม​งาน​ด้วย​อย่าง​ใกล้​ชิด​ใน DDDStrategic Design และ​นัก​พัฒนา​ที่​จะ​ลงมือ​ทำ model ทุก​คน​ถือ​คำถาม​คนละ​บาง​ส่วน​และ​คำ​ตอบ​คนละ​บาง​ส่วน จึง​ต้อง​อยู่​ใน​ห้อง​เดียวกัน
  • ทุก​คน​ต้อง เปิด​ใจ ปลอด​จาก​การ​ตัดสิน​ที่​เข้มงวด ความ​ผิดพลาด​ที่​พบ​บ่อย​ที่สุด​คือ​พยายาม “ถูกต้อง​เร็ว​เกิน​ไป” ควร​ตั้งใจ​สร้าง event ให้​มาก​เกิน​ไว้​ก่อน เพราะ​นั่น​คือ​สิ่ง​ที่​ทำให้​เรา​เรียนรู้มาก​ที่สุด เดี๋ยว​ค่อย​กลั่น​ทีหลัง ซึ่ง​ทำได้​เร็ว​และ​ถูก
  • เตรียม กระดาษ​โน้ต​หลาก​สี ให้​มาก​พอ อย่าง​น้อย​ต้อง​มี​สี: ส้ม, ม่วง/แดง, ฟ้า​อ่อน, เหลือง​อ่อน, ม่วง​ลิลลี่ (lilac) และ​ชมพู ขนาด​สี่เหลี่ยม​จัตุรัส (ราว 7.62 ซม.) กำลัง​ดี เลือก​แบบ​เหนียว​พิเศษ​จะ​ดี​เพราะ​ไม่​อยาก​ให้​โน้ต​หล่น​พื้น
  • เตรียม ปากกา​เมจิก​หัว​ดำ ให้​ทุก​คน​คนละ​ด้าม หัว​เล็ก​จะ​ดี​ที่สุด​เพราะ​ลายมือ​จะ​คม​ชัด
  • หา ผนังกว้างๆ เพื่อ​ทำ model ความ​กว้าง​สำคัญ​กว่า​ความ​สูง พื้นที่​ทำงาน​ควร​สูง​ราว​หนึ่ง​เมตร ส่วน​ความ​กว้าง​ยิ่ง​มาก​ยิ่ง​ดี ขั้น​ต่ำ​ราว 10 เมตร — ถ้า​ไม่มี​ผนัง โต๊ะ​ประชุม​ยาว​หรือ​พื้น​ก็​พอใช้ได้ แต่​ผนัง​ดี​ที่สุด
  • หา กระดาษ​ม้วน​ยาว มา​แขวน​บน​ผนัง (กว้าง​อย่าง​น้อย 10 เมตร สูง 1 เมตร) เพราะ​กระดาษ​โน้ต​เกาะ​ติด​กระดาษ​ได้​นาน​กว่า​เกาะบนไวต์บอร์ด สำคัญ​เมื่อ​จะ​ทำ model เป็น​ช่วงๆ หลาย​วัน

เมื่อ​มี​อุปกรณ์​พื้นฐาน​และ​คน​ที่​ใช่​แล้ว ก็​พร้อม​เริ่ม ลอง​พิจารณา​ที​ละ​ขั้น

ขั้น​ที่ 1 — Storm กระบวนการ​ทาง​ธุรกิจ​ด้วย Domain Event (โน้ต​สี​ส้ม)

หัวข้อ​ที่​มีชื่อ​ว่า “ขั้น​ที่ 1 — Storm กระบวนการ​ทาง​ธุรกิจ​ด้วย Domain Event (โน้ต​สี​ส้ม)”

ออกแรง “พายุ” กระบวนการ​ทาง​ธุรกิจ​ออก​มา​เป็น​ชุด​ของ Domain EventDomain Eventสิ่ง​ที่ “เกิด​ขึ้น​แล้ว” ใน domain ซึ่ง​ส่วน​อื่น​สนใจ แทน​ด้วย​อ็อบเจ็กต์ที่​เปลี่ยนแปลง​ไม่​ได้ ตั้ง​ชื่อ​เป็น​อดีต เช่น CargoWasRouted ใช้​สื่อสาร​ข้าม AggregateTactical Design บน​กระดาษ​โน้ต สี​ส้ม (สี​ที่​นิยม​ที่สุด​สำหรับ Domain Event เพราะ​เด่น​ที่สุด​บน​พื้นที่ model) แนวทาง​พื้นฐาน​คือ:

  • การ​สร้าง Domain Event ก่อน​เป็นการ​ตอกย้ำ​ว่า​เรา​โฟกัส​ที่ กระบวนการ​ทาง​ธุรกิจ เป็น​อันดับ​แรก ไม่ใช่​ที่​ข้อมูล​และ​โครงสร้าง​ของ​มัน ทีม​อาจ​ใช้​เวลา 10–15 นาที​ใน​การ​อุ่นเครื่อง อย่า​เพิ่ง​กระโดด​ข้าม​ขั้น
  • เขียน​ชื่อ Domain Event แต่ละ​ตัว​บน​โน้ต​หนึ่ง​ใบ ชื่อ​ควร​เป็น กริยา​ใน​รูป​อดีต เช่น ProductCreated หรือ BacklogItemCommitted
  • วาง​โน้ต​บน​พื้นที่ model เรียง​ตาม​เวลา จาก​ซ้าย​ไป​ขวา​ตาม​ลำดับ​ที่​แต่ละ event เกิด​ขึ้น​ใน domain หาก​ยัง​ไม่รู้​ลำดับ​เวลา​แน่ชัด ก็​วาง​ไว้​ที่​ใด​ที่​หนึ่ง​ก่อน แล้ว​ค่อย​หา​ว่า​มัน “เกิด​เมื่อไร” ทีหลัง
  • Domain Event ที่​เกิด ขนาน​กัน กับ​อีก​ตัว​หนึ่ง​ให้​วาง​ไว้​ใต้ event ที่​เกิด​เวลา​เดียวกัน — ใช้​พื้นที่​แนว​ตั้ง​แทน​การ​ประมวล​ผล​แบบ​ขนาน
  • เมื่อ​เจอ จุด​ที่​เป็น​ปัญหา ใน​กระบวนการ​เดิม​หรือ​ใหม่ ให้​มาร์กชัดๆ ด้วย​โน้ต ม่วง/แดง พร้อม​ข้อความ​อธิบาย​ว่า​ทำไม​จึง​เป็น​ปัญหา จุด​เหล่า​นี้​คือ​จุด​ที่​ควร​ลงทุน​เวลา​เรียนรู้​เพิ่ม
  • บาง​ครั้ง​ผลลัพธ์​ของ Domain Event คือ Process ที่​ต้อง​ทำงาน (อาจ​ขั้นตอน​เดียว​หรือ​หลาย​ขั้น​ซับซ้อน) ให้​จับ​มัน​ลง​โน้ต ม่วง​ลิลลี่ แล้ว​ลาก​เส้น​มี​หัว​ลูกศร​จาก Domain Event ไป​ยัง Process นั้น และ​จง​สร้าง model event แบบ​ละเอียด​เฉพาะ​เมื่อ​สำคัญ​ต่อ Core Domain เท่านั้น เช่น กระบวนการ​สมัคร​สมาชิก​ผู้​ใช้​มัก​จำเป็น​แต่​ไม่ใช่ feature หลัก ให้ model เป็น event หยาบๆ ตัว​เดียว UserRegistered แล้วไป​ต่อ ทุ่ม​แรง​ไป​ที่ event ที่​สำคัญ​กว่า

หาก​คิด​ว่า​ได้ Domain Event สำคัญ​ครบ​หมด​แล้ว อาจ​ถึง​เวลา​พัก​แล้วกลับ​มา​ทำ session ต่อ​ภายหลัง การกลับ​มา​ที่​พื้นที่ model ใน​วัน​ถัด​ไป​จะ​ทำให้​พบ​แนวคิด​ที่​ขาด​หาย​และ​ได้​กลั่น​หรือ​ทิ้ง event ผิวเผิน​ที่​เคย​คิด​ว่า​สำคัญ เมื่อ​ระบุ Domain Event สำคัญ​ส่วน​ใหญ่​ได้​แล้ว​จึง​ไป​ขั้น​ถัด​ไป

ลำดับ Domain Event เรียง​ตาม​เวลา (ซ้าย​ไป​ขวา)
[ProductCreated] → [ReleaseScheduled] → [SprintScheduled] → [BacklogItemPlanned] → [BacklogItemCommitted]
เวลา (Time) ──────────────────────────────────────────────►

ขั้น​ที่ 2 — สร้าง Command ที่​ก่อ​ให้​เกิด Domain Event (โน้ต​สี​ฟ้า​อ่อน)

หัวข้อ​ที่​มีชื่อ​ว่า “ขั้น​ที่ 2 — สร้าง Command ที่​ก่อ​ให้​เกิด Domain Event (โน้ต​สี​ฟ้า​อ่อน)”

สร้าง Command ที่​เป็นต้นเหตุ​ของ Domain Event แต่ละ​ตัว บาง​ครั้ง Domain Event มา​จาก​ระบบ​อื่น​แล้ว​ไหล​เข้า​มา แต่​บ่อย​ครั้ง Command คือ​ผล​ของ “ท่าทาง” (gesture) ของ​ผู้​ใช้ และ​เมื่อ Command ถูก​ดำเนิน​การ มัน​จะ​ก่อ​ให้​เกิด Domain Event ตั้ง​ชื่อ Command เป็น รูป​คำ​สั่ง (imperative) เช่น CreateProduct และ CommitBacklogItem แนวทาง:

  • เขียน​ชื่อ Command บน​โน้ต ฟ้า​อ่อน เช่น Domain Event ชื่อ BacklogItemCommitted มี Command คู่​กัน​คือ CommitBacklogItem
  • วาง​โน้ต Command ไว้ ทาง​ซ้าย​ของ Domain Event ที่​มัน​ก่อ​ให้​เกิด จับ​คู่​กัน​เป็น Command/Event เป็น​คู่ๆ ไป (จำ​ไว้​ว่า​บาง Domain Event เกิด​เพราะ​ถึง​กำหนด​เวลา จึง​อาจ​ไม่มี Command ที่​ก่อ​มัน​โดยตรง)
  • หาก​มี บทบาท​ผู้​ใช้ (user role) ที่​เจาะจง​และ​สำคัญ​ที่​จะ​ระบุ ให้​ติด​โน้ต เหลือง​เล็กๆ ที่​มุม​ล่าง​ซ้าย​ของ Command พร้อม​รูป​คน​กับ​ชื่อ​บทบาท เช่น “Product Owner”
  • บาง​ครั้ง Command ก่อ​ให้​เกิด Process ให้​จับ​ลง​โน้ต​ม่วง​ลิลลี่​แล้ว​ลาก​เส้น​มี​หัว​ลูกศร​เหมือน​เดิม Process นั้น​จะ​ก่อ​ให้​เกิด Command และ Domain Event ตาม​มา​อีก
  • เคลื่อน​จาก​ซ้าย​ไป​ขวา​ตาม​ลำดับ​เวลา​เหมือน​ตอน​สร้าง Domain Event

การ​สร้าง Command อาจ​ทำให้​นึกถึง Domain Event ที่​ยัง​ไม่​เคย​เห็น​มา​ก่อน (เช่น​ตอน​พบ Process สี​ลิลลี่) อย่า​เพิกเฉย ให้​วาง​มัน​ลง​พร้อม Command ที่​คู่​กัน และ​อาจ​พบ​ว่า​มี Command เพียง​ตัว​เดียว​ที่​ก่อ​ให้​เกิด Domain Event หลาย​ตัว — ไม่​เป็นไร model Command ตัว​เดียว​แล้ว​วาง​ไว้​ทาง​ซ้าย​ของ Domain Event หลาย​ตัว​ที่​มัน​ก่อ

ขั้น​ที่ 3 — ผูก Entity/Aggregate ที่ Command ทำงาน​บน​นั้น (โน้ต​สี​เหลือง​อ่อน)

หัวข้อ​ที่​มีชื่อ​ว่า “ขั้น​ที่ 3 — ผูก Entity/Aggregate ที่ Command ทำงาน​บน​นั้น (โน้ต​สี​เหลือง​อ่อน)”

ผูก EntityEntityอ็อบเจ็กต์ที่​มี “ตัวตน” (identity) ต่อ​เนื่อง​ตาม​เวลา แม้​ค่า​ภายใน​เปลี่ยน ก็​ยัง​เป็น​สิ่ง​เดิม เช่น ลูกค้า, คำ​สั่ง​ซื้อ — แยกแยะ​ด้วย id ไม่ใช่​ด้วย​ค่าTactical Design/AggregateAggregateกลุ่ม​ของ Entity และ Value Object ที่​ถูก​มอง​เป็น​หนึ่ง​หน่วย​เดียว​เพื่อ​รักษา​ความ​ถูกต้อง​ของ​ข้อมูล มี​ขอบเขต​ชัดเจน และ​เป็น​หน่วย​ของ transactionTactical Design ที่​เป็น​ตัว​รับ​การ​ดำเนิน​การ​ของ Command และ​เป็น​ตัว​ปล่อย Domain Event ออก​มา นี่​คือ “ตัว​ถือ​ข้อมูล” ที่ Command ถูก​ดำเนิน​การ​และ Domain Event ถูก​ปล่อย น่า​สนใจ​ที่​แผนภาพ Entity-relationship มัก​เป็น​ขั้น​แรก​ที่​คน​ไอที​ยุค​นี้​นิยม แต่​นั่น​เป็น​ความ​ผิดพลาด​ใหญ่​ที่​จะ​เริ่ม​ตรง​นั้น เพราะ​คน​ธุรกิจ​ไม่​เข้าใจ​มันดี​และ​จะ​ทำให้​บทสนทนา​สะดุด ใน EventStorming ขั้น​นี้​จึง​ถูกลด​ไป​อยู่​อันดับ​สาม เพราะ​เรา​เน้น กระบวนการ​ทาง​ธุรกิจ มากกว่า​ข้อมูล แต่​ถึง​จุด​นี้​เรา​จำเป็น​ต้อง​คิด​เรื่อง​ข้อมูล​แล้ว แนวทาง:

  • ถ้า​คน​ธุรกิจ​ไม่​ชอบ​คำ​ว่า Aggregate หรือ​มัน​ทำให้​สับสน ก็​ใช้​คำ​อื่น​ได้ เช่น Entity หรือ​เรียก​แค่ “Data” สิ่ง​สำคัญ​คือ​โน้ต​สื่อ​แนวคิด​ที่​มัน​แทน​ได้​ชัดเจน ใช้​โน้ต เหลือง​อ่อน สำหรับ Aggregate ทุก​ตัว เขียน​ชื่อ​เป็น​คำ​นาม เช่น Product หรือ BacklogItem
  • วาง​โน้ต Aggregate ไว้ ด้าน​หลัง​และ​เหนือ​ขึ้น​เล็กน้อย จาก​คู่ Command/Event เพื่อ​ให้​อ่าน​ชื่อ​คำ​นาม​ได้ ส่วน​คู่ Command/Event ติด​อยู่​ส่วน​ล่าง​ของ​โน้ต Aggregate เพื่อ​แสดง​ว่า​ผูก​กัน
  • เมื่อ​ไล่​ไป​ตาม​ไทม์​ไลน์ จะ​พบ​ว่า Aggregate ตัว​เดิม​ถูก​ใช้​ซ้ำๆ อย่า​จัด​เรียง​ไทม์​ไลน์​ใหม่ เพื่อ​ยุบ​ทุก​คู่ Command/Event มา​ไว้​ใต้ Aggregate ใบ​เดียว แต่​ให้​สร้าง​คำ​นาม Aggregate เดิม​บน​โน้ต​หลาย​ใบ​แล้ว​วาง​ซ้ำ​ตรง​ที่​คู่ Command/Event เกิด เพราะ​หัวใจ​คือ​การ model กระบวนการ​ทาง​ธุรกิจ​ที่​เกิด​ตาม​เวลา
  • ขณะ​คิด​เรื่อง​ข้อมูล อาจ​ค้น​พบ Domain Event ใหม่ อย่า​เพิกเฉย ให้​วาง​มัน​ลง​พร้อม Command และ Aggregate ที่​คู่​กัน และ​อาจ​พบ​ว่า​บาง Aggregate ซับซ้อน​เกิน​ไป​จน​ต้อง​แตก​เป็น Process (โน้ต​ลิลลี่) อย่า​มอง​ข้าม​โอกาส​เหล่า​นี้
โครง​สาม​ชั้น​ของ EventStorming

แกน​ของ EventStorming คือ​สาม​สี: ฟ้า = Command (สิ่ง​ที่​ตั้งใจ​ให้​เกิด) → เหลือง = Aggregate (ตัว​ที่​บังคับ​ใช้​กฎ) → ส้ม = Domain Event (สิ่ง​ที่​เกิด​ขึ้น​แล้ว) เรียง​ทั้งหมด​ตาม​เวลา​จาก​ซ้าย​ไป​ขวา แล้ว​เพิ่ม ม่วง​ลิลลี่ = Process, ม่วง/แดง = จุด​ปัญหา, ชมพู = Bounded Context, เขียว = View และ เหลือง​เล็ก = บทบาท​ผู้​ใช้ เป็น​ชั้น​เสริม

ทำ​ขั้น​นี้​เสร็จ​ก็​เข้า​ใกล้​ขั้น​เสริม​ที่​จะ​ทำ​หรือ​ไม่​ทำ​ก็ได้ และ​เข้าใจ​ด้วย​ว่า​หาก​ใช้ Event SourcingEvent Sourcingเก็บ​ทุก​การ​เปลี่ยน​สถานะ​เป็น event ที่​เปลี่ยน​ไม่​ได้ แล้ว​สร้าง​สถานะ​ปัจจุบัน​ด้วย​การ​เล่น event ซ้ำ มัก “ต้อง​ใช้​คู่​กับ CQRS” (Greg Young) มี event stream ต่อ1 AggregateArchitecture อยู่ ก็​เดินทาง​มา​ไกล​ใน​การ​เข้าใจ​วิธี implement Core Domain แล้ว เพราะ EventStorming และ Event Sourcing ทับซ้อน​กัน​มาก แน่นอน​ว่า​ยิ่ง storming ใกล้​ภาพ​รวม ก็​ยิ่ง​ไกล​จาก​การ implement จริง แต่​เทคนิค​เดียวกัน​นี้​ใช้​ไป​ถึง​ระดับ design-level ได้ ใน​ประสบการณ์​ของ Vernon ทีม​มัก​สลับ​เข้า​ออก​ระหว่าง big-picture กับ design-level ภายใน session เดียวกัน

ขั้น​ที่ 4 — วาด​ขอบเขต​และ​เส้น​แสดง​การ​ไหล (โน้ต​สีชมพู)

หัวข้อ​ที่​มีชื่อ​ว่า “ขั้น​ที่ 4 — วาด​ขอบเขต​และ​เส้น​แสดง​การ​ไหล (โน้ต​สีชมพู)”

วาด​ขอบเขต​และ​เส้น​ที่​มี​ลูกศร​เพื่อ​แสดง “การ​ไหล” บน​พื้นที่ model เมื่อ​มา​ถึง​จุด​นี้​มัก​พบ​ว่า​มี​หลาย model ทำงาน​อยู่ และ​มี Domain Event ไหล​ข้าม​ไป​มาระหว่าง model วิธี​จัดการ:

  • โดย​สรุป มัก​พบ​ขอบเขต​ภาย​ใต้​เงื่อนไข​เหล่า​นี้: การ​แบ่ง​แผนก, เมื่อ​คน​ธุรกิจ​ต่าง​นิยาม​คำ​เดียวกัน​ขัดแย้ง​กัน, หรือ​เมื่อ​แนวคิด​สำคัญ​แต่​ไม่ใช่​ส่วน​หนึ่ง​ของ Core Domain จริงๆ
  • ใช้​ปากกา​เมจิก​หัว​ดำ​วาด​บน​กระดาษ แสดง​ขอบเขต​ของ context และ​ขอบเขต​อื่น ใช้ เส้น​ทึบ สำหรับ Bounded ContextBounded Contextขอบเขต​ที่​ชัดเจน (มัก​เป็น​ระบบ​ย่อย​หรือ​ทีม​หนึ่ง) ที่ model หนึ่ง​ใช้ได้​และ​มี​ความหมาย​แน่นอน ภายใน​ขอบเขต​นี้ Ubiquitous Language สอดคล้อง​กัน 100%Strategic Design และ เส้น​ประ สำหรับ Subdomain (การ​วาด​บน​กระดาษ​ถาวร จึง​ควร​มั่นใจ​ใน​ระดับ​รายละเอียด​นี้​ก่อน หาก​ยัง​ไม่​มั่นใจ​ให้​ใช้​โน้ต​ชมพู​มาร์ก​พื้นที่​คร่าวๆ ก่อน)
  • วาง​โน้ต ชมพู ไว้​ใน​แต่ละ​ขอบเขต​แล้ว​เขียน​ชื่อ​ที่​ใช้​กับ​ขอบเขต​นั้น เพื่อ​ตั้ง​ชื่อ Bounded Context
  • ลาก​เส้น​มี​หัว​ลูกศร​เพื่อ​แสดง ทิศทางการ​ไหล​ของ Domain Event ระหว่าง Bounded Context นี่​เป็น​วิธี​ที่​สื่อ​ว่า Domain Event บาง​ตัว​มา​ถึง​ระบบ​เรา​โดย​ไม่​ได้​เกิด​จาก Command ใน​ระบบ​เรา​เอง

รายละเอียด​อื่น​ของ​ขั้น​นี้​น่า​จะ​เข้าใจ​ได้​เอง​โดย​สัญชาตญาณ — แค่​ใช้​ขอบเขต​และ​เส้น​ใน​การ​สื่อสาร

graph LR
  subgraph BC1["Bounded Context A (ชมพู)"]
    direction TB
    C1["Command A1 (ฟ้า)"] --> AG1["Aggregate A (เหลือง)"]
    AG1 --> E1["Event A1 (ส้ม)"]
  end
  subgraph BC2["Bounded Context B (ชมพู)"]
    direction TB
    AG2["Aggregate B (เหลือง)"] --> E2["Event B1 (ส้ม)"]
  end
  E1 -->|"Domain Event ไหลข้าม context"| AG2

ขั้น​ที่ 5 — ระบุ View และ​บทบาท​ผู้​ใช้​ที่​สำคัญ (โน้ต​สี​เขียว/เหลือง)

หัวข้อ​ที่​มีชื่อ​ว่า “ขั้น​ที่ 5 — ระบุ View และ​บทบาท​ผู้​ใช้​ที่​สำคัญ (โน้ต​สี​เขียว/เหลือง)”

ระบุ View ต่างๆ ที่​ผู้​ใช้​จำเป็น​ต้อง​ใช้​เพื่อ​ทำงาน​ให้​สำเร็จ และ บทบาท สำคัญ​ของ​ผู้​ใช้​แต่ละ​กลุ่ม

  • ไม่​จำเป็น​ต้อง​แสดง​ทุก View ที่ UI จะมี (หรือ​ไม่​แสดง​เลย​ก็ได้) หาก​ตัดสิน​ใจ​แสดง ควร​เป็น View ที่​สำคัญ​และ​ต้องการ​ความ​ใส่ใจ​พิเศษ​ใน​การ​สร้าง แทน​ด้วย​โน้ต เขียว บน​พื้นที่ model จะ​วาด mockup หรือ wireframe คร่าวๆ ของ View ที่​สำคัญ​ที่สุด​ด้วย​ก็ได้​ถ้า​ช่วย​ให้​เข้าใจ
  • ใช้​โน้ต เหลือง​สด แทน​บทบาท​ผู้​ใช้​สำคัญ แสดง​เฉพาะ​เมื่อ​ต้อง​สื่อสาร​บาง​อย่าง​ที่​มี​นัย​สำคัญ​เกี่ยว​กับ​การ​โต้ตอบ​ของ​ผู้​ใช้​กับ​ระบบ หรือ​สิ่ง​ที่​ระบบ​ทำให้​บทบาท​นั้น​โดย​เฉพาะ

เป็น​ไป​ได้​ว่า​ขั้น​ที่​สี่​และ​ห้า​คือ “ของ​เสริม” ทั้งหมด​ที่​จำเป็น​ต้อง​ผนวก​เข้า​กับ​เวิร์กช็อป EventStorming ของ​เรา

🛒 EventStorming ตะกร้า​สั่ง​ซื้อ

ลอง​พายุ​กระบวนการ “สั่ง​ซื้อ” ออก​มา: Command PlaceOrder (ฟ้า) → Aggregate Order (เหลือง) → Domain Event OrderPlaced (ส้ม) จาก​นั้น OrderPlaced ลาก​เส้น​ไหล​ข้าม​ไป​ยัง Bounded Context “คลัง​สินค้า” (ชมพู) ที่​จะ​เกิด Process จัด​เตรียม​สินค้า​ต่อ — ทั้งหมด​เรียง​ตาม​เวลา​จาก​ซ้าย​ไป​ขวา และ​ทุก​คนใน​ห้อง​ช่วย​กัน​ตั้ง​ชื่อ​ให้​เป็น​ภาษา​กลาง


ทั้งหมด​นี้​ไม่​ได้​ห้าม​เรา​ทดลอง เช่น วาด​สิ่ง​อื่น​เพิ่ม​บน​พื้นที่ model หรือ​ลอง​ขั้นตอน​การ model อื่น​ใน session EventStorming จำ​ไว้​ว่า​นี่​คือ​เรื่อง​ของ​การ​เรียนรู้​และ​สื่อสาร design ใช้​เครื่องมือ​ไหน​ก็ได้​ใน​ฐานะ​ทีม​ที่​แน่นแฟ้น เพียง​ระวัง​อย่า​ให้​มี​พิธีรีตอง (ceremony) มาก​เกิน​ไป เพราะ​นั่น​แพง ไอเดีย​เสริมอื่นๆ:

  • เพิ่ม executable specification ระดับ​สูง แบบ given/when/then (หรือ​ที่​เรียก​ว่า acceptance test) อ่าน​เพิ่ม​ได้​ใน​หนังสือ Specification by Example ของ Gojko Adzic เพียง​ระวัง​อย่า​หมกมุ่น​จน​มัน​กลืน​ทุก​อย่าง​และ​สำคัญ​เหนือ domain model จริงๆ Vernon ประเมิน​ว่าการ​ใช้​และ​ดูแล executable specification กิน​เวลา​และ​แรง​เพิ่ม​ราว 15% ถึง 25% เทียบ​กับ​การ​ใช้ unit test ทั่วไป และ​ง่าย​ที่​จะ​ติด​กับ​การ​คอย​รักษา spec ให้​สอดคล้อง​กับ​ทิศทาง​ธุรกิจ​ที่​เปลี่ยน​ไป​ต่อ​เนื่อง
  • ลอง Impact Mapping (เทคนิค​ของ Gojko Adzic เช่น​กัน) เพื่อ​มั่นใจ​ว่า​ซอฟต์แวร์​ที่​ออกแบบ​เป็น Core Domain จริง ไม่ใช่ model ที่​สำคัญ​น้อย​กว่า
  • ลอง User Story Mapping ของ Jeff Patton เพื่อ​โฟกัส​ไป​ที่ Core Domain และ​เข้าใจ​ว่า​ควร​ลงทุน​กับ feature ใด

เครื่องมือ​เสริม​สาม​ตัว​ข้าง​ต้น​ทับซ้อน​กับ​ปรัชญา DDD อย่าง​มาก และ​เหมาะ​จะ​นำ​มา​ใช้​ใน project DDD ใดๆ ทั้งหมด​ออกแบบ​มา​เพื่อ project ที่​เร่ง​ความเร็ว​สูง มี​พิธีรีตอง​ต่ำ และ​ใช้งาน​ได้​ใน​ราคา​ถูก​มาก


มี​กระแส​ที่​เรียก​ว่า No Estimates ซึ่ง​ปฏิเสธ​การ​ประมาณ​การ​แบบ​เดิม​อย่าง story point หรือ task hour โดย​โฟกัส​ที่​การ​ส่ง​มอบ “คุณค่า” เหนือ​การ​คุม​ต้นทุน และ​ไม่​ประมาณ​งาน​ที่​น่า​จะ​ใช้​เวลา​แค่​ไม่​กี่​เดือน Vernon ไม่​ปัด​ตก​แนวทาง​นี้ แต่ ณ เวลา​ที่​เขียน​หนังสือ ลูกค้า​ที่​เขา​ทำงาน​ด้วย​ยัง​ถูก​บังคับ​ให้​ส่ง​ประมาณ​การ​และ timebox งาน​อยู่ดี หาก No Estimates เวิร์กกับ​สถานการณ์​ของ​เรา ก็​ใช้ได้​เลย

นอกจาก​นี้​บาง​คนใน​วงการ DDD ได้​นิยาม​กระบวนการ​ของ​ตัวเอง​สำหรับ​การ​ใช้ DDD ซึ่ง​อาจ​ได้​ผล​เมื่อ​ทีม​ยอมรับ แต่​ขอ buy-in จาก​องค์กร​ที่​ลงทุน​กับ framework Agile อย่าง Scrum ไป​แล้ว​ได้​ยาก​กว่า

ช่วง​หลัง Scrum ถูก​วิจารณ์​หนัก Vernon ไม่​เลือก​ข้าง แต่​ยอม​รับตรงๆ ว่า​บ่อย​ครั้ง (หรือ​ส่วน​ใหญ่) Scrum ถูก​ใช้​ผิด​วิธี เขา​เคย​พูด​ถึง​แนวโน้ม​ที่​ทีม​จะ “ออกแบบ” ด้วย​สิ่ง​ที่​เขา​เรียก​ว่า task-board shuffle (การ​สับ Post-it บน​บอร์ด) ซึ่ง​ไม่ใช่​วิธี​ที่ Scrum ตั้งใจ​ให้​ใช้ และ​ขอ​ย้ำ​อีก​ครั้ง​ว่า การ​ได้​มา​ซึ่ง​ความ​รู้ (knowledge acquisition) เป็น​ทั้ง​หลักการ​ของ Scrum และ​เป้าหมาย​สำคัญ​ของ DDD แต่​กลับ​ถูก​ละเลย​เพื่อ​แลก​กับ​การ​ส่ง​มอบ​แบบ​ไม่​หยุด​พัก กระนั้น Scrum ก็​ยัง​ถูก​ใช้​อย่าง​กว้าง​ขวาง​และ​คง​ไม่​หาย​ไป​เร็ว​นัก

ดังนั้น​บท​นี้​จะ​แสดง​วิธี​ทำให้ DDD ทำงาน​ใน project ที่​ใช้ Scrum เทคนิค​เหล่า​นี้​ใช้ได้​กับ Agile แนว​อื่น​เช่น Kanban เช่น​กัน — ไม่มี​อะไร​ผูกขาด​กับ Scrum แม้​คำ​แนะนำ​บาง​ส่วน​จะ​พูด​ใน​เชิง Scrum ที่​ใด​ใช้​คำ​ว่า task หรือ task board ก็​เข้า​กัน​ได้​กับ Agile ทั่วไป​และ Kanban ที่​ใด​ใช้​คำ​ว่า sprint ก็​เทียบ​ได้​กับ iteration (Agile ทั่วไป) และ WIP (work in progress; อ้าง​ถึง Kanban) คำ​แนะนำ​ส่วน​ใหญ่​จะ​เกี่ยว​กับ​การ model domain การ​เรียนรู้ การ​ทดลอง และ​การ​ออกแบบ​ด้วย DDD ส่วน​แนวทาง Scrum/Kanban ทั่วไป​ต้องหา​อ่าน​ที่​อื่น

หนึ่ง​ใน​วิธี​ที่​สำคัญ​ที่สุด​ใน​การ​ใช้ DDD ให้​สำเร็จ​คือ จ้าง​คน​เก่ง ไม่มี​อะไร​ทดแทน​คน​เก่ง​ได้ โดย​เฉพาะ​นัก​พัฒนา​ที่​เหนือ​ค่า​เฉลี่ย DDD เป็น​ปรัชญา​และ​เทคนิค​ขั้น​สูง จึง​ต้องการ​นัก​พัฒนา​ที่​เก่ง​กว่า​ค่า​เฉลี่ย (หรือ​เก่ง​มาก) มา​ใช้งาน อย่า​ประเมิน​ความ​สำคัญ​ของ​การ​จ้าง​คน​ที่​ใช่ มี​ทักษะ​ที่​ถูกต้อง และ​มี​แรง​ขับ​ใน​ตัวเอง​ต่ำ​เกิน​ไป

SWOT AnalysisSWOT Analysisการ​วิเคราะห์​จุด​แข็ง (Strengths), จุด​อ่อน (Weaknesses), โอกาส (Opportunities) และ​อุปสรรค (Threats) เพื่อ​ประเมิน​ทิศทาง​ของ project DDD อย่าง​รอบ​ด้านProcess ย่อ​มา​จาก Strengths (จุด​แข็ง), Weaknesses (จุด​อ่อน), Opportunities (โอกาส) และ Threats (อุปสรรค) เป็น​วิธี​คิด​เกี่ยว​กับ project ใน​มุม​ที่​เจาะจง เพื่อ​เก็บเกี่ยว​ความ​รู้​ให้​มาก​ที่สุด​เร็ว​ที่สุด สิ่ง​ที่​มอง​หา​ใน project:

  • Strengths (จุด​แข็ง): ลักษณะ​ของ​ธุรกิจ​หรือ project ที่​ให้​ความ​ได้​เปรียบ​เหนือ​ผู้​อื่น — “สิ่ง​ที่​เรา​มี​อยู่”
  • Weaknesses (จุด​อ่อน): ลักษณะ​ที่​ทำให้​ธุรกิจ​หรือ project เสีย​เปรียบเทียบ​กับ​ผู้​อื่น — “สิ่ง​ที่​ปรับปรุง​ได้”
  • Opportunities (โอกาส): องค์​ประกอบ​ที่ project ใช้​ให้​เป็น​ประโยชน์​ได้ — “สิ่ง​ที่​ทุ่ม​พลัง​ลง​ไป​ได้”
  • Threats (อุปสรรค): องค์​ประกอบ​ใน​สภาพ​แวดล้อม​ที่​อาจ​สร้าง​ปัญหา​ให้​ธุรกิจ​หรือ project — “อุปสรรค​ที่​ต้อง​ข้าม​ให้​ได้”

เมื่อใด​ก็ตาม​บน project Scrum หรือ Agile อื่น ใช้ SWOT เพื่อ​ประเมิน​สถานการณ์​ปัจจุบัน​ได้​เลย:

  1. วาด เมทริกซ์​ใหญ่​สี่​ช่อง
  2. กลับ​ไป​ที่​กระดาษ​โน้ต เลือก​สี​ต่าง​กัน​สำหรับ​แต่ละ​ช่อง​ของ SWOT
  3. ระบุ Strengths, Weaknesses, Opportunities และ Threats ของ project
  4. เขียน​ลง​โน้ต​แล้ว​วาง​ใน​ช่อง​ที่​เหมาะสม​ของ​เมทริกซ์
  5. ใช้​คุณลักษณะ SWOT เหล่า​นี้ (โดย​เฉพาะ​คิดถึง domain model) เพื่อ วางแผน​ว่า​จะ​ทำ​อะไร​กับ​มัน ขั้นตอน​ถัด​ไป​ใน​การ​ส่งเสริม​จุด​ดี​และ​บรรเทา​จุด​ที่​มี​ปัญหา​อาจ​เป็น​ตัว​ชี้​เป็น​ชี้​ตาย​ความ​สำเร็จ

เรา​มี​โอกาส​เอา action เหล่า​นี้​ไป​วาง​บน task board ตอน​วางแผน project (จะ​กล่าว​ต่อ​ไป)

SWOT Matrix — สี่​ช่อง
┌─────────────────────────────┬─────────────────────────────┐
│ Strengths (จุดแข็ง) │ Weaknesses (จุดอ่อน) │
│ สิ่งที่เรามีอยู่ │ สิ่งที่ปรับปรุงได้ │
├─────────────────────────────┼─────────────────────────────┤
│ Opportunities (โอกาส) │ Threats (อุปสรรค) │
│ สิ่งที่ทุ่มพลังลงไปได้ │ อุปสรรคที่ต้องข้ามให้ได้ │
└─────────────────────────────┴─────────────────────────────┘

แปลก​ใจ​ไหม​ว่า project DDD ก็มี Modeling Spike และ Modeling Debt ให้​จ่าย​ได้?

หนึ่ง​ใน​สิ่ง​ที่​ดี​ที่สุด​ที่​ทำได้​ตอน​เริ่ม project คือ​ใช้ EventStorming การ​ทดลอง model ทำนอง​นี้​นับ​เป็น Modeling SpikeModeling Spikeการ​จัดสรร​เวลา timeboxed ให้​ทีม​สำรวจ​และ​ทดลอง​สร้าง model โดย​ไม่​ต้อง​ส่ง​มอบ production code เพื่อ​ลด​ความ​เสี่ยง​และ​เรียนรู้ domain ก่อ​ลงมือ​ทำ​จริงProcess เรา​ต้อง “ซื้อ” ความ​รู้​เกี่ยว​กับ Scrum product ของ​เรา และ​บาง​ครั้ง​ราคา​ที่​จ่าย​คือ spike และ spike ช่วง​เริ่ม project แทบ​จะ​แน่นอน กระนั้น EventStorming ก็​ช่วย​ลด​ต้นทุน​การ​ลงทุน​ที่​จำเป็น​นี้​ได้​มาก

แน่นอน​ว่า​เรา​คาด​หวัง​ให้ model domain สมบูรณ์​แบบ​ตั้งแต่​เริ่ม​ไม่​ได้ แม้​จะ​มอง​ว่าการ​เริ่ม project คือ Modeling Spike ที่​มี​คุณค่า​ก็ตาม แม้แต่​ตอน​ใช้ EventStorming ก็​จะ​ยัง​ไม่​สมบูรณ์​แบบ เพราะ​ธุรกิจ​และ​ความ​เข้าใจ​ของ​เรา​ต่อ​มัน​เปลี่ยน​ไป​ตาม​เวลา และ domain model ก็​เปลี่ยน​ตาม

ยิ่ง​กว่า​นั้น ถ้า​ตั้งใจ timebox งาน model เป็น task บน task board ก็​ให้​คาด​ไว้​เลย​ว่า​จะ​เกิด Modeling Debt ใน​แต่ละ sprint (หรือ iteration หรือ WIP) เพราะ​เรา​จะ​ไม่มี​เวลา​ทำ​ทุก task model ให้​สมบูรณ์​ได้​ใน​กรอบ​เวลา​ที่​จำกัด เช่น เริ่ม design ไป​แล้ว​เพิ่ง​พบ​หลัง​ทดลอง​ว่า​มัน​ไม่​เข้า​กับ​ความ​ต้องการ​ธุรกิจ​อย่าง​ที่​คาด แต่​ข้อ​จำกัด​เวลา​ก็​บังคับ​ให้​ต้อง​เดิน​หน้า

สิ่ง​ที่​แย่​ที่สุด​ที่​ทำได้​ตอน​นี้​คือ ลืม​ทุก​อย่าง​ที่​เรียนรู้ จาก​ความ​พยายาม model ที่​เรียกร้อง design ที่​ดี​กว่า แทนที่​จะ​ทำ​เช่น​นั้น ให้​จด​บันทึก​ไว้​ว่า​เรื่อง​นี้​ต้อง​เข้า sprint ถัด​ไป (หรือ iteration, WIP) นำ​เข้า​ที่​ประชุม retrospective แล้ว​เสนอ​เป็น task ใหม่​ใน​การ​วางแผน sprint ถัด​ไป (หรือ​เพิ่ม​เข้า​คิว Kanban) — ใน Kanban ทำ retrospective ได้​ทุก​วัน จึง​ไม่​ต้อง​รอ​นาน​ใน​การ​เสนอ​ความ​จำเป็น​ปรับปรุง model

อย่า​ทิ้ง​สิ่ง​ที่​เรียนรู้​ลง​ถัง​ขยะ

Modeling Debt ไม่ใช่​ความ​ล้มเหลว แต่​เป็น​ผล​ตาม​ธรรมชาติ​ของ​การ timebox สิ่ง​ที่​ทำลาย​คุณ​ค่าจริงๆ คือ​การ “ลืม” บทเรียน​จาก​การ​ทดลอง​ที่​ชี้​ว่า​ควร​มี design ที่​ดี​กว่า จง​บันทึก​หนี้​ก้อน​นั้น​ไว้​และ​ทยอย​จ่าย​ใน​อนาคต (ใน​อุดมคติ​คือ​อนาคต​อัน​ใกล้)

EventStorming ใช้ได้​ทุก​เวลา ไม่ใช่​แค่​ตอน​เริ่ม project ขณะ​ทำ session เรา​จะ​สร้าง artifact จำนวน​หนึ่ง​ออก​มา​อย่าง​เป็น​ธรรมชาติ — Domain Event, Command และ Aggregate แต่ละ​ตัว​ที่ storm ออก​มา​บน model กระดาษ ใช้​เป็น​หน่วย​ประมาณ​การ (estimation unit) ได้ ทำได้​อย่างไร?

วิธี​ประมาณ​การ​ที่​ง่าย​และ​แม่น​ที่สุด​วิธี​หนึ่ง​คือ แนวทาง​อิง metric (metrics-based) สร้าง​ตาราง​ที่​มี​หน่วย​ประมาณ​การ​สำหรับ component แต่ละ​ชนิด​ที่​ต้อง implement วิธี​นี้​ตัด “การ​เดา” ออก แล้ว​ใส่​หลักการ​เชิง​วิทยาศาสตร์​เข้าไป​ใน​กระบวนการ:

Component TypeEasy (ชั่วโมง)Moderate (ชั่วโมง)Complex (ชั่วโมง)
Domain Event0.10.20.3
Command0.10.20.3
Aggregate124

ตาราง​ทำงาน​ดังนี้:

  1. สร้าง column Component Type อธิบาย​ชนิด​ของ component ที่​นิยาม​หน่วย​ประมาณ​การ
  2. สร้าง​อีก3 column: Easy, Moderate, Complex สะท้อน​หน่วย​ประมาณ​การ​เป็น​ชั่วโมง​หรือ​เศษส่วน​ชั่วโมง​ของ component แต่ละ​ชนิด
  3. สร้าง​หนึ่ง​แถว​ต่อ component แต่ละ​ชนิด​ใน​สถาปัตยกรรม (ใน​ตาราง​มี Domain Event, Command, Aggregate แต่​อย่า​จำกัด​แค่​นี้ — สร้าง​แถว​สำหรับ UI component, service, persistence, ตัว serialize/deserialize ของ Domain Event และอื่นๆ ได้​ทุก​ชนิด หาก​ปกติ​สร้าง serializer/deserializer ควบคู่​กับ Domain Event ก็​กำหนด​ค่า​ประมาณ​การ​ของ Domain Event ให้​ครอบคลุม​การ​สร้าง​ทั้งหมด​นั้น​ไป​ด้วย)
  4. กรอก​จำนวน​ชั่วโมง​หรือ​เศษส่วน​สำหรับ​แต่ละ​ระดับ​ความ​ยาก: easy, moderate, complex ค่า​ประมาณ​นี้​รวม​ทั้ง​เวลา implement และ​อาจ​รวม​เวลา​ออกแบบ​และ​ทดสอบ​เพิ่มเติม จง​ทำให้​แม่น​และ​สมจริง
  5. เมื่อ​รู้ task ของ backlog item (WIP) ที่​จะ​ทำ ให้​ดึง metric สำหรับ​แต่ละ task มาระบุ​ให้​ชัด อาจใช้สเปรดชีต​ช่วย
  6. รวม​หน่วย​ประมาณ​การ​ของ​ทุก component ใน sprint ปัจจุบัน (iteration หรือ WIP) เข้า​ด้วย​กัน นั่น​คือ​ประมาณ​การ​รวม

ขณะ​รัน​แต่ละ sprint (iteration หรือ WIP) ให้ ปรับ​จูน metric ให้​สะท้อน​ชั่วโมง​ที่​ใช้​จริง หาก​ใช้ Scrum และ​เริ่ม​เกลียด​การ​ประมาณ​เป็น​ชั่วโมง ให้​เข้าใจ​ว่า​วิธี​นี้​ผ่อนปรน​และ​แม่น​กว่า​มาก ยิ่ง​เรียนรู้​จังหวะ​ของ​ทีม ก็​ยิ่ง​จูน metric ให้​แม่น​ขึ้น อาจ​ต้อง​ใช้​หลาย sprint กว่า​จะ​ลงตัว และ​เมื่อ​ทีม​เก่ง​และ​มี​ประสบการณ์​ขึ้น มัก​จะ​ปรับ​ตัวเลข​ลง​หรือ​ใช้ column Easy/Moderate ได้​บ่อย​ขึ้น

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

ความ​แม่นยำ​ใน​สนาม​จริง

มี​โปรแกรม​องค์กร​ขนาด​ใหญ่​หนึ่ง​ที่​ต้อง​ประมาณ​การ project ใหญ่​และ​ซับซ้อน มี​สอง​ทีม​รับ​งาน​นี้ ทีม​แรก​เป็น​ที่ปรึกษา​ค่าตัว​สูง​ที่​เคย​ทำงาน​ประมาณ​การ​ให้​บริษัท Fortune 500 มี​ดีกรี​ปริญญา​เอก​และ​อุปกรณ์​ครบมือ ส่วน​ทีม​ที่​สอง​เป็น​สถาปนิก​และ​นัก​พัฒนา​ที่​ใช้​กระบวนการ​ประมาณ​การ​แบบ metrics-based นี้ project อยู่​ใน​ระดับ 20 ล้าน​ดอลลาร์ และ​เมื่อ​ประมาณ​การ​ของ​ทั้ง​สอง​ทีม​ออก​มา กลับ ต่าง​กัน​เพียง​ราว 200,000 ดอลลาร์ (โดย​ทีม​เทคนิค​ประเมิน​ต่ำ​กว่า​เล็กน้อย) ไม่​เลว​เลย​สำหรับ​สาย​เทคนิค คาด​หวัง​ความ​แม่น​ใน​กรอบ 20% สำหรับ​ประมาณ​การ​ระยะ​ยาว และ​แม่น​กว่า​นั้น​มาก​สำหรับ​ระยะ​สั้น​อย่าง sprint, iteration และ​คิว WIP

Task Board (ตัวเลข​ใน​วงเล็บ = หน่วย​ประมาณ​การ/ชั่วโมง)
To Do In Progress Done
───────────────────── ───────────────────── ─────────────────────
AdSpot Aggregate (1) Appointment Aggregate (2) AdCredits Aggregate (3)
AdSpot Commands (1) Appointment Events (2) AdCredits Commands (1)
AdSpot Events (1.5) ServiceShop Aggregate (2) AdCredits Events (1)
Payment (0.5)

เมื่อ​มี​ประมาณ​การ​ของ component แต่ละ​ชนิด​แล้ว ก็​สร้าง task โดย​อิง​จาก component เหล่า​นั้น​ได้​โดยตรง อาจ​เก็บ​แต่ละ component เป็น task เดียว​พร้อม​จำนวน​ชั่วโมง หรือ​แตก task ให้​ละเอียด​ขึ้น​ก็ได้ แต่ Vernon แนะนำ​ให้​ระวัง​การ​แตก task ละเอียด​เกิน​ไป​จน​ทำให้ task board ซับซ้อน​เกิน​จำเป็น ดัง​ที่​แสดง​ก่อนหน้า อาจ​ดี​ที่สุด​ที่​จะ รวม Command และ Domain Event ทั้งหมด​ของ Aggregate เดียว ไว้​เป็น task เดียว

graph LR
  S1["Scenario #1 (เขียว)"] <--> TA["Test Aggregate A (ขาว)"]
  S2["Scenario #2 (เขียว)"] <--> TA
  S3["Scenario #3 (เขียว)"] <--> TA2["Test Aggregate A (ขาว)"]
  TA <--> AGA["Aggregate A (เหลือง)"]
  TA2 <--> AGA
  AGA --- CA["Command A1 (ฟ้า)"]
  AGA --- EA["Event A1 (ส้ม)"]
  AGA --> AGB["Aggregate B (เหลือง)"]

แม้​จะ​มี artifact ที่ EventStorming ระบุ​ไว้ ก็​ไม่​จำเป็น​ว่า​จะ​มี​ความ​รู้​ครบ​ทุก​อย่าง​ที่​ต้อง​ใช้​ทำงาน​บน domain scenario, story หรือ use case หนึ่งๆ ถ้า​ต้องการ​มากกว่า​นั้น ให้​รวม​เวลา​สำหรับ การ​ได้​มา​ซึ่ง​ความ​รู้​เพิ่มเติม ไว้​ใน​ประมาณ​การ​ด้วย แต่​เวลา​สำหรับ​ทำ​อะไร? จำ​ได้​ไหม​ว่า​ก่อนหน้า​นี้​มี​การ​พูด​ถึง​การ​สร้าง concrete scenario รอบๆ domain model — นี่​คือ​หนึ่ง​ใน​วิธี​ที่​ดี​ที่สุด​ใน​การ​ได้​มา​ซึ่ง​ความ​รู้​เกี่ยว​กับ Core Domain เกิน​กว่า​ที่ EventStorming ให้​ได้ Concrete scenario และ EventStorming คือ​สอง​เครื่องมือ​ที่​ควร​ใช้​ควบคู่​กัน วิธี​ทำงาน:

  • ทำ session EventStorming สั้นๆ สัก​หนึ่ง​ชั่วโมง แทบ​แน่นอน​ว่า​จะ​พบ​ว่า​ต้อง​พัฒนา concrete scenario เพิ่ม​รอบๆ สิ่ง​ที่​เพิ่ง​ค้น​พบ
  • จับ​คู่​กับ ผู้เชี่ยวชาญ​ธุรกิจDomain Expertผู้เชี่ยวชาญ​ธุรกิจ​ที่​รู้​กฎ กระบวนการ และ​ความ​ต้องการ​ของ domain อย่าง​ลึกซึ้ง เป็น​แหล่ง​ความ​รู้​สำคัญ​ที่​ทีม​พัฒนา​ต้อง​ร่วม​งาน​ด้วย​อย่าง​ใกล้​ชิด​ใน DDDStrategic Design เพื่อ​หารือ scenario รูปธรรม​หนึ่ง​หรือ​มากกว่าที่​ต้อง​กลั่น เพื่อ​ระบุ​ว่า model จะ​ถูก​ใช้​อย่างไร เป้าหมาย​ไม่ใช่​แค่​เขียน​ขั้นตอน แต่​เพื่อ​ระบุ องค์​ประกอบ​ของ domain model จริงๆ (เช่น อ็อบเจ็กต์) ว่า​มัน​ทำงาน​ร่วม​กัน​อย่างไร และ​โต้ตอบ​กับ​ผู้​ใช้​อย่างไร
  • สร้าง​ชุด acceptance test (หรือ executable specification) ที่​ออก​กำลัง​แต่ละ scenario
  • สร้าง component เพื่อ​ให้ test/specification รัน​ได้ ทำซ้ำ (สั้น​และ​เร็ว) ขณะ​กลั่น test/specification และ component จนกว่า​มัน​จะ​ทำ​ใน​สิ่ง​ที่​ผู้เชี่ยวชาญ​ธุรกิจ​คาด​หวัง
  • มี​โอกาส​สูง​ที่​การ​ทำซ้ำ (สั้น​และ​เร็ว) จะ​ทำให้​เรา​พิจารณา scenario อื่น สร้าง test/specification เพิ่ม และ​กลั่น​ของ​เดิม​พร้อม​สร้าง component ใหม่

ทำ​เช่น​นี้​ต่อ​ไป​จน​ได้​ความ​รู้​ที่​จำเป็น​ครบ​เพื่อ​บรรลุ​เป้าหมาย​ธุรกิจ​ที่​จำกัด​ไว้ หรือ​จนกว่า timebox จะ​หมด หาก​ยัง​ไป​ไม่​ถึง​จุด​ที่​ต้องการ ให้​บันทึก Modeling Debt ไว้​แก้​ใน​อนาคต (ใน​อุดมคติ​คือ​อนาคต​อัน​ใกล้)

ตัวอย่าง​ของ scenario แบบ given/when/then ที่​กลาย​เป็น executable specification และ test มี​รูปร่าง​ประมาณ​นี้:

Scenario (given/when/then)
Scenario: The product owner commits a backlog item to a sprint
Given a backlog item that is scheduled for release
And the product owner of the backlog item
And a sprint for commitment
And a quorum of team approval for commitment
When the product owner commits the backlog item to the sprint
Then the backlog item is committed to the sprint
And the backlog item committed event is created
ShouldCommitBacklogItemToSprint.cs
/*
The product owner commits a backlog item to a sprint.
The backlog item may be committed only if it is already
scheduled for release, and if a quorum of team members
have approved commitment. When the commitment completes,
notify the sprint to which it is now committed.
*/
[Test]
public void ShouldCommitBacklogItemToSprint()
{
// Given
var backlogItem = BacklogItemScheduledForRelease();
var productOwner = ProductOwnerOf(backlogItem);
var sprint = SprintForCommitment();
var quorum = QuorumOfTeamApproval(backlogItem, sprint);
// When
backlogItem.CommitTo(sprint, productOwner, quorum);
// Then
Assert.IsTrue(backlogItem.IsCommitted());
var backlogItemCommitted =
backlogItem.Events.OfType<BacklogItemCommitted>().SingleOrDefault();
Assert.IsNotNull(backlogItemCommitted);
}

หนึ่ง​ใน​ความ​ท้าทาย​ใหญ่​ของ​การ​ใช้ DDD คือ การ​ได้​เวลา​กับ ผู้เชี่ยวชาญ​ธุรกิจDomain Expertผู้เชี่ยวชาญ​ธุรกิจ​ที่​รู้​กฎ กระบวนการ และ​ความ​ต้องการ​ของ domain อย่าง​ลึกซึ้ง เป็น​แหล่ง​ความ​รู้​สำคัญ​ที่​ทีม​พัฒนา​ต้อง​ร่วม​งาน​ด้วย​อย่าง​ใกล้​ชิด​ใน DDDStrategic Design โดย​ไม่​มาก​เกิน​ไป หลาย​ครั้ง​ผู้เชี่ยวชาญ​ธุรกิจ​มี​ภาระ​อื่น​มหาศาล ทั้ง​ประชุม​หลาย​ชั่วโมง​และ​อาจ​ต้อง​เดินทาง การ​หา​เวลา​ให้​พอ​จึง​ยาก เรา​จึง​ต้อง​ทำให้​ทุก​นาที​ที่​ใช้ “คุ้ม​ค่า” และ​จำกัด​เฉพาะ​ที่​จำเป็น หาก session model ไม่​สนุก​และ​ไม่มี​ประสิทธิภาพ มี​โอกาส​สูง​ที่​จะ​เสีย​ความ​ช่วยเหลือ​ไป​ใน​จังหวะ​ที่​ผิด​ที่สุด แต่​ถ้า​พวก​เขา​เห็น​ว่า​มัน​มี​คุณค่า เปิด​หู​เปิด​ตา และ​คุ้ม​ค่า ก็​จะ​เกิด partnership ที่​แข็งแรง​อย่าง​ที่​ต้องการ

คำถาม​แรก​ที่​ต้อง​ตอบ​คือ “เมื่อไร​ที่​ต้องการ​เวลา​กับ​ผู้เชี่ยวชาญ​ธุรกิจ? task ใด​ที่​ต้อง​ให้​เขา​ช่วย?”

  • รวม​ผู้เชี่ยวชาญ​ธุรกิจ​ใน​กิจกรรม EventStorming เสมอ นัก​พัฒนา​จะ​มี​คำถาม​มากมาย และ​ผู้เชี่ยวชาญ​ธุรกิจ​มี​คำ​ตอบ ต้อง​อยู่​ใน session EventStorming ด้วย​กัน
  • ต้องการ input จาก​ผู้เชี่ยวชาญ​ธุรกิจ​ใน​การ​หารือ​และ​สร้าง model scenario
  • ต้องการ​ผู้เชี่ยวชาญ​ธุรกิจ​มา รีวิว test เพื่อ​ยืนยัน​ความ​ถูกต้อง​ของ model โดย​สมมติ​ว่า​นัก​พัฒนา​ได้​ตั้งใจ​ยึด ภาษา​กลางUbiquitous Languageภาษา​กลาง​ที่​ทุก​คนใน​ทีม (ทั้ง​นัก​พัฒนา​และ​ผู้เชี่ยวชาญ​ธุรกิจ) ใช้​ร่วม​กัน อิง​กับ domain model โดยตรง คำ​เดียวกัน​ต้อง​หมาย​ถึง​สิ่ง​เดียวกัน และ​สะท้อน​ลง​ใน codeStrategic Design และ​ใช้​ข้อมูล​ทดสอบ​ที่​มี​คุณภาพ​และ​สมจริง​แล้ว
  • ต้องการ​ผู้เชี่ยวชาญ​ธุรกิจ​มา กลั่น​ภาษา​กลาง ทั้ง​ชื่อ Aggregate, Command และ Domain Event ซึ่ง​ทั้ง​ทีม​ร่วม​กัน​กำหนด ความ​กำกวม​ถูก​แก้​ผ่าน​การ​รีวิว ตั้ง​คำถาม และ​อภิปราย แม้​กระนั้น session EventStorming ควร​แก้​คำถาม​เกี่ยว​กับ​ภาษา​กลาง​ไป​แล้ว​เป็น​ส่วน​ใหญ่

แล้ว​ต้อง​ใช้​เวลา​จาก​ผู้เชี่ยวชาญ​ธุรกิจ​มาก​แค่​ไหน​สำหรับ​แต่ละ​ความ​รับผิดชอบ?

  • session EventStorming ควร​จำกัด​ที่​ไม่​กี่​ชั่วโมง (สอง​หรือ​สาม) ต่อ​ครั้ง อาจ​ต้อง​จัด​ติดต่อ​กัน​หลาย​วัน เช่น สาม​หรือ​สี่​วัน
  • กัน​เวลา​เผื่อ​ไว้​มาก​พอ​สำหรับ การ​หารือ​และ​กลั่น scenario แต่​พยายาม​ใช้​เวลา​แต่ละ scenario ให้​คุ้ม ควร​หารือ​และ​ทำซ้ำ​ต่อ1 scenario ได้​ภายใน​ราว 10 ถึง 20 นาที
  • สำหรับ test ต้อง​ใช้​เวลา​กับ​ผู้เชี่ยวชาญ​ธุรกิจ​รีวิว​สิ่ง​ที่​เขียน แต่​อย่า​คาด​หวัง​ให้​เขา​นั่ง​ดู​ตอน​เขียน code (ถ้า​เขา​อยู่​ก็​เป็น​โบนัส แต่​อย่า​คาด​หวัง) model ที่​แม่นยำ​ใช้​เวลา​รีวิว​น้อย​กว่า อย่า​ประเมิน​ความ​สามารถ​ของ​ผู้เชี่ยวชาญ​ธุรกิจ​ใน​การ​อ่าน test ต่ำ​เกิน​ไป โดย​เฉพาะ​เมื่อ​ข้อมูล​ทดสอบ​สมจริง test ควร​ให้​ผู้เชี่ยวชาญ​ธุรกิจ​เข้าใจ​และ​ยืนยัน​ได้​ราว1 test ต่อ​หนึ่ง​ถึง​สอง​นาที
  • ระหว่าง​รีวิว test ผู้เชี่ยวชาญ​ธุรกิจ​ให้ input เกี่ยว​กับ Aggregate, Command และ Domain Event ได้​ว่า​ยึด​ภาษา​กลาง​แค่​ไหน ทำได้​ใน​เวลา​อัน​สั้น

คำ​แนะนำ​นี้​ช่วย​ให้​ใช้​เวลา​กับ​ผู้เชี่ยวชาญ​ธุรกิจ​ใน​ปริมาณ​ที่​พอดี​และ​จำกัด​เวลา​ที่​ต้อง​ใช้​ไป​กับ​พวก​เขา


ใน​บท​นี้​เรา​ได้​เรียนรู้:

  • รู้จัก EventStorming ว่า​ใช้​อย่างไร​และ​จัด session กับ​ทีม​อย่างไร — ทั้งหมด​เพื่อ​เร่ง​ความ​พยายาม​ใน​การ​สร้าง model ให้​เร็ว​ขึ้น โดย​ใช้​กระดาษ​โน้ต​หลาก​สี​บน​ผนัง ไล่​จาก Domain Event (ส้ม) → Command (ฟ้า) → Aggregate (เหลือง) เรียง​ตาม​เวลา แล้ว​เสริม​ด้วย Process (ลิลลี่), จุด​ปัญหา (ม่วง/แดง), Bounded Context (ชมพู), View (เขียว) และ​บทบาท​ผู้​ใช้
  • รู้จัก เครื่องมือ​เสริมอื่นๆ ที่​ใช้​ควบคู่​กับ EventStorming ได้แก่ executable specification, Impact Mapping และ User Story Mapping
  • รู้​วิธี ใช้ DDD บน project Agile ทั้ง​การ​จ้าง​คน​เก่ง, การ​วิเคราะห์ SWOT, การ​ยอมรับ Modeling Spike และ Modeling Debt, การ​ประมาณ​การ​แบบ metrics-based, Timeboxed Modeling และ​การ​บริหาร​เวลา​กับ​ผู้เชี่ยวชาญ​ธุรกิจ

สำหรับ​เอกสาร​อ้างอิง​เชิง​ลึก​ที่​ครอบคลุม​การนำ DDD ไป implement บน project ดู​ได้​ใน Implementing Domain-Driven Design ของ Vaughn Vernon

หัวใจ​ของ​บท​นี้
  • เวลา​เป็น​ข้อ​จำกัด​จริง ทางออก​ไม่ใช่​การ​ตัด design ทิ้ง แต่​คือ​การ​ออกแบบ​ใน​แบบ​ที่ เร่ง​ความเร็ว​ได้
  • EventStormingEventStormingเวิร์กช็อป​แบบ​ร่วมมือ (Alberto Brandolini, 2013) ใช้​กระดาษ​โน้ต​สี​ติด​บน​ผนัง: ส้ม=event, น้ำเงิน=command, เหลือง=aggregate ฯลฯ เพื่อ​ค้น​พบ model และ​ขอบเขต​ของ contextProcess (Alberto Brandolini) ทำให้​ทุก​คนใน​ห้อง — ทั้ง​นัก​พัฒนา​และ ผู้เชี่ยวชาญ​ธุรกิจDomain Expertผู้เชี่ยวชาญ​ธุรกิจ​ที่​รู้​กฎ กระบวนการ และ​ความ​ต้องการ​ของ domain อย่าง​ลึกซึ้ง เป็น​แหล่ง​ความ​รู้​สำคัญ​ที่​ทีม​พัฒนา​ต้อง​ร่วม​งาน​ด้วย​อย่าง​ใกล้​ชิด​ใน DDDStrategic Design — ออกแบบ​ร่วม​กัน​ด้วย​กระดาษ​โน้ต เร็ว ถูก และ​โฟกัส​ที่​กระบวนการ​ทาง​ธุรกิจ
  • บริหาร project DDD บน Agile ด้วย SWOTSWOT Analysisการ​วิเคราะห์​จุด​แข็ง (Strengths), จุด​อ่อน (Weaknesses), โอกาส (Opportunities) และ​อุปสรรค (Threats) เพื่อ​ประเมิน​ทิศทาง​ของ project DDD อย่าง​รอบ​ด้านProcess, Modeling SpikeModeling Spikeการ​จัดสรร​เวลา timeboxed ให้​ทีม​สำรวจ​และ​ทดลอง​สร้าง model โดย​ไม่​ต้อง​ส่ง​มอบ production code เพื่อ​ลด​ความ​เสี่ยง​และ​เรียนรู้ domain ก่อ​ลงมือ​ทำ​จริงProcess/Modeling Debt, การ​ประมาณ​การ​อิง metric และ Timeboxed Modeling
  • จำกัด​เวลา​กับ​ผู้เชี่ยวชาญ​ธุรกิจ​ให้​พอดี ทำ session ให้​สนุก​และ​คุ้ม​ค่า เพื่อ​รักษา partnership ที่​แข็งแรง
🔗 อ้างอิง​เพิ่มเติม​ใน DevIQ

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

  • EventStorming — คำ​อธิบาย​เทคนิคเวิร์กช็อป​ที่​บท​นี้​ใช้​เป็น​แกน​หลัก​ใน​การพายุ Domain Event, Command และ Aggregate ร่วม​กับ​ผู้เชี่ยวชาญ​ธุรกิจ
  • Domain Events — แพทเทิร์น​เบื้องหลัง​โน้ต​สี​ส้ม​ที่​เป็น​จุด​เริ่มต้น​ของ​ทุก session EventStorming
  • Aggregate — แนวคิด​ของ​โน้ต​สี​เหลือง​อ่อน​ใน​ขั้น​ที่ 3 ซึ่ง​เป็น​ตัว​รับ Command และ​ปล่อย Domain Event
  • Bounded Context — ขอบเขต​ที่​วาด​ด้วย​เส้น​ทึบ​และ​โน้ต​สีชมพู​ใน​ขั้น​ที่ 4 ของ EventStorming

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

ข้อ 1 / 4

ใน EventStorming กระดาษโน้ตสีส้มใช้แทนอะไร และสร้างเป็นอันดับแรกเพราะอะไร?