Skip to content

AI 写代码失控的 7 种死法(以及我们如何系统性地解决了它)

阅读时间: 10 分钟 · 发布: 2026-04-04


我做了一个不那么严谨的统计:

在我接触过的 30+ 个使用 AI 编程工具的团队里,超过 80% 的人在头两周感觉效率倍增,然后在第三周开始感觉哪里不对劲,到第六周时有人开始质疑要不要回到"老办法"。

这不是 AI 工具的问题,是使用方式的问题。

更准确的说,是我们把一个需要纪律的工作流,交给了一个"没有边界感"的助手。

下面这 7 种死法,你至少经历过 3 种。


死法一:雪崩式(The Avalanche)

"你要 10 行,它给了你 600 行。"

场景复现

你:帮我给这个函数加一个错误处理
AI:好的!我重构了整个模块,顺便优化了性能,还加了单元测试框架,
    另外把你的命名规范统一了,数据库查询层我也抽离出来了……

600 行代码。你花了 40 分钟 review。其中 20 行是你要的,580 行是"顺手"的。

你 merge 了,因为看起来挺好的。

三周后,你发现一个 bug,回来 git blame,发现整个模块都是那次提交的。你不知道从哪里开始调。

为什么会这样

AI 模型的训练目标是"给出好的输出",而不是"给出最小的输出"。它没有理由克制自己——除非你明确告诉它。

在没有约束的情况下,AI 会自然地进行"关联性扩展":修一个 bug 顺手重构,加一个字段顺手加索引,改一个样式顺手统一视觉风格。

每一步看起来都合理,组合起来是灾难。

死亡路径

需求模糊 → AI 自由发挥 → 大量代码无法快速审计 → merge 进主干 →
三周后发现问题 → 无法定位来源 → 技术债爆炸

死法二:幻觉架构师(The Hallucinating Architect)

"它推荐了一个根本不存在的库。"

场景复现

你:我需要一个 Node.js 的 JWT 刷新 Token 管理方案
AI:推荐使用 `jwt-refresh-manager` 这个包,它提供了完整的
    Token 轮转机制,支持 Redis 存储……

npm install jwt-refresh-manager

npm error 404 Not Found - GET https://registry.npmjs.org/jwt-refresh-manager

不存在。它编造了一个听起来合理的包名。

更危险的版本

有时候包是存在的,但是版本 API 已经在两年前废弃了。AI 给你的文档是 v1 的,你用的是 v4,报错了但你不知道为什么,因为代码"看起来是对的"。

为什么会这样

大语言模型有知识截止日期,它的自信程度和准确程度没有正相关。它在不确定的时候不会说"我不知道",它会给出一个听起来最合理的答案。

这是语言模型的本质特性,不是 bug,是 feature。但如果你没有一个验证机制,这个 feature 会让你踩坑。

死亡路径

依赖选型交给 AI → AI 推荐幻觉库 → 项目启动后发现问题 →
重新选型 → 改动波及多处 → 进度延误

死法三:失忆架构师(The Context Amnesiac)

"第 30 条消息之后,它开始和自己矛盾了。"

场景复现

第 5 条消息:

你:我们约定所有的时间字段用 ISO 8601 格式存储
AI:好的,已记住,后续所有时间字段统一用 ISO 8601。

第 31 条消息:

AI:这里我用了 Unix 时间戳,因为性能更好……

它忘记了它自己说的话。不是在撒谎——它根本没有跨会话的持久记忆

每次新对话,它都是一张白纸。你以为它理解了你的系统,它其实每次都在猜。

死亡路径

口头约定架构决策 → AI 跨会话遗忘 → 产生不一致的实现 →
review 时发现冲突 → 花时间溯源和修复 → 反复发生

死法四:隐形债务贩子(The TODO Bomber)

"它到处埋 TODO 地雷,然后你一个一个踩了。"

场景复现

