让 AI 写出像资深工程师一样的代码:Karpathy 编码准则项目解读
【免费下载链接】andrej-karpathy-skillsA single CLAUDE.md file to improve Claude Code behavior, derived from Andrej Karpathy's observations on LLM coding pitfalls.项目地址: https://gitcode.com/GitHub_Trending/an/andrej-karpathy-skills
andrej-karpathy-skills 把 Andrej Karpathy 对 LLM 编码陷阱的观察浓缩成一份 CLAUDE.md 文件:放进项目根目录,或装成 Claude Code 插件,AI 就不再凭空猜需求、不再堆砌臃肿架构,而是先问再做。
🎯 AI 说"好的"之后,问题才真正开始
场景你可能熟悉:任务是"加个用户数据导出功能",AI 不问一个字,直接全量导出所有用户、文件写到项目根目录、字段自己挑,还顺手做上 JSON 和 CSV 双格式。80 行代码看着没错,但没几行是你想要的。
再比如"加个函数算折扣"。一句乘法被包上抽象基类、策略接口、配置数据类,30 多行。review 比自己写还累。
这不是随机事故,而是一种稳定倾向:替你假设需求、默默选定一种解释、顺手重构相邻代码、清理它"注意到"的死代码。Karpathy 的总结很尖锐——大模型不管理自己的困惑、不寻求澄清、不呈现权衡、该反驳时也不反驳。
andrej-karpathy-skills 就是为此做的。手段简单到反直觉:没有框架、没有运行时,只有一份改写 AI 工作习惯的指令文件。
⚖️ 4 个 AI 编码常见误区的修正
整份准则围绕 4 个误区组织,每一个都是"AI 默认会怎么做"与"文件要求它怎么做"的对照。
误区一:急着开工,跳过确认
反直觉的点在于:模型写码前应该先慢下来。收到"加个导出功能",它的默认动作是默默选定一种解释然后开写;准则要求的是——先列假设,不确定就问;存在多种解释就列出来让你选;有更省力的路径就提出来、该反驳时反驳。
| AI 的默认动作 | 准则生效后的动作 |
|---|---|
| 默默选一种解释直接实现 | 列出多种解释,由你拍板 |
| 替你猜范围、字段、落盘位置 | 假设逐条摆明,拿不准就问 |
| 默认没有更省事的方案 | 给出更轻的路径并说明代价 |
误区二:提前造"可扩展架构"
模型连一次性使用的代码也爱套抽象层。下面同一需求两种写法,上面是常见默认产物(节选),下面是准则要求的版本:
# 默认输出:一次乘法写 30 多行(节选) class DiscountStrategy(ABC): @abstractmethod def calculate(self, amount: float) -> float: ... # 准则输出:只写今天需要的 def calc_discount(amount: float, percent: float) -> float: return amount * percent / 100验收标准是一个自问:资深工程师会不会说这太复杂?会,就回退。等第二种折扣类型真出现的那天,再补复杂度不迟。
误区三:"顺手重构"是一种麻烦
修一个空输入崩溃的 bug,diff 回来却多了引号统一、类型标注、docstring,还有对相邻字段的新校验规则。准则给的判据很硬:每一行改动都必须能直接追溯到本次请求;现有风格(哪怕你个人不喜欢)原样保留;发现无关死代码,在 PR 里提一句,不删;自己的改动造成的孤儿导入要清掉,历史遗留的不动。
一份达标的 diff 长这样——只动必要的两行,周边格式和注释纹丝不动:
def parse_date(s): - if s == '': + if not s or not s.strip(): return None误区四:"我来修一下"不算目标
大模型擅长朝着目标循环直到达成,但人们交给它的却是模糊指令,然后怪它跑偏。第四处修正,是把动词翻译成可验证的标准:
| 模糊指令 | 转化后的目标 |
|---|---|
| 加个校验 | 先写非法输入测试,再让它通过 |
| 修排序 bug | 先写能复现的测试,再修到通过 |
| 重构某模块 | 重构前后测试套件全绿 |
多步任务还会附上"动作 → 验证"计划,每一步都有验收点。弱标准("让它能跑")逼你反复澄清,强标准则让模型自己把循环跑完。
🔌 准则如何生效:三条注入路径
仓库里没有任何可执行代码,所谓"实现"就是把同一段文字在合适的时机喂给 AI。载体有三个:
- 项目根目录的 CLAUDE.md:Claude Code 进入目录即自动加载,最轻的部署;
- Cursor 项目里的 .cursor/rules 规则文件,设为常驻生效,打开文件夹即用;
- 打包成技能的 skills/karpathy-guidelines/SKILL.md:以插件形式安装后全局生效,不用逐项目复制。
下面这张流程图展示一个任务从进入会话到被验收的完整约束链路:
无论走哪条路径,最终约束模型的规则是同一套四条;原则更新时需同步三个载体,且它们都能和你现有的指令文件自由合并。
📊 收益能量化吗:4 个可观察的变化
从你的视角看,这些修正的价值可以落到 4 个可观察的差异上:
| 你感受到的 | 使用前 | 使用后 |
|---|---|---|
| PR 噪音 | diff 里混着格式统一、注释清理 | 只剩任务相关的改动行 |
| 首版体量 | 简单需求上百行"可扩展架构" | 行数接近资深工程师手写 |
| 返工 | 做完才发现不是你要的 | 澄清问题出现在实现之前 |
| 代码审查 | 要人肉揪出"顺手"改动 | 审查者只看一类变更 |
适用面很宽:团队日常功能开发、有 AI 结对搭档的长期项目、需要长期维护的存量代码库。要留意的是,准则偏向谨慎而非速度——一行拼写修正不必走全套流程,文件本身也留了这个判断空间。
⚡ 两条安装路径,5 行命令搞定
两种部署方式,二选一即可:
# 方式 A:放进项目(任何读取 CLAUDE.md 的工具都适用) git clone https://gitcode.com/GitHub_Trending/an/andrej-karpathy-skills cp andrej-karpathy-skills/CLAUDE.md your-project/ # 方式 B:在 Claude Code 中装成全局插件 /plugin marketplace add forrestchang/andrej-karpathy-skills /plugin install andrej-karpathy-skills@karpathy-skills一条定制建议:别用它替换你现有的 CLAUDE.md,而是追加一个"项目特定指南"小节,写清两三条硬规则(例如 TypeScript 严格模式、所有 API 必须有测试、错误处理沿用某个既有文件的模式)——这份准则在设计上就是为与项目规则合并而存在的。
这个项目的价值,在于把"AI 表现不稳定"从玄学问题变成可控变量:一份文本文件,零依赖,无迁移成本。下次派活给 AI 之前,不妨先丢一份 CLAUDE.md 进去,看看 diff 能小多少。
【免费下载链接】andrej-karpathy-skillsA single CLAUDE.md file to improve Claude Code behavior, derived from Andrej Karpathy's observations on LLM coding pitfalls.项目地址: https://gitcode.com/GitHub_Trending/an/andrej-karpathy-skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考