本章是 Part III 的開場,透過一個**銀行聯貸系統(Syndicated Loan)**的真實專案故事,生動說明「模型突破(Breakthrough)」這個現象——重構的回報並非線性的,有時一個突如其來的深層洞見會徹底改變模型,讓複雜度驟降、表達力暴增。

重構的回報通常是漸進式的小改善累積。但最重要的洞見往往突然降臨,對專案產生衝擊性的影響。突破不是一種「技術」,而是一種事件——挑戰在於辨認它正在發生,並決定如何應對。


Story of a Breakthrough#

Evans 描述了他曾參與的一個投資銀行專案,負責開發管理**聯貸(Syndicated Loan)**的核心系統。

聯貸的業務背景#

  • 當 Intel 這類企業需要十億美元級別的貸款時,沒有單一銀行能獨自承擔
  • 多家銀行組成銀團(Syndicate),共同出資支持一個 Facility(授信額度)
  • 投資銀行通常擔任銀團領導者,協調交易與各項服務

什麼是 Facility? 在商業銀行領域,Facility 是一種貸款承諾。信用卡就是一種 Facility——它授權你按需借款,有預設額度與利率。當你刷卡時,你建立了一筆 Loan(未償貸款);每次額外消費都是對 Facility 的 Drawdown(提款)。最後你償還本金。你也可能繳年費——這是為擁有 Facility(信用卡)的特權付費,與 Loan 無關。


A Decent Model, and Yet…#

團隊經過四個月的努力,從一個完全不可用的遺留程式碼中,重構出一個看似合理的 MODEL-DRIVEN DESIGN

初始模型的優點#

  • Loan Investment 是一個衍生物件,代表特定投資者對 Loan 的出資份額,按其在 Facility 中的比例計算
  • 常見情況處理起來非常簡單

Figure 8.1: A model that assumes lender shares are fixed

浮現的問題#

然而令人不安的跡象開始出現:

  • Facility 的份額只是參考:當借款人要求提款時,銀團領導者會通知所有成員出資,但投資者經常與其他成員協商,實際出資可能多於或少於原始份額
  • 為了應對這個問題,團隊在模型中加入了 Loan Adjustment(貸款調整)
  • 複雜度持續增加,卻沒有收斂到穩固功能的跡象
  • 更令人擔憂的是,出現了微妙的捨入不一致(rounding inconsistencies),越來越複雜的演算法也無法消除

Figure 8.2: A model incrementally changed to solve problems.

在一筆一億美元的交易中,沒人在乎多餘的幾分錢跑到哪裡去。但銀行家不信任無法精確追蹤每一分錢的軟體。團隊開始懷疑這些困難是基本設計問題的症狀


The Breakthrough#

某一週,團隊突然意識到問題的根源:模型將 Facility 份額與 Loan 份額綁在一起,但這不符合業務現實

關鍵洞見#

  • Facility 的份額與 Loan 的份額可以獨立變化
  • 業務專家點頭贊同,甚至可能在想「你們怎麼現在才明白」

用情境走查驗證新模型#

團隊在白板上用視覺化方式走過多個業務場景:

場景一:初始提款

借款人從 $100MM 的 Facility 中提取 $50MM,三家銀行按 Facility 份額等比例出資。

Figure 8.3: A drawdown distributed based on Facility shares

場景二:第二次提款,部分銀行退出

借款人再提取 $30MM(累計 Loan 達 $80MM)。Company B 選擇不參與,Company A 承擔額外份額。此時 Loan 的份額已不再與 Facility 份額成正比——這在實務上很常見。

Figure 8.4: Lender B opts out of a second drawdown.

場景三:本金償還

借款人償還 Loan 時,資金按 Loan 份額(而非 Facility 份額)分配給各銀行。利息支付同樣按 Loan 份額分配。

Figure 8.5: Principal payments are always distributed proportional to shares in the outstanding Loan.

場景四:費用支付

借款人繳納 Facility 使用費時,資金按 Facility 份額分配,與誰實際出借了資金無關。Loan 不受費用支付影響。甚至存在銀行將費用份額與利息份額分開交易的情境。

Figure 8.6: Fee payments are always distributed proportionally to shares in the Facility.


A Deeper Model#

團隊獲得了兩個深層洞見:

洞見一:Share 是一個通用概念#

原本的 InvestmentLoan Investment 只是一個更根本概念的特例:Share(份額)

  • Facility 的份額
  • Loan 的份額
  • 付款分配的份額
  • 任何可分割價值的份額

洞見二:Share Pie 模型#

Evans 在幾天內勾勒出一個通用的 Share 模型,並基於它重新設計了 Loan 模型:

Figure 8.7: An abstract model of shares

Figure 8.8: The Loan model using Share Pie

新模型的威力#

  • 不再有 Facility 份額或 Loan 份額的專用物件——它們都被拆解為更直覺的 Share Pie
  • 這個泛化允許引入「份額數學(shares math)」,大幅簡化任何交易中的份額計算
  • 最重要的是,新模型移除了不當的約束——讓 Loan 的份額可以自由偏離 Facility 的份額,同時保留對總額、費用分配等的有效約束
  • Loan Adjustment 不再需要,大量特殊案例邏輯被消除
  • Loan Investment 消失了——團隊這時才意識到「loan investment」根本不是銀行術語。業務專家曾多次表示不理解這個詞,但他們尊重團隊的技術知識而未質疑。實際上,這是團隊基於對領域的不完整理解而創造的

