← 回文章列表

2024年3月19日

領域故事化(Domain Storytelling):讓業務用說故事的方式講需求,再從故事裡找出上下文邊界

DDD領域驅動設計Domain Storytelling需求分析架構設計

在 DDD 概論 提到,DDD 的前提是真的理解業務,而理解業務的方法之一是 Event Storming。不過實際和業務同事坐下來時,我發現 Event Storming 對第一次參加的人有點門檻:要先解釋什麼是「領域事件」、為什麼要用過去式、橘色和藍色差在哪裡。

Domain Storytelling(領域故事化)是另一種協作建模的方法,門檻低很多:請業務照著平常的工作講一個故事,主持人一邊聽一邊畫。它來自 Stefan Hofer 和 Henning Schwentner,兩人在 2021 年出版了《Domain Storytelling》一書,把這套方法整理成完整的做法。

圖示語法:用簡單的句子拼成故事

Domain Storytelling 的圖只有幾種元素:

元素說明例子
角色(Actor)故事裡做事的人、群體或系統買方、經紀人、屋主、業務系統
工作物件(Work Object)角色處理、傳遞、產生的東西帶看紀錄、斡旋書、斡旋金
活動(Activity)連接角色和工作物件的箭頭,用動詞標示預約、確認、轉交
序號標在活動上,表示故事的順序①、②、③
註解補充說明、規則或疑問「還價是另一個故事」

每一步都是一個簡單的句子:

角色 → 活動 → 工作物件 →(介系詞)→ 另一個角色

例如:買方 提出 斡旋 給 經紀人

句子越簡單越好。如果一句話需要「如果…就…否則…」才講得完,通常代表它其實是兩個故事。

例子:從找房到斡旋

下面是我和一位資深經紀人訪談後畫出來的故事,描述一位買方從找到物件、看屋,到提出斡旋的過程:

房仲帶看到斡旋的領域故事圖:買方、經紀人、屋主三個角色各只出現一次,左上是網站、下方是業務系統,經紀人位在中間,所有往來都經過他。九個帶序號的箭頭組成故事,每一句是「角色、動詞、工作物件、介系詞、角色」:1. 買方在網站搜尋物件;2. 買方向經紀人預約帶看;3. 經紀人和屋主確認帶看時間;4. 經紀人陪同買方帶看物件;5. 經紀人在業務系統填寫帶看紀錄;6. 買方提出斡旋書與斡旋金給經紀人;7. 經紀人轉交斡旋書給屋主;8. 屋主簽回已接受的斡旋書給經紀人;9. 經紀人通知斡旋結果給買方。序號依顏色分成三段:1 是搜尋,2 到 5 是帶看,6 到 9 是斡旋,代表從故事找出的候選上下文

每個角色在圖上只出現一次,所以畫完一眼就能看出整體的形狀:買方和屋主之間從來沒有直接往來,所有的東西都經過經紀人。這在逐條的需求清單裡看不出來,但它解釋了為什麼經紀人總是很忙,也指出了之後可以改善的地方,例如通知斡旋結果能不能由系統自動發送。

畫的時候,經紀人講到第 5 步,我問「帶看紀錄寫在哪?」,答案是「以前寫紙本帶看單,現在用業務系統」。再追問「帶看紀錄之後誰會看?」,才知道店長每週會看帶看紀錄來決定哪些物件要調價。這些細節在需求文件裡完全沒有,卻直接影響帶看紀錄要存哪些欄位。

一場工作坊怎麼進行

參與者與分工

  • 說故事的人:領域專家,例如資深經紀人、店長。最好是實際做這件事的人,而不是只知道規定的主管
  • 主持人(Moderator):引導對話、控制節奏,確保一次只講一步
  • 建模者(Modeler):負責畫圖,通常就是主持人自己。畫的時候要大聲重述每一句:「所以是經紀人把斡旋書交給屋主,對嗎?」
  • 聽眾:開發人員、PO。主要聽,必要時提問

進行步驟

  1. 選一個具體的情境:「一位買方看了物件後出價」,而不是「斡旋流程」。具體的情境才講得出具體的步驟
  2. 從觸發點開始講:「這件事是怎麼開始的?」
  3. 一句一句畫:每講一步就畫一步,畫完重述,對方確認後再講下一步
  4. 遇到分支先記下來:「如果屋主不接受呢?」先寫在註解上,等這個故事講完,再另外畫一個「屋主還價」的故事
  5. 整個故事重講一遍:照著序號從頭講一次,常常會在這時發現漏掉的步驟
  6. 標出疑問和痛點:例如「經紀人要手動通知所有斡旋人,常常漏掉」

一個故事通常 30 分鐘到 1 小時就能畫完。工具可以用白板,或是免費的線上工具 Egon.io,它內建 Domain Storytelling 的圖示,還可以逐步回放故事。

不要畫分支

