Karpathy 发推文指出 AI 编程通病,andrej-karpathy-skills 给出四条解法

0 阅读6分钟

大家在用 AI Agent 写代码时,大概率都有同一种体感:模型越来越强了,但只要缺少协作规则,输出质量就很难稳定。

OpenAI 联合创始人、前特斯拉 AI 总监 Andrej Karpathy 在 X 上发过一条推文,总结了 AI 编程的通病。

1.png

这些问题,本质上可以归纳为三类:错误假设、过度复杂、无关改动。


问题所在:LLM 写代码常见通病

1)错误假设:不澄清,直接执行

你让它改一个小点,它会默认一堆前提并直接开工。
比如只让它“做导出功能”,它会默认导出全部字段、默认格式、默认存储路径,甚至默认权限策略。

问题是:这些默认值很多并不是你要的。

2)过度复杂:100 行问题写成 1000 行架构

本来几十行能完成的需求,它会加抽象层、加配置、加扩展点,最终写成一个“看起来很先进”的复杂方案。

短期看像“专业”,长期看维护成本陡增。

3)无关改动:误触任务边界外的代码

你让它修一个 bug,它顺手把附近注释、命名、格式、甚至无关模块也改了。
结果是代码评审困难、回归风险上升、回滚成本变高。

补充一个常见现象:只执行动作,不对结果负责。
“修一下这个问题”这类弱指令下,AI 常常没有验证闭环,最后仍然需要人工兜底。


从通病到解法:andrej-karpathy-skills

andrej-karpathy-skills 是一个很特别的开源项目:核心不是代码功能,而是一份规则文档 CLAUDE.md
它的由来很直接:Karpathy 先在 X 上点出了 LLM 编码里的典型通病,随后社区开发者把这些观察提炼成可执行的四条协作规则,并整理成项目,方便直接接入日常开发流程。

所以它真正提供的价值,不是“再造一个工具”,而是把“人和 AI 如何协作”这件事标准化。
前面我们讲的是问题,下面就进入它给出的具体解法。

2.png


四条规则

这四条规则分别对应上面的三个核心问题:
编码前思考 -> 消灭错误假设;简洁优先 -> 抑制过度复杂; 精准修改 -> 控制无关改动; 目标驱动 -> 建立结果闭环。

3.png

规则一:编码前先思考(Think Before Coding)

核心:先对齐认知,再写实现。

执行要点:

  • 不要假设,不要隐藏困惑;
  • 有歧义时展示多种解释,不要默选;
  • 有更简单方案时主动提出;
  • 关键点不清楚时先停下来提问。

场景:你说“做一个用户导出接口”。
正确做法不是立刻写代码,而是先澄清:

  • 导出哪些字段?
  • 哪些角色有权限?
  • 支持哪些格式?
  • 异步还是同步?

这一步会显著减少后续返工。

规则二:简洁优先(Simplicity First)

核心:最少代码解决问题,不做投机性设计。

执行要点:

  • 不加未要求功能;
  • 不给一次性逻辑强上抽象;
  • 不加未要求的“灵活性/可配置性”;
  • 如果明显写复杂了,主动重写到简洁版本。

场景:你要加一个一次性脚本。
AI 倾向于先封装一套通用框架。
更好的要求是:只为当前需求写最小可用实现,不预埋“未来可能用到”的复杂能力。

判断标准很简单:如果资深工程师会说“这明显过度了”,就继续简化。

规则三:精准修改(Surgical Changes)

核心:只改和当前任务直接相关的代码。

执行要点:

  • 不顺手“优化”相邻代码、注释、格式;
  • 不重构未损坏模块;
  • 匹配现有风格,减少协作摩擦;
  • 只清理本次改动引入的冗余代码。

场景:你让它修分页 bug。
允许改动的是分页相关逻辑;
不该改的是无关注释、无关格式、无关重构。

这样做能保证每一行 diff 都有业务理由,评审效率和稳定性都会提升。

规则四:目标驱动执行(Goal-Driven Execution)

核心:把任务改写成可验证成功标准。

执行要点:

  • “修 bug” -> “先写复现测试,再让测试通过”;
  • “加校验” -> “先写无效输入测试,再让其通过”;
  • 多步骤任务必须给出每步验证方式。

场景:不要说“修这个 bug”,改成:

  1. 先写一个能复现 bug 的测试;
  2. 再修改代码让测试通过;
  3. 最后跑回归确保无副作用。

当目标可验证时,AI 才能真正形成“执行-验证-修正”的闭环。


如何安装

这套规则常见有两种接入方式:

方式 A:作为 Claude Code 插件安装(推荐)

/plugin marketplace add forrestchang/andrej-karpathy-skills
/plugin install andrej-karpathy-skills@karpathy-skills

特点:全局可用,多个项目可复用。

方式 B:按项目添加 CLAUDE.md

新项目可直接下载:

curl -o CLAUDE.md https://raw.githubusercontent.com/forrestchang/andrej-karpathy-skills/main/CLAUDE.md

已有 CLAUDE.md 的项目,建议追加而不是覆盖,避免冲掉项目自定义规范。
如果在 Cursor 使用,也可以把规则放入 .cursor/rules 作为项目级约束。

GitHub 项目地址:github.com/forrestchan…


如何使用(基于 Claude Code)

我现在固定用一条 Claude Code 工作流:

第 1 步:先澄清,再编码

把目标、边界、验收标准说清楚。
不让模型在关键点上“自己脑补”。

第 2 步:小步改动,逐步验证

每次只改一个点,改完就验证,避免大包提交后排查困难。

第 3 步:按结果闭环交付

在四条规则约束下执行改动,并按成功标准完成验证。
我的常用流程是:

  1. 先澄清歧义;
  2. 输出简短方案;
  3. 小步提交改动;
  4. 每步都带验证结果;
  5. 最终给出可审查的变更说明。

4.png


如何判断它真的在起作用

你可以用这四个信号快速判断:

  1. diff 里无关改动更少
  2. 因为过度复杂导致的返工更少
  3. 澄清问题发生在实现前,而不是出错后
  4. PR 更精简,变更理由更容易追溯

最后

用 Claude Code 写代码,真正的分水岭不是“会不会用”,而是“有没有规则”。

把这四条规则执行稳定后,Claude Code 不只是“写得快”,而是能持续产出可审查、可维护、可交付的结果。