為什麼軟體架構缺乏明確定義?#

「Software architect」經常出現在各種最佳職業排行榜上,但與護理師或財務經理不同,這個職業卻沒有清晰的職涯路徑。原因有幾個:

  • 業界缺乏共識的定義 — Martin Fowler 在著名的白皮書 “Who Needs an Architect?” 中也拒絕給出定義,而是引用 Ralph Johnson 的名言:“Architecture is about the important stuff…whatever that is.”
  • 範圍持續擴大 — 十年前架構師只需處理純技術面(modularity、components、patterns),如今因為 microservices 等新架構風格,責任範圍大幅擴展
  • 持續變動的目標 — 軟體開發生態系統快速演進,任何定義都可能很快過時
  • 歷史包袱 — 過去許多架構相關的材料已失去時效性,許多曾經有效的方案在今天的脈絡下已不適用

Figure 1.1: The responsibilities of a software architect encompass technical abilities, soft skills, operational awareness, and a host of others

所有架構都必須在其脈絡(context)下理解。許多架構決策是基於當時環境的現實限制,例如 2002 年建構 microservices 架構在成本上是不可能的,但開源軟體與 DevOps 革命改變了這一切。

定義軟體架構(Defining Software Architecture)#

作者提出軟體架構由四個面向組成:

Structure(結構)#

指系統實作所採用的 architecture style(架構風格),例如 microservices、layered、microkernel 等。

僅描述結構並不足以完整描述一個架構。如果有人問「你的架構是什麼?」而你回答「這是一個 microservices 架構」,你只描述了結構,而非完整的架構。

Architecture Characteristics(架構特性)#

定義系統的成功準則,通常與功能性需求正交(orthogonal)。這些特性又稱為 “-ilities”,包括:

  • Availability(可用性)
  • Reliability(可靠性)
  • Scalability(可擴展性)
  • Performance(效能)
  • Security(安全性)
  • Deployability(可部署性)
  • Testability(可測試性)
  • Elasticity(彈性)
  • 以及更多…

架構特性不需要了解系統的功能需求,但系統要正常運作就必須支援這些特性。本書有數個章節專門探討架構特性的定義與治理。

Figure 1.4: Architecture characteristics refers to the '-ilities' that the system must support

Architecture Decisions(架構決策)#

定義系統建構的規則與限制。例如:在 layered architecture 中,只有 business 和 services 層可以存取資料庫,presentation 層不可直接呼叫資料庫。

  • 架構決策構成系統的約束條件(constraints),指導開發團隊什麼可以做、什麼不可以做
  • 當某個決策因特殊情況無法遵守時,可以透過 variance(變異)機制,經由 Architecture Review Board(ARB)或首席架構師審核後批准例外

Figure 1.5: Architecture decisions are rules for constructing systems

Design Principles(設計原則)#

與架構決策不同,設計原則是指導方針(guideline)而非硬性規則(rule)。

例如:「服務之間應盡可能使用非同步訊息傳遞(async messaging)以提升效能」是一個設計原則,它提供偏好方向,但允許開發者在特定情境下選擇更合適的通訊協定(如 REST 或 gRPC)。

Figure 1.6: Design principles are guidelines for constructing systems

Figure 1.2: Architecture consists of the structure combined with architecture characteristics, architecture decisions, and design principles

對架構師的期望(Expectations of an Architect)#

作者認為與其定義架構師的「角色」,不如聚焦在架構師的期望。無論職稱為何,軟體架構師有八項核心期望:

1. Make Architecture Decisions(做出架構決策)#

  • 架構師應該引導(guide)技術選擇,而非指定(specify)技術選擇
  • 例如:不應決定「使用 React.js」,而是決定「使用 reactive-based framework for frontend web development」,讓團隊在 Angular、React、Vue 之間選擇
  • 關鍵問題:架構決策是在引導團隊做正確選擇,還是團隊做技術選擇?

2. Continually Analyze the Architecture(持續分析架構)#

  • 評估 architecture vitality — 三年前定義的架構在今天的業務和技術環境下是否仍然可行?
  • 多數架構會經歷 structural decay(結構衰退),通常發生在開發者的程式碼變更影響了架構特性時
  • 不要忘記分析測試環境和發布流程

3. Keep Current with Latest Trends(跟上最新趨勢)#

  • 架構師的決策往往長期且難以更改,因此跟上技術趨勢有助於做出正確決策
  • 追蹤趨勢很難,第 24 章討論了具體的技巧與資源

