专业书籍精读 · SRE · 第 33 章
Site Reliability Engineering · Ch 33 · Google · 2016
你坐过飞机、进过手术室,也可能住在离核电站不远的地方。这些行业有个共同点:出一次事就要命。它们为此摸索了上百年,把「怎么别出事」做成了一门手艺。这一章干的事很简单:把这些做法摊在桌上,看软件能抄哪几招、哪几招抄不了。
游泳池的救生员每隔十几分钟就要换一个位置。不是因为累——他们坐着不动。换岗是因为一个很朴素的发现:盯着同一片水面看久了,人会「看着却看不见」。而溺水的人往往不喊不扑腾,就那么安静地沉下去。
请注意这里的思路:它没有要求救生员更专心一点。它把「人一定会走神」当成一条设计条件,然后围着这条条件排班表。
软件是个很年轻的行业,年轻的代价是没有师父。飞行和发电的每一条规矩,背后都压着一次真实的伤亡,而这些教训被写成了全行业都得照做的规程——你不用亲自摔,也能拿到别人摔出来的经验。
软件这边不是这样:每家公司自己摔一遍,摔完还把过程当机密。同一个坑在几千家公司里被重新挖了几千次。
把这些行业的做法拢一拢,剩下四件事:
其一,把灾难提前排练成日常。潜艇上天天演习,而且演习被故意设计得比真事更难;等真出事那天,身体已经先于脑子知道该干什么。
其二,出事之后只问「什么条件让这事成为可能」,不问「谁干的」。这不是宽容,是算计:你想知道真相,唯一的来源就是当事人的嘴——一旦开始罚说真话的人,嘴就闭上了。航空业干得最绝:事故报告交给一个跟监管方无关的第三方,让监管方拿不到它去罚人。
其三,把重复的活交给机器,但故意留一部分让人手动做。这一条最反直觉:自动化太好用的时候,人会慢慢不会做了;而机器搞不定的那些罕见场景,偏偏最需要一双熟练的手。航空业为这件事付过昂贵的学费。
其四,拍板按数据和事先写好的规则,不按谁资历深。事故当场不是发明流程的时候,谁说了算必须在出事前定死。
软件行业其实一直在抄,只是很多人不知道自己在抄:值班、演练、复盘、事故指挥官,一样都不是软件发明的。反过来,软件手里有两张别人没有的好牌——坏了通常几分钟就能改回来,而且通常不会死人。正因为有这两张牌,软件才敢用「允许出一点错」这种工具。
代价也很实在:坏了能马上改,久而久之就养成了「先上线再说」的习惯;而当软件开始管方向盘和输液泵,这个习惯就不够用了。
那些出事要命的行业,靠的不是让人更小心,而是把「人一定会走神、一定会出错」当成设计条件:平时排练灾难、出事只追条件不追人、把重复的交给机器又故意留活给人、拍板按事先写好的规则。软件能抄这些,但抄不走「允许出点错」——它的前提是失败可逆、且不致命。
想看四个主题的具体机制、五个行业的对照表和示意图? → 切到精读版
这一章的核心命题是:SRE 的那套做法,几乎没有一样是软件发明的。作者访谈了一批从核电、民航、铁路信号、电信、制造、金融乃至游泳池救生转行进 Google 的工程师,抽出四个跨行业共通的主题——准备度与灾难演练、复盘文化、自动化、结构化决策。真正值钱的是那条反向结论:软件独有的两个条件是「失败通常可逆」与「失败通常不致命」,正因如此它才敢用错误预算这种明确「允许出错」的工具——而这一条别的行业永远抄不走。
1 − SLO 那一截允许出错的额度(见 Ch3);有余额就继续发版,烧光就冻结。99.999% 可用性,一年只准不可用约 5 分钟——电信行业的传统标杆。本章是 SRE 全书 Part V「结语」的第一章,也是全书唯一一章把视线从 Google 内部移开:前面三十多章都在讲「我们怎么做」,这一章问「别人怎么做、我们凭什么以为自己对」。上承 Part IV(SRE 的组织与协作),下启 Ch34 结语。对应现实里那些制度化了几十年的东西:功能安全标准(IEC 61508、ISO 26262)、航空的机组资源管理与匿名报告制度、医疗的手术核对表。
一个很不舒服的问题:SRE 这套东西是普适的工程原理,还是 Google 一家公司在这一个时代凑出来的局部解?
这个问题没法在 Google 内部自证:只有一家公司的样本,任何「我们这么干很有效」都可能只是活得久的那批做法在自我夸奖。想验证只有一条路——去找赌注比你大得多、且已经赌了上百年的行业:它们独立长出同样的做法,这就更可能是原理;它们的做法和你相反,就该问自己凭什么例外。
赌注的量级差距值得摆明白:一次 Web 服务的全球故障影响几亿人、烧掉一大笔钱、上头条——但几乎不会有人因此死亡;一次客机操纵失误死几百人;一次堆芯事故以几十年和几百平方公里计。同一个词「可靠性」,两边不是一个量级。
不解决会怎样?软件业会一直用「我们不一样」当免检理由——而随着代码开始控制方向盘、输液泵和电网,这条理由正在快速过期。
对安全的组织级关注。核电与铁路信号业的做法是:开动前先交一份安全案例,正面论证「为什么这东西不会伤人」,且由独立方来审。狠处在于举证责任的方向:不是「你找不出问题就能开」,而是「你论证不出安全就不能开」。软件里最接近的是生产就绪评审(Ch27),但默认方向仍是前者。
对细节的洁癖。核潜艇的操作纪律远超软件行业的想象:每次阀门动作留痕、交班逐条口头交接、口令重复回读。背后是一条简单机制——没写下来的等于没发生。落到软件:事故时间线、变更记录、交接笔记,价值不在「事后可查」,而在写的那一刻迫使你把事情想清楚一遍。
把「人会失效」放进排班表。救生员的换岗制度是全章最漂亮的例子:它不要求人更专注,而是承认注意力会衰减,用轮换去兑。第二条规则同样值钱:怀疑有人出事就立刻下水,猜错没有任何惩罚——把误报成本压到零,换漏报趋近于零。软件的对应是「宁可早升级、早叫人」,它和 Ch6「告警不许有噪声」之间有真实张力:自动告警要压误报,人的判断要鼓励误报——不矛盾,前者烧的是注意力预算,后者只烧一次尴尬。
排练灾难。高危行业的演习有两个共同特征:高频,以及被故意设计得比真实更难。
DiRT 最该被抄走的不是「断机房」,而是它的交战规则。还有一个很少有人敢做的变种——把人也断掉:临时「禁用」那个装着未成文知识的老手,看团队还转不转。这是唯一能测出「知识有没有真落到文档里」的办法。
无指责复盘在软件圈已是共识(Ch15),本章的价值在于告诉你别的行业把它制度化到了什么程度。
民航业的做法是把收集渠道从监管者手里拿走:飞行员把差错报给一个与监管执法无关的第三方,去标识化后只用于分析与发布。这比「我们团队文化很包容」硬得多——它不依赖任何人的善意,而是把「说真话会被罚」这条通路从结构上切断了。
医疗业提供了反面对照:长期的指责文化让不良事件被系统性低报,而低报意味着连「到底有多少」都不知道,改进无从下手。
软件业在这个主题上明显落后,落后的不是公司内部而是跨公司:民航的事故调查报告全行业都会读,软件业的复盘基本止步于公司边界。这是本章照出来的最刺眼的一块空白。
制造业那一侧的教训是正向的:把重复动作标准化再自动化,同时用统计方法盯住过程波动——跟 Ch5「消除琐务」是同一件事。
但本章给了一个非常反直觉的反向教训:核海军刻意不把能自动化的都自动化。第一层理由是手感:操作员几年不亲手做,真需要他做的那天就做不好了。第二层更隐蔽——情境意识:亲手操作的人对系统状态有一份活的心智模型,只盯仪表盘的人往往要到偏离很大时才察觉。
民航业为这件事付过昂贵学费。自动飞行让日常巡航极其安全,却造成一个结构性问题:自动化会在它搞不定的时候退出,而它搞不定的场景恰恰是最难飞的——最难的活被交到了因常年不练而最不熟练的手上。法航 447 号班机(2009,228 人遇难)就是这样:空速管结冰导致自动驾驶退出,机组在失速告警下持续拉杆。这个案例不是书里的,是本章主张在公开事故报告里的印证(法国 BEA 最终报告,2012)。
所以判据很明确:自动化该吃掉「频繁且已知」的,不该独吞「罕见且需要判断」的。后者不仅要把人留在回路里,还要给人练习的机会——这就绕回了主题一。
高危行业的决策有三个共同特征:基于数据而非直觉、留痕可复查、升级路径事先定死。制造业那套「先定义问题、再测量、再分析、再改、再控住」的流程,本质就是把「拍板」这件事从个人能力变成可审计的步骤。
软件里最好的两个对应物本书前面都讲过,只是没点明它们是同一类东西:SLO 把「这版还能不能发」变成可以算出来的判据(Ch3、Ch4),事故指挥体系把「谁说了算」在出事之前定死。共同点是把判断从事故当场搬到事故之前——当场的人,肾上腺素和信息都不在正常水平。
反面案例太常见:把「资深工程师的直觉」当唯一决策依据。它在常见场景下又快又准,但直觉长在历史样本上,而罕见场景正是历史样本最稀薄的地方——直觉最容易失灵的时刻,恰好是你最依赖它的时刻。
这一章不是让你把核电的规程搬进软件。真正的选型问题是:你在「失败代价」和「变更速率」这两根轴上落在哪里?位置不同,可用的手段完全不同。
表 1 · 五个行业的可靠性配方:能搬走的一条、搬不走的一条
| 行业 | 主要手段 | 能搬进软件的 | 搬不走的 |
|---|---|---|---|
| 核电 | 安全案例 + 多层独立防线 + 高频演习 | 举证责任反转:论证不出安全就不许开 | 设计能冻结几十年 |
| 民航 | 核对清单、机组资源管理、第三方匿名报告 | 报告渠道与处罚权分开 | 执照与强制规程 |
| 医疗 | 核对清单、复盘(长期受指责文化拖累) | 一张纸也能救命 | 每个「系统」都不一样 |
| 电信 · 铁路 | 形式化验证、99.999% 标杆、冗余 | 关键路径值得上形式化方法 | 协议几十年不变才撑得起验证 |
| Web 服务 | SLO、错误预算、金丝雀、快速回滚 | —— | 两张好牌:可逆 + 不致命 |
第二个权衡:什么时候照章执行,什么时候允许即兴?高危行业压倒性偏向前者,软件不能照抄——软件的故障有相当一部分前所未见,对前所未见的东西照章执行只会把它做错得更整齐。
表 2 · 照章执行 vs 即兴处置:按「这事见过没有」分,而不是按重要性分
| 场景 | 该用哪种 | 为什么 | 代价 |
|---|---|---|---|
| 已知故障,有 playbook | 严格照章 | 凌晨三点的判断力不如写好的步骤 | playbook 会过期,照章钝化思考 |
| 前所未见的故障 | 角色照章,动作即兴 | 没步骤可照;但「谁说了算」必须照章 | 严重依赖当班人的水平 |
| 高频低危变更 | 交给自动化 | 频繁且已知,机器的主场 | 人会失去这条路径的手感 |
| 罕见高危操作(切主、恢复数据) | 照章 + 双人确认 + 演练 | 罕见意味着没人有手感 | 演练有成本,还可能真搞坏生产 |
本章的实证价值在于:软件业最引以为傲的几件事,来源都是可查的。事故指挥官来自消防与应急救援;发布检查单的祖宗是飞行前检查单;无指责复盘的制度化原型在民航;Chaos Monkey 与 DiRT 是「排练灾难」这条老规矩的软件实现。好处很实际:卡在某个环节时,直接去那个行业查它们是怎么过去的。
1.5% 降到 0.8%、并发症从 11% 降到 7%——一张纸、几乎零成本。这是「检查单不是官僚主义」最有力的外部证据。Haynes 等,《新英格兰医学杂志》,2009(未取到可核实链接,故只留文字出处)① 核心命题:SRE 的做法几乎没有一样是软件发明的;五个互不相干的高危行业独立收敛到同样四个主题,这才让它们像原理而不像习惯。
② 四个主题:准备度与灾难演练、无指责复盘、自动化、结构化决策;分量最重的是第一个。
③ 准备度的内核是把「人会走神、会出错」当成设计条件:救生员靠换岗兑掉注意力衰减,靠「误报零惩罚」把漏报压到近零。
④ 核电与铁路的举证责任是反的:论证不出安全就不许开;软件的生产就绪评审是同一招的弱化版。
⑤ 演练的两条交战规则最该抄:真事故优先于演练、每个演练自带回滚方案;狠一点的变种是把「装着未成文知识的那个人」也断掉。
⑥ 无指责的制度化形态是把报告渠道和处罚权分开(民航的第三方匿名报告),比靠团队文化硬得多;软件业最大的空白是跨公司不共享。
⑦ 自动化的判据:吃掉「频繁且已知」,别独吞「罕见且需判断」;结构化决策则是把判断从事故当场搬到事故之前(SLO、指挥角色)。
⑧ 搬不走的那一件是错误预算——前提是失败可逆且不致命。软件正快速搬进「高代价 + 高变更速率」这个新象限,而本章写作时那里还几乎没人。