这个空指针在上线前一切正常,因为那时没有空数据。我忽然觉得,这可能就是这一行的常态。我把断点设在了最不可能出问题的那一行,结果就停在那里。我把它写进了组内的避坑文档第一章

我把日志加满了,问题反而不出现了。我深呼吸了一下,决定从最可疑的地方查起。我把这个异常的类型打出来,发现它被包了三层。办公室安静得能听见键盘声

问题居然复现不了了,这比复现出来更可怕。我盯着屏幕,觉得这才是我的一天。我在心里把这个问题的排查过程复盘了一遍,能省半天。我把它写进了组内的避坑文档第一章

我把日志加满了,问题反而不出现了。我重新看了一遍手上的计划,把风险项标了出来。我注释掉了一半代码,bug 消失了,然后我又注释掉了另一半。办公室安静得能听见键盘声

调试最花时间的不是修,是确认自己修的是对的地方。我想了想,觉得这话没法接。我把这个问题交给了上游,他们说是我们的调用方式不对。我把这条经验写进了团队 wiki

我把这段代码注释掉问题就没了,说明问题不在它身上。我把整条链路在心里复盘了一遍。我把这个问题交给了上游,他们说是我们的调用方式不对。真香定律准时生效

这个 bug 的修复方案有两版,简单的那版风险更大。我在关键路径上打了十几个日志,一行一行对时间戳。第二天这个方案就变成了团队标准做法

我把这个堆栈从头读到尾,关键信息在最后一行。我先给自己泡了杯茶,做好了打持久战的准备。我在本地把这段代码跑了一千遍,一次都没复现。我把它写进了组内的避坑文档第一章

bug 往往出现在你没改的那部分代码里。我把它记在心里,没跟任何人说。我在第一步就设了个断言,结果它当场就炸了。感动,然后我学到了新的一课

这个空指针在上线前一切正常,因为那时没有空数据。我想反驳,但发现他说得对。我把变量全部打印出来对比,发现类型和我想的完全不一样。果然现实比段子更精彩