架構與設計沒有本質區別,兩者都是「軟體整體計畫」的一部分,差別只在決策的層次。而所有架構工作服務的是同一個目標:讓系統易於改變。一套好架構能讓你在需求變動時,用最小的代價、最少的重工去回應——這比讓系統「現在正確運作」更難、也更持久地重要。
🧠 Core Ideas
- 軟體有兩種價值:行為價值與架構價值。行為價值是「讓系統做對事」,架構價值是「讓系統易於改變」。多數人只盯著前者,但 Uncle Bob 主張後者往往更關鍵:一個功能正確卻硬到改不動的系統,會隨每次需求變更而愈發昂貴,最終價值歸零。
- 三種程式設計典範各是一種「紀律」。結構化程式設計取消了 goto(限制直接控制轉移)、物件導向限制了間接控制轉移、函數式限制了賦值。它們不是給你新能力,而是拿走你的能力——正是這些限制,讓大規模架構的紀律成為可能。
- SOLID 五原則從類別層級一路適用到架構層級。SRP(單一職責,一個模組只對一個角色負責)、OCP(開放封閉,靠擴充而非修改來因應變化)、LSP(里氏替換,子型別要能無痛替換父型別)、ISP(介面隔離,別逼客戶依賴用不到的東西)、DIP(依賴反轉,依賴抽象而非具體)。
- 依賴反轉是整潔架構的引擎。DIP 讓你可以「反轉」原始碼依賴的方向——即使控制流從高階流向低階,原始碼依賴仍能一致指向高階。這使得跨越邊界時,依賴永遠指向更穩定、更抽象的一側。
- 依賴規則:原始碼依賴只能指向內層。以同心圓表示——最內是 Entities(企業規則),往外是 Use Cases(應用規則)、Interface Adapters、Frameworks & Drivers。內層對外層一無所知;外層的變化不應波及內層。
- 資料庫、Web、框架都是「細節」。它們位於最外圈,是可抽換的插件,而非架構核心。把商業規則與這些細節解耦,你就能延後決策、獨立測試、並在細節過時時替換它們,而不動到系統的心臟。
TIP
「整潔架構」不是又一個原創發明,而是把 Hexagonal Architecture、Onion Architecture、DCI 等前人智慧統合到同一張同心圓圖上。它們雖細節各異,卻都指向同一條規則:依賴指向內、細節指向策略。抓住這條規則,圖畫成幾層都不是重點。
⚖️ 為什麼「架構價值」比「行為價值」更難也更重要
急著上線的團隊幾乎總是犧牲架構、保住行為——因為老闆看得見功能,看不見結構。但這個取捨的帳,會在往後每一次變更時被追討。
行為 vs 架構:艾森豪矩陣的陷阱
-
緊急 vs 重要的錯位。行為(功能)通常緊急但不總是重要;架構重要但很少緊急。團隊若總是先做「緊急」的,就會系統性地犧牲「重要」的架構,把系統推向愈來愈硬、愈來愈改不動的角落。
-
軟體的本意是「soft」。軟體之所以叫「軟」體,就是因為它應該易於改變。一個為了趕行為價值而放棄架構價值的系統,等於背叛了自己存在的理由——它變成了昂貴的硬體。
-
架構師的責任是「留住選項」。好架構的標誌,是把「不重要的決策」(用哪個資料庫、哪個框架、走 Web 還是桌面)盡量延後並隔離在外圈,讓系統的核心商業規則不被這些細節綁架。延後決策本身就是一種競爭優勢。
🖼️ 依賴規則怎麼在真實系統裡運作
想像一個典型的請求流:Web 送進來一筆資料,經過 Controller,呼叫 Use Case(應用商業規則),Use Case 操作 Entity(企業商業規則),再把結果透過 Presenter 送回 Web。控制流從外向內、再從內向外;但「原始碼依賴」——也就是誰 import 誰、誰認識誰——必須始終指向內。Use Case 不知道 Controller 存在,Entity 不知道資料庫存在。
要讓控制流與依賴方向「相反」,靠的正是 DIP:在邊界上放一個由內層定義的介面,外層去實作它。於是 Use Case 呼叫的是它自己擁有的 Gateway 介面,真正的 SQL 實作住在外圈,實作方向內依賴。這帶來三個具體好處:其一,商業規則可以在沒有資料庫、沒有 UI、沒有框架的情況下被單元測試;其二,你可以把 Oracle 換成 Postgres、把 Web 換成桌面,而不動核心;其三,團隊可以沿邊界並行開發。書末的案例研究把這套規則落到影片販售、真實專案的目錄結構上,示範「按元件的變更軸切分」而非「按技術分層堆疊」,讓每個元件能獨立內聚、獨立部署。
IMPORTANT
邊界要畫在「變化軸」上:把「因不同理由、以不同速率改變」的東西分開。商業規則變得慢、UI 與資料庫變得快,就在它們之間畫一條由 DIP 守護的線。畫錯邊界(或該畫時不畫)是架構腐化最常見的起點——邊界的紀律,本質上就是 SRP 在系統層級的展開。
🔑 Takeaways
- 架構的目標是讓系統「易於改變」;架構價值往往比一時的行為價值更關鍵。
- SOLID 不只管類別:SRP 定義邊界、DIP 反轉依賴,是整潔架構得以成立的兩根支柱。
- 依賴規則只有一條——原始碼依賴永遠指向內層的高階策略,內層對外層一無所知。
- 資料庫、Web、框架都是可抽換的細節;把它們隔到外圈,才能延後決策、獨立測試、自由替換。
- 延伸:系統層級的整潔,源自每個檔案、每個函式的整潔紀律,回到 Clean Code:什麼是整潔的程式碼。
No notes yet — jot your takeaways or Q&A here.