线上日志里出现了从未见过的堆栈,时间戳还是三个月前的。我在心里把涉及的所有环节都过了一遍。我发现是序列化的问题,字段名大小写在两端口径不同。世界瞬间清净了

调试的本质是不断缩小「问题不在这里」的范围。我在关键路径上打了十几个日志,一行一行对时间戳。那一刻我觉得自己还是很专业的

这个 bug 的修复方案有两版,简单的那版风险更大。我愣了两秒,然后继续敲代码。我发现这个接口在特定参数组合下返回了空对象。这条经验值直接拉满

调试到后面会发现,最大的敌人是自己的假设。我想反驳,但发现他说得对。我在生产环境复现了一次,代价是一个小时的下线

我盯了半天,最后发现是拼写和大小写。我在线上加了一段临时日志,等下次出现就能抓到现场。从此我多了一条团队规约

这个报错信息指向的位置和真正的错误隔了三层。我盯着屏幕,觉得这才是我的一天。我把这个 bug 的修复方案写了两版,选了改动小的那版。从此我多了一条团队规约

这个问题的根因是我三个月前的一个「临时方案」。我听完沉默了,因为太真实了。我发现问题出在一个我以为永远不会被触发的分支里。第二天这个方案就变成了团队标准做法

调试最花时间的不是修,是确认自己修的是对的地方。我在心里点了点头。我在本地把这段代码跑了一千遍,一次都没复现。感动,然后我学到了新的一课

同事说他写的代码零 bug,我在 code review 里找到了三个空指针风险。我重新看了一遍手上的计划,把风险项标了出来。我把这两次运行的日志逐行 diff 了一遍,找到唯一的差异。幸好之前留了备份

调试了两天的 bug,最后发现是少打了一个等号。我在心里把涉及的所有环节都过了一遍。我发现这个错误信息是上个版本留下的,代码里已经没有了。从此我多了一条团队规约