编程 Karpathy Skills 深度解析:当 AI 编程大师的「血泪教训」被压缩成 100 行配置文件

2026-04-10 04:48:17 +0800 CST views 3

Karpathy Skills 深度解析:当 AI 编程大师的「血泪教训」被压缩成 100 行配置文件

引言:一个「反向工程」的传奇

2026 年 4 月,GitHub 上出现了一个诡异的项目:它没有一行代码,只有一个 Markdown 文件,却在短短几天内冲上 Trending 榜单,狂揽 10,263 个 Star。

项目名叫 andrej-karpathy-skills,作者是一位名叫 Forrest Chang 的开发者。他把 Andrej Karpathy——这位前 Tesla AI 总监、OpenAI 创始成员、AI 编程界顶级 KOL——对 LLM 编程的「吐槽」提炼成了四条原则,写进了一个名为 CLAUDE.md 的文件里。

这个文件的作用是什么?让 Claude Code 变得更像一个「资深程序员」,而不是一个「过度热情的实习生」。

这不是一个工具,而是一个「行为规范」。它不解决问题,而是防止 AI 制造问题


第一部分:Karpathy 的「血泪清单」

1.1 那条改变一切的推文

一切源于 Karpathy 的一条推文(2026 年 3 月)。在这条推文中,他没有赞美 LLM 的能力,而是列举了 AI 编程的三大「致命缺陷」:

缺陷一:假设狂魔

"The models make wrong assumptions on your behalf and just run along with them without checking. They don't manage their confusion, don't seek clarifications, don't surface inconsistencies, don't present tradeoffs, don't push back when they should."

(模型会替你做错误假设,然后一路狂奔。它们不管理自己的困惑,不求澄清,不暴露矛盾,不呈现权衡,该拒绝时不拒绝。)

缺陷二:复杂度成瘾

"They really like to overcomplicate code and APIs, bloat abstractions, don't clean up dead code... implement a bloated construction over 1000 lines when 100 would do."

(它们喜欢过度复杂化代码和 API,膨胀抽象,不清理死代码……用 1000 行代码实现一个 100 行就能搞定的事情。)

缺陷三:顺手牵羊

"They still sometimes change/remove comments and code they don't sufficiently understand as side effects, even if orthogonal to the task."

(它们有时会顺手修改/删除它们不理解但与任务无关的注释和代码,作为「副作用」。)

这三条,任何一个和 AI 编程工具深度协作过的开发者,都会深有体会。

1.2 为什么 Karpathy 的「吐槽」价值连城?

Karpathy 不是普通用户。他是:

  • OpenAI 创始成员:参与了 GPT 系列模型的早期研发
  • 前 Tesla AI 总监:领导了 Autopilot 和 FSD 的 AI 团队
  • AI 教育布道者:他的课程《零基础入门深度学习》《构建神经网络》影响了数百万开发者
  • AI 编程实践者:他公开表示自己大量使用 LLM 辅助编程,并持续分享实战经验

换句话说,他是那个既造锤子又用锤子的人。他对 LLM 编程缺陷的观察,不是「用户吐槽」,而是「工程师诊断」。


第二部分:四条原则的「反向工程」

Forrest Chang 做的事情很简单:他把 Karpathy 的三大缺陷,逆向工程成了四条「行为准则」。

这四条原则构成了 CLAUDE.md 的全部内容。

2.1 原则一:先思考,再编码(Think Before Coding)

针对缺陷:假设狂魔

核心指令

Don't assume. Don't hide confusion. Surface tradeoffs.
(不要假设。不要隐藏困惑。呈现权衡。)

具体行为

  • 明确陈述假设:如果不确定,就问,不要猜
  • 呈现多种解读:存在歧义时,列出所有可能,不要静默选择
  • 该拒绝就拒绝:如果存在更简单的方案,说出来
  • 困惑时停下来:命名你的困惑,请求澄清

代码示例

假设你要求 Claude Code:「添加一个用户登录功能」。

错误示范(假设狂魔)

