“跑通的那一刻是最幸福的。之后的每一天都是恐惧。”
三个月前,组里来了个新同事,小林。
小林干活极快。一个需求,别人要两天,他半天搞定。用的什么?Cursor + Claude,全程 AI 生成。
代码跑通了。测试过了。PR 合并了。
然后噩梦开始了。
第一个来改这段代码的人,看了十分钟后问我:”这谁写的?”
“小林。”
“小林写的?小林不会写这种代码。”
我翻了一下 git blame。每一行的作者都是小林,但提交注释全是”AI-generated”。
800 行代码,没有一个注释。变量名叫 result1、data2、temp3。一个函数里有七层嵌套。异常处理全是 except: pass。
最恐怖的是——它能跑。
测试全绿,线上零报错。
但它就像一座用纸牌搭的城堡。你知道它现在站着,但你不知道碰哪一张牌它会塌。
烦死了。每次 code review 看到这种代码,我都想把小林的键盘摔了。
The New Stack 2025 年有一份报告,里面的数据颇为扎心:
67% 的开发者在调试 AI 生成的代码上,花费的时间比以前更多了。
68% 的开发者在解决 AI 代码的安全问题上,花的时间也更多了。
你想想这个画面。公司买 AI 编程工具的初衷是”提效”。结果开发者把省下来的编码时间,全花在了理解 AI 到底写了什么上。
这不叫提效。这叫转移。 把编码的时间转移到了调试上。总工时没变,甚至更多了。
Hacker News 上有人总结得更直白:
“如果 AI 工具让团队快 76%,但多出 100% 的 bug,你其实并没有提高生产力,你只是在转移技术债务。”
技术债务不会消失。它只会延期,并且附带利息。
我用了三个月观察团队里的 AI 代码,总结出了”赛博屎山”的三个典型特征。对号入座,看看你的项目有没有。
特征一:函数像俄罗斯套娃
AI 写代码有个习惯——它不喜欢拆函数。
你让它写一个”用户注册”功能。它不会拆成”参数校验”“密码加密”“写入数据库”“发送验证邮件”四个函数。它会写一个 200 行的 register_user(),里面套着七层 if-else。
为什么?因为 AI 的上下文窗口是有限的。它在生成代码的时候,倾向于在一个连续的上下文中完成所有逻辑,而不是拆成多个独立的函数去分别处理。
拆函数需要”设计思维”——思考职责边界、思考复用性、思考未来的扩展。这些恰恰是 AI 最弱的地方。
AI 写的是”能运行的代码”,不是”好维护的代码”。
特征二:异常处理全面摆烂
AI 代码里的异常处理,大抵只有三种模式:
# 模式一:假装没发生
try:
do_something()
except:
pass
# 模式二:打个日志就算完
try:
do_something()
except Exception as e:
logger.info(e)
# 模式三:抛给调用方
try:
do_something()
except:
raise
没有重试逻辑。没有降级策略。没有具体的异常类型捕获。没有错误码规范。
你问 AI”加上完善的异常处理”,它会给你加。但它加的还是这三种模式的变体。
因为它不知道你的业务里,哪些异常是可恢复的,哪些是致命的。 这个判断只有人能做。
特征三:魔法数字和硬编码满天飞
AI 代码里到处都是 if status == 3、if role_id == 7、timeout = 30。
这些数字是什么意思?不知道。为什么是 3 不是 4?不知道。为什么要 30 秒而不是 60 秒?不知道。
AI 不知道你的业务常量应该叫什么名字。 它只知道”这里需要一个数字”,然后从训练数据里随便挑了一个看起来合理的。
三个月后,当产品经理说”把超时时间从 30 秒改成 60 秒”,你面对的不是一个配置项的修改,而是全文搜索 30,然后一个个判断哪个 30 是超时时间。
这便是 AI 代码的隐蔽成本。
AI 生成的代码,不能跳过 Code Review 直接合并。
很多团队用了 AI 之后,PR 数量暴增,review 质量暴跌。一天合并 20 个 PR,每个 PR 看 30 秒就 approve。
这不叫 review。这叫签字。
每天签 20 个字。累死了。
review AI 代码时,重点看三件事:
- 函数拆分:超过 50 行的函数,要求拆
- 异常处理:
except: pass零容忍 - 魔法数字:所有硬编码数字必须提取为常量
不要让 AI 自由发挥。给它约束:
- “每个函数不超过 30 行”
- “必须写 docstring”
- “异常处理必须指定具体异常类型”
- “禁止 except: pass”
这些约束听起来像是基本要求。但你如果不说,AI 就真的不做。
AI 不会主动遵循你公司的编码规范。 你得把规范喂给它。
说错了——不是”喂”就行。应该说,是每次生成都要塞给它。AI 没有记忆。你以为上次告诉过它了,这次它又忘了。
这种感觉很恶心。就像你教了一个实习生三遍,他第四遍还犯同样的错。
每个月抽一天,让团队一起 review 最近的 AI 生成代码。不是为了追责,是为了还债。
把那些嵌套太深的函数拆了。把那些 pass 掉的异常处理补了。把那些魔法数字提出来。
技术债就像信用卡账单。你可以这个月不还,但下个月的利息会让你更疼。
——虽然我这么说,但我自己上个月也没还。有一堆 AI 生成的代码就放在那儿,每次经过都想假装看不见。人就是这样,知道该做的事和实际做的事之间,永远有一道缝。
AI 写的代码跑通了。
这不可怕。
——不对,应该说,跑通这件事本身不可怕。可怕的是接下来的每一天。
代码跑通只是最低标准。可维护、可理解、可扩展——这些才是软件工程真正在意的东西。而 AI 在这些维度上的表现,大抵还停留在”能跑就行”的阶段。
——等等,这样说也不完全公平。我上个月用 AI 写一个 CLI 工具,代码质量确实比我手写的干净。但这恰恰说明问题:AI 在简单场景下表现很好,让你误以为它在复杂场景下也行。这种错觉才是最危险的。
工具没毛病。有毛病的是你降低了标准。
这,便是赛博屎山的由来。
关于码孖AI
码孖AI,专注 AI 工程化落地。我们相信:AI 不是来替代程序员的,是来帮程序员省时间的——前提是,你得会用。
关注我,持续更新实战踩坑指南。
:::callout tip 觉得有用? 点个「在看」,分享给同样在 AI 落地路上挣扎的朋友。 :::