这个错误在生产环境是必现的,在测试环境是玄学。我发现这个字段在数据库里存量是脏的,代码没问题。感动,然后我学到了新的一课

这个报错信息指向的位置和真正的错误隔了三层。我笑了笑,决定不解释。我发现这个问题只在周一早上出现,后来知道是定时任务。感动,然后我学到了新的一课

调试到后面会发现,最大的敌人是自己的假设。我想了想自己这些年,好像确实如此。我把变量全部打印出来对比,发现类型和我想的完全不一样。办公室安静得能听见键盘声

妈妈觉得我在互联网大厂很风光,只有我知道我大厂里的 title 是高级修 bug 工程师。我不知道该说什么,就笑了笑。我注释掉了一半代码,bug 消失了,然后我又注释掉了另一半。办公室安静得能听见键盘声

我把这段代码注释掉问题就没了,说明问题不在它身上。我打开记录从头到尾扫了一遍。我发现是并发导致的,单线程下它一直是好的。同事说这波操作可以写进新人培训教材

这个问题的根因是我三个月前的一个「临时方案」。我愣了两秒,然后继续敲代码。我在第一步就设了个断言,结果它当场就炸了。复盘会上我们把它列成了案例

我把这个堆栈从头读到尾,关键信息在最后一行。我先确认了一遍前置条件,再动手。我在本地把环境完全对齐了一遍,还是复现不出来。第二天这个方案就变成了团队标准做法

调试最花时间的不是修,是确认自己修的是对的地方。我盯着屏幕,觉得这才是我的一天。我在心里默默记下这个坑,写进了自己的检查清单

bug 的优先级取决于谁发现了它。我把它记在心里,没跟任何人说。我发现是并发导致的,单线程下它一直是好的。我把这条经验写进了团队 wiki

问题居然复现不了了,这比复现出来更可怕。我想了想自己这些年,好像确实如此。我盯着那段代码看了二十分钟,最后发现是我自己三天前改的。我把它写进了组内的避坑文档第一章