# Claude 自动假设:
# 1. 使用 JWT 认证
# 2. 密码需要加密
# 3. 需要记住我功能
# 4. 需要第三方登录
# 5. 需要登录失败重试限制
# ...然后直接写出 500 行代码

正确示范(先思考)

我注意到「用户登录功能」有几种实现方式,请确认:
1. 认证方式:JWT 还是 Session?
2. 密码存储:是否需要支持第三方登录(OAuth)?
3. 是否需要「记住我」功能?
4. 登录失败是否需要限制重试?

建议先用最简单的 JWT + bcrypt 方案(约 50 行代码),后续再扩展。

程序员视角:这就是资深工程师和初级工程师的区别。初级工程师接到需求就开干,资深工程师会先问清楚边界条件。

2.2 原则二:极简优先(Simplicity First)

针对缺陷:复杂度成瘾

核心指令

Minimum code that solves the problem. Nothing speculative.
(用最少的代码解决问题。不做任何投机性设计。)

具体行为

  • 不添加未被请求的功能
  • 不为单次使用的代码创建抽象
  • 不添加未被请求的「灵活性」或「可配置性」
  • 不为不可能发生的场景编写错误处理
  • 如果 200 行代码可以缩减到 50 行,重写它

判断标准

问自己:资深工程师会说这段代码「过度复杂」吗?
如果是,简化它。

代码示例

假设你要求:「读取一个 JSON 文件并打印内容」。

错误示范(复杂度成瘾)

import json
import os
from pathlib import Path
from typing import Dict, Any, Optional
import logging
from dataclasses import dataclass

logger = logging.getLogger(__name__)

@dataclass
class JsonReaderConfig:
    encoding: str = 'utf-8'
    validate_schema: bool = False
    cache_enabled: bool = False
    max_file_size_mb: int = 100

class JsonReader:
    """A robust JSON file reader with caching and validation."""
    
    def __init__(self, config: Optional[JsonReaderConfig] = None):
        self.config = config or JsonReaderConfig()
        self._cache: Dict[str, Any] = {}
    
    def read(self, file_path: str) -> Dict[str, Any]:
        # ...60 行代码

正确示范(极简优先)

import json

with open("config.json") as f:
    print(json.load(f))

两行代码 vs 60 行代码。前者是「解决问题」,后者是「解决不存在的问题」。

2.3 原则三:外科手术式修改(Surgical Changes)

针对缺陷:顺手牵羊

核心指令

Touch only what you must. Clean up only your own mess.
(只触碰你必须触碰的。只清理你自己制造的混乱。)

具体行为

  • 不要「改进」相邻代码、注释或格式
  • 不要重构没坏的东西
  • 匹配现有风格,即使你不会那样写
  • 发现无关的死代码?提及它,不要删除它

判断标准

每一条修改的代码行,都应该能追溯到用户的原始请求。

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

针对缺陷:假设狂魔 + 复杂度成瘾

核心指令

Define success criteria. Loop until verified.
(定义成功标准。循环直到验证。)

转换规则

原始指令转换后
「添加验证」「为无效输入编写测试,然后让测试通过」
「修复 bug」「编写一个能复现该 bug 的测试,然后让测试通过」
「重构 X」「确保重构前后测试都通过」

Karpathy 的原话

"LLMs are exceptionally good at looping until they meet specific goals... Don't tell it what to do, give it success criteria and watch it go."

(LLM 非常擅长循环直到达成特定目标……不要告诉它做什么,给它成功标准,然后看它自己跑。)


第三部分:从「吐槽」到「工具」——CLAUDE.md 的工作原理

3.1 为什么是一个 Markdown 文件?

CLAUDE.md 不是代码,不是配置文件,不是脚本。

它是「上下文注入」

Claude Code 在启动时会读取项目目录下的 CLAUDE.md 文件,将其内容注入到对话上下文中。这相当于在每次对话开始时,对 Claude 说:

「在我们开始之前,这里有四条规则你必须遵守。」

