返回

让 AI 主动质疑自己的设计

AI Coding 里一个很重要的能力,不是让 AI 多写代码,而是让 AI 主动质疑自己的设计。

现在用 Codex、Claude、Cursor 这类工具写代码,最容易产生一种错觉:模型越强,工程质量就越高。

但实际用久了你会发现,AI 最大的问题之一往往不是“不会写”,而是“太会写”。它可以很快生成一套看起来完整、专业、抽象层次分明的方案,但这个方案未必适合当前项目。

尤其在真实业务里,很多问题本来只需要一个简单函数、一个明确分支、一个普通组件,AI 却很容易写出一套完整的:

TaskManagerFactory
TaskStrategyRegistry
TaskExecutionContext
TaskStateHandler

最后你回头一看,实际业务只有 3 个状态。

这不是工程化,这是复杂化。

AI 很容易把简单问题复杂化

程序员自己也会过度设计,AI 只是把这个倾向放大了。

因为 AI 训练语料里有大量“看起来很工程化”的代码:设计模式、架构分层、可扩展框架、通用抽象、策略模式、注册中心、生命周期管理器。于是它在面对一个普通需求时,很容易默认走向“更完整”的方案。

问题在于,完整不等于合适。

常见的过度设计包括:

  • 为了未来可能的需求提前抽象
  • 多封装一层 service、manager、handler
  • 为了“优雅”引入复杂模式
  • 把一次性逻辑做成通用框架
  • 给小团队项目套大厂工程结构
  • 为了理论最佳实践增加维护成本

这些东西单看都不一定错,但放到小团队、早期项目、业务还没稳定的场景里,就很容易变成负担。

[!WARNING] 过度设计最危险的地方是,它一开始看起来不像错误。它甚至显得很专业。真正的问题会在三个月后、半年后维护时出现。

关键词:避免过度设计

以后和 AI 协作时,一个非常值得长期复用的关键词是:

避免过度设计(overengineering)

这句话的作用不是让 AI 写得更少,而是让它重新检查:当前方案是不是超过了问题本身的复杂度。

AI 默认会倾向于“把方案做完整”。但真实工程里,更重要的是“刚好够用”。

尤其是两个人小团队,最怕的不是代码不够高级,而是项目太早染上“大厂病”:抽象很多、概念很多、文件很多,但真正的业务路径反而越来越难看懂。

Prompt 1:审视是否过度设计

这是最常用、也最推荐长期放在手边的一段 Prompt。

请审视当前方案是否存在过度设计(overengineering)。

重点检查:
1. 是否为了未来可能的需求做了过多抽象
2. 是否增加了不必要的层级/封装
3. 是否可以用更简单直接的实现
4. 是否存在“为了优雅而复杂”
5. 是否符合当前项目规模和团队情况

如果有,请给出更简单、更务实的方案。

这段 Prompt 的价值在于,它不是让 AI “继续优化”,而是让 AI 反过来质疑自己。

很多时候你会发现,AI 第二轮给出的方案会明显更朴素:少一个接口、少一个抽象类、少一个 registry,甚至直接承认原方案没有必要。

这才是有用的 AI 协作。

Prompt 2:像维护者一样思考

AI 很擅长完成当前任务,但它不一定天然关心半年后的维护体验。

所以你可以让它切换视角。

请从“半年后维护这个模块的人”的角度,重新审视当前实现。

重点关注:
- 可读性
- 复杂度
- 调试难度
- 是否容易理解
- 是否真的需要这么多抽象

请指出当前实现中未来维护成本最高的地方,并给出更容易维护的版本。

这个 Prompt 特别适合在 AI 已经写完一版代码之后使用。

因为第一版代码经常能跑,但不一定好维护。你让 AI 从“交付者”切换成“维护者”,它就会开始注意命名、调用链、状态流转、调试入口这些更实际的问题。

这一步很重要。

代码不是写完就结束。真正的成本发生在下一次需求变更、下一次线上 bug、下一次别人接手的时候。

Prompt 3:小团队长期维护原则

如果项目只有一两个人维护,很多所谓“最佳实践”都要重新评估。

不是说最佳实践错了,而是它们通常默认你有更多人、更长周期、更复杂组织和更稳定的边界。

小团队需要的是另一套优先级。

请按“小团队长期维护”的原则优化方案:

- 优先简单
- 优先可读
- 优先少抽象
- 优先少依赖
- 优先业务直观
- 不要为了理论最佳实践增加复杂度

请保留当前业务真正需要的部分,去掉不必要的工程化设计。

这段 Prompt 很适合小团队、个人项目、外包项目、早期产品。

它的核心不是“写得随便一点”,而是把复杂度花在真正有价值的地方。

少抽象不等于低质量。很多时候,少抽象反而更专业。

让 AI 给两个版本

还有一个非常实用的技巧:让 AI 同时给出简单版和扩展版。

请分别给出:
1. 最简单直接的实现
2. 更可扩展的实现

并说明:
- 两个方案分别适合什么场景
- 当前项目阶段更推荐哪个
- 如果选择简单方案,未来扩展时需要注意什么

这个方法很好用,因为它不会直接否定扩展性,而是把选择权拿回来。

AI 默认可能会给一个“工程化复杂方案”。但当你要求它同时给出两个版本,它往往会承认:当前阶段其实更适合简单实现。

这就是关键。

我们不是反对架构,不是反对设计模式,也不是反对扩展性。我们反对的是,在业务还没证明需要复杂度之前,就提前支付复杂度成本。

可以定一条团队 AI 原则

如果团队长期使用 AI 写代码,我建议定一条很简单的原则:

不要为了未来需求设计未来系统。
优先满足当前业务。

这句话听起来普通,但非常有用。

它可以压住 AI 的抽象欲,也可以压住程序员自己的抽象欲。

每次 AI 想引入新层级、新接口、新 manager、新 hook、新 service 时,都可以问一句:

这个抽象现在解决了真实问题,还是只是在服务一个未来想象?

如果答案是后者,就先别加。

AI 架构师思维

很多人理解 AI Coding,还停留在“怎么写 Prompt”“怎么让 AI 更快生成代码”。

但真正重要的能力,可能是另一件事:

控制 AI 的复杂度。

AI 可以让你更快写出代码,也可以让你更快堆出一座复杂系统。

所以你不能只做需求方,不能只说“帮我实现”。你还要学会当审查者,要求 AI 解释设计,质疑抽象,删除多余层级,把方案压回项目真实需要的大小。

这才是 AI 架构师思维。

不是让 AI 写更多,而是让 AI 在该停下来的地方停下来。

写在最后

好的 AI 协作,不是把所有事情都交给 AI。

而是你能控制它的方向、边界和复杂度。

当 AI 给出一个很“完整”的方案时,不要急着接受。先问它:

有没有过度设计?
有没有更简单的做法?
半年后维护这个模块的人会不会骂我?

如果这三个问题都过了,再继续往下写。

工程质量很多时候不是来自更多抽象,而是来自更少的、不必要的抽象。

把简单问题保持简单,是 AI Coding 里非常重要的能力。