Logo
Published on

軟體設計不全然是軟體架構

在軟體開發的世界裡,許多開發者都嚮往著成為「架構師」這個頭銜。畢竟,誰不想擁有在跨領域決策上的權力、聲望與更高的薪資呢?但是,軟體設計真的等同於軟體架構嗎?技術教練 Emily Bache 在這支影片中明確指出軟體設計不是軟體架構,而且這是一件好事

讓我們一起來探討這個重要的觀點,以及如何讓我們的設計決策保持彈性和低成本

什麼是軟體架構?變更成本是關鍵

在深入探討設計與架構的差異前,我們需要先理解什麼是軟體架構。Emily Bache 引用了著名的軟體工程師 Grady Booch 的定義

架構代表著「影響系統的重大設計決策,其重要性以變更成本來衡量」

這個定義非常精準地點出了核心:架構關注的是那些「變更成本高昂」的決策。換句話說,一旦做出這些決定,日後要改變它們將需要付出巨大的代價

架構層面的決策包含

  • 系統結構選擇:採用分散式微服務還是單體架構
  • 平台選擇:部署在哪個雲端平台(AWS、Azure、GCP)
  • 資料處理方式:如何管理資料流和儲存
  • 交易管理:如何確保資料一致性
  • 工作流程編排:系統各部分如何協同運作

這些決策影響深遠,一旦確定後要變更往往需要大量的時間、人力和金錢投入

軟體設計在光譜的另一端

相對於架構,軟體設計關注的是變更成本較低的決策。這些決策通常涉及程式碼層面的具體細節

設計層面的決策包含

  • 方法的參數設計:一個函式應該接收哪些參數
  • 條件判斷:如何撰寫高效且可讀的 if-else 語句
  • 類別結構:如何組織類別之間的關係
  • 程式碼可讀性:如何讓程式碼更容易理解和維護

這些變更相對容易執行,不會對整個系統造成巨大的影響

設計與架構是一種連續光譜

重要的是,設計與架構並非二元對立,而是存在於一個連續的光譜上。兩者都涉及

  • 將業務需求映射到軟體
  • 識別良好的抽象概念
  • 與利害關係人溝通
  • 理解情境並做出明智的權衡

關鍵差異在於「影響範圍」和「變更成本」。我們的目標是將盡可能多的決策保持在「低變更成本」的設計範疇內,以提升系統的靈活性

保持設計決策低成本的三大關鍵

那麼,如何讓設計決策保持低成本和可逆轉呢?Emily Bache 提出了三個關鍵因素

1. 模組化(Modularity):管理複雜性的核心

模組化是一切的基礎。它涉及良好的抽象化和 API 設計,與以下概念緊密相關

  • 高內聚性(Cohesion):相關的功能應該集中在一起
  • 關注點分離(Separation of Concerns):不同的責任應該分開處理
  • 抽象化(Abstraction):隱藏實作細節,只暴露必要的介面
  • 鬆散耦合(Loose Coupling):減少元件之間的依賴關係

無論是在函式、類別、模組(設計層面),還是元件、服務(架構層面),良好的模組化都能讓程式碼的更新和變更變得更容易

模組化的好處

當我們擁有良好的模組化設計時,可以有效地

  • 推斷變更影響:清楚知道修改某個模組會影響到哪些部分
  • 最小化衝擊範圍:將變更的影響控制在最小範圍內
  • 安全地更新功能:有信心地進行修改,不用擔心破壞其他功能

2. 自動化測試(Automated Tests):讓決策可逆轉

自動化測試是讓決策變得可逆的關鍵。當我們進行程式碼修改時,測試可以迅速揭示變更對系統行為造成的影響

即使程式碼的模組化程度不高,充足的自動化測試也能

  • 快速回饋:立即知道變更是否破壞了現有功能
  • 明確影響範圍:清楚指出哪些行為受到了影響
  • 保障安全性:確保功能更新不會引入新的錯誤

在現代軟體開發中,自動化測試不僅是品質保證的工具,更是讓我們敢於重構和改進程式碼的安全網