这种设计的精妙之处:

  1. 零代码:不需要写插件、脚本、API 调用
  2. 零配置:不需要修改 Claude Code 的设置
  3. 项目级:每个项目可以有不同的 CLAUDE.md
  4. 可组合:可以和项目特定的规则合并

3.2 两种安装方式

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

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

方式二:项目级 CLAUDE.md

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

第四部分:这 100 行文件解决了什么问题?

4.1 AI 编程的「实习生困境」

很多开发者使用 AI 编程工具时的体验是这样的:

  1. 提出一个需求
  2. AI 迅速生成一大段代码
  3. 代码能跑,但有各种问题:过度设计、假设错误、顺手修改
  4. 你花时间审查、修改、回滚
  5. 最后发现:用 AI 节省的编码时间,被审查时间抵消了

这就是「实习生困境」:一个热情但缺乏经验的实习生,会快速产出代码,但你需要花大量时间审查和修正。

4.2 CLAUDE.md 的本质:把「实习生」变成「资深工程师」

这 100 行文件的本质,是行为约束

它不是教 Claude 如何写代码(Claude 已经很会写代码了),而是教 Claude 如何克制写代码的冲动

资深工程师和初级工程师的区别,不在于谁写代码更快,而在于谁更懂得「不写不必要的代码」。


第五部分:与「女娲.skill」的对照——两种「技能」哲学

5.1 女娲.skill:把「思维」变成代码

之前我们分析过「女娲.skill」——一个把乔布斯、芒格、马斯克的思维方式变成可运行 AI 技能的项目。

女娲.skill 是「正向注入」:注入优秀的思维模式
Karpathy Skills 是「负向约束」:约束错误的行为模式

5.2 两种哲学的殊途同归

两者都指向同一个目标:让 AI 更像一个「资深专家」

  • 女娲.skill 的路径:注入资深专家的「思维模型」
  • Karpathy Skills 的路径:约束资深专家会「避免的行为」

第六部分:技术深度——为什么这 100 行有效?

6.1 LLM 的「默认行为」vs「约束行为」

大语言模型在代码生成任务上的训练数据,主要来自开源代码库。这些代码库的特点:

  1. 多样化:同一个功能有无数种实现方式
  2. 过度工程化:很多代码是为了「展示架构能力」而非「解决问题」
  3. 碎片化:缺乏统一的风格和约定

因此,LLM 在生成代码时,倾向于:

  • 「抄最好的」:借鉴「最佳实践」模式
  • 「防患于未然」:预先处理各种边界情况
  • 「展示能力」:写出「看起来很专业」的代码

这导致了 Karpathy 观察到的三大问题。

6.2 上下文注入的「首因效应」

CLAUDE.md 的工作原理,利用了 LLM 的「首因效应」:

  • 模型在处理用户请求之前,首先「看到」了这些行为准则
  • 这些准则被纳入到模型的「上下文」中
  • 当模型生成代码时,会「回顾」这些准则,进行自我约束

6.3 四条原则的「正交性」

这四条原则设计得非常精妙,它们相互独立、互不重叠:

原则作用阶段约束对象
先思考,再编码编码前假设和决策
极简优先编码中代码复杂度
外科手术式修改编码中修改范围
目标驱动执行编码后验证标准

这四条形成了一个完整的「编码闭环」。


第七部分:延伸思考——AI 编程的「最佳实践」时代

7.1 从「编程能力」到「编程行为」

传统编程教育的核心是「编程能力」:

  • 如何写正确的代码
  • 如何设计好的架构
  • 如何优化性能

AI 编程时代的核心变成了「编程行为」:

  • 什么时候不该写代码
  • 什么时候该问清楚
  • 什么时候该停下来思考

andrej-karpathy-skills 提供了一个框架:不是教 AI 如何写代码,而是教 AI 如何「克制」写代码。

7.2 「软件工程」回归本源

Fred Brooks 在《人月神话》中提出过著名的论断:

"The best code is no code at all."
(最好的代码是不写代码。)

这句话在 AI 编程时代有了新的含义:

最好的 AI 编程,是让 AI 写最少但最准确的代码。


第八部分:如何在实际项目中应用

