线上出了Bug,全组排查到凌晨三点。最后发现是我改公共类导致的。检讨书写到一半,隔壁老兵说了句话,让我从“背锅侠“变成了“改革者“

张开发
2026/4/24 19:29:27 15 分钟阅读

分享文章

线上出了Bug,全组排查到凌晨三点。最后发现是我改公共类导致的。检讨书写到一半,隔壁老兵说了句话,让我从“背锅侠“变成了“改革者“
故事是这样的。凌晨两点手机震了。群里炸了生产环境挂了用户支付页面全白屏客服电话被打爆。技术总监全体成员所有人立刻上线排查。我迷迷糊糊爬起来打开电脑心里一个咯噔。昨天下午我改了一个公共类就加了两行代码优化了一个工具方法的性能。代码审查过了测试也跑通了晚上八点发的版本。不会是我吧。。。不会吧不会吧。群里消息刷得飞快运维在查日志前端在排查接口后端在回滚代码。我手心开始冒汗偷偷去看了一眼我改的那个类越看越心虚。凌晨三点半真相大白。就是我改的那个公共类导致了支付模块的一个边界条件判断失效。影响范围全站支付功能持续时间5个小时损失。。。不敢想。我当时脑子一片空白。群里安静了几秒钟然后技术总监发了一句明天早上开复盘会。我知道接下来会怎样背锅写检讨可能还要扣绩效。我打开Word开始写检讨书「由于本人的低级失误导致线上故障给公司造成重大损失我深刻反省。。。」写到一半隔壁工位的老张发了条私信过来。老张是团队里的老兵写了十几年代码经历过无数次线上事故。他说别急着写检讨明天复盘会上听我的。第二天早上会议室里气氛凝重。技术总监让我先说说情况我硬着头皮把事情经过讲了一遍然后说这是我的失误我愿意承担责任。话音刚落老张开口了。他说这不是某个人的失误这是我们整个防御体系的失效。会议室里所有人都看向他。老张打开电脑投屏了一张图上面画着好几层奶酪每层都有洞。他说这叫瑞士奶酪模型是1990年英国曼彻斯特大学一个教授提出来的专门用来分析事故为什么会发生。他指着那些奶酪说你看我们的防御体系就像这些奶酪每一层都是一道屏障。第一层是代码审查第二层是自动化测试第三层是QA测试第四层是预发布验证第五层是生产环境监控。理想状态下每一层都应该是完好无缺的但实际上每一层都有漏洞。他看着我说你改公共类的时候代码审查为什么没发现问题自动化测试为什么没覆盖到这个边界条件QA测试为什么没测到支付场景预发布环境为什么没模拟出这个问题生产环境监控为什么没有及时报警。当所有层的漏洞恰好对齐的时候事故就发生了。会议室里安静了几秒钟。技术总监若有所思地点了点头说继续说。老张切换了一张PPT上面是一张表格我一眼就看到了那个数字100x。他说你们知道软件缺陷在不同阶段修复的成本差异有多大吗需求分析阶段发现问题成本是1设计阶段是3到5倍编码阶段是10倍测试阶段是15到20倍生产环境100倍起步。这次事故我们付出了100倍的代价但这不是某个人的错而是我们的防御体系在前面四个阶段全部失效了。他看向技术总监说我们应该问的不是谁犯了错而是我们的系统为什么没有拦住这个问题。技术总监沉默了一会儿说你说得对。然后他看向我说这次事故你不需要写检讨但我们需要一份完整的根因分析报告不是追责而是找出我们防御体系的每一个漏洞然后补上。我当时鼻子一酸。会后老张拉着我去楼下抽烟。他说你知道Google怎么处理线上事故吗他们有一套叫Blameless Postmortem的文化翻译过来就是无责复盘。核心理念就是事故发生后聚焦查找根本原因而不是追究个人责任。他吐了口烟说你想想看如果今天我们把你拉出来批评一顿扣你绩效下次再有人改公共类的时候他会怎么做他会隐瞒会推责会想尽办法证明这不是他的问题。但如果我们把重点放在系统上放在流程上下次再有人改公共类的时候他会主动提出来这个改动影响范围有多大我们需要加什么测试用例需要在哪些环节加强审查。这才是一个学习型组织应该有的样子。我问他那我们接下来应该怎么做。他掐灭烟头说代码审查流程要改公共组件的改动必须有至少两个资深工程师审查而且要明确标注影响范围。然后自动化测试覆盖率要提上去尤其是公共组件必须有完整的单元测试每次提交合并的时候必须通过所有测试否则禁止合码。还有预发布环境要真正模拟生产环境不能只是走个过场。另外生产环境监控要加强关键业务指标要有实时报警。他拍了拍我肩膀说这些都是我们这次事故暴露出来的问题不是你一个人的问题。回到工位我打开那份检讨书删掉了。然后新建了一个文档标题是「支付模块故障根因分析报告」。我花了整整一周时间把这次事故的每一个环节都梳理了一遍。代码审查环节审查者没有意识到这是一个公共类影响范围评估不足。自动化测试环节这个工具方法的单元测试覆盖率只有60%边界条件没有覆盖到。QA测试环节测试用例里没有包含支付金额为0的场景。预发布环节预发布环境的数据库配置跟生产环境不一致导致这个问题没有暴露。监控环节支付成功率的报警阈值设置得太宽松5个小时后才触发报警。五层防御五个漏洞恰好对齐。报告写完后技术总监组织了一次全员分享会让我把这份报告讲给所有人听。讲完之后技术总监说从今天开始我们要建立一套完整的公共组件改动规范。公共组件必须有完善的单元测试覆盖率不低于80%。公共组件的改动必须经过至少两个资深工程师的代码审查并且要明确标注影响范围。我们要建立一个公共组件改动的checklist每次改动都要过一遍。预发布环境要跟生产环境保持一致包括数据库配置、中间件版本、网络环境。关键业务指标的监控报警要收紧不能等到用户投诉了才发现问题。他看着所有人说这些规范不是为了限制大家而是为了保护大家。我们要建立的是一个学习型组织而不是一个恐惧文化的组织。会后好几个同事过来跟我说谢谢你把这件事讲出来我们以前也遇到过类似的问题但都不敢说。我突然意识到老张那句话的分量。如果今天我们把这次事故定性为「个人低级失误」那么下次再有人遇到类似的问题他会选择隐瞒会选择推责会选择自保。但如果我们把它定性为「流程体系缺失」那么下次再有人遇到问题他会选择暴露会选择分享会选择改进。这就是文化的力量。三个月后我们的公共组件改动规范已经完全落地了。代码审查通过率从原来的95%降到了70%但线上事故率从每月3次降到了每月0.5次。自动化测试覆盖率从60%提升到了85%预发布环境的问题发现率提升了3倍。更重要的是团队的氛围变了。以前大家改代码都小心翼翼生怕出问题出了问题就互相推责。现在大家改代码更大胆了因为知道有完善的防御体系在保护着出了问题就一起复盘一起改进。有一次前端的小李改了一个公共组件结果在预发布环境发现了一个严重问题。他主动在群里所有人说这个问题如果流到生产环境会导致全站崩溃然后详细分析了问题原因并且提出了改进建议。技术总监在群里发了个大拇指说这才是我们想要的文化。我想起老张那天跟我说的话他说2024年亚马逊有个AI工具叫Kiro一周内引发了4次最高级别事故电商平台瘫痪了6小时。后来调查发现不是技术问题而是裁员1.6万人之后运维团队减员工程师超负荷工作引发了连锁反应。技术事故的背后往往是组织层面的问题。回到那个凌晨两点的夜晚如果没有老张那句话我可能会背着这个锅离开公司然后在下一家公司继续小心翼翼地写代码生怕再犯错。但现在我学会了用系统性思维去看待问题。不是说个人不需要负责任而是说个人的责任应该体现在如何帮助团队建立更好的防御体系而不是背锅和自责。就像瑞士奶酪模型告诉我们的事故的发生从来不是因为某一层奶酪有洞而是因为所有层的洞恰好对齐了。我们要做的不是去指责哪一层奶酪有洞而是去填补每一层的洞。这才是工程师文化的底色。最后说一句如果你的团队还在用「个人低级失误」来定性线上事故那可能是时候引入「流程体系缺失」的视角了。不是为了推卸责任而是为了建立一个真正的学习型组织。毕竟我们写代码不是为了背锅而是为了创造价值。

更多文章