3. 重構技能(Refactoring Skills):最重要的能力

Emily Bache 認為,重構技能是三者中最有趣且最重要的因素。這也是我最認同的觀點

為什麼重構如此重要

許多開發者和架構師抱怨他們的系統難以變更和更新。即使投資了「良好的架構」(如微服務、訊息佇列、事件監控等),但如果設計缺乏彈性,問題依然存在

常見的問題包含

  • 義大利麵式的依賴關係:模組或服務之間糾纏不清
  • 測試問題:測試速度慢、不穩定或過度依賴 mock
  • 高變更成本:即使是修改方法參數這種小事也變得困難

這就是所謂的「遺留程式碼(Legacy Code)」問題。在這種情況下,原本應該是設計層面的簡單變更,卻因為程式碼品質不佳而提升到了架構層面的變更成本

重構技能的價值

掌握重構技能意味著你能夠

  • 識別程式碼異味:發現程式碼中的問題徵兆
  • 安全地解決問題:使用確定性的重構手法,在不破壞行為的前提下改進程式碼
  • 提升模組化:改善程式碼結構,使其更易於理解和修改
  • 撰寫更好的測試:透過重構讓程式碼更容易測試
  • 降低變更成本:將架構層面的問題轉化為設計層面的簡單變更

重構在健康專案中的作用

重構不僅適用於遺留程式碼。在健康的專案中,持續的重構能夠

  • 保持設計靈活性:確保程式碼始終易於修改
  • 快速回應需求:當業務提出新需求時,能夠迅速調整
  • 抓住商業機會:將意外的需求視為簡單的設計變更,而非昂貴的架構調整

具備重構能力的團隊,能夠在面對變化時保持敏捷和創新

在 AI 時代,這些技能依然重要

看完這支影片後,我最大的感觸是:即使在 AI 輔助開發的時代,這三種技能依然非常重要

模組化思維是基礎

無論是人工撰寫程式碼還是使用 AI 產生程式碼,良好的模組化設計都是必要的。模組化思維幫助我們

  • 更好地下指令給 AI:清楚的模組邊界讓 AI 更容易理解我們的需求
  • 審查 AI 產生的程式碼:判斷 AI 的輸出是否符合良好的設計原則
  • 整合不同來源的程式碼:將 AI 產生的程式碼與既有系統整合

測試確保品質

當 AI 幫我們產生程式碼時,自動化測試變得更加重要

  • 驗證 AI 的輸出:確保 AI 產生的程式碼符合預期行為
  • 安全地迭代:在 AI 的協助下快速嘗試不同方案,測試確保我們不會破壞既有功能
  • 建立信任:透過測試建立對 AI 產生程式碼的信心

重構技能無可取代

重構技能是開發者的核心競爭力,因為它涉及

  • 判斷力:什麼時候該重構,什麼時候不該
  • 品質意識:如何識別程式碼異味
  • 系統思維:理解變更的影響範圍

這些能力需要經驗和直覺,目前還難以完全由 AI 取代

每個技能攤開來都可以深入探討,它們共同構成了優秀軟體開發者的能力基礎

結語:擁抱設計的靈活性

軟體設計與軟體架構的區別,核心在於「變更成本」。這種區分是有益的,因為它讓我們能夠

  • 保持彈性:大部分的決策都能以低成本變更
  • 快速回應:面對需求變化時能夠迅速調整
  • 持續改進:透過重構不斷優化設計

透過掌握模組化、自動化測試和重構技能,我們可以讓設計決策保持在低成本的範疇內。這不僅能產生更好的軟體,也能讓開發者的工作更有成就感

在這個充滿變化的時代,擁有靈活的設計能力,比追求完美的架構更為重要。讓我們專注於提升這三大核心技能,建立能夠適應變化的軟體系統


支持創作

如果這篇文章對您有幫助,歡迎透過 贊助連結 支持我持續創作優質內容。您的支持是我前進的動力


圖片來源:AI 產生