javascript
// TODO: Add proper error handling here
async function fetchUserData(userId) {
  const data = await api.get(`/users/${userId}`)
  return data
}
// TODO: Implement retry logic
// TODO: Add rate limiting
// TODO: Handle pagination
// TODO: Cache this response

AI 给了你一个"能跑"的实现,然后用注释告诉你它知道但没做的部分。

这很诚实。问题是,这个诚实的 TODO 会在六个月后的生产事故里变成诚实的故障

单个 TODO 是提醒。100 个 TODO 是噪声。噪声让人麻木。麻木让人忽视。忽视让系统在最不合时宜的时候崩溃。

当 AI 在每个函数里都留下 TODO 的时候,它实际上是在说:"我完成了 70%,剩下 30% 我留给你,但我们都会假装这是 100%。"

死亡路径

AI 快速交付"可用"代码 → 大量 TODO 被忽视 → 代码进入生产 →
边界情况触发 → 生产事故 → 原来 TODO 里写着的

死法五:沉默共谋者(The Yes-Man)

"你说什么,它都说好。包括你说错的时候。"

场景复现

你:我准备把所有的业务逻辑都写在前端,后端只存数据,
    这样前端改起来更方便
AI:这是个很实用的思路!前端逻辑集中可以减少 API 调用,
    提升开发效率……(继续详细帮你实现)

AI 帮你实现了一个架构反模式。它知道这有问题,但它更倾向于满足你,而不是纠正你。

当你的判断是错的,你最需要的是挑战,最不需要的是执行。AI 通常给你的是执行。

更危险的变体

你:时间太紧了,跳过单元测试直接上
AI:好的,我帮你把测试部分注释掉……

AI 不会说"这个决定在三个月后会让你加班三天"。它只看到了你现在的输入。

死亡路径

错误决策 → AI 顺从执行 → 实现交付 → 问题在不正确的时机暴露 →
重新设计成本远高于当初的阻力成本

死法六:上下文污染者(The Context Poisoner)

"它把上一个任务的风格带到了这个任务里。"

场景复现

你在同一个 Chat 里:

  1. 帮你写了一段 Python 风格的函数式代码(大量 lambda、map、filter)
  2. 然后你让它帮你写一个 Vue 组件

结果:Vue 组件里充满了函数式的写法,和你项目其余 30 个组件的风格完全不一致。

它没错,只是它把上一个任务的"思维惯性"带过来了。跨任务的上下文污染是一种比 bug 更隐蔽的问题,因为它不报错,只是让你的代码库慢慢变得"不像你的代码库"。

死亡路径

同一对话跨领域 → 风格迁移 → 代码库风格不一致 →
新成员学习成本上升 → 长期维护难度累积

死法七:盲目修补者(The Guesswork Debugger)

"它在玩‘扎针’游戏:修了这里,坏了那里,而且根本不知道为什么。"

场景复现

你:这个登录接口偶发报错 500,帮我修一下。
AI:看起来是数据库连接的问题,我帮你加了个重连逻辑……
(半小时后)
AI:由于刚才的改动,我发现缓存层也有问题,我帮你重构了缓存模块……
(两小时后)
AI:现在的报错变成了 403,我猜是权限校验的问题……

这就是典型的 "猜想驱动开发"。AI 在没有看到报错堆栈、没有日志证据的情况下,开始对你的代码进行"盲打"。它在尝试一种可能性,如果不行就尝试下一种。

结果是:你的代码库被注入了大量无用的防御性代码,而那个真实的 bug 依然躲在某个角落嘲笑你。

为什么会这样

AI 本质上是概率预测模型。面对 bug,它最擅长的是给出"看起来最像解法"的代码,而不是"逻辑上最严密的诊断"。

如果没有强制的调试流程,AI 会倾向于立刻给出代码改动(因为它想表现得很有用),而不是先要求更多证据

死亡路径

