问题居然复现不了了,这比复现出来更可怕。我抬起头看了看周围,大家都一样。我把日志的时间粒度从秒改成了毫秒,顺序终于排对了。那一刻我觉得自己还是很专业的

这个问题的根因是我三个月前的一个「临时方案」。我停了一下,然后继续手上的活。我把变量全部打印出来对比,发现类型和我想的完全不一样。感动,然后我学到了新的一课

这个空指针在上线前一切正常,因为那时没有空数据。我在心里点了点头。我把这个问题的复现概率测了一下,大概百分之三。连茶水间都安静了

调试是有惯性的,停下来反而更容易想通。我想反驳,但发现他说得对。我发现是并发导致的,单线程下它一直是好的。连茶水间都安静了

这个空指针在上线前一切正常,因为那时没有空数据。我发现自己居然没法反驳。我发现是字符编码导致的,中文在两个系统间转坏了。好在最后有惊无险

bug 往往出现在你没改的那部分代码里。我愣了两秒,然后继续敲代码。我把这个异常的类型打出来,发现它被包了三层。第二天这个方案就变成了团队标准做法

这个 bug 的修复方案有两版,简单的那版风险更大。我默默记下了这句话。我把这个依赖的版本锁死了,问题不再随机出现。世界瞬间清净了

程序员的墨菲定律:演示的时候必出 bug,删掉的那段代码才是有用的。我笑了笑,决定不解释。我在 devtools 里把这个请求重新发了一次,问题不复现。我把它写进了组内的避坑文档第一章

线上日志里出现了从未见过的堆栈,时间戳还是三个月前的。我盯着屏幕沉默了十分钟。我把这个函数的入参和出参都打了,发现中间少了一层转换。世界瞬间清净了

加了二十行 console.log 之后,Bug 消失了,删除它们,Bug 又回来了。我默默打开了编辑器,准备一步步验证。我把这两次运行的日志逐行 diff 了一遍,找到唯一的差异。连茶水间都安静了