AI写的代码能跑,但跑的是不是你想要的,完全是两码事。
开发者Hussain Shamlooh最近干了件有点偏执的事:他故意让ChatGPT、GitHub Copilot等工具生成代码,横跨不同语言、不同场景,逐行审了超过1000行。不是看能不能运行,而是看它们到底在干什么、为什么这么干。
「能跑」是个低得可怜的门槛
Shamlooh的发现很反直觉。AI代码的问题往往不是明晃晃的语法错误,而是藏在逻辑褶皱里的「合理但危险」。比如一段处理用户输入的代码,表面看流程完整,但Shamlooh发现它把敏感数据写进了未加密的临时文件——不是故意的,是训练数据里这种写法太常见,AI学会了,但没学会后果。
更隐蔽的是命名和结构。AI喜欢生成看起来专业的变量名,比如`userDataProcessingManager`,但拆开看,里面混着三种不同的数据格式,转换逻辑散落在七个嵌套函数里。人类写这种代码会被同事骂,AI写却自带「看起来很忙」的免死金牌。
上下文是AI的盲区
Shamlooh测试了一个电商库存扣减的场景。AI给出的方案在单用户环境下完美运行,但完全没考虑并发。两个用户同时下单,库存只扣一次——这种bug在压测前几乎不可能被发现。
「它不是在解决问题,」Shamlooh在复盘时写道,「它是在生成一个看起来像解决方案的文本块。」
这种「幻觉」在边界条件上尤其明显。AI会优雅地处理99%的情况,然后在第100种输入上静默失败,或者更糟,返回一个看起来对的结果。Shamlooh记录了一个日期解析的例子:AI代码能正确处理`2024-01-15`,却把`2024-1-5`解析成了1905年——因为正则表达式写死了两位数月份。
安全债务的复利效应
最让Shamlooh后背发凉的不是某个具体bug,而是模式。AI倾向于用「历史上出现过」的方式写代码,而历史上出现过的代码,往往带着那个时代的安全债。
他在多段生成代码里发现了已弃用的加密算法、明文存储的密码字段、以及那种「先上线再补安全」的注释风格。这些不是AI的发明,是AI从GitHub数十亿行代码里学来的「主流做法」——而主流往往意味着平庸,甚至过时。
Shamlooh算了一笔账:一个中级开发者review 1000行代码大约需要4-6小时。如果AI把产出速度提升了10倍,但review成本只降了30%,那么净效率增益可能是个负数——还没算上线后修bug的代价。
工具还是代笔?
Shamlooh的实验没有给出非黑即白的结论。他自己也在用这些工具,但用法变了:从「帮我写这段」变成「给我三个不同思路,我挑一个自己改」。
他最后提了一个问题:当AI生成的代码占比超过某个临界点,团队里还有没有人能真正理解系统的全貌?
这个问题,他留给了读那1000行代码之前的自己。
热门跟贴