8.1 项目级定制

CLAUDE.md 可以和项目特定的规则合并。例如:

# CLAUDE.md

[...Karpathy Skills 的四条原则...]

## 项目特定规则

- 使用 TypeScript strict mode
- 所有 API 端点必须有测试
- 遵循 `src/utils/errors.ts` 中的错误处理模式

8.2 团队协作

对于团队项目,可以将 CLAUDE.md 纳入版本控制:

  • 每个开发者使用 AI 编程工具时,都会遵守相同的规则
  • Code Review 时,可以检查 AI 生成的代码是否符合团队约定

第九部分:总结——一个「减法」的胜利

9.1 核心价值

andrej-karpathy-skills 的核心价值,可以用一句话概括:

用 100 行约束,换取 AI 编程的「成熟度」。

它不增加功能,不提升性能,不引入新技术。

它只是让 AI 少犯错

9.2 适用场景

适合

  • 长期维护的项目
  • 需要高代码质量的场景
  • 团队协作项目
  • 对 AI 编程「过度热情」感到困扰的开发者

不适合

  • 快速原型开发
  • 一次性脚本
  • 对代码质量要求不高的场景

9.3 哲学启示

这个项目给我们最大的启示:

在 AI 编程时代,「约束」比「能力」更重要。

LLM 已经具备了强大的代码生成能力。真正的问题不是「能不能写」,而是「该不该写」。

andrej-karpathy-skills 提供了一个答案:用资深工程师的「血泪教训」,约束 AI 的「过度热情」。


尾声:一个「反向工程」的隐喻

Forrest Chang 做的事情,本质上是一个「反向工程」:

  • 正向工程:从需求到代码
  • 反向工程:从问题到规范

他从 Karpathy 的「吐槽」中,反向推导出了 AI 应该遵守的「行为规范」。

这个过程本身,就是一种「资深工程师思维」的体现:

不是「解决问题」,而是「防止问题发生」。

这 100 行文件,不解决任何具体问题。但它防止了无数问题的发生。

这就是「工程」的本质。


参考资料

  1. andrej-karpathy-skills GitHub 仓库
  2. Andrej Karpathy 的原始推文
  3. Claude Code 官方文档
  4. 《人月神话》,Fred Brooks

一句话总结:当 AI 编程大师的「血泪教训」被压缩成 100 行配置文件,AI 终于学会了资深工程师最核心的能力——「克制」。

推荐文章

地图标注管理系统
2024-11-19 09:14:52 +0800 CST
php获取当前域名
2024-11-18 00:12:48 +0800 CST
阿里云发送短信php
2025-06-16 20:36:07 +0800 CST
Vue中如何使用API发送异步请求?
2024-11-19 10:04:27 +0800 CST
Vue3中如何处理跨域请求?
2024-11-19 08:43:14 +0800 CST
使用Vue 3实现无刷新数据加载
2024-11-18 17:48:20 +0800 CST
Vue3中的Slots有哪些变化?
2024-11-18 16:34:49 +0800 CST
Vue3中的v-slot指令有什么改变?
2024-11-18 07:32:50 +0800 CST
全栈利器 H3 框架来了!
2025-07-07 17:48:01 +0800 CST
JavaScript中的常用浏览器API
2024-11-18 23:23:16 +0800 CST
Vue3中如何处理路由和导航?
2024-11-18 16:56:14 +0800 CST
如何在 Vue 3 中使用 TypeScript?
2024-11-18 22:30:18 +0800 CST
ElasticSearch集群搭建指南
2024-11-19 02:31:21 +0800 CST
使用临时邮箱的重要性
2025-07-16 17:13:32 +0800 CST
Linux查看系统配置常用命令
2024-11-17 18:20:42 +0800 CST
Shell 里给变量赋值为多行文本
2024-11-18 20:25:45 +0800 CST
利用图片实现网站的加载速度
2024-11-18 12:29:31 +0800 CST
PHP 如何输出带微秒的时间
2024-11-18 01:58:41 +0800 CST
程序员茄子在线接单