凌晨两点被叫醒,我用AI排查了一个半小时没找到的bug

上周五凌晨两点,我被电话叫醒,线上有个支付回调接口偶发500错误,大概每三百笔订单就炸一次。我迷迷糊糊打开电脑,翻了半天日志,愣是没看出问题在哪。日志里就一行NullPointerException,堆栈指向一个工具类的第三十七行,看上去是个空指针,但那个入参理论上不可能为空。

说实话,排查到凌晨三点半,我已经有点崩溃了。那个工具类被四十多个地方调用,我总不能一个一个断点调试吧。这时候我想起来,之前同事推荐过用AI来分析代码,我当时还笑话他「你是不是被营销号洗脑了」。但凌晨三点半的人是没有底线的,我打开了ChatGPT,把报错堆栈和相关代码贴了进去。

AI看完之后说了一句让我直接清醒的话。「你这个方法在第七十二行做了参数校验,但第五十三行有个异步回调会提前调用同一个方法,那个回调的入参没做校验」。我顺着这个线索一查,还真是。那个异步回调是三个月前另一个同事加的,走的是MQ消息,正常情况下MQ的消息体不会为空,但在高并发的时候,有个消费者做了重试,重试的时候消息体被序列化出了问题,丢了个字段。三百笔炸一次,刚好就是重试触发的概率。

我当时就愣住了。我花了将近一个半小时没找到的问题,AI用了大概三十秒就指出了方向。坦率的讲,那一刻我的感受很复杂,一半是「卧槽真有用」,一半是「我是不是要失业了」。

从那之后我就开始认真用AI辅助写代码了。但用了一段时间之后,我发现事情没那么简单。AI确实能帮你干活,但它翻起车来也真的离谱。

有一次我让AI帮我写一个分布式锁的工具类,要求是基于Redis实现,支持可重入,有过期时间自动续期。AI给我刷刷刷生成了一大坨代码,看上去挺像那么回事,命名规范,注释齐全,还贴心地加了日志。我差点就直接复制粘贴了。

幸好我多看了一眼。它写的锁续期逻辑用的是TimerTask,而不是ScheduledExecutorService。你想想看,Timer这玩意儿在Java里基本已经被判死刑了,一个任务抛异常整个Timer就废了。更离谱的是,它的可重入实现用的是ThreadLocal来记录重入次数,但解锁的时候没有判断当前线程是不是锁的持有者。也就是说,线程A加了两次锁,线程B可以直接解锁两次,直接把锁释放了。这种bug在单测里根本测不出来,上线之后在高并发场景下才会暴露,到时候排查起来能让你怀疑人生。

我把这个问题指给AI看,它立刻道歉说「您说得对,我来修复」,然后给我换了一版。但这版又出了新问题,它的续期逻辑和解锁逻辑之间没有做原子性保证,存在一个时间窗口,在锁过期但还没续期成功的时候,另一个线程可以拿到锁。说实话,这种问题如果你自己从头写,大概率不会犯,因为你脑子里有这个场景。但AI生成的代码太「流畅」了,流畅到你容易放松警惕。

还有一件事让我印象特别深。上个月我们组在重构一个老项目,大概五年前写的,Spring Boot 2.1,Java 8,各种技术债堆得跟小山似的。领导说要升级到Spring Boot 3.2和Java 17,问我大概要多久。我粗略看了一下代码,说两周吧。

然后我想了个骚操作,我打算用AI来帮忙。我把整个项目结构和主要的配置类、工具类都喂给AI,让它帮我分析哪些地方需要改。AI确实给力,给我列了一份详细的迁移清单,javax到jakarta的包名替换、配置项的变更、废弃API的替代方案,一目了然。

我照着清单开始改,前两天进度飞快,AI帮我对每个文件做了精确的修改建议,我基本就是在review和apply。到第三天的时候,我已经改完了百分之七十的代码,心里还挺美,觉得这周就能搞定。

然后编译就开始报错了。几百个错误。我一开始以为是漏改了什么,仔细一看发现,AI帮我替换的那些代码,有一部分它只改了表面,没改底层逻辑。比如它把@PostConstruct换成了@Bean注解的方式,但没注意到原来那个初始化方法里依赖了另一个Bean的生命周期,顺序一变全乱了。还有它把一些同步调用改成了响应式的写法,但周围的代码全是阻塞式的,混在一起直接死锁。

最后这个项目花了三周才搞定,比我自己从头改还多了一周。多出来那一周全是在修AI留下的坑。你想想看,如果是你自己一行一行改,你对每处修改心里都有数。但AI批量改完之后,你根本记不住它改了哪些细节,排查问题的时候反而更难。

其实吧,用了这几个月AI,我最大的感受就是,它是一个非常强的工具,但它替代不了你的判断力。就像一把好刀,厨师拿它能做出米其林,你拿它可能切到手。AI擅长的是帮你快速生成一个「看起来对」的方案,但「看起来对」和「真的对」之间,往往隔着你对业务的理解、对边界条件的敏感、对并发场景的直觉。

我现在的工作方式是,让AI当我的「第一稿写手」。写个工具类、生成个模板代码、分析个报错堆栈,这些它干得又快又好。但每一行代码我都会过一遍,尤其是涉及并发、分布式、安全这些关键场景,我绝对不会直接用AI给的方案。因为这些地方出问题,代价太大了。

有个段子说得好,「AI不会取代程序员,但会用AI的程序员会取代不会用AI的程序员」。我觉得这话对了一半,后面应该再加一句,「会用AI但不盲信AI的程序员,才会笑到最后」。你工具再强,最终拍板的还得是你自己。凌晨两点被叫醒的时候,AI可以帮你分析日志,但决定怎么修、怎么上线、怎么回滚,这些责任还是在你肩上。

所以我的建议是,大胆用,但别偷懒。AI帮你省下来的时间,你应该用来提升自己的判断力,而不是用来摸鱼。当然了,偶尔摸一下也行,毕竟凌晨两点还在修bug的人,值得摸一会儿。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值