微服務帶來大量決策——技術數量、語言慣例、服務該拆該合……架構師的角色也得跟著改變。本章對「架構師到底該做什麼」採取一個強硬主張:離開象牙塔

名字裡有玄機#

「軟體工程師」「軟體架構師」這些名字都是借來的。傳統建築師、工程師有數千年的知識累積、有嚴格的執照制度——出錯要負法律責任。軟體業才 75 年左右,連「什麼算好」都還沒共識,借名字卻不見得能借到那份嚴謹。

借「架構師」這個詞最大的副作用是:讓人誤以為架構師像建築師那樣,畫好圖、其他人按圖施工。實際上:

  • 軟體變更成本遠低於建築(你能改 code,但無法把混凝土倒回去)
  • 軟體本來就不該停止演化
  • 一張完美藍圖無法預測未來

軟體架構是什麼?#

Ralph Johnson 的完整定義(不是常被引用的那個短句):

架構是專家開發者對系統設計的共同理解——這個理解包含系統如何拆分元件,以及這些元件如何透過介面互動。架構是社會建構(social construct)。」

Martin Fowler 的常見句子:「architecture is things that people perceive as hard to change.」也對,但只看這句會錯失「架構應該為變更創造空間」這個核心。

為變更創造空間#

Mies van der Rohe 設計的 Seagram Building:外牆不承重、所有 lift / 樓梯 / 水電 / 空調集中在中央核心——每層樓內部沒有結構牆,可隨需求重新配置

這就是架構師的工作:界定哪些地方變更便宜(universal space),哪些地方一旦定下就難以改動

演化型架構師的願景#

Erik Doernenburg(Thoughtworks):把架構師想成城市規劃師(town planner),而不是建築師。

城市規劃師不會說「這裡要蓋哪棟樓」,而是劃定區域(工業區、住宅區)並設下規範。實際蓋什麼、由哪些人決定,留給該區的人。

城市會演化、會被使用者塑形——規劃師接受這點,把心力放在區域之間的連結,而不是強控所有細節。

把這個比喻搬到微服務:

  • 區域 = 微服務的邊界(或一群微服務)
  • 區域內部的細節,留給該團隊決定
  • 架構師關注區域之間的互動:服務介面、整體系統健康、資料流

定義系統邊界#

Figure 16.1:在微服務內部變更很容易,只要對外互動沒變

Figure 16.2:區域內變更比區域間變更容易得多

  • 區域內部:自由
  • 區域之間:約束(共通介面協定、版本策略、認證機制)
  • 對應「Team API」概念——團隊邊界即架構邊界

Be worried about what happens between the boxes, and be liberal in what happens inside.

跨服務之間如果一個用 REST、一個 gRPC、一個 Java RMI——整合會變成噩夢。所以協定、整合方式要有約束;但服務內部的技術棧可以更寬鬆。

至於要寬鬆到什麼程度:Netflix 即使能用各種資料庫,仍然主要採用 Cassandra——因為運維、訓練、工具的成本,比「為每個任務挑最佳工具」的好處更重要。

架構是社會建構#

「No plan survives contact with the enemy.」

——Helmuth von Moltke

Grady Booch:「In the beginning, architecture is a statement of vision. In the end, the architecture of every system is a reflection of the billions upon billions of small and large, intentional and accidental design decisions made along the way.」

架構是「發生了什麼」,不是「規劃了什麼」。

  • 架構師若不沉浸在團隊裡 → 你只是個夢想家
  • Comcast 的做法:仿 IETF 的開放標準制定流程,建立「架構公會(Architecture Guild)」由各團隊代表協作決策

宜居性(Habitability)#

Richard Gabriel《Patterns of Software》:「Habitability 是讓後續來到這份程式碼的工程師能輕鬆理解其結構與意圖、並有信心改動的特性。」

軟體生態系不只是程式碼——還有工具、流程、實踐方式。架構師若不下場使用團隊的工具,就無法理解他們的痛苦。

強烈建議架構師定期親自寫 code、和團隊配對程式設計。例如四個團隊——每月跟每個團隊配半天,做真實工作。

不下場 = 失去判斷力。

原則導向#

決策需要**框架(framing)**幫助:

層級說明變更頻率
戰略目標(Strategic Goals)公司方向(如「進軍東南亞」)
原則(Principles)為達成目標所訂的規則
實踐(Practices)具體執行細節

原則不要超過 10 條——太多會互相矛盾、人記不住。

範例:戰略目標「縮短上市時間」→ 原則「交付團隊全程掌握自己軟體」→ 實踐「每微服務獨立 CI、獨立部署」。

Figure 16.3:戰略目標、原則與實踐的範例(Evan Bottcher)

演化型架構的指引:Fitness Functions#

