Skip to content
All writing Part 09 of 09 · 一次 Golang 版本升級的連鎖反應
Engineering · 1 min read

在教訓褪色前,把它寫成規則

八個除錯教訓如果只留在某人腦袋裡,等於沒學到。我們把它們提煉成 code review 原則,更新到 plugin 裡。

八篇文章,一場連鎖反應。事後看來教訓很清楚,但事後的清醒會褪色。半年後,下一個要升依賴版本的人不會記得這個故事。他們會走跟我們一樣的路:信任測試、釘版、跳過 EOL(End of Life,官方停止維護)檢查。

解法不是「記住教訓」,而是把教訓變成自動觸發的檢查點,在 PR 合併前就攔住。

學到的,壓縮版

  1. 版本升級會連鎖。 升語言版本會移動 base image,base image 移動系統函式庫。go.mod 裡的一行動了三層(總覽)。
  2. 手動拼湊之前先查矩陣。 你要的組合通常已經發布了(查 tag 矩陣)。
  3. graft 是解決真實缺口,不是猜測的。 先驗證需求再堆複雜度(graft)。
  4. 逐層下降隔離時,也要變動輸入。 逐層下降走程式碼軸,輸入變異走另一軸(逐層下降)。
  5. 被污染的 oracle 會反轉你的診斷。 嚴謹用在壞測試上只會更有信心地確認錯誤(oracle)。
  6. 符合規格的最佳化看起來像 bug。 GIF 編碼器合併相同影格不是回歸(regression:更新後壞掉的行為)(GIF 編碼器)。
  7. 測試結果是關於輸入的事實,不是關於系統的。 做結構性決策前,先用生產形態的輸入重新驗證(FACT)。
  8. 「最後已知好」可能等於 EOL。 落在 EOL 上的釘版,用真實的安全修補換了一個不存在的修正(釘版EOL)。

從教訓到 review 原則

我們把這些提煉成具體的 code review 檢查點,更新到 code-reviewer plugin(版本 1.0.0 → 1.1.0)。這次更新新增了:

  • 依賴連鎖感知 — 一次版本升級有沒有連帶動到隱式的下游依賴?
  • 測試輸入有效性 — 測試用的是生產形態的輸入,還是可能遮蔽或反轉真實行為的人造資料?
  • 釘版衛生 — 版本 pin 有沒有退場計畫,釘住的目標還在支援中嗎?
  • EOL 偵測 — base image 或依賴的分支還在收安全修補嗎?

這些不是格式檢查。這是結構性的問題,用來防止團隊花好幾天除錯一個不存在的問題。

一次事件的教訓有價值。但能撐過事件、變成 review 原則的東西,才是真正能防住下一次的。


Related: 回到連鎖反應總覽

Tags #devops #debugging #code-review
// connect

Be brave | Be wise | Be grateful

21 BreakinCode

// elsewhere
LinkedInMedium (lang: en)Youtube
wh:~$William Hung· © 2026 Taipei · GMT+8 · Available for collaboration