← 回文章列表

2024年9月24日

Event Storming 怎麼跑?從準備、Big Picture 的七個步驟,到 Process Modeling 的便利貼語法

DDD領域驅動設計Event Storming需求分析團隊協作

DDD 概論 簡單介紹過 Event Storming,Domain Storytelling 那篇也比較過兩者的差別。這段時間實際主持了幾場,發現光知道「橘色是事件、藍色是命令」遠遠不夠,一場 Event Storming 成不成功,八成取決於準備和主持。這篇把流程完整整理一次。

三種層次

Event Storming 由 Alberto Brandolini 提出,依目的不同分成三種層次:

層次目的參與者時間
Big Picture看清楚整個業務的全貌,找出問題與邊界各部門的領域專家、PO、開發人員半天到一天
Process Modeling拆解一個流程,弄清楚每一步的規則該流程的領域專家、PO、開發人員2~4 小時
Software Design設計聚合、命令與事件,直接對應到程式開發人員為主,領域專家在旁回答問題2~4 小時

三者是由寬到窄的關係:Big Picture 找出最值得處理的流程,Process Modeling 把那個流程拆清楚,Software Design 再把它變成程式的設計。這篇主要介紹前兩種。

準備

找對人

最重要的一件事。Event Storming 的價值來自不同部門的知識碰在一起,所以要找:

  • 真正做事的領域專家:資深經紀人、店長、負責簽約的同事、財務。只找主管來,常常只會聽到「規定上應該怎麼做」
  • 開發人員:他們會問出業務沒想過的問題,例如「斡旋過期的那一刻,系統要做什麼?」
  • PO:最後要決定優先順序的人
  • 主持人:最好不是領域專家,也不是要做決定的人,才能保持中立

Big Picture 大約 8~15 人最適合。少於 5 人看不到全貌,超過 20 人很難讓每個人都參與。

準備空間與材料

  • 一面很長的牆:至少 6~8 公尺,貼上大張的海報紙或白報紙卷。牆不夠長,時間軸會被迫折行,就看不出全貌
  • 把椅子移開:大家站著才會走動、會靠過去看別人貼了什麼。坐著開會很快就變成一兩個人在講
  • 大量的便利貼:橘色要準備最多,一場 Big Picture 用掉幾百張很正常
  • 粗的黑色簽字筆:每人一支。不要用原子筆,字太小,遠一點就看不到;字寫不下也會逼大家寫得簡潔
  • 圖例:把每種顏色代表什麼,先貼在牆的一角

遠端進行可以用 Miro 這類線上白板,先把時間軸和圖例準備好。但線上很難達到實體的效果:大家容易各自安靜地貼,討論變少,主持人要更主動點名。

便利貼的顏色與語法

Event Storming 的便利貼圖例與 Process Modeling 語法。上方是八種便利貼:橘色是領域事件,業務上發生的事,用過去式,例如斡旋已提出;藍色是命令,使用者的意圖或決定,例如提出斡旋;小張黃色是角色,做出命令的人,例如買方;淡紫色是政策,每當某事件發生就做某事的自動反應;綠色是讀取模型,做決定前需要看的資訊;大張黃色是聚合或系統,接收命令並守住規則;粉紅色是外部系統,例如簡訊服務;桃紅色是熱點,代表疑問、衝突或痛點。下方是一條完整的語法鏈:買方看了讀取模型「物件資訊與目前斡旋狀態」後,發出「提出斡旋」命令,由斡旋聚合檢查規則,產生「斡旋已提出」事件;事件觸發政策「每當斡旋已提出,就通知屋主」,發出「通知屋主」命令,交給外部的簡訊服務;同時事件會更新讀取模型

顏色元素說明
橘色領域事件(Domain Event)業務上發生、而且有人在意的事,用過去式:「斡旋已提出」
藍色命令(Command)使用者的意圖或決定:「提出斡旋」
小張黃色角色(Actor)發出命令的人:買方、經紀人
淡紫色政策(Policy)「每當…就…」的反應規則,可以是自動的,也可以是某人的固定做法
綠色讀取模型(Read Model)角色做決定前需要看到的資訊
大張黃色聚合/系統接收命令、檢查規則、產生事件的地方
粉紅色外部系統不在我們控制範圍內的系統:簡訊服務、銀行
桃紅色(斜貼)熱點(Hot Spot)疑問、衝突、痛點,任何人隨時都可以貼

