01

为什么顶级工程师都在谈论这 4 条规则?

Andrej Karpathy 亲眼目睹了 AI 编程助手最常见的失控模式,并把解药浓缩成了一个文件。

Karpathy 是谁,他为什么在意这件事?

Andrej Karpathy 在 X(Twitter)上发了一篇帖子,描述他观察到 AI 编程助手反复犯的几种错误。这篇帖子在工程师社区迅速引爆——因为每个用过 Claude、GPT、Cursor 的人都说:"对!就是这个!"

一位叫 forrestchang 的开发者把这些观察整理成了一个单文件指南,上传到 GitHub 后获得了 102,000 个 Star——这个数字意味着十万多个工程师觉得这份文件值得珍藏。

💡
102K Stars 意味着什么?

GitHub Star 相当于工程师版的「收藏」。一个文件能收到 10 万个 Star,说明全球顶尖工程师圈子都在传阅它。这不是教程,而是战场上总结的经验。

AI 编程助手的三大失控模式

Karpathy 的原话(翻译):

🎲

乱猜不问

「模型替你做了错误的假设,然后一路往前跑,不核实、不确认、不提醒你它在猜。」

🏗️

过度建造

「它们爱把代码搞复杂:膨胀的抽象层、不必要的弹性设计。100 行能搞定的,它写了 1000 行。」

✂️

误伤代码

「它有时会修改甚至删掉它根本没搞清楚的代码和注释,即使那些代码跟你要的功能完全无关。」

这 4 条规则是怎么工作的?

这份文件的核心是 4 条行为准则——每一条都直接对应一种失控模式。点击「下一步」看它们怎么协作:

🧠
先想清楚
✂️
简洁优先
🔬
外科修改
🎯
目标驱动
点击「下一步」开始

学会这 4 条规则,你能做到什么?

这不是给程序员的课程——这是给所有用 AI 编程工具的人的生存指南。

🎮
更好地驾驭 AI

知道 AI 容易在哪里犯错,就能在它犯错之前用指令纠正它。

🔍
识别 AI 何时在乱来

能分辨「AI 在帮我」和「AI 在自作主张」——这是防止代码失控的核心能力。

从循环中解脱

了解「目标驱动执行」原则后,你能打破 AI 反复修改却没有进展的死循环。

这份 CLAUDE.md 文件获得 102,000 个 Star,最能说明什么?

02

先想清楚再动手

规则一:别让 AI 替你猜测。好的 AI 编程助手会先亮出它的假设,而不是埋头就干。

想象你雇了一个承包商来装修

你说:「帮我把厨房改一下,我想要更多储物空间。」

一个差劲的承包商会直接动手——拆墙、安柜子,做完后你发现他把你最重要的管道藏进了墙里。

一个好承包商会先问:「你要的是上层柜还是下层柜?预算多少?有没有不能动的墙?你希望几号完工?」

AI 编程助手也一样。它收到你的指令后,必须做很多假设——假设你用什么框架,假设你要什么风格,假设有没有现有逻辑需要保留。好的 AI 会把这些假设说出来,坏的 AI 会悄悄猜测然后去做。

⚠️
Karpathy 的原话

「模型替你做了错误的假设,然后一路跑,不管理自己的困惑,不寻求澄清,不呈现权衡,不在该推回去的时候推回去。」

规则一的原文,逐行解读

原文

## 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 的回应截然不同:

💡
关键洞察:沉默的假设是最贵的 bug

「差劲 AI」花了时间写了你不需要的东西。好 AI 用 5 秒钟问清楚,然后只做你真正需要的 15 行代码。时间成本差了 10 倍。

如何在日常使用中激活规则一

只要把这份文件(或这几句话)加进你的 AI 工具的系统提示,AI 就会内化这些行为。以下是实操方法:

1
使用前先说「列出你的假设」

在任务开始时加一句:「动手之前,先告诉我你在哪些地方做了假设。」

2
鼓励 AI 提问

加一句:「如果有不确定的地方,先问我,别猜。」

3
要求呈现方案选项

说:「如果有多种实现方式,列出来并告诉我你推荐哪种,以及原因。」

情景

你让 AI 「帮我优化这个函数的性能」。AI 没有提任何问题,直接改了代码,把一个简单的循环换成了一个复杂的缓存机制。你运行后发现 bug 出现了。

根据规则一,这个 AI 最主要的失误是什么?

03

简洁即力量

规则二:用最少的代码解决问题。50 行胜过 200 行——只要能跑,就不加一行多余的。

乐高积木和瑞士军刀

想象你要给朋友一个能打开啤酒瓶的工具。

你可以给他一把开瓶器:小巧,专门做一件事,永远不出问题。

或者你可以给他一把瑞士军刀:有 23 个功能,有一个是开瓶器,但每次用都要先找到那个功能,偶尔还会误触到锯子。

AI 编程助手的默认倾向是瑞士军刀——它会在你要开瓶器的时候,同时顺手给你加上锯子、螺丝刀和镊子。 过度工程化 是 AI 编程最常见的失控模式之一。

