無究責事後檢討#
事故無法完全避免,但每次事故都是一次學習的機會——前提是團隊敢於誠實面對。無究責事後檢討(Blameless Postmortem)的核心信念是:事故的根因是系統與流程的缺陷,而非某個人的失誤。本章談何時該寫、blameless 的信條、流程與如何把它變成團隊文化。事故當下的告警與升級流程見 16 On-Call 與告警設計。
何時該寫 Postmortem#
不是每件事都要寫,但符合以下條件之一時,應該寫:
- 使用者可感知的服務中斷或降級,超過約定門檻。
- 任何資料遺失。
- 需要人工介入才能恢復的事故(例如手動回滾、緊急切換)。
- 解決時間超過門檻的事故。
- 監控失效,導致問題是被人發現而非被系統發現。
事先用明確的觸發條件定義「哪些事故必須寫 postmortem」,避免事後爭論「這次要不要寫」。寫不寫不該取決於事故有沒有上頭關注,而取決於它是否符合預設門檻。
Blameless 信條#
無究責的根本主張:人會犯錯,因為系統允許他們犯錯。 與其追問「是誰按錯了按鈕」,不如追問「為什麼系統讓一次按錯就釀成災難」。
- 假設每個當事人在當下、以其掌握的資訊與動機,都做出了合理的判斷。
- 把焦點放在系統性因素:缺乏防呆、文件過時、告警缺失、流程模糊、工具危險。
- 目標是修復「讓錯誤得以發生並擴大的環境」,而不是懲罰犯錯的人。
究責文化會讓人隱瞞錯誤、粉飾細節,反而讓真正的根因永遠藏在暗處——於是同樣的事故換個人再來一次。無究責不是「不負責」,而是把責任從「找戰犯」轉移到「修系統」。
究責 vs 無究責#
| 維度 | 究責文化(Blameful) | 無究責文化(Blameless) |
|---|---|---|
| 根因歸屬 | 某個人的失誤 | 系統與流程的缺陷 |
| 提問方式 | 「是誰造成的?」 | 「為什麼系統允許它發生?」 |
| 當事人反應 | 隱瞞、推諉、防衛 | 坦誠、主動揭露細節 |
| 學習效果 | 細節失真,學不到真因 | 取得完整事實,得以修復根因 |
| 長期結果 | 同類事故反覆發生 | 系統逐步加固,事故率下降 |
| 心理安全 | 低,人人自危 | 高,敢於承認與分享 |
事後檢討流程#
flowchart TD
A[事故發生並恢復] --> B[指定撰寫負責人]
B --> C[蒐集事實<br/>時間線 / 監控 / 日誌 / 對話記錄]
C --> D[撰寫初稿<br/>影響 / 時間線 / 根因 / 行動項]
D --> E[同儕審查<br/>檢查是否客觀、無究責、可行動]
E --> F[公開分享<br/>全團隊可見]
F --> G[追蹤行動項至關閉]
G --> H[歸檔成為組織知識]- 蒐集:盡可能還原客觀事實——時間線、監控曲線、日誌、聊天記錄、操作命令。事實先於評斷。
- 審查:由未直接涉入的同儕審查,確認措辭客觀、不指名究責、且每個行動項都具體可執行。
- 分享:postmortem 必須公開可見,讓整個組織都能從中學習——藏起來的教訓等於沒有教訓。
- 追蹤:行動項要有負責人與期限,並追蹤到關閉,否則 postmortem 淪為一份沒人讀的文件。
Postmortem 模板#
title: "結帳服務 P1 中斷"
date: 2026-06-20
status: resolved # draft / in-review / resolved
authors: [oncall-primary]
severity: P1
summary: >
一行話講清楚發生了什麼、影響了誰、持續多久。
impact:
duration: "37 分鐘"
users_affected: "約 12% 結帳請求失敗"
slo_impact: "消耗約 60% 當月 availability error budget"
timeline: # 以 UTC 記錄,越精確越好
- "14:02 部署 v2.3.0 上線"
- "14:05 結帳錯誤率開始上升"
- "14:11 告警觸發,主值班介入"
- "14:24 確認為連線池耗盡,開始回滾"
- "14:39 回滾完成,錯誤率恢復正常"
root_cause: >
系統性描述:新版本將連線池上限誤設為舊值的 1/10,
且部署前的負載測試未覆蓋此組態,CI 也無組態校驗。
# 五個為什麼 / 觸發鏈,聚焦系統而非個人
contributing_factors:
- "連線池組態缺乏校驗與預設安全值"
- "負載測試未覆蓋此路徑"
- "Canary 階段未設定連線池相關告警"
what_went_well:
- "告警在 6 分鐘內觸發"
- "回滾流程順暢,無資料遺失"
action_items:
- {
action: "為連線池組態加入 CI 校驗與下限",
owner: platform,
due: 2026-07-04,
ticket: INFRA-1234,
}
- {
action: "負載測試補上結帳高併發情境",
owner: checkout,
due: 2026-07-11,
ticket: CHK-567,
}
- {
action: "Canary 增加連線池飽和度告警",
owner: sre,
due: 2026-06-30,
ticket: SRE-890,
}
lessons_learned: >
組態變更和程式碼變更一樣危險,卻常缺乏同等的測試與守門。文化導入#
光有模板不夠,無究責是一種需要刻意培養的文化:
- 由上而下示範:資深成員主動為自己參與的事故寫 postmortem、坦承判斷失誤,讓團隊看到「承認錯誤是安全的」。
- 公開表揚而非懲罰:表揚誠實揭露問題的人,而非追究犯錯的人;讓「找到一個系統缺陷」成為值得慶祝的事。
- 災難輪盤(Wheel of Misfortune):定期舉辦的角色扮演演練——隨機抽出一個過往或假想的事故,讓成員扮演當班者,即時推演如何診斷與應對。這既訓練應變能力,也讓新人在低風險環境中熟悉系統與流程。
- 把 postmortem 變成資產:建立可檢索的事故庫,讓新事故能參考舊教訓,避免重蹈覆轍。
災難輪盤(Wheel of Misfortune)怎麼跑
一場典型的災難輪盤演練:
- 出題:主持人挑一個真實或虛構的故障情境,準備好對應的監控畫面與系統回應。
- 抽人:隨機指定一名成員擔任「當班工程師」,其餘人觀摩。
- 推演:當班者像真實值班一樣下指令、查監控、做決策;主持人扮演系統,回應其操作的後果。
- 覆盤:演練後全體討論——哪裡判斷得好、哪裡有更快的路徑、文件與工具是否夠用。
它的價值不在「考倒誰」,而在於用安全的方式暴露知識落差與流程缺口,讓團隊在真正事故來臨前就練過手。
小結#
- 事先用明確門檻定義哪些事故必須寫 postmortem,避免事後爭論。
- Blameless 的核心是「人會犯錯因為系統允許」,把責任從找戰犯轉向修系統。
- 流程是蒐集事實 ➡️ 同儕審查 ➡️ 公開分享 ➡️ 追蹤行動項至關閉。
- 無究責是需要刻意培養的文化,靠由上而下示範與災難輪盤等演練落地。