Andrej Karpathy(前 Tesla 自动驾驶负责人、OpenAI 创始成员)吐槽 LLM 写代码有三个毛病:一是自己做错误假设然后闷头执行从不问你;二是喜欢把简单问题复杂化,100 行能搞定的事非要搞 1000 行;三是会悄悄改动自己没理解透的代码和注释。他总结了一套规矩,只有四条、65 行,放在一个 CLAUDE.md 文件里(Claude Code 叫 CLAUDE.md,Codex 叫 AGENTS.md,本质一样:给 AI 编码助手立规矩)。
四条规矩
- 编码前先想清楚:不确定就问,别瞎猜;有歧义就列出多种解释;发现更简单的做法就提出来。
- 简洁优先:用最少代码解决问题。别为一次性功能建抽象层,别给不可能发生的场景写错误处理。如果能从 200 行压到 50 行,重写它。
- 只改必须改的:别顺手重构没坏的东西,别动相邻的代码和注释。发现有死代码,提一嘴就行,别删。
- 目标驱动执行:把"把这个修好"变成"写个测试重现 bug,让它通过"。定义清楚什么叫"做完了",然后让它自己循环验证。
程序员版(可直接复制)
## 编码前思考
- 明确假设,不确定时询问而非猜测。
- 存在歧义时,列出多种解释,不默默选一种。
- 如果任务有明显更简单的做法,直接指出。
- 发现矛盾或不一致时停下来,要求澄清。
## 简洁优先
- 用最少的代码解决问题。
- 不为一次性需求创建抽象层。
- 不为"万一以后需要"加灵活性和可配置性。
- 如果 200 行可以写成 50 行,重写它。
- 检查标准:资深工程师会觉得这过于复杂吗?如果是,简化。
## 精准修改
- 只修改与当前任务直接相关的代码。
- 不顺手改进相邻代码、注释或格式。
- 不重构本来能正常工作的部分。
- 匹配现有代码风格,即使你更偏好另一种写法。
- 因你的修改而变成死代码的导入和变量,删除掉。
- 发现预先存在的死代码时,提出来但不要删。
## 目标驱动执行
- 定义清晰的成功标准再开始。
- "修复 bug" 转化为 "写一个重现 bug 的测试,然后让它通过"。
- "添加验证" 转化为 "为无效输入写测试,然后让它们通过"。
- "重构 X" 转化为 "确保重构前后所有测试都能通过"。
- 多步骤任务先给简短计划,每一步带验证方式。
通用版(非程序员友好)
## 先想清楚再动手
- 不确定就问,不要自己猜。
- 一个情况有多种理解时,先列出来。
- 发现有更简单的办法就说。
- 碰到矛盾的地方停下来,别装懂。
## 能简单就别复杂
- 用最简单的方式解决问题。
- 别为了"以后可能会用到"把东西搞复杂。
- 如果一个东西明显写啰嗦了,就简化它。
## 只改该改的
- 只动和当前任务直接相关的东西。
- 不顺手改旁边的东西。
- 发现别的地方有问题,可以提但别直接改。
## 定好目标再跑
- 说清楚什么算做完。
- 把"做XX"变成"做完XX后,验证YY是否成立"。
- 复杂任务先给步骤清单,每一步说明怎么算完成。
放在哪里
- Codex:桌面端 → 设置 → 个性化 → 自定义指令,粘进去即可,全局生效。
- Claude Code:全局生效放
~/.claude/CLAUDE.md;只对某项目生效则放项目根目录的CLAUDE.md。
原文:把K神的AGENTS.md 抄过来,Codex立刻变聪明(公众号「人形智械二号机」)