近年来,AI编程工具如GitHub Copilot、Codex等层出不穷,它们宣称能“自动生成代码”“大幅提升开发效率”。但不少程序员在使用后却发现一个尴尬的现实:AI生成的代码常常漏洞百出,逻辑混乱,甚至需要花费比手写更多的时间去修改调试。为什么AI写代码总是“靠谱”不了?背后究竟有哪些深层原因?记者采访了多位业内人士和技术专家,试图揭开这一谜题。

训练数据的“原罪”:AI学的是网上代码的平均水平

“AI写代码的基础是大规模爬取GitHub等开源平台的代码数据,但开源代码的质量参差不齐。”国内某头部互联网公司AI工程师张明(化名)告诉记者。据统计,GitHub上约有70%以上的项目存在安全漏洞或低效代码,甚至不少是业余开发者的“练手作品”。AI在训练时无法区分“好代码”与“坏代码”,它只是学习到了代码的统计规律——包括那些常见的错误模式。

例如,当AI需要生成一个“读取文件”的函数时,它可能模仿了大量未关闭文件句柄的代码,导致内存泄漏;在写“递归算法”时,容易遗漏终止条件,造成无限循环。“AI本质上是‘鹦鹉学舌’,它不知道什么是对,什么是错,只是根据上下文补全最‘常见’的片段。”张明坦言。

缺乏业务上下文:AI看不懂“潜规则”

代码从来不是孤立存在的。一段优秀的代码需要理解业务逻辑、系统架构、数据结构设计、性能要求,甚至团队编码规范。而AI目前能处理的,只是局部、短视的语义。

“比如让AI写一个‘用户登录’的接口,它可能会生成标准的JWT验证流程,但完全忽视公司内部已有的单点登录系统、数据库连接池配置、异常拦截器规范。”某创业公司CTO李浩举例道,“这就像让一个实习生抄写合同模板,他抄得很工整,但不知道这个合同适用哪条法律。”

更严重的是,AI对变量命名、代码可读性、未来扩展性几乎没有概念。它倾向于生成“一次性”的代码——功能上勉强能跑,但维护成本陡增。程序员接手后,往往需要重构、解耦、添加注释,这恰恰是“擦屁股”的核心环节。

验证能力缺失:AI自己不会“跑”代码

另一个关键短板是:AI大模型是“静态”的。它生成代码时,不会像程序员一样在头脑中“模拟执行”,更不会自动跑单元测试来验证结果。这就导致AI常常给出语法正确但逻辑错误的代码。

一位前微软程序员在技术博客中吐槽:“让AI写一个‘字符串去重’函数,它可能返回一个包含重复元素的列表——因为它在训练数据中看到了太多错误的实现。”更令人头疼的是,AI对边界条件(空输入、特殊字符、并发冲突)的处理极为薄弱,经常需要程序员手动补充防御性代码。

“AI生成的代码就像一个‘抛硬币’的结果,正反面概率取决于训练集,但程序员需要的是100%正确的代码。”浙江大学计算机学院教授王志刚指出,“目前没有任何AI能保证生成代码的可靠性,最终验证责任必然落在程序员肩上。”

架构思维缺失:AI不懂“全局”

大型软件系统讲究模块化、分层架构、依赖注入、设计模式。而AI的输入输出窗口(context window)通常只有几千个token,它只能看到当前函数或文件,无法感知整个项目结构。这导致AI生成的代码往往“只顾眼前”,在局部看似合理,但放到整体项目中就会产生循环依赖、接口冲突、性能死穴。

“比如让AI为一个电商系统写‘库存扣减’逻辑,它可能生成基于数据库行锁的代码,而完全没考虑Redis缓存和消息队列的异步削峰方案。”李浩补充道。程序员接手后的“擦屁股”工作,很多时候就是在修复这种“只见树木不见森林”的问题。

未来方向:人机协作,而非取代

尽管问题重重,但业界普遍认为AI编程助手仍有巨大价值。谷歌、微软等巨头正尝试通过“代码搜索增强”“测试驱动生成”“强化学习”等方式提升质量。例如,让AI先生成预设结果的测试用例,再反推代码;或者引入“形式化验证”来卡控逻辑错误。

“我们有理由相信,AI会逐渐减少‘擦屁股’的频率,但永远不会为零。”王志刚总结道,“就像自动化测试不能完全替代人工测试一样,编程的本质是人类对需求、设计、质量的综合判断。AI是效率工具,但不是创造者。”

对于今天的程序员而言,学会“教AI写代码”“审AI的代码”“改AI的代码”,已经成为一项新基本功。而那句“给AI擦屁股”的自嘲背后,其实是对AI辅助编程时代更理性、更清醒的认知。