2024年12月17日
在 Scrum 中加入 Event Storming:Big Picture 建立 Product Backlog,Process Modeling 拆出 User Story
Scrum 流程整理 那篇整理了 Scrum 的角色、事件和產出物,Event Storming 怎麼跑 那篇整理了工作坊的做法。兩者各自都清楚,但放在一起時有個落差:
- Scrum 沒有說需求從哪裡來:Product Backlog 要「排好優先順序、上面的項目要清楚」,但 PO 怎麼知道該有哪些項目?一個個獨立寫出來的 User Story,很容易看不出彼此的關係,Refinement 變成 PO 逐張念卡片
- Event Storming 沒有說之後怎麼辦:牆貼滿了、熱點也找到了,然後呢?如果要先把所有流程都拆到 Software Design 才開始開發,那就變回瀑布了
這篇整理把兩者接起來的方式。核心原則只有一句:Big Picture 看全貌只做一次,細節只為接下來一兩個 Sprint 建模。
每種 Event Storming 放在哪裡
| 時機 | Event Storming 層次 | 參與者 | 產出 |
|---|---|---|---|
| 產品啟動、設定新的 Product Goal | Big Picture(半天~一天) | PO、各部門的領域專家、Developers | Epic、熱點、Product Goal 的方向 |
| Backlog Refinement | Process Modeling(1~2 小時) | PO、相關的領域專家、Developers | User Story、驗收條件、還沒釐清的熱點 |
| Sprint Planning 的「How」 | Software Design(30~60 分鐘,視需要) | Developers,PO 在場回答問題 | 聚合、命令、事件的設計,以及 Task |
| Sprint 進行中 | 不另外跑,牆面當參考 | Developers | 新的熱點 |
| Sprint Review | 回到牆面更新 | Scrum Team、利害關係人 | 已完成的範圍、對全貌的新理解 |
Big Picture → Product Backlog
Big Picture 不需要每個 Sprint 跑,通常在這些時候才跑:
- 新產品或新專案開始
- 要設定新的 Product Goal,例如「讓斡旋流程全面線上化」
- 團隊接手一個不熟悉的領域
跑完之後,牆上的東西可以直接對應到 Product Backlog:
- 關鍵事件切出來的每一段,變成一個 Epic:例如「委託與刊登」、「帶看」、「斡旋」、「簽約交屋」。這些段落也是 子域與限界上下文 的候選邊界,Epic 和團隊的分工可以一起考慮
- 投票選出的熱點,決定先做哪個 Epic:大家最痛的地方通常就是最有價值的地方。例如投票最多的是「斡旋要經紀人逐一打電話通知,常常漏掉」,那斡旋就是第一個 Epic
- 問題型的熱點,變成待釐清的項目:「斡旋已接受算不算成交?」不是開發工作,而是要 PO 去和業務、財務確認的事。可以放進 Product Backlog 並指定負責人,或者在需要時排一個探索性的 Spike
- Product Goal:整面牆和投票結果,讓 PO 更容易寫出一個具體的 Product Goal,而不是「優化交易流程」這種口號
這時候 Product Backlog 上只有幾個 Epic,不需要把每個 Epic 都拆成 Story。拆得太早,到真的要做時需求可能已經變了。
Process Modeling → User Story
每個 Sprint 的 Backlog Refinement 中,挑出排在最前面、下一兩個 Sprint 就要做的 Epic,跑一場 Process Modeling。Scrum Guide 2017 版曾建議 Refinement 不要超過 Developers 產能的 10%,兩週的 Sprint 大約一天左右,花 1~2 小時跑 Process Modeling 是合理的。
沿著命令和事件切 Story
Process Modeling 的牆貼完後,一條「命令 → 事件」或「政策 → 事件」的路徑,就是一個 Story 的候選:
| Story | 牆上的路徑 | 說明 |
|---|---|---|
| A. 提出斡旋 | 提出斡旋 → 斡旋已提出 | 買方能提出斡旋 |
| B. 通知屋主 | 政策:每當斡旋已提出,就通知屋主 → 屋主已收到通知 | 自動通知取代經紀人打電話 |
| C. 屋主接受斡旋 | 接受斡旋 → 斡旋已接受 | 屋主可以接受斡旋 |
| D. 斡旋到期失效 | 政策:每當期限到,就失效 → 斡旋已過期 | 不需要人工處理過期 |
| E. 通知其他斡旋人 | 政策:每當斡旋已接受,就通知其他斡旋人 | 有熱點「多組斡旋時誰優先」,還沒就緒 |
這樣切出來的 Story 有幾個好處:
- 天生就是垂直切片:每個 Story 從命令到事件,一定包含畫面、API、規則、資料,完成後就是一個能用的功能,而不是「斡旋的資料表」、「斡旋的 API」這種依技術層切的 Story
- 大小比較一致:每條路徑的範圍差不多,估算時比較不會出現一個 3 點、一個 40 點
- 順序很清楚:牆上看得出 C 一定要在 A 之後,B 和 D 可以並行
- 有熱點的就是還沒就緒:E 牽涉到一個還沒定案的業務規則,不應該放進 Sprint。這和 Scrum 那篇提到的 Definition of Ready 是同一件事
如果一條路徑太大,例如「提出斡旋」要處理斡旋金的線上付款,可以再沿著事件拆開:「提出斡旋(斡旋金現場收取)」先做,「斡旋金線上付款」之後再做,兩個都是能獨立使用的功能。
事件就是驗收條件
Story 的驗收條件,可以直接從牆上的事件寫成 Given–When–Then:
- Given 前面已經發生的事件(狀態)
- When 這個 Story 的命令
- Then 應該產生的事件,或是被拒絕的原因
以 Story C「屋主接受斡旋」為例:
| Given | When | Then |
|---|---|---|
| 斡旋已提出,且還沒過期 | 屋主接受斡旋 | 斡旋已接受 |
| 斡旋已過期 | 屋主接受斡旋 | 拒絕,提示「斡旋已過期」 |
| 斡旋已撤回 | 屋主接受斡旋 | 拒絕,提示「斡旋已撤回」 |
這些驗收條件用的都是牆上的業務用語,PO 看得懂,開發人員也可以直接寫成測試。如果用 DDD 概論 裡的聚合設計,這三列幾乎就是 Offer.Accept() 的三個單元測試。
Sprint Planning:需要時才跑 Software Design
Sprint Planning 的「How」階段,大部分的 Story 直接拆 Task 就好。只有在這些情況,才值得花 30~60 分鐘跑一次 Software Design:
- 這個 Sprint 要建立新的聚合,例如第一次做斡旋,要決定
Offer和Listing的邊界 - Story 牽涉到多個聚合之間的一致性,例如「斡旋已接受」之後,物件狀態要不要立刻更新
- 團隊對設計有明顯的分歧
跑完之後,Task 也很自然地出來了:
Offer聚合加上Accept()方法與驗收條件對應的單元測試- 「接受斡旋」的命令處理
- 「斡旋已接受」事件的發布
- 屋主端的斡旋列表畫面(讀取模型)
讓牆面活著
Event Storming 的牆如果貼完就收起來,幾個 Sprint 之後就沒人記得全貌了。幾個讓它持續發揮作用的做法:
- 轉成線上白板:實體牆拍照後整理到 Miro,整個團隊都看得到
- 標出進度:每個 Sprint 完成的事件,在白板上標記為已完成。Sprint Review 時打開這張圖,利害關係人一眼就能看出這次的 Increment 在整個流程的哪一段
- 新的發現就更新:開發過程中發現新的規則或例外,直接加一張便利貼或熱點,下次 Refinement 時一起討論
- 不要追求完整:牆面是溝通工具,不是規格書。過時的部分寧可刪掉,也不要讓它誤導人
角色分工
- PO:對結果負責,決定哪些熱點要優先處理、哪些 Story 先做。Big Picture 和 Process Modeling 都一定要參加
- Scrum Master:適合擔任主持人,確保時間盒、確保每個人都有參與。如果團隊裡有人更熟悉 Event Storming,也可以由他主持
- Developers:一起參與,不是等 PO 把 Story 寫好再看。他們會問出很多業務沒想過的邊界情況
- 領域專家:Big Picture 要找齊各部門;Process Modeling 只需要該流程的人。他們不一定是 Scrum Team 的成員,由 PO 邀請
常見的陷阱
| 陷阱 | 結果 | 改善 |
|---|---|---|
| 開發前把所有流程都跑到 Software Design | 花了一個月設計,需求已經變了,變回瀑布 | 只為接下來一兩個 Sprint 建模 |
| 只有 Developers 自己跑 | 牆上都是開發人員的猜測,沒有真正的業務知識 | PO 和領域專家一定要在場 |
| 依技術層切 Story | 每個 Story 都無法單獨使用,Sprint Review 沒東西可展示 | 沿著命令→事件的路徑切 |
| 熱點沒有人追 | 同樣的問題在下一場又被貼一次 | 每個熱點指定負責人,放進 Product Backlog |
| 每個 Sprint 都跑 Big Picture | 時間成本太高,參與者開始疲乏 | Big Picture 只在 Product Goal 改變時跑 |
| 牆面只用一次 | 幾個 Sprint 後沒人記得全貌 | 轉成線上白板,在 Review 時更新 |
一句話總結
把 Event Storming 加進 Scrum 的方式,是依照「由寬到窄、剛好夠用」放在不同的時機:產品啟動時用 Big Picture 找出 Epic、熱點與 Product Goal,每個 Sprint 的 Refinement 只為下一個 Epic 跑 Process Modeling,沿著命令與事件切出垂直的 User Story、用事件寫出驗收條件,Sprint Planning 只在必要時跑 Software Design,並讓牆面在每次 Review 時持續更新。