article.read --id=199

代码命名的哲学:好名字胜过好注释

// published: 2025-08-30

线上事故,是每个工程师都不愿面对却又无法避免的现实。无论系统设计得多么完善,测试做得多么充分,总会有意外发生。服务器会宕机,网络会中断,代码会有bug,人会犯错。事故本身不可怕,可怕的是从事故中学不到教训,让同样的错误重复发生。事故复盘,就是将危机转化为机遇的过程,是团队成熟的标志。

让我们理解事故复盘的价值。事故发生后,团队的第一反应往往是"赶紧修复",修复后就松了一口气,继续投入下一个项目。但这样做会错过宝贵的学习机会。事故复盘的目的不是追究责任、不是指责个人,而是系统性地分析问题的根本原因,找出可以改进的地方,防止类似问题再次发生。好的事故复盘应该回答几个问题:发生了什么(事故的时间线)?为什么会发生(根本原因分析)?影响有多大(受影响的用户数、持续时间、业务损失)?我们做了什么(应急响应过程)?我们学到了什么(经验教训)?我们将如何改进(行动计划)?事故复盘应该在事故解决后尽快进行,趁记忆还清晰,通常在事故解决后的1-3天内。参与者应该包括所有相关人员:开发、运维、产品、客户支持等,每个角色都有不同的视角,能够提供不同的信息。复盘会议应该是安全的、无责备的,鼓励大家坦诚地分享信息,而不是互相指责或推卸责任。只有在安全的环境中,人们才会说出真相,才能找到真正的问题。

案例分析:Google的SRE(Site Reliability Engineering)团队建立了业界最成熟的事故复盘文化。在Google,每次重大事故后都会写一份详细的Postmortem文档,这不是可选的,而是必须的。Postmortem文档有标准的模板,包括事故摘要、影响范围、时间线、根本原因、行动项等部分。事故摘要用一两句话描述事故的本质,让读者快速了解发生了什么。影响范围包括受影响的用户数、持续时间、业务损失等,用数据量化事故的严重程度。时间线部分详细记录了事故从发生到解决的每一个关键节点,包括何时发现、何时响应、何时定位、何时修复、何时恢复。这个时间线不仅帮助理解事故的演进过程,也能发现响应流程中的问题。比如从发现到响应花了30分钟,说明监控告警可能不够及时;从定位到修复花了2小时,说明问题定位工具可能不够完善。根本原因分析使用"五个为什么"技术:不断追问"为什么",直到找到根本原因。比如"服务宕机了"→"为什么?因为内存溢出"→"为什么?因为有内存泄漏"→"为什么?因为某个对象没有正确释放"→"为什么?因为代码中缺少finally块"→"为什么?因为代码审查没有发现这个问题"。通过这个过程,可以发现问题不仅仅是代码bug,还有代码审查流程的缺陷。行动项部分列出了具体的改进措施,每个行动项都有负责人和截止日期,并且会被跟踪执行。行动项不是空话,而是具体的、可执行的、有时间限制的任务。比如"改进监控告警"太抽象,应该是"在X服务添加内存使用率告警,阈值80%,负责人张三,截止日期下周五"。Google还建立了Postmortem数据库,所有的事故复盘文档都会被保存和分类,新人可以从中学习,团队可以发现系统性的问题。比如发现过去一年有5次事故都和数据库连接池有关,说明这是一个系统性问题,需要从架构层面解决。更重要的是,Google的文化鼓励分享失败:写了好的Postmortem文档的工程师会被表扬,而不是因为造成事故而被责备。这种文化让工程师愿意主动暴露问题,而不是隐瞒问题。

深度思考:事故复盘的最大价值是文化建设。一个成熟的工程团队不是没有事故的团队,而是能够从事故中快速学习和改进的团队。无责备文化是事故复盘的基础:如果人们担心被责备,他们就会隐瞒信息、推卸责任,复盘就失去了意义。建立无责备文化需要管理层的支持:明确表态事故复盘的目的是改进系统而不是惩罚个人,鼓励坦诚分享,奖励主动暴露问题的行为。但无责备不等于无责任,如果同样的错误反复发生,说明学习没有发生,这时需要反思流程和文化。事故复盘也需要系统思维:大多数事故不是单一原因造成的,而是多个因素叠加的结果。瑞士奶酪模型告诉我们:系统有多层防护,每层都有漏洞,当所有漏洞对齐时,事故就发生了。找到根本原因需要深入分析,而不是停留在表面。行动项的执行也很重要:如果复盘后没有实际改进,复盘就只是走过场。应该定期回顾行动项的执行情况,确保改进措施落地。可以在下次复盘会议开始时,先回顾上次的行动项是否完成。

结语:事故是最好的老师,但只有当我们认真听讲时。事故复盘让我们从失败中学习,让系统变得更健壮,让团队变得更成熟。当我们以开放的心态面对事故,它就不再是灾难,而是成长的机会。每一次事故都是一次压力测试,暴露了系统的弱点,给了我们改进的方向。

事故复盘还需要建立度量体系。可以跟踪MTTR(Mean Time To Recovery,平均恢复时间)、MTTD(Mean Time To Detect,平均检测时间)、MTTF(Mean Time To Failure,平均故障间隔时间)等指标,通过数据来评估系统的可靠性和团队的响应能力。这些指标的改善,说明复盘是有效的。事故复盘也要关注人的因素:事故发生时,工程师承受着巨大的压力,复盘时要关注他们的心理状态,提供必要的支持。一个好的复盘文化,不仅让系统更可靠,也让团队更有凝聚力。