Skip to content

一个 70 行的文件,6 万 Star:Karpathy 的 AI 编程守则 #430

@mqyqingfeng

Description

@mqyqingfeng

你好,我是冴羽

一个只有 70 行的文件,在 GitHub 上已经有了 6 万 Star。

不是框架,不是库,不是应用。就是一个配置文件——CLAUDE.md

你可能觉得这很离谱。一个文本文件能有什么用?

但如果你用过 Claude Code、Cursor、Copilot 这些 AI 编程助手,你就会懂:

AI 写代码确实快,但它经常把事情搞砸。

你让它修个 bug,它重写半个文件。你让它加个功能,它给你造一整套抽象层。你让它帮个忙,它自信满满地用错误的假设往前冲……

Reddit 上有个被广泛认同的说法:AI 就像一个自信的初级开发者。 聪明、快速、但容易犯低级错误。

而这个 CLAUDE.md 文件,就是给这个“初级开发者”设置的护栏。

1. 故事的起点

2026 年 1 月,OpenAI 联合创始人、前特斯拉 AI 负责人 Andrej Karpathy 发了条推特。

他没有分享工具或代码,而是列出了一堆吐槽——关于 AI 写代码时的各种毛病:

  • 默默做假设,从不问清楚

  • 过度设计,搞一堆用不上的抽象

  • 改 A 的时候顺手“优化”B、C、D

  • 从不验证自己写的代码是否真的解决了问题

每一条都是痛点。

开发者 Forrest Chang 看到后,做了件很实际的事:把这些吐槽变成了一份行为准则。

他创建了一个 GitHub 仓库 forrestchang/andrej-karpathy-skills,里面只有一个核心文件:CLAUDE.md

不到两个月,这个仓库就成了 GitHub 上增长最快的 AI 工具类项目之一。

2. AI 编程的 4 大坑

Karpathy 总结的问题,其实可以归为四类。每一类都对应一个常见的“翻车现场”:

坑 1:默默做假设

你说“给用户数据加个导出功能”。

AI 不问格式(CSV? JSON? Excel?),不问范围(全部数据还是筛选后的?),不问权限(谁能导出?),直接开始写代码。

结果你拿到的功能,和你想要的完全不是一回事。

坑 2:过度设计

你说“写个计算折扣的函数”。

AI 给你搞出一套策略模式:抽象基类、工厂方法、配置文件……200 行代码。

但你只需要一个 10 行的函数。

坑 3:顺手“优化”

你说“修复邮箱验证的 bug”。

AI 改了 bug,顺便把单引号改成双引号,加了类型注解,重写了返回逻辑,调整了缩进……

你看 diff 的时候完全分不清哪些改动是修 bug 必须的,哪些是它“顺手”加的。

坑 4:不验证结果

你说“重构这段代码”。

AI 重构完了,信心满满地说“完成了”。

但它没跑测试,没检查是否引入新 bug,甚至没确认代码能不能编译通过。

这 4 个坑,你踩过几个?

AI 编程的四大坑

3. 4 条原则

Forrest Chang 把 Karpathy 的观察提炼成了 4 条原则。每一条都直击一类问题:

原则 解决的问题
编码前先思考 错误假设、隐藏的困惑、缺失的权衡
简单优先 过度复杂、臃肿的抽象、投机性功能
外科手术式修改 无关的编辑、顺手改代码、风格漂移
目标驱动执行 模糊的实现、没有验证、弱成功标准

我们一条条看。

3.1. 原则 1:编码前先思考

核心: 不要假设。不要隐藏困惑。把权衡摆出来。

在写代码之前,AI 必须:

  • 明确说出自己的假设。如果不确定,就问

  • 如果有多种理解方式,列出来让你选

  • 如果有更简单的方案,说出来

  • 如果有什么不清楚的,停下来,说明白哪里困惑

举个例子:

用户说:“给用户数据加个导出功能”

错误做法: 直接开始写 CSV 导出代码

正确做法:

我需要先确认几点:
1. 导出格式:CSV、JSON 还是 Excel?
2. 数据范围:全部用户还是当前筛选结果?
3. 权限控制:是否需要管理员权限?
4. 数据量:如果用户很多,是否需要分页或异步处理?

编码前先思考流程图

3.2. 原则 2:简单优先

核心: 能解决问题的最少代码。不要投机性功能。

规则很严格:

  • 不要加没被要求的功能

  • 单次使用的代码不要搞抽象

  • 不要加没被要求的“灵活性”

  • 不要为不可能的场景写错误处理

  • 如果 200 行能缩成 50 行,就重写

测试标准: 资深工程师会不会说这太复杂了?如果会,就简化。

举个例子:

用户说:“写个计算折扣的函数”

错误做法:

// 策略模式 + 工厂 + 配置文件,200 行代码
class DiscountStrategy { ... }
class PercentageDiscount extends DiscountStrategy { ... }
class FixedDiscount extends DiscountStrategy { ... }
class DiscountFactory { ... }

正确做法:

// 一个函数,10 行代码
function calculateDiscount(price, discountPercent) {
  return price * (1 - discountPercent / 100);
}

等真的需要多种折扣类型时,再重构。

3.3. 原则 3:外科手术式修改

核心: 只改必须改的。只清理自己弄乱的。

编辑现有代码时:

  • 不要“改进”相邻的代码或格式

  • 不要重构没坏的东西

  • 匹配现有风格,即使你不喜欢

  • 如果发现死代码,提一句——但别删

