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

告别版本过低提示!微信3.9登录修复与聊天记录无缝迁移全攻略 本文详细解析了微信3.9版本过低提示的根源,并提供了完整的修复方案和聊天记录迁移指南。通过专用修复工具绕过版本检测,以及新旧版本聊天记录目录对比,帮助用户实现无缝迁移。特别提醒备份重要数据,确保操作安全。 阅读详情

故事是这样的。

凌晨两点,手机震了。

群里炸了,生产环境挂了,用户支付页面全白屏,客服电话被打爆。技术总监@全体成员,所有人立刻上线排查。

我迷迷糊糊爬起来,打开电脑,心里一个咯噔。

昨天下午我改了一个公共类,就加了两行代码,优化了一个工具方法的性能。代码审查过了,测试也跑通了,晚上八点发的版本。

不会是我吧。。。

不会吧不会吧。

群里消息刷得飞快,运维在查日志,前端在排查接口,后端在回滚代码。我手心开始冒汗,偷偷去看了一眼我改的那个类,越看越心虚。

凌晨三点半,真相大白。

就是我改的那个公共类,导致了支付模块的一个边界条件判断失效。影响范围,全站支付功能,持续时间,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万人之后,运维团队减员,工程师超负荷工作,引发了连锁反应。

技术事故的背后,往往是组织层面的问题。

回到那个凌晨两点的夜晚,如果没有老张那句话,我可能会背着这个锅离开公司,然后在下一家公司继续小心翼翼地写代码,生怕再犯错。

但现在,我学会了用系统性思维去看待问题。

不是说个人不需要负责任,而是说,个人的责任应该体现在如何帮助团队建立更好的防御体系,而不是背锅和自责。

就像瑞士奶酪模型告诉我们的,事故的发生,从来不是因为某一层奶酪有洞,而是因为所有层的洞恰好对齐了。

我们要做的,不是去指责哪一层奶酪有洞,而是去填补每一层的洞。

这才是工程师文化的底色。

最后说一句,如果你的团队还在用「个人低级失误」来定性线上事故,那可能是时候引入「流程体系缺失」的视角了。

不是为了推卸责任,而是为了建立一个真正的学习型组织。

毕竟,我们写代码,不是为了背锅,而是为了创造价值。

XianYuAutoDeliveryX:基于闲鱼API与大模型的智能自动发货系统实践 本文详细介绍了如何利用XianYuAutoDeliveryX系统,结合闲鱼API与大语言模型,构建一个智能自动发货解决方案。该系统能实现买家付款后秒级自动发货,并通过对接ChatGPT等大模型智能回复买家咨询,有效解放卖家时间,提升虚拟商品店铺的运营效率和客户体验。 阅读详情

相关推荐

Sparse4Dv3 代码复现

打包数据集的元信息和标签,并生成所需的.pkl文件。最后还输出了很多跟踪相关的东西...然后通过K-means生成锚点。编译可变形聚合CUDA算子。安装motmetrics。

m0_60857098的博客 4490

让 AI 修一个 Bug,怎样避免它顺手改坏其他功能?

这个按钮偶尔会触发两次,帮我修一下。需求只有一句。等改动出来,除了按钮处理,还可能包含公共函数调整、默认值变化,以及一批看起来更整齐的代码。如果这些改动混在一起,审查时就得重新确认:哪些是修复必需的,哪些会影响其他入口,已有数据还能不能正常读取?我现在让 AI 修问题时,会把这几件事提前说清楚。上一篇写了功能改完以后怎么验收,这次聊聊怎样控制修复范围,以及拿到代码后先看什么。

qq_26483133的博客 104

TI MSPM0G3507 循迹小车强制寻黑线代码一

一个基于MSPM0微控制器的循迹小车控制系统。系统通过8路循迹传感器检测黑线位置偏差,使用PID算法计算电机控制量。主程序初始化中断、PWM等外设,在按键触发后进入循迹模式。传感器数据处理函数根据检测到的黑线位置返回偏差值(-7到7),PID控制器根据偏差调整左右电机速度。系统还包含限幅处理、中断服务等模块,实现稳定的自动循迹功能。代码结构清晰,展示了嵌入式系统中传感器数据处理、电机控制和PID算法的典型实现方式。

雾削木的优快云博客 1856

fix bug

当你通过 cpolar 域名外网访问时,请求到达你本机的 Apache 时,如果 Apache 的虚拟主机配置(如。)默认匹配了本地环境,或者反向代理透传了本地 Host,它依然可能表现为本地地址。$_SERVER['REMOTE_ADDR']也永远指向127.0.0.1。

huxyc的博客 73

高性能算力中心 — RDMA — Overview

目录 文章目录目录RDMA基于以太网的 RoCE/RDMA 计算优化NVMeNVMe Over Fabrics基于以太网的 NVMe 存储优化 RDMA RDMA(Remote DMA,远程直接内存访问)是一种新的内存访问技术,RDMA 让计算机可以直接存取其他计算机的内存,而不需要经过 CPU 耗时的处理。RDMA 将数据从一个系统快速移动到远程系统存储器中,而不对操作系统造成任何影响。RDMA 技术的原理及其与 TCP/IP 架构的对比如下图所示。 InfiniBand(IB):从一开始就支持 R

烟云的计算 2367

DB文件在编程中的作用及示例代码

通过使用DB文件,我们可以实现数据的持久化存储,并能够高效地进行数据的增删改查操作。在本文中,我们以SQLite数据库为例,演示了如何使用Python语言创建和操作DB文件的示例代码。在实际的编程中,我们可以根据具体的需求和使用的数据库系统来进行更复杂的操作和优化。通过使用DB文件,我们可以实现数据的持久化存储,确保数据在程序关闭后也能被保留,并且能够高效地进行数据检索和更新。在本文中,我们将探讨DB文件的作用,并提供一些示例代码展示如何在编程中使用DB文件。上述代码中,我们使用SQLite提供的。

CodeSpark的博客 1822

2026年Bug跟踪管理系统推荐:研发与测试协作的关键枢纽

回到最初的问题,2026年的Bug跟踪管理系统推荐,核心不是列出一串名字,而是找到一条适合自己组织的协作链路。中大型企业优先看闭环、测试深度、权限治理与部署边界;工程团队优先看代码关联和工作流效率;流程稳定的团队可以把自托管工具作为起点。选型时先定流程,再用真实Bug和真实用例做试点,并以数据复盘。能把研发与测试协作串起来的系统,才配得上“关键枢纽”这个位置。本文基于公开资料与产品文档整理,具体功能、部署方式与服务范围以官方说明和实际试用为准。更新时间:2026年11月。

zentao_pms的博客 177

基于STM32设计的便携式心电信号监测系统_146

基于STM32 设计的便携式心电信号监测系统,采用 PulseSensor 心率传感器进行数据采集,通过 LCD 显示屏显示心电数字数据和采集状态。同时,该系统还采用 HC05 蓝牙模块将实时心电信号数据传输到手机 APP,用户可以在手机 APP 上实时查看采集的数据并绘制心率曲线。此外,STM32 上的按键可以控制心率采集状态,用户登录手机 APP 还可以查看实时心电信号折线图。

1万+

不收 PR、让 Agent 自己修 Bug:3,900 Star 的 Rust UI 框架 Rune,为“AI 写界面“重新设计

Rune:GPU 渲染的 Rust 原生 UI 框架,headless 模式让 Agent 渲染 PNG、导出元素树、脚本驱动输入并自检——UI 框架第一次把可被 AI 观测作为架构需求。更激进的是:它不收 PR,贡献和维护两端都是 Agent。

话梅糖の优快云 Blog 596

SAP CRP能力计划详细说明操作及相关配置

2、求助朋友同事的希望破灭后,网上找了资料发现在百度搜索的资料基本都是没有说明白什么才产能计划,都没有详细的操作说明,然后用google去搜索了一些相关的文章,好像也没有详细的文章。然后也去SAP的官网搜索了相关的文章,都是文字性的表述,对系统的配置都没有很大的帮助,很久之前有记得在隐身人的博客中有提到CRP的能力计划的文章,然后试着去找了一下相关的文章。5、首先产能排产肯定涉及的就是是能力的问题,能力第一个能想到的就是工作中心中的能力页签,在流程制造中也叫资源,其实都是一个东西。

我小时候很黑的博客 4523

基于FPGA的相控阵雷达波束控制系统设计(2)

也就是在计算波控码时0,按2.8125递增,取遍-90

qq_43416206的博客 1812

Bug跟踪管理系统怎么搭?从提交到关闭全流程最佳实践

搭一套Bug跟踪管理系统,真正要解决的不是把问题记下来,而是让每个问题从提交到关闭都有明确的责任人、进入条件和退出证据。,这三样决定Bug管理能不能长期跑下去。软件Bug的代价并不抽象。美国国家标准与技术研究院(NIST)2002年发布的一项委托研究测算,软件Bug每年给美国经济造成约595亿美元损失。对研发组织来说,越晚发现、越晚闭环,返工和沟通损耗越高。

zentao_pms的博客 194

【人工智能的数学基础】最优传输(Optimal Transport)问题与Wasserstein距离

代表两堆石子,则问题等价于如何移动一堆石子,通过最小的累积移动距离把它堆成另外一堆石子。的不同位置分配的值。为离散型概率分布,则该优化问题可以表示为矩阵形式。表示寻找总运输成本最小的方案。放大后的上确界不会小于原来的上确界,因此不妨取。具有相同的概率分布。是概率分布,因此积分可以写作采样形式。描述了一种可行的运输方案,表示应该从位置。则最优传输问题的目标函数可以用列向量。对于一个线性规划问题,总可以写出其。的所有可能联合分布的集合,下确界。其中矩阵的每一行代表概率分布。表示寻找使得目标函数最大的。

AI天才研究院 6330

React 前端工程化在秒杀活动中的性能优化与 Bug 修

措施名称 | 实施成本 | 预期收益 | 风险等级 | |----------|----------|-----------|------------| | 使用 Redux Toolkit 管理状态 | 中等 | 提高可维护性和性能 | 中等 | | 引入 Suspense / Lazy Loading | 高 | 显著提升用户体验 | 高 | | 使用 Error Boundaries 捕获异常 | 中等 | 提高系统健壮性 | 中等 |在大型互联网企业中,秒杀与抢购活动是高频的业务场景之一。

wuchangjian的专栏 208

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

IINA BUG 正在播放的视频不显示原始文件名

视频播放时标题异常显示为录屏软件名,源于内部元数据干扰。通过在IINA中配置Lua脚本,强制使用文件原始名称作为媒体标题,实现播放列表正确显示。脚本路径为~/.config/iina/scripts/filename-title.lua,需在高级设置中添加scripts选项指向该文件。重启IINA后验证生效,不影响原文件与元数据。适用于macOS版IINA,可随时移除脚本恢复原行为。

烨之魅儿的专栏 266

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【Unity Bug挑战】第12期 Awaitable 二次 await 死锁之谜 —— 为什么同一个异步操作等两次就卡死?

你正在把项目从 UniTask 迁移到 Unity 6 原生的 Awaitable。你觉得这很合理——就像 Task 一样,同一个 Awaitable 等多次又能怎么样呢?栏目:Unity Bug挑战 | 期号:NO.012 | 日期:2026-10-31 | 4星 · 中高级 | Bug挑战 | Unity 6+ · 异步编程 / Awaitable / 对象池。标签:Unity、Bug挑战、Awaitable、异步编程、死锁、Unity6、对象池、游戏开发、C#

