为什么顶级工程师都在谈论这 4 条规则?
Andrej Karpathy 亲眼目睹了 AI 编程助手最常见的失控模式,并把解药浓缩成了一个文件。
Karpathy 是谁,他为什么在意这件事?
Andrej Karpathy 在 X(Twitter)上发了一篇帖子,描述他观察到 AI 编程助手反复犯的几种错误。这篇帖子在工程师社区迅速引爆——因为每个用过 Claude、GPT、Cursor 的人都说:"对!就是这个!"
一位叫 forrestchang 的开发者把这些观察整理成了一个单文件指南,上传到 GitHub 后获得了 102,000 个 Star——这个数字意味着十万多个工程师觉得这份文件值得珍藏。
GitHub Star 相当于工程师版的「收藏」。一个文件能收到 10 万个 Star,说明全球顶尖工程师圈子都在传阅它。这不是教程,而是战场上总结的经验。
AI 编程助手的三大失控模式
Karpathy 的原话(翻译):
乱猜不问
「模型替你做了错误的假设,然后一路往前跑,不核实、不确认、不提醒你它在猜。」
过度建造
「它们爱把代码搞复杂:膨胀的抽象层、不必要的弹性设计。100 行能搞定的,它写了 1000 行。」
误伤代码
「它有时会修改甚至删掉它根本没搞清楚的代码和注释,即使那些代码跟你要的功能完全无关。」
这 4 条规则是怎么工作的?
这份文件的核心是 4 条行为准则——每一条都直接对应一种失控模式。点击「下一步」看它们怎么协作:
学会这 4 条规则,你能做到什么?
这不是给程序员的课程——这是给所有用 AI 编程工具的人的生存指南。
知道 AI 容易在哪里犯错,就能在它犯错之前用指令纠正它。
能分辨「AI 在帮我」和「AI 在自作主张」——这是防止代码失控的核心能力。
了解「目标驱动执行」原则后,你能打破 AI 反复修改却没有进展的死循环。
这份 CLAUDE.md 文件获得 102,000 个 Star,最能说明什么?
先想清楚再动手
规则一:别让 AI 替你猜测。好的 AI 编程助手会先亮出它的假设,而不是埋头就干。
想象你雇了一个承包商来装修
你说:「帮我把厨房改一下,我想要更多储物空间。」
一个差劲的承包商会直接动手——拆墙、安柜子,做完后你发现他把你最重要的管道藏进了墙里。
一个好承包商会先问:「你要的是上层柜还是下层柜?预算多少?有没有不能动的墙?你希望几号完工?」
AI 编程助手也一样。它收到你的指令后,必须做很多假设——假设你用什么框架,假设你要什么风格,假设有没有现有逻辑需要保留。好的 AI 会把这些假设说出来,坏的 AI 会悄悄猜测然后去做。
「模型替你做了错误的假设,然后一路跑,不管理自己的困惑,不寻求澄清,不呈现权衡,不在该推回去的时候推回去。」
规则一的原文,逐行解读
## 1. Think Before Coding
Before implementing:
- State your assumptions explicitly.
If uncertain, ask.
- If multiple interpretations exist,
present them - don't pick silently.
- If a simpler approach exists,
say so. Push back when warranted.
- If something is unclear, stop.
Name what's confusing. Ask.
在动手写代码之前:
把你做的假设明确说出来。不确定的话,直接问。
如果你的指令可以被理解成多种意思,把几种理解都列出来——不要自己悄悄选一种。
如果有更简单的解法,告诉我。必要时应该反驳我的方案。
如果有什么不清楚,停下来。说清楚是什么让你困惑了,然后问。
好 AI vs 差 AI:来看一场真实对话
你对 AI 说:「帮我给用户列表加一个搜索功能。」两种 AI 的回应截然不同:
「差劲 AI」花了时间写了你不需要的东西。好 AI 用 5 秒钟问清楚,然后只做你真正需要的 15 行代码。时间成本差了 10 倍。
如何在日常使用中激活规则一
只要把这份文件(或这几句话)加进你的 AI 工具的系统提示,AI 就会内化这些行为。以下是实操方法:
在任务开始时加一句:「动手之前,先告诉我你在哪些地方做了假设。」
加一句:「如果有不确定的地方,先问我,别猜。」
说:「如果有多种实现方式,列出来并告诉我你推荐哪种,以及原因。」
你让 AI 「帮我优化这个函数的性能」。AI 没有提任何问题,直接改了代码,把一个简单的循环换成了一个复杂的缓存机制。你运行后发现 bug 出现了。
根据规则一,这个 AI 最主要的失误是什么?
简洁即力量
规则二:用最少的代码解决问题。50 行胜过 200 行——只要能跑,就不加一行多余的。
乐高积木和瑞士军刀
想象你要给朋友一个能打开啤酒瓶的工具。
你可以给他一把开瓶器:小巧,专门做一件事,永远不出问题。
或者你可以给他一把瑞士军刀:有 23 个功能,有一个是开瓶器,但每次用都要先找到那个功能,偶尔还会误触到锯子。
AI 编程助手的默认倾向是瑞士军刀——它会在你要开瓶器的时候,同时顺手给你加上锯子、螺丝刀和镊子。 过度工程化 是 AI 编程最常见的失控模式之一。
「问自己:'一个高级工程师会说这代码过于复杂吗?'如果是,就简化它。」
规则二原文,逐行解读
## 2. Simplicity First
- No features beyond what was asked.
- No abstractions for single-use code.
- No "flexibility" or "configurability"
that wasn't requested.
- No error handling for
impossible scenarios.
- If you write 200 lines and it
could be 50, rewrite it.
不加任何没被要求的功能。
不为只用一次的代码创建抽象层(不要为了「以后可能会用」而过度封装)。
不加任何没被要求的「灵活性」或「可配置性」——你说要一个按钮,就给一个按钮,别给「可高度定制的按钮组件」。
不为不可能发生的情况写错误处理。
如果你写了 200 行但 50 行就够了,重写它。
找出 AI 的过度工程化
你只要求「写一个把数字加倍的函数」。点击你认为多余的那一行:
任务:写一个把数字加倍的函数
function double(n) {
if (typeof n !== 'number') throw new Error('Expected number');
return n * 2;
// multiplier: configurable factor (default: 2)
const _cache = new Map(); // memoization cache
}
如何指令 AI 保持简洁
把这些短语加进你的提示,AI 就会收到明确信号:
最小可行实现
告诉 AI 只实现核心功能,不要提前「扩展」
不要加我没提到的功能
直接封住 AI 的自作主张冲动
20 行以内解决
给代码量设上限,迫使 AI 精简
YAGNI
「You Aren't Gonna Need It」——工程师圈子的经典原则:只做现在需要的,别为未来没到来的需求提前建造
你让 AI 写一个发送欢迎邮件的功能。AI 返回了 300 行代码,包括:邮件模板系统、多语言支持、发送队列、重试逻辑和邮件追踪像素。你只有一个产品,只有中文用户,每天发不到 10 封邮件。
根据规则二,你应该怎么处理这 300 行代码?
外科医生式修改
规则三:只碰你必须碰的地方。好的 AI 做完手术后,病人身上的其他器官完好无损。
手术刀,不是除草机
外科医生做心脏手术时,不会因为「顺便看到肝脏有点不好看」就把肝脏也动一刀。他们的原则是: 只修复被要求修复的,其他一律不动。
AI 编程助手有时候像一个过于热情的清洁工——你让它擦擦窗户,它顺手把你书架上的书都重新排了序,把你的备忘录扔掉了,还把你最喜欢的马克杯换了个位置。一切看起来更「整洁」,但你的东西全乱了。
规则三叫「 Surgical Changes 」——用手术刀,不用除草机。
规则三原文,逐行解读
## 3. Surgical Changes
When editing existing code:
- Don't "improve" adjacent code,
comments, or formatting.
- Don't refactor things that
aren't broken.
- Match existing style,
even if you'd do it differently.
- If you notice unrelated dead code,
mention it - don't delete it.
When your changes create orphans:
- Remove imports/variables/functions
that YOUR changes made unused.
修改现有代码时:
不要「顺便改进」旁边的代码、注释或格式。
不要重构没有问题的东西。
保持现有代码风格,即使你自己会写得不一样。
如果你发现了无关的「死代码」,说出来——但不要自己删掉它。
当你的修改导致某些东西变成孤儿:清理你的改动造成的多余 import/变量/函数。但只清理你自己造成的,不动原有的。
「顺便」二字有多贵?
你让 AI 修一个 bug:「第 47 行的变量名拼错了」。看看两种 AI 的代码变更(diff)有多大差别:
点击查看不同 AI 的操作范围
AI「顺便」删掉了它认为是死代码的逻辑——而那段代码其实是你同事刚加的新功能,还没上线。这种 bug 可能要花好几个小时才能定位到。
但有一件事 AI 必须自己清理
外科医生不能留着用过的纱布在病人肚子里。规则三有一个重要例外:
你的改动产生的孤儿代码,必须由你负责清理。
比如:你添加了一个新函数 B,删掉了旧函数 A——那么所有原本 import 了函数 A 的地方,都需要 AI 帮你更新,否则会报错。
拖拽练习:哪些清理是 AI 应该做的,哪些不应该自作主张?
✅ AI 应该主动清理
❌ AI 不应该自作主张
你让 AI 把一个函数从同步改成异步(加 async/await)。AI 完成任务后,顺便把整个文件的缩进从 2 格改成了 4 格,还把所有变量命名从小驼峰改成了下划线风格。
AI 修改格式和命名风格,违反了规则三的哪个条款?
目标驱动执行
规则四:把任务变成可验证的目标,让 AI 自己循环直到达成。从此摆脱「改了又改」的死循环。
GPS 导航 vs 手绘地图
想象你开车去一个陌生城市找一家餐厅。
手绘地图方式:朋友给你一张手画的路线图,走了 10 分钟发现有条路封了,地图失效,你只能打电话问朋友。朋友又画了一张,走了 5 分钟又遇到施工……你来来回回询问了 7 次才到。
GPS 导航方式:你输入目的地,GPS 自动规划路线,遇到封路自动重新规划,独立循环直到你到达——全程不需要你干预。
规则四就是把 AI 从「手绘地图模式」切换成「 GPS 导航模式 」。
「帮我把这个功能搞好」是弱标准——什么叫搞好?没法验证。「写一个测试,当输入空字符串时失败,然后让它通过」是强标准——测试通过即完成,机器可以自己判断。
规则四原文,逐行解读
## 4. Goal-Driven Execution
Transform tasks into verifiable goals:
- "Add validation" →
"Write tests for invalid inputs,
then make them pass"
- "Fix the bug" →
"Write a test that reproduces it,
then make it pass"
- "Refactor X" →
"Ensure tests pass before and after"
Strong success criteria let you
loop independently. Weak criteria
require constant clarification.
把任务转化成可验证的目标:
「加验证逻辑」→「先写一个针对非法输入会失败的测试,再让它通过」
「修这个 bug」→「先写一个能复现 bug 的测试,再让它通过」
「重构 X」→「确保测试在改动前后都能通过」
强成功标准让 AI 可以自己循环迭代,弱标准则需要你每一步都介入。
弱目标 vs 强目标:代入感演练
以下是同一个任务的两种表达方式。好的 AI 在收到强目标后,可以自己循环工作直到完成:
「帮我修一下登录的 bug」
什么 bug?什么情况会触发?怎么算修好了?
不断介入解释,来回 5 轮
「用户输入正确密码但收到 401 错误。写一个测试复现这个情况,然后修到测试通过。」
写测试 → 发现 token 过期逻辑的 bug → 修复 → 测试通过 → 完成
零介入,直接拿到结果
复杂任务:用计划格式锁定目标
对于多步骤任务,CLAUDE.md 还规定了一个「计划模板」。把这个模板塞进你的提示,AI 会自己制定执行计划:
For multi-step tasks,
state a brief plan:
1. [Step] → verify: [check]
2. [Step] → verify: [check]
3. [Step] → verify: [check]
对于多步骤任务,先列出执行计划:
1. 添加用户验证逻辑 → 验证:运行验证测试,全部通过
2. 更新 API 响应格式 → 验证:curl 请求返回新格式
3. 更新前端显示 → 验证:页面正确渲染新数据
你正在用 AI 开发一个新功能,已经来回改了 6 次了,AI 每次都说「好了」,但你测试后发现还有问题。这个循环已经进行了 2 个小时。
根据规则四,如何从这个死循环中解脱?
四条规则,一个工作流
这份课程到这里结束了。四条规则不是孤立的——它们是一个完整的工作流:
收到任务 → 列出假设 → 问清楚不确定的地方 → 再动手
只实现被要求的功能 → 50 行能解决就不用 200 行
只碰必须碰的代码 → 不改风格 → 清理自己制造的孤儿
把任务转成可验证的目标 → AI 自己循环直到达成
把这个 CLAUDE.md 文件放进你的任何项目根目录(Claude Code、Cursor 或其他支持 system prompt 的工具),这四条规则就会自动生效于所有任务。这是 102,000 个工程师的集体认可。