✂️
Karpathy 的测试题

「问自己:'一个高级工程师会说这代码过于复杂吗?'如果是,就简化它。」

规则二原文,逐行解读

原文

## 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 的过度工程化

你只要求「写一个把数字加倍的函数」。点击你认为多余的那一行:

任务:写一个把数字加倍的函数

1 function double(n) {
2 if (typeof n !== 'number') throw new Error('Expected number');
3 return n * 2;
4 // multiplier: configurable factor (default: 2)
5 const _cache = new Map(); // memoization cache
6 }

如何指令 AI 保持简洁

把这些短语加进你的提示,AI 就会收到明确信号:

最小可行实现 告诉 AI 只实现核心功能,不要提前「扩展」
不要加我没提到的功能 直接封住 AI 的自作主张冲动
20 行以内解决 给代码量设上限,迫使 AI 精简
YAGNI 「You Aren't Gonna Need It」——工程师圈子的经典原则:只做现在需要的,别为未来没到来的需求提前建造
情景

你让 AI 写一个发送欢迎邮件的功能。AI 返回了 300 行代码,包括:邮件模板系统、多语言支持、发送队列、重试逻辑和邮件追踪像素。你只有一个产品,只有中文用户,每天发不到 10 封邮件。

根据规则二,你应该怎么处理这 300 行代码?

04

外科医生式修改

规则三:只碰你必须碰的地方。好的 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 的改动
差劲 AI 的改动
点击上方任意组件,查看它的操作范围。
⚠️
最危险的场景

AI「顺便」删掉了它认为是死代码的逻辑——而那段代码其实是你同事刚加的新功能,还没上线。这种 bug 可能要花好几个小时才能定位到。

但有一件事 AI 必须自己清理

外科医生不能留着用过的纱布在病人肚子里。规则三有一个重要例外:

你的改动产生的孤儿代码,必须由你负责清理。

比如:你添加了一个新函数 B,删掉了旧函数 A——那么所有原本 import 了函数 A 的地方,都需要 AI 帮你更新,否则会报错。

拖拽练习:哪些清理是 AI 应该做的,哪些不应该自作主张?

删掉自己添加但最终没用到的变量
删掉原有代码里它认为「不优雅」的注释
更新因自己修改而失效的 import 语句
把原有的 var 全换成 const

✅ AI 应该主动清理

拖到这里

❌ AI 不应该自作主张

拖到这里
情景

你让 AI 把一个函数从同步改成异步(加 async/await)。AI 完成任务后,顺便把整个文件的缩进从 2 格改成了 4 格,还把所有变量命名从小驼峰改成了下划线风格。

AI 修改格式和命名风格,违反了规则三的哪个条款?

05

目标驱动执行

规则四:把任务变成可验证的目标,让 AI 自己循环直到达成。从此摆脱「改了又改」的死循环。

GPS 导航 vs 手绘地图

想象你开车去一个陌生城市找一家餐厅。

手绘地图方式:朋友给你一张手画的路线图,走了 10 分钟发现有条路封了,地图失效,你只能打电话问朋友。朋友又画了一张,走了 5 分钟又遇到施工……你来来回回询问了 7 次才到。

GPS 导航方式:你输入目的地,GPS 自动规划路线,遇到封路自动重新规划,独立循环直到你到达——全程不需要你干预。

规则四就是把 AI 从「手绘地图模式」切换成「 GPS 导航模式 」。

🎯
关键区别:弱成功标准 vs 强成功标准

「帮我把这个功能搞好」是弱标准——什么叫搞好?没法验证。「写一个测试,当输入空字符串时失败,然后让它通过」是强标准——测试通过即完成,机器可以自己判断。

规则四原文,逐行解读

原文

## 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」

AI

什么 bug?什么情况会触发?怎么算修好了?

不断介入解释,来回 5 轮

「用户输入正确密码但收到 401 错误。写一个测试复现这个情况,然后修到测试通过。」

AI

写测试 → 发现 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 个小时。

根据规则四,如何从这个死循环中解脱?

四条规则,一个工作流

这份课程到这里结束了。四条规则不是孤立的——它们是一个完整的工作流:

1
先想清楚(Think Before Coding)

收到任务 → 列出假设 → 问清楚不确定的地方 → 再动手

2
简洁优先(Simplicity First)

只实现被要求的功能 → 50 行能解决就不用 200 行

3
外科修改(Surgical Changes)

只碰必须碰的代码 → 不改风格 → 清理自己制造的孤儿

4
目标驱动(Goal-Driven Execution)

把任务转成可验证的目标 → AI 自己循环直到达成

🚀
下一步:把这些规则放进你的工具

把这个 CLAUDE.md 文件放进你的任何项目根目录(Claude Code、Cursor 或其他支持 system prompt 的工具),这四条规则就会自动生效于所有任务。这是 102,000 个工程师的集体认可。