- 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 產生
