Nothing is more dangerous than an idea if it’s the only one you have.

— Emil-Auguste Chartier (Alain), Propos sur la religion, 1938

核心概念#

工程師偏好簡單、單一的解決方案。管理層也傾向認同工程師——單一、簡單的答案可以整齊地放入試算表和專案計畫中。

但現實世界不會配合!今天的東西可能明天就需要變成另一回事。沒有東西是永恆的——如果你過度依賴某個事實,你幾乎可以保證它改變。

關鍵決策的不可逆性#

每個關鍵決策都讓專案團隊承諾走向一個更小的目標——一個選項更少的更窄版本的現實。到了許多關鍵決策已做出的時候,目標變得如此之小,任何風吹草動都可能讓你偏離很遠。

問題在於,關鍵決策不容易逆轉。一旦你決定使用某個廠商的資料庫、某種架構模式、或某種部署模型,你就承諾了一條難以回頭的路。

可逆性#

本書中的許多主題都在於產出靈活、可適應的軟體。透過遵循建議——特別是 DRY 原則、解耦和使用外部配置——我們不需要做那麼多不可逆的關鍵決策。

Tip 18 - There Are No Final Decisions(沒有最終決定)

實際案例#

假設你在專案早期決定使用廠商 A 的關聯式資料庫,但後來在效能測試中發現它太慢了。如果你真的把資料庫的概念抽象化——到了它只是提供持久化服務的程度——那麼你就有了中途換馬的彈性。

同樣,假設專案以瀏覽器應用程式開始,但行銷部門後來決定他們真正想要的是行動 app。在理想世界中,至少在伺服器端,這不應該太大的影響。

靈活的架構#

不只是程式碼需要保持靈活,架構、部署和廠商整合方面也需要維持彈性。

自世紀之交以來的「最佳實踐」伺服器端架構不斷變化:大型主機 -> 聯邦式大型主機 -> 負載平衡叢集 -> 雲端虛擬機 -> 雲端服務 -> 容器化 -> 無伺服器…

錯誤在於假設任何決定都是刻在石頭上的。不要把決定想成刻在石頭上,要把它們想成寫在沙灘上的——大浪隨時可能把它們沖走。

你能做的是讓它容易修改:

  • 將第三方 API 隱藏在你自己的抽象層之後
  • 將程式碼拆分成元件
  • 即使最後部署在單一伺服器上,拆分的方式也比拆分一個單體應用容易得多

Tip 19 - Forgo Following Fads(放棄追隨潮流)

沒有人知道未來會怎樣。讓你的程式碼能搖滾——能順勢而為,也能承受打擊。

相關章節#

  • Topic 8,優秀設計的精髓
  • Topic 10,正交性
  • Topic 19,版本控制
  • Topic 28,解耦
  • Topic 45,需求之坑
  • Topic 51,務實的入門套件