新模型的圖表讓業務專家完全看懂了——他們過去常說舊的模型圖「太技術性」。最頑固的捨入問題也從根源上被解決,複雜的捨入程式碼可以直接丟掉。


A Sobering Decision#

突破帶來的不是狂喜,而是恐懼

面臨的困境#

  • 專案已嚴重落後於時程,團隊在巨大的截止日期壓力下
  • 重構到新模型需要大量修改支援程式碼,中間幾乎沒有穩定的中繼點
  • 那是自動化測試尚未普及的年代——他們沒有測試,必然會有不可預見的破壞
  • 團隊已經精疲力竭

與專案經理的關鍵對話#

Evans 描述了一場令他永生難忘的會議:

問題回答
用新設計恢復到目前功能需要多久?大約三週
不做這個改變能解決問題嗎?可能可以,但無法確定
如果現在不做,下一版能順利推進嗎?不做的話進展會很慢,而且有了上線版本後改變會更困難
你們認為這是正確的做法嗎?是的——更簡單的方案,更貼合業務,長期風險更低

專案經理批准了這個決定,並說他會承擔壓力。Evans 對此表達了極大的敬意——這需要勇氣與信任


The Payoff#

團隊拼命趕工,三週內完成了重構,過程出乎意料地順利。

立即可見的成效#

  • 那些令人困惑的意外需求變更停止了
  • 捨入邏輯雖然永遠不會簡單,但穩定了且合理了
  • 第一版順利交付,第二版的道路暢通無阻

長期影響#

  • Share Pie 成為整個應用程式的統一主題
  • 技術人員和業務專家用它來討論系統
  • 行銷人員用它向潛在客戶解釋功能
  • 客戶立刻理解並用它來討論需求
  • 它真正成為 UBIQUITOUS LANGUAGE 的一部分,因為它觸及了聯貸業務的核心

Opportunities#

當更深層模型的突破機會出現時,往往令人恐懼:

  • 比一般重構有更高的機會,也有更高的風險
  • 時機可能不恰當
  • 進步不是一條平滑的道路——轉向真正深層的模型需要思維的深刻轉變和設計的重大改變
  • 在許多專案中,模型和設計最重要的進展來自這些突破

Focus on Basics#

不要因為追求突破而陷入癱瘓。突破的可能性通常在許多適度的重構之後才出現。

為突破鋪路的具體做法#

  • 知識消化(Knowledge Crunching):持續與領域專家互動
  • 培養健壯的 UBIQUITOUS LANGUAGE:讓技術與業務語言趨於一致
  • 探索重要的領域概念,在模型中將它們顯式化(見第 9 章)
  • 精煉設計使其更靈活(見第 10 章)
  • 蒸餾模型(見第 15 章)

不要因為看得太遠而不敢動手做適度的改善。即使在同一個概念框架內,逐步深化模型的小改進也很有價值。只要保持警覺,留意突破的機會。


Epilogue: A Cascade of New Insights#

Share Pie 的突破不是故事的結尾——更深層的模型開啟了意想不到的新機會

發現遺失的 Entity#

在 Share Pie 版本發布後僅僅數週,團隊注意到模型中另一個令人不適的面向:

  • 一個重要的 ENTITY 缺失了,它的責任被其他物件不當地承擔
  • 管控 Drawdown、Fee Payment 等的重要規則被塞進 Facility 和 Loan 的各種方法中
  • 團隊開始注意到討論中出現了模型裡找不到的術語——例如「Transaction」(金融交易)

第二次突破#

遵循類似的過程(幸運的是在較小的時間壓力下),團隊達成了又一輪洞見和更深層的模型:

  • 將隱含概念顯式化為各種 Transaction 類型
  • 同時簡化了 Position(Facility 和 Loan 的抽象)
  • 各種交易及其規則、協商程序、審批流程都能以相對自解釋的程式碼定義

Figure 8.9: Another model breakthrough that followed several weeks later.

突破的連鎖效應#

  • 深層模型帶來的清晰度與簡潔性,加上基於新 UBIQUITOUS LANGUAGE 的增強溝通,引發了又一次建模突破
  • 開發速度在大多數專案開始因累積的質量和複雜度而陷入泥沼的階段,反而在加速
flowchart TD
    B1["突破 1:Share Pie\n概念浮現"]:::breakthrough --> D1["發現遺失的 Entity\n(Transaction)"]
    D1 --> B2["突破 2:Transaction\n精化 Facility 設計"]:::breakthrough
    B2 --> ACC["開發速度加快\n模型表達力提升"]:::accel
    ACC --> B3["更多洞察湧現\n連鎖效應"]:::breakthrough

    classDef breakthrough fill:#e74c3c,stroke:#c0392b,color:#fff,font-weight:bold
    classDef accel fill:#2ecc71,stroke:#27ae60,color:#fff,font-weight:bold

本章的核心訊息:突破不可強求,但可以透過持續的重構、知識消化和語言精煉來為它鋪路。當突破來臨時,需要勇氣去擁抱它——即使時機看似不對。真正深層的模型帶來的不只是技術上的簡化,更是整個團隊溝通方式的根本轉變。