這是我第一次畫時最常犯的錯。流程圖習慣畫「判斷」菱形,但 Domain Storytelling 刻意不畫分支:一個故事只講一種情況。屋主接受、屋主還價、斡旋過期,是三個不同的故事。

這樣做的好處是每張圖都很好讀,而且逼大家用具體的例子思考。要說清楚的情況越多,就畫越多張,而不是把一張圖畫成迷宮。

範圍因子:先決定要畫哪一種故事

開始之前,要先和參與者確認這次故事的「範圍」,書中整理了三個因子:

Domain Storytelling 的三個範圍因子:第一是粒度,粗粒度描述從找房到成交的整個過程,大約十步,用來看全貌和找邊界,細粒度只描述斡旋這一段的每個細節,用來釐清規則和需求;第二是時間點,現況描述目前實際怎麼做,例如經紀人手動打電話通知所有斡旋人,未來描述導入新系統後要怎麼做,例如系統自動通知;第三是領域純度,純領域只講業務,不提任何軟體,例如經紀人記下買方反應,數位化則畫出系統扮演的角色,例如經紀人在業務系統填寫帶看紀錄

因子選項用途
粒度(Granularity)粗粒度/細粒度粗粒度看全貌、找上下文邊界;細粒度釐清單一流程的規則
時間點(Point in Time)現況(As-is)/未來(To-be)現況用來理解問題;未來用來討論新系統要怎麼改變工作方式
領域純度(Domain Purity)純領域(Pure)/數位化(Digitalized)純領域只講業務,避免被現有系統限制;數位化畫出軟體扮演的角色

常見的組合是:

  • 剛接觸一個領域:粗粒度 + 現況 + 純領域,先理解業務本身
  • 要設計新系統:細粒度 + 未來 + 數位化,討論系統要怎麼支援每一步

上面帶看的例子是「粗粒度、現況、數位化」:它涵蓋整個過程,描述目前的做法,而且畫出了網站和業務系統。

範圍因子要在開始前講好。如果有人在講現況,有人在講「理想上應該要…」,故事會一直被打斷,最後兩邊都畫不完。

從故事找出限界上下文

粗粒度的故事畫完後,可以在上面找出限界上下文的候選邊界。幾個常用的線索:

  • 語言改變了:前半段說「物件」指的是網站上的刊登內容,到斡旋階段,「物件」變成有權狀、有所有權人的交易標的
  • 工作物件換了:步驟 2~5 圍繞著「帶看」和「帶看紀錄」,步驟 6~9 圍繞著「斡旋書」和「斡旋金」
  • 有明顯的交接或時間間隔:買方看完屋,可能隔好幾天才決定斡旋,前後兩段的觸發條件完全不同
  • 負責的人或部門不同:帶看是經紀人自己安排,斡旋涉及店長審核、斡旋金的保管,參與的人不一樣

把這些線索對照到序號上,就能把故事分成三段:步驟 1 是搜尋、步驟 2~5 是帶看、步驟 6~9 是斡旋,也就是範例圖中序號的三種顏色。這只是候選的邊界,還要再看業務的重要性、團隊分工等因素才會定案,這部分之後會另外整理。

和 Event Storming 的比較

兩者都是協作建模,但適合的情境不太一樣:

Domain StorytellingEvent Storming
主軸角色和工作物件,「誰對什麼做了什麼」領域事件,「發生了什麼事」
進行方式一位主持人一邊聽一邊畫,一次講一個故事所有人同時在牆上貼便利貼
適合人數少,3~6 人多,可以 10 人以上
擅長深入一個流程、看出人和人之間的交接一次看到整個業務的全貌,發現部門之間的落差
門檻低,像訪談要先說明規則,主持需要經驗

我的做法是:剛接觸一個領域時先用 Domain Storytelling 和一兩位專家訪談,對業務有基本理解後,再找更多部門一起跑 Event Storming。兩者不衝突,用 Domain Storytelling 找到的角色和工作物件,在 Event Storming 時也很容易轉成事件和命令。

注意事項

  • 用具體的例子:「王先生上週六看了信義區那間三房」比「使用者瀏覽物件」好講得多,也更容易發現例外
  • 不要畫成畫面流程:「點擊預約按鈕、跳出日曆」是 UI 設計,不是業務。即使是數位化的故事,也只畫「經紀人在業務系統填寫帶看紀錄」
  • 建模者不要自己補內容:覺得少了一步就問,不要自己畫上去。建模者的假設常常就是需求誤解的來源
  • 一張圖不要太長:步驟超過 20 步就很難讀,可以把細節拆成另一個細粒度的故事
  • 畫完要保存:拍照或匯出,放進團隊的文件。之後新成員要理解業務時,這些故事比任何規格書都好懂

一句話總結

Domain Storytelling 用「角色、活動、工作物件」的簡單句子,讓領域專家照著真實的工作講故事、主持人一邊畫一邊確認;一個故事只講一種情況,開始前先決定粒度、時間點與領域純度,畫完後再從語言、工作物件與交接點的變化,找出限界上下文的候選邊界。