It’s tough to make predictions, especially about the future.

— Lawrence “Yogi” Berra, after a Danish Proverb

核心概念#

深夜、漆黑、傾盆大雨。一輛雙人座跑車在蜿蜒的山路上疾馳,勉強抓住彎道。一個急彎出現了,車子錯過了它,衝破了單薄的護欄,在山谷中化為一團烈焰。州警到達現場,資深警官悲傷地搖搖頭。「一定是跑得比車頭燈還快了。」

車頭燈有一定的有限範圍,稱為投射距離。超過那個距離,光線太分散而無法有效照明。此外,車頭燈只能直線投射,不會照亮彎道、山丘或道路中的凹陷。根據美國國家公路交通安全管理局的資料,近光燈平均照明距離約 160 英尺。但是在時速 40 英里時停車距離是 189 英尺,時速 70 英里時高達 464 英尺。所以實際上,超過車頭燈的照明範圍是相當容易的。

在軟體開發中,我們的「車頭燈」同樣有限。我們無法看太遠的未來,而且越偏離直線方向看,就越黑暗。

Tip 42 - Take Small Steps – Always(永遠採取小步驟)

永遠採取小而謹慎的步驟,在繼續前進之前檢查回饋並調整。把回饋的速率視為你的速度限制。你永遠不要承擔一個「太大」的步驟或任務。

什麼是回饋?#

任何能獨立確認或否定你的行動的東西。例如:

  • REPL 中的結果提供你對 API 和演算法理解的回饋
  • 單元測試提供你上次程式碼改動的回饋
  • 使用者展示和對話提供功能和可用性的回饋

什麼是太大的任務?#

任何需要「算命」的任務。就像車頭燈的投射距離有限,我們只能看到未來一到兩步——也許幾個小時或幾天。超過那個範圍,你就從有根據的猜測快速進入瘋狂的推測。你可能在以下情況中滑入了「算命」:

  • 估計幾個月後的完成日期
  • 為未來的維護或擴展性做設計
  • 猜測使用者未來的需求
  • 猜測未來的技術可用性

Tip 43 - Avoid Fortune-Telling(避免算命)

設計可替換的程式碼#

但是,我們不是應該為未來的維護做設計嗎?是的,但只到一定程度:只到你能看見的範圍。你越需要預測未來會是什麼樣子,你出錯的風險就越大。

與其浪費精力為不確定的未來做設計,你可以退而設計可替換的程式碼。讓你的程式碼容易被丟棄並用更好的東西取代。讓程式碼可替換也有助於內聚、耦合和 DRY,導向更好的整體設計。

即使你對未來感到有信心,彎道後面總是可能有黑天鵝。

黑天鵝#

在 Nassim Nicholas Taleb 的書 The Black Swan 中,他提出歷史上所有重大事件都來自高度矚目、難以預測的稀有事件。這些離群值雖然統計上罕見,卻有不成比例的影響。此外,我們自身的認知偏見傾向於讓我們忽視在工作邊緣悄悄出現的變化。

在第一版 The Pragmatic Programmer 出版的年代,電腦雜誌和網路論壇激烈討論:「誰會贏得桌面 GUI 大戰?Motif 還是 OpenLook?」這是個錯誤的問題。你可能從來沒聽過這些技術——兩者都沒有「贏」,以瀏覽器為中心的網路迅速主宰了整個局面。

大多數時候,明天看起來很像今天。但別指望它。

相關章節#

  • Topic 12,曳光彈
  • Topic 13,原型與便利貼
  • Topic 40,重構
  • Topic 41,為程式碼而測試
  • Topic 48,敏捷的本質
  • Topic 50,椰子不能用來砍東西