说句实话,我本来没打算写这个。就是昨晚发生的事,今天醒了还记得,怕忘了,记一笔。
东西不大,我自己维护的一个小工具,给一个老客户做的数据导出功能,前阵子他反馈说偶尔会漏行——"偶尔"这个词最要命,我查了三天没查出来。昨晚又收到他消息,说刚刚又漏了一行,语气还行,但我已经能感觉到他忍很久了。吃完饭开了电脑,想着再查一个晚上,查不出来就坦白。
报错日志我翻来覆去看了几十遍,就是一条很不起眼的warning,连error都不是。内存里某段数据被覆盖了——谁覆盖的,什么时候,不知道。我加了几个打印想抓现场,跑一次要等二十分钟,跑到第四遍我觉得自己像个傻子盯着控制台。
凌晨一点多,猫跳上桌来踩键盘。我把它抱下去,它又上来,又抱下去。就这么折腾了几个来回,我突然想起一件事——那天改功能的时候,我顺手把原来一个循环里的索引变量改名了,但好像漏了后面一处引用。当时编译没报错,因为那个变量还在作用域里,存在,就是一个逻辑判断用了旧引用。就这么一个破事,我改了四天。
改完那行,凌晨两点十分。跑了一次,没漏了。又跑了一次,也没漏。我不敢跑了,怕跑第三次又出来——那种感觉你们懂吗,就是你在一个bug旁边蹲了太久,它修好的时候你不信。
发了条消息给客户说修好了,让他明天再试。他没回,这个点正常人早睡了。
写这个不是想讲什么道理,也不是教学,我不会贴代码——贴了就成了教程,我不想写教程,我答应过自己不再干那种事。昨晚蹲在屏幕前的时候,我其实一直在想,这要是放在我卖课那会儿,我早拍个短视频了,标题我都想好了:"一个让客户半夜催你的bug,三步定位",家人们谁懂啊——差点又开始了,打住。
昨晚修完bug其实挺爽的,就那种很纯粹的爽,不是赚了钱的那种。我坐在那抽了根烟,看了看窗外,天快亮了。然后去睡了。
就说到这。这破事让我一觉睡到今天中午。