AI写代码:只要不报错,就是一锅好粥(糊了也算)
技术债务就像赘肉,一开始看不出来,等你想动的时候就晚了
产品:“这个功能三天能完成吗?”
开发:“一天就行,我用Codex。”
说这话的是一位资深开发,说得那叫一个轻描淡写、云淡风轻,仿佛AI是他口袋里的哆啦A梦。
之后代码很快上线了,功能确实跑通了,从结果来看,还是很不错的,效率超级高。又过了一周,另一位同事接手维护时发现:
代码里重复逻辑多到可以用“复制粘贴大赛”来形容;错误处理?不存在的;边界条件?请问边界是什么,能吃吗?
一个简单的参数修改,就像抽掉了积木塔底层的三块——Bug们欢天喜地地蹦了出来。功能是对的,过程却是一团糟。
如果你觉得这只是一个倒霉蛋的故事,那你可能还没被AI代码坑过。
当AI开始写代码,人类开始“躺平”
说个笑话:
以前程序员写代码:查文档 → 画脑图 → 写伪代码 → 喝茶 → 重构 → 写注释 → 再喝茶。
现在程序员写代码:# 写个排序函数 → Tab → 搞定。
GitHub Copilot、Cursor、Codex,Claude Code、Qoder、通义灵码……这些工具确实猛。你说“写个函数从数据库查用户”,它“唰”地一下就把代码甩你脸上了。
效率上去了,但代码质量——咦,谁把我家屋顶拆了?为啥会这样呢?
因为AI本质上是一个超级复读机,只不过它复读的不是原话,而是“概率上最像正确代码的那串字符”。
它见过八百万遍“def get_user”后面跟着一段SQL,于是它说:好的,那就这么写。
它不会思考:这个SQL安全吗?要加缓存吗?连接池呢?异常要不要捕获?
AI的任务只有一个:在当前光标位置,填上最有可能被接受的代码。
说得再直白一点:AI只对“结果看起来对”负责,不对“过程是不是体面”负责。
就像你请了个装修队,他们说“保证三天装完你家的卫生间”。三天后卫生间能用了——水管漏不漏水?电线走没走地?防水做了几层?
“那是你的问题,不是我的问题。”
“伪完成”陷阱:测试过了,人傻了
我手头有个真实案例,保证你看了想笑又想哭。
需求:从数据库读取用户信息。
AI写出来的代码长这样:
def get_user(user_id):
conn = sqlite3.connect('db.sqlite')
cursor = conn.cursor()
cursor.execute(f"SELECT * FROM users WHERE id = {user_id}")
return cursor.fetchone()
你跑一下,哎,返回了用户信息。完美!合并!上线!
等等——让我数数这里面有多少坑:
-
• SQL注入?不存在的,f-string大法欢迎黑客来玩。 -
• 连接没关?没事,反正数据库连接池会哭,又不是我哭。 -
• 异常没处理?报错就是用户的网络不好。 -
• 每次调用来一次connect?性能是什么,好吃吗?
如果是一个人类程序员写出这玩意,他会被Code Review的人用眼神杀死。
但AI不会尴尬,AI只会无辜地看着你:“你说要返回用户信息,我返回了呀。”
这种“伪完成”代码正在悄悄地、快乐地潜入你的生产环境。测试通过了(因为测试只跑那条正常的user_id),Review没人仔细看(因为“看起来挺对的”),上线后半夜三点报警——所有人挠头:“明明功能是对的啊!”
功能是对的,但你的头发不对了。
如何优雅地驯服AI,而不是被AI驯服
说了这么多,你可能会问:那AI工具还能不能用?
当然能用!但不能裸用。
下面几条“保发秘籍”,专治AI代码的后遗症:
1. 让AI先写测试,再写实现
不要上来就让AI写函数,而是说:“为这个函数写一组测试用例,包括正常值、边界值、异常值。”
AI写出测试的过程,其实是在帮你逼自己思考——哦,原来负数也要处理,原来缓存失效也要考虑。
2. 对着AI敲桌:你给我解释解释
AI生成代码后,别急着复制。追一句:“这个方案有什么潜在问题?有没有更好的写法?”
神奇的事情发生了——AI往往会自己承认:“啊对,这里可能会有SQL注入,建议改用参数化查询。”
AI不是不知道,是你没问。
3. Code Review的时候,先把AI写的当嫌疑人
如果你是团队的Code Reviewer,看到一段代码,先问一句:“这是人类写的还是AI写的?”
如果是AI写的,请把审查标准调高两级。不要因为“看起来正常”就放过。AI的“正常”往往只是“高频”,不一定是“正确”。
4. 把AI当实习生,别当架构师
AI生成的代码,永远应该是第一版草稿。
你要做的事:重命名变量 → 提取函数 → 加错误处理 → 写注释 → 删掉20%的冗余代码。
这个过程,叫编程。AI替你干了最累的搬砖,但砌墙、抹灰、验收还是你的活。
借助 AI 开发的时候,最上层的设计一定是在你的脑中,而不是让 AI 来帮你设计。同样,当 AI 把代码写成屎山的时候,更不要期望他能够把屎山优化掉。如果这样做了,你会发现 AI 会在屎山的基础上再造一座屎山。
5. 把你的“规矩”喂给AI
把你团队的编码规范、常见坑点、代码模板整理成一段提示词。每次让AI写代码之前,先塞给它:“请遵循以下规范:1. 所有数据库操作必须使用参数化查询;2. 所有函数必须包含异常处理;3. 禁止魔法数字……”
你会发现,AI真的会照做。你不对它提要求,它就放飞自我。
写在最后
AI编程工具不是洪水猛兽,它们是人类历史上最好用的偷懒工具,没有之一。
但请你记住一个扎心的事实:
-
• 锤子不会帮你判断钉子钉没钉歪。 -
• GPS 不会帮你判断那条路是不是在修。 -
• AI 也不会帮你判断那段代码是不是屎山。
你今天用AI写了成百上千行代码,下班前跑通了所有用例。
回家路上问问自己:我理解每一行吗?三个月后的我,会不会想穿越回来掐死现在的我?
只对结果负责的,叫机器。
对过程也负责的,才配叫工程师。
哦对了,如果你觉得这篇文章是在骂你。
别担心,我也在骂我自己。让 AI 帮我写了一周的代码,已经全部删除,从顶层设计开始,从头再来。
那感觉,就像自己给自己挖了个坑,然后微笑着跳了进去。
夜雨聆风