各團隊的顏色不完全一樣,重要的是同一場裡保持一致,並把圖例貼在牆上。

為什麼事件要用過去式

「斡旋已提出」和「提出斡旋」看起來只差兩個字,但意義完全不同:

  • 過去式代表已經發生的事實,不能被拒絕、不能被撤銷,只能用另一個事件來抵銷(例如「斡旋已撤回」)
  • 它逼大家講業務結果,而不是系統動作。「資料已寫入資料庫」、「API 已呼叫」不是領域事件,業務人員看不懂,也不在意
  • 事件是最容易達成共識的:大家對「該怎麼做」可能意見不同,但對「發生了什麼」通常很快有共識

Big Picture:七個步驟

Big Picture 的牆面示意,房仲業務的事件時間軸局部。時間軸由左到右分成四段:委託與刊登有委託已簽訂、物件已拍照、物件已上架;帶看有帶看已預約、帶看已完成、帶看紀錄已填寫;斡旋有斡旋已提出、斡旋金已收取、斡旋已轉交屋主、斡旋已接受,以及另一種結果斡旋已過期;簽約交屋有買賣契約已簽訂、已交屋、服務費已收取。物件已上架、斡旋已接受、買賣契約已簽訂是關鍵事件,用垂直線把時間軸分段,各段上方標出屋主、經紀人、買方、代書等角色,以及外部系統銀行。牆面下方貼著三個熱點:物件改價後進行中的斡旋怎麼辦、多組斡旋時誰優先、斡旋已接受算不算成交。最底部列出七個步驟:混亂探索、整理時間軸、關鍵事件與邊界、人與系統、熱點、走一遍與倒著走、問題與機會投票

0. 開場(10 分鐘)

說明今天的目的、範圍(例如「從屋主委託到交屋」)、規則,以及圖例。範圍的起點和終點要講清楚,否則會有人從公司成立開始講。

1. 混亂探索(20~30 分鐘)

每個人各自把自己知道的領域事件寫在橘色便利貼上,大致依時間順序貼到牆上。

  • 不討論、不糾正:這個階段要的是數量,重複的、寫錯的之後再處理
  • 自己負責的部分就貼:財務只知道服務費怎麼收,那就貼那一段

一開始大家會很拘謹,主持人可以自己先貼幾張示範,再點名:「店長,斡旋那一段您最熟,可以先貼嗎?」

2. 整理時間軸(30~60 分鐘)

大家一起把便利貼排成一條合理的時間軸:

  • 合併重複的:兩張寫法不同但意思一樣的,選一個大家都接受的說法。如果合不起來,代表其實是兩件事,或是語言有分歧,貼一張熱點
  • 補上缺漏:時間軸上出現跳躍,問「這兩件事中間還發生了什麼?」
  • 平行的流程分成泳道:例如「帶看」和「斡旋金保管」可以同時進行,上下分開排

這個階段最容易吵起來,例如業務認為「斡旋已接受」就是成交,財務認為「買賣契約已簽訂」才算。不需要當場吵出結果,貼一張熱點,繼續往下走。

3. 找出關鍵事件與邊界(20 分鐘)

找出幾個改變業務階段的事件,例如「物件已上架」、「斡旋已接受」、「買賣契約已簽訂」,在它們後面用膠帶或垂直線把時間軸分段,並在每段上方寫一個名稱。

這些分段就是子域或限界上下文的候選。之後可以再用 子域劃分 那篇的方法,判斷每一段是核心、支撐還是通用。

4. 補上人與系統(20 分鐘)

在事件旁邊貼上小張黃色的角色,以及粉紅色的外部系統:誰讓這件事發生的?依賴了哪個系統?

這一步常常會發現交接的問題,例如「斡旋金已收取」之後,到底是經紀人還是店長保管?兩個人的說法不一樣。

5. 標出熱點(全程)

熱點不是一個獨立的階段,而是整場都可以貼。任何疑問、衝突、「這裡常常出問題」都貼上去。熱點越多,代表這場越有價值:這些問題本來就存在,只是之前沒被看到。