Neal Ford 等人《Building Evolutionary Architectures》:用 Fitness Function 度量架構的「健康度」。

例:「服務回應 < 100ms」就是一個 fitness function——可在效能測試或 production 持續量測。當數值跑出邊界,架構師就知道要介入。

Fitness function 不是萬靈丹——它和與團隊密切合作互補,而不是取代後者。

Stream-Aligned 組織中的架構師#

Figure 16.4:架構功能作為一支賦能團隊(Enabling Team)

  • 架構師最自然的位置是Enabling Team:少數常駐架構師 + 各團隊技術負責人輪流參與
  • 工作內容:表達技術願景、串連團隊、辨識挑戰、適應願景

何時該否決團隊?#

「教孩子騎腳踏車」比喻——他騎不穩你不要插手;但他要衝向池塘時必須立刻接住。

架構師多數時候要相信團隊的決策,否決會耗損信任。但有少數情況「衝向池塘」時必須出聲——而你常常會發現自己後來才明白團隊那條路其實走得通。

跨切活動與短期決策的衝突#

REA 的解法:把產品負責人也納入對技術品質負責——讓他們得理解效能、安全等議題,並與技術領袖協商優先順序。光把技術債丟給 tech lead 是錯的設計。

建立團隊#

  • 微服務的多個獨立 codebase 提供了讓人「擔當」一塊的好機會
  • 把單一微服務交給某人擁有 → 是培養下一代技術領袖的好途徑
  • 「Great software comes from great people」——只看技術等於只看一半

必要的標準(Required Standard)#

哪些事情必須跨服務一致?作者列出三個高優先:

監控(Monitoring)#

一致的健康指標、一致的 log 格式、推到中央——這是非妥協的。否則你做不出「跨服務的整體健康觀」。

介面(Interfaces)#

選一兩種整合協定(HTTP/REST + 訊息)、再加上版本策略、分頁、命名慣例。20 種風格不行。

架構安全(Architectural Safety)#

  • 強制 circuit breaker、time-out
  • 嚴守 HTTP 回應碼語意:200/4xx/5xx 不能亂用——熔斷器靠這些區分

治理與鋪好的路(Governance and the Paved Road)#

COBIT 對治理的定義:透過評估持份者需求、設定方向、監控執行成效,確保企業目標達成。

技術治理 = 確保實作符合技術願景。但作者主張輕量化、群體化

  • 一群人協作(不是個人發號施令)
  • 把原則討論當作日常活動
  • 「鋪好的路」:清楚說明該怎麼做 + 提供讓人輕鬆做對的工具——但不強制

範例(Exemplars)#

文件好,但工程師更愛 code。找出系統內表現好的微服務當示範——而不是另寫「完美的範例」(因為脫離現實)。

量身訂做的微服務模板#

  • Spring Boot 等框架可預先配好健康檢查、metrics、JWT 驗證、circuit breaker
  • 通常由平台團隊維護
  • Netflix 用 JVM 模板與 sidecar,Monzo 用 Go 模板

強推單一模板會壓垮團隊士氣。一些組織採極端做法:把模板程式碼用「複製」而非依賴的方式放進每個服務——升級慢,但避免共享代碼帶來的耦合。

技術債#

  • 短期妥協會累積技術債——本身不是錯,但要被看見、被追蹤
  • 技術願景變了,原本符合的部分變成新的技術債
  • 架構師要看大圖;視組織風格決定是輕量提醒,還是維持正式債務追蹤表

例外處理(Exception Handling)#

  • 偶爾會有不照原則的決策——把它記下來
  • 同類例外累積到一定程度 → 修改原則反映新理解
  • 例:原則「資料庫一律用 MySQL」→ 反覆例外後改為「一般用 MySQL,需要超大規模時用 Cassandra」

演化型架構師的核心職責#

職責含意
Vision(願景)確保有清晰、有溝通的技術願景
Empathy(同理心)理解你的決策對顧客與同事的影響
Collaboration(協作)與盡可能多的同事一起定義、修正、執行願景
Adaptability(調適)隨組織與顧客需求調整技術願景
Autonomy(自治)在「標準化」與「給團隊自由」之間找到平衡
Governance(治理)讓系統實作貼近願景,讓做對的事情變得容易

小結#

  • 「架構師」這個詞容易誤導——別當建築師,當城市規劃師
  • 架構是社會建構:在發生中,不在規劃中
  • 為變更創造空間比一次規劃完美更重要
  • 用 Fitness Function 量測架構是否還在健康狀態
  • Enabling team + 鋪好的路是現代架構師的工具箱
  • 架構師必須與團隊一起寫 code,否則只是夢想家
  • 推薦延伸閱讀:Neal Ford 等《Building Evolutionary Architectures》、Gregor Hohpe《The Software Architect Elevator》