4. Ensure Compliance with Decisions(確保決策被遵守)#

  • 持續驗證開發團隊是否遵循架構決策和設計原則
  • 不確保合規性,架構特性就無法被滿足,系統也無法如預期運作
  • 第 6 章介紹使用 automated fitness functions 來衡量合規性

5. Diverse Exposure and Experience(多元的技術接觸)#

  • 不需要精通每一種技術,但至少要熟悉多種技術
  • 重視技術廣度(technical breadth)而非技術深度(technical depth)
  • 例如:熟悉 10 種 caching 產品的優缺點,比精通其中 1 種更有價值

6. Have Business Domain Knowledge(具備業務領域知識)#

  • 沒有業務知識,就無法理解業務問題、目標和需求
  • 最成功的架構師擁有廣泛的技術知識加上特定領域的深厚理解
  • 這讓架構師能使用業務語言與 C-level 主管和業務使用者有效溝通

7. Possess Interpersonal Skills(具備人際技巧)#

  • 領導力至少佔成為有效架構師所需能力的一半
  • 架構師不僅要提供技術指導,還要帶領團隊完成架構的實作
  • 許多技術優秀但缺乏領導力的架構師,難以維持其職位

8. Understand and Navigate Politics(理解並應對政治)#

  • 架構師做的幾乎每個決策都會被挑戰 — 來自產品負責人、專案經理、業務利害關係人和開發者
  • 與開發者不同,架構師的決策影響範圍更廣,因此必須為每個決策辯護
  • 談判技巧極為關鍵,本書第 23 章專門討論

架構師的角色遠不只是技術能力。人際技巧、領導力、談判力和政治敏感度同樣重要,甚至更為關鍵。

架構的交叉領域(Intersection of Architecture and…)#

軟體架構的範圍在過去十年持續擴大,與組織其他部分的交集越來越多。

Engineering Practices(工程實踐)#

  • 區分 process(流程)和 engineering practices(工程實踐)很重要
    • Process — 團隊如何組建、會議如何進行、工作流程如何運作
    • Engineering practices — 與流程無關的可重複實踐,如 continuous integration、automated testing
  • 從 Extreme Programming(XP)到 Continuous Delivery 的演進,展示了工程實踐如何影響架構
  • Unknown unknowns(未知的未知)是軟體系統的天敵,這就是為什麼 “Big Design Up Front” 方法會失敗
  • 架構風格和工程實踐形成共生關係 — 例如 microservices 架構假設了自動化 machine provisioning、自動化測試和部署
  • Fitness functions(適應度函數)來自 Building Evolutionary Architectures 一書,是對架構特性的客觀完整性評估,透過 metrics、unit tests、monitors 和 chaos engineering 等機制實作

架構風格與工程實踐必須匹配。試圖在缺乏自動化的傳統運維團隊中建構 microservices 架構,會造成巨大的摩擦。

Figure 1.7: The architecture for a software system consists of both requirements and all the other architectural characteristics

Operations/DevOps#

  • 過去架構與運維的關係是契約式的,許多公司將運維外包
  • 舊有架構(如 ESB-driven SOA)被迫在架構內部處理 elastic scale 等運維關注點,導致架構更加複雜
  • Microservices 的建構者意識到這些運維關注點應由 operations 處理,因此架構師與運維人員合作創造了 microservices

Process(流程)#

  • 軟體架構大致上與開發流程正交,但流程會影響架構的許多面向
  • Agile 方法論支援迭代式開發,提供更快的回饋循環,適合架構的本質
  • 架構遷移(如從 monolithic 到更現代的架構)更適合 Agile 方法,搭配 Strangler Patternfeature toggles 等技巧

All architectures become iterative because of unknown unknowns, Agile just recognizes this and does it sooner. — Mark Richards

Data#

  • 程式碼與資料具有共生關係,兩者缺一不可
  • 許多架構書籍對資料著墨甚少,但本書在討論架構的運維面向和 architectural quantum(第 3 章)時,會將資料庫等外部儲存納入考量

軟體架構的定律(Laws of Software Architecture)#

作者提出兩條軟體架構定律:

First Law#

Everything in software architecture is a trade-off.

軟體架構中的一切都是取捨。架構師面對的每個決策都必須考量多個對立因素。

Corollary 1(推論一)If an architect thinks they have discovered something that isn’t a trade-off, more likely they just haven’t identified the trade-off yet.

如果你認為某個選擇沒有取捨,那很可能只是你還沒發現取捨在哪裡。

Second Law#

Why is more important than how.

「為什麼」比「怎麼做」更重要。架構師可以透過拓樸圖了解系統結構(how),但要理解為何做出特定選擇(why)則困難得多。本書全程強調架構師做出決策背後的 why 以及相關的取捨。