前几天处理一个数据稽核接口的权限校验问题,忙了一下午。晚上回家改这篇稿子,比平时晚了一个多小时。媳妇儿问我今天怎么发这么晚,我说白天一堆事,晚上才有空改稿。她没再问,给我倒了杯水,看了眼我屏幕说:”你们这行越来越像开飞机了,机器开,人盯着。”
改这个的时候我就在想,要是这段代码是AI写的,我还得再审一遍。
最近不是AI写代码特别火吗。刷到个数据,说GitHub上快一半代码都是AI生成的,明年据说要到65%。
我看了愣了一下。兴奋是真的,效率涨了也是真的。但慌,也是真的。
效率确实涨了。以前排三天的活,现在AI辅助两天就能交。样板代码AI包圆了,人就改改业务逻辑。
但我以前,其实是不审代码的。
团队里老陈是资深开发,QA测得也仔细,代码层面他们把关,我只看架构和方案。流程走了十年,没出过大事。直到上个月,连着出了两回事。
━━━━━━━━━━━━━━━
安全漏洞:注释太全,反而没人问
说个上个月的事,差点出大事。小北用AI生成了一段数据稽核接口的权限校验代码,他自己先过了一遍,觉得没问题就提了PR。
老陈是我们团队的资深开发,审了代码,接口鉴权、鉴权校验、权限刷新,该有的都有。代码风格也很规范,注释写得比人还全。他点了通过。QA测了功能正常,刷新后新凭证能拿到,旧凭证也没报错,测试用例全绿。
我扫了一眼方案,批了上线。
结果上线后第二天,安全团队做季度全量扫描,扫出来一个漏洞:旧凭证刷新后有15分钟缓冲期,没立即失效。
我脑袋嗡的一声。跑去翻代码,AI在注释里写的是”提供缓冲以避免并发请求失败”。听起来没毛病对吧?很多系统都这么做的,测试环境也跑得好好的。
我开了个复盘会,问老陈:”这个缓冲期你当时怎么没提?”
他说了句话,我到现在都记得:”注释写得那么完整,我以为它考虑全了。”
我听完没说话。
老陈从来没出过这种疏漏。如果是人写的这段代码,逻辑但凡有点绕,他肯定会多问一句。但AI写的,太标准了,标准到让人忘了问。
那次复盘会后,老陈在团队里做了分享,把自己怎么被AI代码骗过的过程一条条摊开说。不是追责,是让所有人都知道,AI代码的坑长什么样。
后来我们手动改成了”刷新即失效”,安全窗口期能压多低压多低。测试的时候还模拟了凭证泄露的场景,确认旧凭证刷新后立即失效,才算过关。
这个改动很小,可能就十几行代码。但万一安全团队没扫到呢?我想了想,后背一身汗。阿杰可以跟我说”这是AI写的”,但我不能跟老板说”这是AI写的”。
━━━━━━━━━━━━━━━
性能陷阱:AI按你说的写,不会按你想的写
还有一次,小李用AI生成了一段批量处理站点数据的逻辑。代码写得挺”高级”,几个高阶函数一套,链式调用,一行搞定。
老陈这次留了个心眼,专门问了句”数据量多大”。小李说”测试环境几千条”。老陈没再追问,因为以前人工代码如果生产环境数据量不一样,开发会主动标注。这次没人标注,老陈就以为生产环境也是几千条。QA用几千条数据测了,跑得飞快,上线。
结果那天晚上十一点,我手机响了。生产环境OOM,批量导入站点数据的任务挂了。
运营商每个月都要批量更新站点台账,数据量平时就是十万级别。小李说的”几千条”,只是测试环境的数据量。AI按这个写了,生产环境十万条直接OOM。
我爬起来打电话,叫小李和老陈起来处理,自己在旁边盯进度。搞到半夜两点才恢复。
第二天我找了QA负责人,问他们测批量任务为什么不用生产数据量。QA说:”以前人工代码,如果数据量有问题,开发会主动标注。这次没人标注,我们就按常规模拟了。”
你看,不是谁忘了。是以前那套配合方式,在AI代码面前,失灵了。
后来小李手动改成了流式处理,分批读取,内存才稳下来。
━━━━━━━━━━━━━━━
边界条件:我也被骗了
从那以后,关键模块的AI代码我开始看了。但不是每条都看。
上个月我自己试了下,用AI写了段数据校验逻辑。生成的代码特别完整,各种校验规则都有。我扫了一眼,觉得没问题,顺手传给老陈,让他帮我看看。
老陈传了个空字符串进去,直接空指针。AI压根没考虑这茬。
老陈看着我,那眼神我到现在都记得。像是在说”老大,你也被骗了”。
我说是,我也是人。看着这么完整的代码,我也不会去想”空字符串呢”。
━━━━━━━━━━━━━━━
我现在怎么看
我现在看明白了。问题不是老陈的问题,也不是小李的问题,更不是流程的问题。我们流程走了十年,老陈和QA也配合了十年。
问题是,这套流程建立在一个默认假设上:坏代码看起来是坏的。
人写的代码,如果逻辑有坑,通常会写得乱一点。变量名随意,注释敷衍,你一眼就能看出”这段代码有问题,得多看看”。
AI写的代码没有这种信号。逻辑有坑的代码,和逻辑完美的代码,看起来一模一样。都是排版整齐,注释齐全,命名规范。你看不出哪里需要警惕。
这才是最可怕的。
我现在审AI代码,审的不是功能。功能老陈和QA会看。我审的是:这段代码有没有”看起来太对了”的地方。
太对的地方,往往藏着AI的假设。它假设数据量几千条,它假设输入都是合法的,它假设安全场景是标准的。但它不会告诉你,它假设了这些。
小李有次问我:”老大,你以前不是只看方案吗,现在怎么连代码都一条条看了?”
我说:”我不是在看代码,我是在找AI藏起来的假设。”
他听完没说话。
但这么搞不是办法。团队项目越来越多,我不能每个模块都亲自过。关键是怎么让老陈他们也能看出来这些假设。
我现在让他们做一件事:拿到AI代码,先别问”这代码对不对”,先问”这代码假定了什么”。
数据量多大?空字符串呢?边界条件呢?安全场景是不是我们内网的标准?
AI不会替你想这些。它只会让你觉得,”这代码已经够好了,不用多想”。
━━━━━━━━━━━━━━━
AI写得越快,我看得越慢。不是代码有问题,是我的审查系统还在用老标准。
以前我练出来的本事,是挑写得烂的代码。现在我得重新练,去挑写得”太对了”的代码。
你们团队里,有没有这种经历:AI写的代码看着太顺眼,反而忘了多问一句?评论区聊聊。
夜雨聆风