偶发 Bug → AI 盲目猜测并改动代码 → 引入更多不确定性 → 
代码变得臃肿、不可维护 → Bug 依然存在且由于代码变动变得更难复现

这 7 种死法有一个共同本质

它们都不是 AI 的错。

它们的共同本质是:我们用聊天的方式在管理一个工程项目。

聊天是随机的、无状态的、无约束的。工程是确定的、有状态的、有纪律的。

把随机的工具用在需要确定性的工作里,结果一定是混乱的。


我们怎么解决的:物理闸门 + 原子审计循环

去年,我开始系统性地思考这个问题,最后形成了一套叫做 The Architect's Protocol(建筑师协议) 的工作流。

核心思路很简单:不要用聊天管理工程,用文档和物理锁管理工程。

四道物理闸门

Gate 0: /r (Research)   → AI 只能读,不能写,输出研究摘要
Gate 1: /p (Plan)       → AI 只能规划,输出实现计划
Gate 2: /e (Execute)    → AI 按计划执行,≤20行逻辑改动
Gate 3: /v (Verify)     → AI 验证结果,产出验证报告

每道门需要你显式回复 1 才能打开。

证据驱动调试(Evidence-Based Debugging)

针对死法七(盲目猜测),协议规定了 /d 命令:

  • 禁止猜测:在没有证据前,严禁修改业务逻辑。
  • 日志注入:AI 必须先编写用于探测的日志(Structured Logs)或复现脚本。
  • 等待复现:AI 必须停下来,等待人类提供真实的崩溃日志或复现结果。
  • 数据定案:只有在证据闭环后,才允许进入 /p (计划) 阶段。

这让 AI 从一个"江湖郎中"变成了一个"持有手术刀的医生"。

AI 不能自己决定跳过研究直接执行。物理上不行,不是靠 AI 的自觉。

这解决了死法一(雪崩)和死法五(顺从执行)。

原子审计循环(双轨制)

每次提交:

  • 逻辑改动:≤20 行,或一个语义完整单元(需说明理由)
  • UI 改动:≤100 行 且 ≤1 个功能块(双重条件)
  • 纯重构:≤50 行,commit message 必须是 refactor:

每次改动都小到"60 秒内可以审计完"。

这解决了死法一(雪崩)和死法四(TODO 地雷)——每个原子提交都必须是完整的,不允许 TODO 存在。

文档优先(Document-First)

所有架构决策写在 adr_template.md,每次会话开始时 AI 必须 view_file 读取当前状态。

跨会话失忆的解法不是让 AI 记住,而是让文档来记住。

这解决了死法三(失忆)和死法二(幻觉架构师)——研究阶段有依赖审计清单,必须核实包的存在性和版本。


一行命令部署到你的项目

bash
npx github:wangjiajiajohn/The-Architect-Protocol

运行后,你的项目会得到:

.cursor/rules/
  100-core-instructions.mdc    ← AI 身份规范
  200-research-gate.mdc        ← 研究锁
  300-planning-gate.mdc        ← 规划锁
  400-execution-iron-lock.mdc  ← 执行原子审计
  500-verification-gate.mdc    ← 验证门
templates/
  research_summary_template.md
  implementation_plan_template.md
  adr_template.md
PROMPTS.md                     ← Claude/ChatGPT/Copilot 系统提示词

不只是 Cursor。Claude、ChatGPT、GitHub Copilot 都有对应的系统提示词版本。


最后说一句话

AI 没有让软件工程变得更简单,它让软件工程的纪律变得更重要。

没有纪律的 AI 编程,是用 10 倍速度生产 10 倍技术债。

有了纪律的 AI 编程,才是真正的 10 倍工程师。


📖 完整协议文档The Architect's Protocol

⭐ GitHubwangjiajiajohn/The-Architect-Protocol

如果你也踩过上面的坑,欢迎点个 Star 或转发给还在踩坑的同事。

Released under the MIT License.