上礼拜五,眼看要下班了,生产环境出幺蛾子。我们那个跑批系统,下午四点半的定时任务,五点半我去瞄了一眼——没跑完,卡住了。日志刷到最后一行,停在一个莫名其妙的报错上,说什么NULL值不能当数组用。
我心想,这他妈不是祖传代码的老毛病吗。那套老系统,零零散散攒了十一二年,早几任同事写的,什么风格都有,注释基本靠猜。报错那行我盯了两分钟,压根看不出是哪来的,函数套函数,一层套一层,全是动态调用。当年写这代码的人可能觉得这么写很帅,现在谁接手谁想死。
算了,反正也不是第一次了。我按老规矩,先看是不是数据问题——查了源表,没问题。再手动跑一遍那个任务,照样报错。翻日志往前看了两百行,啥线索没有。七点了,办公室里剩我一个人,空调嗡嗡响,我对着屏幕那股无名火就上来了。
跟我打个赌,我要是一个人去翻那段代码,今晚就得泡在公司。
坦白说,我现在遇到这种事,第一个念头已经不是自己硬啃了——面子归面子,事归事。我把那段日志复制了一下,连同报错的那行代码附近大概两百行,一起扔给了公司买的那个AI编程助手。
我没抱什么希望。
结果它看完问了我一句:这个$order_id是不是可能是字符串'0'?
我当时心里话:你他妈在说什么?0就是0,跟字符串有什么关系?
但我还是去查了一下调用链。往上翻了四层,找到入口那,确认了,有一一路传下来的是$_GET['order_id'],一个网页入口调过来的,如果没传参就默认空字符串,然后这个空字符串被塞进一个老函数,老函数里有个地方三目运算符没写严谨,落了个''传给下面一层,下面那层直接拿它去数组里取key……取不到,就崩了。
就这一个地方,十二年了,一直埋在那。查出来之后我改了三行,任务就能跑了。
当时我后脑勺有点发麻。因为这错误要是让我自己捋,从报错点往上查,得把那条链路上所有函数全翻一遍,里头嵌套的逻辑花样百出,没有小半天根本下不来。AI给我点出来了,从它收到日志到问我那句话,中间也就三十秒。
三十秒。
我那年入行,第一次独立排查线上bug,蹲了整整一个晚上,最后发现就是少写了个分号。当年哭的心都有,第二天跟组长汇报,还得假装淡定说"小问题小问题"。现在这东西三十秒给你把方向指到脸上,我一时不知道是时代的进步还是什么的——算了,这话打住,免得有人又要说我矫情。
反正修完之后我盯着那三行改动看了半天。要说它干得有多神,其实也没有,那行代码报错的原因,是它问了我一个问题,然后我顺着去查,查出来是我自己确认的。AI只负责"猜",没负责"证"。但我不得不承认,它会往那个方向猜,就已经值回票价了。
当然话又说回来——它能问出那个问题,也是我把报错和上下文给它喂得够清楚。要是换个人,只丢一句"我代码报错了帮我看看"进去,它也就跟你扯几句正确的废话。所以说到底,还是干活的人脑子得在线。工具再好,也得配个会把话说清楚的主,这就是我们这种老家伙不可替代的原因,嗯,差不多这样。
行了不写了,改完代码还挂了几个TODO没盯,明天上班再说吧。