crystal_WJT的博客 203

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

bug?nacos跑满内存!!!

手上一台 2 核 2G 阿里云服务器,用 docker-compose 搭微服务基础环境:Nacos、MySQL、Redis、RabbitMQ。本来以为拉起来就能用,结果直接翻车,Xshell 连不上服务器,折腾半天,终于找到根源。

2501_90507065的博客 245

【Unity Bug挑战】第10期 SerializeReference 内存泄漏之谜

你翻了一下代码,项目里大量使用了 [SerializeReference] 特性来做技能系统的多态序列化——大概有 200 多个不同的技能效果类,都挂在 SkillData 这个 ScriptableObject 上,通过 Addressables 动态加载和释放。Unity 的 Native 对象是引用计数管理的,而 C# 托管对象是 GC 管理的。SerializeReference 的多态对象,它们的 Native 侧表示是什么样的?托管堆内存 | 加载后释放,回到初始水平 | 正常,符合预期。

crystal_WJT的博客 690

Git 分支管理详解:从 HEAD、合并原理到冲突解决与 Bug 修复

现在再回到“功能开发到一半,线上突然需要修 Bug”的场景:先检查工作区,把现场提交到合适的功能分支或暂存进 stash;从需要修复的版本创建 Bug 分支,修复并验证后合入主线;回到功能分支恢复现场,再把主线修复同步过来,完成集成和测试;最后合入功能并清理临时分支。分支引用标记提交位置,HEAD 标记当前落点,提交推进当前分支,合并整合历史,未提交修改需要单独照顾。把这几条规则与提交图对应起来,分支管理就会从一组需要死记的命令,变成能够推导和解释的开发过程。

2601_94861874的博客 225

让 AI 修 AI 平台自己的 Bug:我用 SoduWork 给 SoduWork 提了一个 PR

签收是硬约束:打回后需求真的停在"进行中",源码里有对应的 blocker。能在真实仓库里做真实工程:读贡献指南、跑基线、TDD、多语言环境复现、处理 CRLF,产出一个能直接提交的 PR。返修体验好:打回意见会自动带进下一轮,并要求"在现有交付上返修"。权限沙箱设计扎实:只读白名单、受保护路径、授权指纹、指令文件防篡改。启动器负责任:数据隔离、没有默认密码、只绑本机。

努力是为了站在万人之中,成为别人的光 3689

ESP32-S3 语音玩具全链路打通实录:12 个坑、4 个字节级协议 Bug

ESP32-S3 语音玩具全链路打通实录:12 个坑、4 个字节级协议 Bug 一块 N16R8、一块 2.4 寸 ILI9341、一个 INMP441、一块 MAX98357A、一个裸喇叭,加上火山

lpfasd123的博客 253

嵌入式故障诊断-Bug002-局部大数组压栈高温必死机

摘要(148字): P2电动沙发控制器在高温下3~8分钟必死机,根因是overheat_report()中1024B局部数组栈溢出。常温不触发,NTC≥65℃时任务栈需求骤增至1984B,超1792B限额192B,踩坏堆内存。修复方案:静态化数组、分段发送、栈扩容至2560B,填充0xDEADBEEF监控水位。成本:RAM+768B,Flash+412B;收益:高温季0客诉,栈状态可量化。

u011697185的专栏 398
上一篇: 线上出了Bug,全组排查到凌晨三点。最后发现是我改公共类导致的。检讨书写到一半,隔壁老兵说了句话,让我从“背锅侠“变成了“改革者“
下一篇: 线上出了Bug,全组排查到凌晨三点。最后发现是我改公共类导致的。检讨书写到一半,隔壁老兵说了句话,让我从“背锅侠“变成了“改革者“
Java思维导图
博客等级 码龄10年 306粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值