軟體架構領域流傳著一句殘酷的真理:「寫程式碼很容易,搞懂業務極其困難;而搞懂業務最大的障礙,不是業務規則深奧,而是大家都以為自己在說同一件事。」
在大部分團隊的會議室裡,經常上演這樣的悲劇對話:
業務總監說:「系統要支援『訂單(Order)』取消。」
工程師點點頭,在 Order 資料表上加上 status = CANCELLED。
兩週後,倉儲主管衝進辦公室破口大罵:「為什麼司機都已經把貨櫃開出物流中心了,系統還允許用戶在 App 上按取消?司機在高速公路上要怎麼把箱子放回架位?」
工程師委屈地說:「但業務說只要訂單未完成都可以取消啊!」
財務長跟著補刀:「更糟糕的是,發票上個月底就已經申報營業稅了,你們在資料庫直接把這筆訂單狀態抹掉,是要讓我去坐牢嗎?」
在這場混亂中,沒有任何人在蓄意破壞系統,每個人都在恪盡職守。這場災難的真正元凶,是系統分析端最普遍也最致命的隱形殺手——同名異義詞(Polysemy)。
「訂單」這個詞,在銷售端、倉儲端與財務端,表面上拼寫完全相同,但在各自的業務現實中,指涉的是完全不同的事物。如果系統分析師在白板前無法抓出這些潛藏在日常對話中的語義衝突,工程團隊就必然會打造出一個欄位破百、到處都是 nullable、無人敢動其狀態機的「上帝物件(God Object)」。
為了解決這個溝通死局,我們需要一套極簡、嚴謹且以微觀時序為核心的圖解語法——Domain Storytelling(領域敘事)。
破除幻想:為什麼「全局統一數據字典」是致命毒藥?
許多傳統架構師試圖用「企業級全域資料模型(Enterprise Data Model)」來解決語義混亂:由架構委員會召集所有部門,花費幾個月編寫一本厚重的《全公司統一資料字典》,規定全公司所有的「Order」都必須統一採用標準定義與單一資料表結構。
這是一種典型的幼稚病。
現實商業世界本質上是由多個各自具備不同目標、不同時間尺度與不同約束的「子語境」所組成的。
- 對行銷部門而言,訂單是**「消費意向與優惠券套用結果」**;
- 對物流中心而言,訂單是**「實體貨物的重量、體積、揀貨路徑與包裝箱編號」**;
- 對會計稅務而言,訂單是**「具備法律效力的權責發生制憑證」**。
試圖強行用單一資料模型統攝所有部門的認知,下場只有兩個:
- 模型肥大化與語義撕裂:一個實體承載了幾十個互不相關部門的私有屬性,任何一個業務流程的微調都會意外觸發其他部門的驗證錯誤;
- 表面一致,私下脫軌:各部門發現集中式系統根本無法滿足自己的彈性需求,於是私底下開始用 Excel、Google Sheet 或自建小影子系統來記錄真正的業務資料。
Eric Evans 在 DDD 經典中提出最核心的智慧正是:「通用語言(Ubiquitous Language)不是全域的,它只在特定的限界上下文(Bounded Context)內部具備絕對嚴格的單一含義。」
而 Domain Storytelling,就是一套專門用來**「在具體故事中逼出語義分歧、劃定上下文邊界」**的手術刀。
Domain Storytelling 的極簡圖解語法
Domain Storytelling 由 Stefan Hofer 與 Henning Schwentner 提出,其核心哲學是:「人類天生擅長講故事與聽故事。」
比起抽象的 UML 類別圖或資料流圖,業務專家更願意用「誰、拿著什麼、對誰做了什麼」來還原工作場景。其語法極其精簡,僅包含三個微觀要素:
1. 參與者(Actors)
在故事中主動發起行為的人、組織角色或軟體系統。
圖解上通常以簡單的小人形圖示(代表內部員工、外部客戶)或電腦圖示(代表既有軟體系統、外部服務網關)表示。
2. 工作物件(Work Objects)
參與者在協同作業過程中所傳遞、查閱、修改或產生的資訊載體或實體物品。
例如「採購清單」、「紙本驗收單」、「動態報價單」、「物流運單」。工作物件絕不是資料庫裡的資料表,而是業務專家眼前真實看見或操作的具體事物。
3. 活動(Activities)與序號箭頭
參與者之間對工作物件所採取的動作,用一根帶有方向的箭頭連接,箭頭上方以「動詞短語」描述動作,並且必須標註從 1 開始遞增的阿拉伯數字序號(1, 2, 3…)。
透過這三個元素,一個原本極度複雜的跨部門退換貨流程,就可以在白板上被還原為一句句具體的時間序列句子:
1. [客戶] 向 [客服人員] 提交 [瑕疵照片與訂單編號]2. [客服人員] 在 [客服系統] 建立 [換貨申請案件]3. [客服系統] 向 [倉庫主管] 發送 [瑕疵品待檢通知]4. [物流司機] 將 [實體瑕疵包裹] 運抵 [檢驗隔離區]
系統分析實戰:用領域敘事提煉通用語言的四個步驟
在實際系統分析會議中,系統分析師應當如何引導業務專家與工程師完成語義提煉?
第一步:講述具體場景故事(Concrete Scenarios)
永遠禁止業務專家做「抽象的概括性發言」(例如:「我們通常會審核訂單」)。
系統分析師必須強勢追問具體案例:「請拿昨天下午發生的那起最棘手的『VIP 用戶跨國取消換貨』為例,具體是哪位客服、打開了什麼畫面、看見了什麼、做了什麼?」
分析師一邊聽專家講述,一邊在白板上同步畫出帶序號的圖形。每畫完一段,立刻指著圖表向業務專家覆述:「所以步驟 4 是司機把包裹送給驗收員,而不是系統自動通知入庫,對嗎?」
因為圖形極其直觀,業務專家能在一秒內指出認知偏差:「不對,驗收員根本看不到包裹,是倉儲工讀生先拆箱分類!」這瞬間消滅了傳統規格書中數週後才會暴露的盲點。
第二步:獵殺同名異義詞(Polysemy Hunting)
當分析師畫了三個不同的故事(「日常快速下單發貨故事」、「大檔期庫存預購故事」、「瑕疵品換貨退款故事」)後,將三張圖並排貼在白板上,開始進行**「名詞跨故事比對」**。
仔細審視「工作物件(Work Object)」在跨越不同參與者時的內涵變化:
- 在《下單故事》中,消費者提交的
Order,裡面只包含商品 ID、購買數量與外送地址; - 在《倉庫故事》中,倉管人員看見的
Order,卻變成了包含貨架編號(A-12-04)、揀貨路徑、外箱容積計算的撿料單; - 在《財務故事》中,會計人員審核的
Order,關心的卻是統一編號、免稅額度、沖銷憑證與銀行手續費拆帳。
分析師此時要在白板上敲響警鐘:「各位請看,這三個故事裡的『Order』根本不是同一個東西!如果在資料庫裡把它們建在同一張表,我們就是在為系統埋下未爆彈。」
第三步:銳化為通用語言(Sharpen Ubiquitous Language)
抓出同名異義詞後,系統分析師的下一個動作是**「消滅模糊名詞,進行精準概念替換」**:
- 放棄籠統的萬能名詞
Order; - 在銷售溝通中,將其正式命名為
SalesOrder(銷售意向訂單); - 在物流溝通中,將其重命名為
PickList(揀料單) 或FulfillmentJob(履約派工單); - 在財務溝通中,將其重命名為
CommercialInvoice(商業發票憑證)。
透過這種精確命名,業務專家、產品經理與工程師在未來的所有對話中,不再使用模糊的「那個 Order 狀態改一下」,而是精確地討論「PickList 已經鎖定出庫,因此無法直接撤銷 SalesOrder,必須發起逆向物流補償流程」。
第四步:確立純淨的限界上下文(Bounded Context Boundaries)
當名詞與職責被銳化後,限界上下文的物理接縫自然確立:
- 銷售上下文(Sales Context): 專注於購物車轉換、行銷促銷計算,維護小巧純淨的
SalesOrder模型。 - 履約上下文(Fulfillment Context): 專注於物理庫存鎖定、批次撿料、路線規劃,維護自己的
PickList與Shipment模型。 - 結算上下文(Billing Context): 專注於稅法合規、雙式記帳、金流扣款,維護嚴謹的
Invoice與PaymentReceipt模型。
各上下文內部只有自己領域的純淨名詞與業務不變量。跨模組溝通時,不再傳遞龐大的實體資料表,而僅透過純粹的 ID(例如 SalesOrderId)進行異步事件通知。
系統分析交付物:領域詞典與場景矩陣
經過 Domain Storytelling 提煉後,系統分析端輸出的不再是幾十頁無人翻閱的 PRD,而是一套精簡且可被代碼嚴格落地的資產:
1. 結構化領域詞彙表(Domain Glossary)
為每一個劃定好的 Bounded Context 建立獨立字典:
- 邊界名稱:履約上下文(Fulfillment Context)
- 通用詞彙:
PickList(揀料派工單) - 精確業務定義:指派給特定倉庫撿料員的一組實體商品 SKU 與貨架座標組合,一旦被撿料員掃碼認領,即進入凍結鎖定狀態。
- 絕對不包含之概念:不包含用戶信用卡交易狀態,不包含促銷折扣折抵金額。
2. 微觀場景故事圖(Scenario Storyboards)
保留帶有編號的 SVG/圖解故事板,直接存放在代碼庫的模組目錄下(例如 docs/domain-stories/fulfillment-dispatch.svg)。當新工程師或 AI Coding Agent 進入代碼庫時,這張故事圖就是最高權威的「架構業務契約」。
下一步:將業務分析封裝為架構契約
透過 Wardley Mapping,我們錨定了不可替代的核心域;
透過 Big Picture EventStorming,我們梳理了全域事件時序並圈定了候選邊界;
透過 Domain Storytelling,我們抓出了微觀故事中的同名異義詞,提煉出了純淨的通用語言。
現在,系統分析的所有拼圖已經完整齊備。我們該如何將這些分析產出,轉化為架構師、技術主管與工程團隊可以直接簽字確認、並作為系統通訊拓撲最高規範的標準交付物?
在下一篇(本系列完結篇)中,我們將深入最後的戰略交付神器:《從業務分析到架構契約:Bounded Context Canvas 的規格交付與通訊拓撲》,拆解如何用一張畫布,完成微服務/模組化單體的邊界封裝與通訊協定設計。