6. 走一遍、倒著走(30 分鐘)

  • 走一遍(Explicit Walk-through):請一位參與者從頭講一次整條時間軸,其他人邊聽邊補充。講不下去的地方,通常就是缺了事件
  • 倒著走(Reverse Narrative):從最後一個事件往回問「要發生這件事,前面必須先發生什麼?」。往前走容易只講順利的情況,倒著走比較容易發現前置條件,例如「服務費已收取」之前,必須先有「服務費已確認」

7. 問題與機會、投票(20 分鐘)

最後請每個人寫下他認為最大的問題或機會,再用箭頭投票:每人兩票,畫在他認為最該優先處理的熱點或事件上。

票數最多的地方,就是接下來要用 Process Modeling 深入的流程。

收尾

  • 拍照:整面牆分段拍清楚,最好有人負責整理成數位版
  • 整理熱點清單:每個熱點寫下要問誰、誰負責追
  • 說明下一步:讓參與者知道這場的結果會怎麼被使用,下次才找得到人

Process Modeling:把一個流程拆清楚

Big Picture 投票選出「斡旋」這段後,找相關的人再跑一場 Process Modeling。這時要用上完整的語法,規則很簡單:

  1. 每個事件前面都有原因:可能是某個角色發出的命令,也可能是一條政策
  2. 每個命令前面都有角色或政策,角色在發出命令前,通常需要看某個讀取模型
  3. 每個事件後面接政策、讀取模型,或是流程結束

照著這個語法串下去,就會被迫回答很多 Big Picture 時跳過的問題:

  • 買方提出斡旋時,需要看到什麼資訊?(讀取模型:物件資訊、目前是否已經有人斡旋)
  • 「斡旋已提出」之後,誰會知道?怎麼知道?(政策:通知屋主的經紀人)
  • 斡旋期限到了,誰來處理?(政策:每當斡旋到期,就把斡旋標記為過期、退還斡旋金)
  • 屋主同時收到兩組斡旋時,規則是什麼?(熱點:先到先處理,還是屋主自己選?)

Process Modeling 的產出很接近需求規格:命令就是功能,事件就是功能完成的結果,政策就是要自動化或要人工處理的規則,熱點就是還沒定案的問題。

Software Design:再往下一層

如果團隊要開始寫程式,可以再跑一場 Software Design:把相關的命令和事件圍繞著聚合重新整理,問每個聚合要守住哪些規則。例如「斡旋已提出」、「斡旋已接受」、「斡旋已過期」都圍繞著「斡旋」這個聚合,「物件已上架」、「物件已改價」則屬於「物件」聚合。這部分可以參考 DDD 概論 裡的聚合設計原則。

主持人的技巧

  • 控制時間,不控制內容:每個階段都有時間盒,到了就進下一步。內容由參與者決定
  • 事件要用業務語言:看到「訂單資料已更新」,問「業務上發生了什麼事?」
  • 衝突先貼熱點:不要讓兩個人在牆前吵十分鐘,其他人站著等
  • 注意沒說話的人:資淺的人常常最清楚實際狀況,但不敢在主管面前說。主持人可以直接問他們負責的那段
  • 不要讓開發人員主導:開發人員容易把討論帶到「資料表怎麼設計」,Big Picture 階段先專注在業務
  • 事前和關鍵人物溝通:如果主管會參加,事前說明這不是報告會,是一起探索,請他多聽少講

常見的失敗

狀況原因改善
牆上都是「點擊按鈕」、「呼叫 API」參與者以系統操作的角度思考開場用業務事件示範,過程中隨時提醒
只有兩三個人在貼坐著開會、主管在場、沒有點名移開椅子,主持人主動邀請每個部門
吵了一小時沒有結論想在當下解決所有分歧衝突貼熱點,會後再找對的人解決
貼完就沒有下文沒有整理產出、沒有指定負責人收尾時整理熱點清單與下一步
範圍太大,一天貼不完開場沒有定義起點和終點先跑 Big Picture,細節留給 Process Modeling

一句話總結

Event Storming 的關鍵在準備與主持:找齊真正做事的人、準備夠長的牆和站著的空間,Big Picture 先讓每個人各自貼出過去式的領域事件,再一起整理時間軸、找出關鍵事件與邊界、補上人與系統、隨時標出熱點,最後走一遍並投票選出最該處理的問題;選出的流程再用 Process Modeling 的「角色、命令、聚合、事件、政策、讀取模型」語法拆清楚。