Balance Quality with Pragmatism

Balance Quality with Pragmatism #

品質與實用的辯證 #

程式碼品質(Code Quality)歸根究柢是場關於權衡(Trade-offs)的賽局,並沒有一條放諸四海皆準的通用法則。

Effective 工程師面對決策時,不應糾結於抽象的「對錯(Right or Wrong)」, 而應將思維轉向判斷該方案在當前情境下是「行得通還是行不通(Work and doesn’t work)」。 在此前提下,我們透過以下四個面向來落實這項原則。


1. 建立可持續的程式碼審查機制 #

建立 Code Review 流程不僅是為了把關,更是團隊成長的基石。其具體效益包含:

價值維度核心功能對團隊的長遠影響連結的思維模型
品質門神提早發現錯誤降低生產環境的修復成本,避免設計短視P95 效能優化:減少極端 Bug 對使用者的衝擊
行為約束提升責任感開發者會自發性地重構,不留下 Dirty Mess守 (Shu):在被檢視的壓力下,維持基本的開發規範與紀律
技術傳承樹立典範透過 Feedback 分享 Best Practices轉化 (Transform):將個人的高階技巧轉化為團隊的共同資產
系統韌性共享知識消除資訊孤島 (Silos),確保 Bus Factor 大於 1低耦合 (Decoupling):讓工作內容不與特定個人過度耦合
速度紅利長期敏捷性易讀、易改的程式碼,是維持開發速度的基石人工時間優化:減少後人理解程式碼的認知負荷

根據 2008 年一項針對 650 家公司、12,500 個專案的研究發現,經過設計與程式碼審查的流程,平均能移除 85% 的殘留錯誤。


2. 透過抽象化管理複雜度 #

選對抽象層(Abstraction),程式設計會優雅高效;選錯了,則會變成一連串災難。錯誤介面會因被迫適應預期外互動而臃腫笨重。

正確抽象化能透過以下方式提升生產力(甚至可達數量級的提升):

  1. 簡化問題:將原本複雜問題拆解為易理解的基本元素(Primitives)。 例如許多複雜的數據處理問題,都可被簡化為一連串的 Map 與 Reduce 轉換
  2. 提升維護性:解決硬核問題一次,便能讓解法重複使用多次
  3. 落實 DRY 原則:良好抽象將複雜細節統一封裝(Consolidate),每次的重複使用都在攤提開發成本
什麼是好的抽象化?

建立通用的解決方案雖然比解決特定問題耗時,但一個好的抽象化應具備以下特質:

  • 易於學習 (Easy to learn)

  • 易於使用 (Easy to use):即便沒有文件也能憑直覺使用

  • 難以誤用 (Hard to misuse):設計上應避免使用者輕易犯錯

  • 功能強大 (Sufficiently powerful):足以滿足需求

  • 易於擴充 (Easy to extend)

  • 受眾合適 (Appropriate to the audience)


3. 自動化測試 #

隨著新功能的開發,錯誤率(Error Rate)往往會飆升。自動化測試(Automated Testing) 是建立信心的關鍵。

  • 信心來源:為修復的 Bug 撰寫測試,確保該問題在合併到主分支後永遠不會再重現
  • 對抗恐懼:消除人們「不敢修改程式碼」的恐懼文化。沒有測試保護,問題往往要很久才會被發現,且常被錯誤歸因於功能擁有者,而非始作俑者
  • 誰該寫測試?:應由程式碼作者撰寫,而非讓幾個月後試圖修改的人補償

面對無測試專案的策略: 若你需要接手一個完全沒有測試的專案,不要試圖一次補完。請從 「最有價值(Most Valuable)」 的部分開始寫測試,然後由此延伸。


4. 償還技術債 #

技術債(Technical Debt) 指的是那些為了讓軟體維持健康與品質,卻被推遲的必要工作。

值得注意的是,技術債不一定源於草率的權宜之計(Quick and dirty workarounds)。 很多時候,當我們尚未完全理解問題全貌時就編寫軟體,初版設計往往不夠乾淨,這也是種技術債。

償還策略:高槓桿原則 #

技術債難以量化,且並非所有債務都值得償還。如果把所有資源都拿來還債,你將無暇開發新事物。 Effective 工程師會專注於 高槓桿(Highest Leverage) 的債務:

程式碼中「高流量(Highly Trafficked)」,且修復成本最低(Takes the least time)的部分。這些改進能帶來最高效益。


重點摘要 (Key Takeaways) #

  1. 建立審查文化:Code Review 不僅除錯,更是推廣優良編碼規範的模範
  2. 投資抽象化:好的抽象化能一勞永逸地解決困難問題,大幅提升使用者生產力
  3. 自動化測試擴展品質:單元與整合測試能減緩修改脆弱代碼的恐懼。優先撰寫能省下最多時間的測試
  4. 管理技術債:不要盲目還債。專注那些利息最高(影響範圍最大)的債務