如果你的改动产生了“孤儿代码”:

  • 只清理你的改动直接导致 的无用代码

  • 不要顺手清理其他无关的旧代码

测试标准: 每一行改动都应该能直接追溯到用户的要求。

举个例子:

用户说:“修复空邮箱导致验证器崩溃的 bug”

错误做法:

# 修了 bug,顺便:
# - 单引号改成双引号
# - 加了类型注解
# - 加了 docstring
# - 重构了返回逻辑
# - 调整了空格

正确做法:

# 只加一行空值检查,其他代码一个字都不动
if not email:
    return False

外科手术式修改

3.4. 原则 4:目标驱动执行

核心: 定义成功标准。循环直到验证通过。

这是 Karpathy 认为是最高杠杆的洞察:

把命令式任务转化为声明式目标。

不要说…… 而是说……
“加个验证” “写测试覆盖非法输入,然后让测试通过”
“修这个 bug” “写个能复现 bug 的测试,然后让它通过”
“重构 X” “确保重构前后测试都通过”

目标驱动执行流程

对于多步骤任务,AI 应该先说明计划:

我的计划:
1. 写测试复现 bug
2. 运行测试确认失败
3. 修复代码
4. 确认测试通过
5. 检查是否引入回归

四条原则框架图

4. 完整的 CLAUDE.md 文件

这就是完整的文件内容。不到 70 行:

# CLAUDE.md

减少常见 LLM 编码错误的行为准则。
根据需要与项目特定指令合并。

**权衡:**这些准则偏向谨慎而非速度。
对于简单任务,请自行判断。

## 1. 编码前先思考

**不要假设。不要隐藏困惑。把权衡摆出来。**

实现之前:

- 明确说出你的假设。如果不确定,就问。
- 如果存在多种理解方式,列出来。
- 如果有更简单的方案,说出来。
- 如果有什么不清楚,停下来。说明哪里困惑。

## 2. 简单优先

**能解决问题的最少代码。不要投机性功能。**

- 不要加没被要求的功能
- 单次使用的代码不要搞抽象
- 不要加没被要求的"灵活性"
- 不要为不可能的场景写错误处理
- 如果 200 行能缩成 50 行,就重写

## 3. 外科手术式修改

**只改必须改的。只清理自己弄乱的。**

- 不要"改进"相邻的代码或格式
- 不要重构没坏的东西
- 匹配现有风格,即使你不喜欢
- 如果发现死代码,提一句——但别删

## 4. 目标驱动执行

**定义成功标准。循环直到验证通过。**

把任务转化为可验证的目标:

- "加个验证" → "写测试,然后让测试通过"
- "修这个 bug" → "用测试复现,然后修复"
- "重构 X" → "确保重构前后测试都通过"

就这些。

它的威力在于简洁——短到能完整放进 AI 的上下文窗口,又长到能编码关键的行为护栏。

5. 怎么用?

两种方式:

方式 A: Claude Code 插件(推荐)

这会把准则安装为 Claude Code 插件,在所有项目中生效:

# First, add the marketplace
/plugin marketplace add forrestchang/andrej-karpathy-skills

# Then install the plugin
/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

# 现有项目(追加)
echo "" >> CLAUDE.md
curl https://raw.githubusercontent.com/forrestchang/
  andrej-karpathy-skills/main/CLAUDE.md >> CLAUDE.md

6. 什么是 CLAUDE.md?

简单说:它是 AI 编程助手的“入职文档”。

每次 Claude Code 启动时,它都会读这个文件,获取持续的上下文。

就像给新员工的 onboarding 文档——只不过 AI 每次都会重新读一遍。

6.1. CLAUDE.md 最佳实践(2026)

章节 内容
项目概述 2-3 句话说明项目是干什么的
技术栈 语言、框架、关键库
架构 代码库地图(源码、组件、配置)
命令 dev、build、test、lint 命令
编码标准 命名约定、模式、风格规则
安全规则 “永远不要硬编码 API 密钥”、“不要编辑 /config”

6.2. 层级关系

项目根目录的 CLAUDE.md (项目特定规则)
    ↓ 覆盖
全局 Claude Code 插件 (通用准则)
    ↓ 覆盖
Claude 的默认行为

经验法则: 如果你在聊天中重复某个指令超过两次,就把它提升到 CLAUDE.md 里。

7. 最后

这个仓库火,不是因为它技术多牛逼。

而是因为它解决了一个所有人都在经历,但没人系统化表达的问题。

AI 编程助手确实改变了游戏规则。但它们也带来了新的问题:

  • 代码写得快了,但质量参差不齐

  • 实现速度快了,但理解成本高了

  • 生产力提升了,但维护负担也增加了

Karpathy 的洞察 + Forrest Chang 的执行,给了我们一个实用的解决方案。

不是限制 AI,而是引导它。

这就是 2026 年的 AI 工程:不是让 AI 做所有事,而是让 AI 在正确的护栏内做正确的事。

工具就摆在那里。用不用,是你的事。

我是冴羽,10 年笔耕不辍,专注前端领域,更新了 10+ 系列、300+ 篇原创技术文章,翻译过 Svelte、Solid.js、TypeScript 文档,著有小册《Next.js 开发指南》、《Svelte 开发指南》、《Astro 实战指南》。

欢迎围观我的“网页版朋友圈“,关注我的公众号:冴羽(或搜索 yayujs),每天分享前端知识、AI 干货。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions