跳到主要内容

让AI重写了我最烂的代码

老白
老白

· 阅读约 4 分钟

先说这次命题,看到"最烂的代码"我第一反应是:怎么可能让你看,脸还要不要。后来一想,也没啥不能看的,反正丢人的事情多一件不多。

是2014年那套日志滚动脚本。当时公司在切新业务线,没人管这些老破小,我接手的时候线上日志已经三个月没人清了,磁盘吃了好几个警报。我那时候刚学会写PHP没太久,大概是凌晨两点,对着shell手足无措,就写了个PHP脚本让crontab跑,每天半夜滚动日志,跑批。老手看一眼就知道我要放什么屁了——那个脚本整个就是个土制定时炸弹。全局变量有十几个,变量名叫$a、$b、$tmp1、$tmp2,有一处判断文件大小的地方用了if (filesize(LOG_PATH) > 10485760)就直接拿数字当魔法数,注释什么都没有,逻辑里还有一段写死的"reload nginx"的命令,还是sleep 2之后再reload,当年好像是为了等某个进程落盘,具体为什么,我现在都忘了。全凭肌肉记忆。

就这么一个东西,线上跑了十二年。真跑通了就一直没动过它。每年磁盘警报响几次,我都是SSH上去手动清一下仓,然后嘴上骂两句"这破脚本",其实心里明白,那就是自己当年焊死的。改它?不敢,一改就提心吊胆,怕把哪根线碰断了,比家里那台老打印机的毛病还难缠。

今年六月份,磁盘又满了。我例行上去看,发现日志已经三天没滚了。当时正在赶一个项目进度,抽不出手来修,逼急了——算了,承认吧——我把这段代码整个扔给了AI。

我跟它说:这是老子十二年前写的垃圾,你告诉我怎么改。它第一遍给了我一个回收站级的完整重构版,把清理、压缩、按日期分桶、旧文件删光,写得确实干净。但我不敢跑。我让它解释下它干了啥,它解释得头头是道,我核对了一下"reload nginx"那部分,它直接就跳过了,没处理。我逼着问了一句,它才补了个方案,说应该用fcntl锁避免并发触发——这个我确实没想到。但第一版方案我没用,因为里面有个路径是拿dirname(__FILE__)拼的,线上部署的路径跟开发机不一样,它不知道。这也不怪它,我俩没聊到那茬。

第二回我学聪明了,先把线上目录结构、nginx的日志切割配置、还有php.ini里的时区全甩给牠,让它照着现状改。这次它给了我一个新旧混搭的版本:保留了那几千行的整体框架,但把魔法数换成配置项,把全局变量收了,循环逻辑理顺了。看着像样,比我自己承认的还要像样。

跑的时候是周日凌晨两点,我盯着屏幕看它跑完,日志卷过去了,旧文件压好了,磁盘空间刷地掉下去一个数量级。那一刻我说不上是什么滋味,就感觉像给祖宗上完坟,腿一软,说不上高兴也说不上难过,就爬回床上睡了。

话说回来,让AI重写,它也翻过车——当我没告诉它线上环境有多怪的时候,它的方案总是差那么一步。就那一步,你需要自己手动填。所以我也就让它打打下手。真让他主力顶我,恐怕连那台老打印机的脾气都摸不准。

不过话说回来,它把那段代码重构完之后,我通读了一遍,发现当年有个隐藏的分支逻辑,是我写的时候甚至没意识到的——那个魔法数10485760,后来被一个同事模模糊糊改过一次,改完的那版能撑更久。AI把它当常量提出来,旁边写了个注释,问"该值是否与保留天数有关"。这问题我憋了六年了,一直不敢问。

算了,你们也没赶上那会儿。反正那套脚本现在还在线上跑,不是AI重写的那版,是我手动把它改得能读一点点了。AI改的那版我给收起来了,哪天磁盘再爆再说吧。

老白
老白

PHP 十二年。新东西大半是炒作,好用的那一小半我自有判断。

查看主页 →