← 返回文章列表
查看 ↗

2026 年 1 月底,Andrej Karpathy(OpenAI 创始成员

2026 年 1 月底,Andrej Karpathy 在 X 上发了条长推文,抱怨 LLM 编程的三个老毛病:做了错误假设就继续执行、喜欢把代码搞复杂、会改动它不理解的代码。两天后,GitHub 上出现了一个 15 万 star 的仓库,里面只有一个 65 行的配置文件,把这些抱怨提炼成了 4 条规则。我用 Claude Code 开发了两个月,发现这 4。

一位开发者与发光的AI精灵并肩站在代码之桥上,阳光透过头顶的代码树叶洒落,象征人类与AI之间建立信任的协作关系

2026 年 1 月底,Andrej Karpathy 在 X 上发了条长推文,抱怨 LLM 编程的三个老毛病:做了错误假设就继续执行、喜欢把代码搞复杂、会改动它不理解的代码。

Andrej Karpathy站在科技大会舞台上,身前巨屏显示三处红色警告图标:错误的假设、过度复杂化、随意修改未知代码,台下程序员们露出困惑表情

两天后,GitHub 上出现了一个 15 万 star 的仓库,里面只有一个 65 行的配置文件,把这些抱怨提炼成了 4 条规则。

我用 Claude Code 开发了两个月,发现这 4 条规则确实管用。但先说清楚一件事:这份配置不是 Karpathy 写的。

这不是 Karpathy 的"官方配置"

很多人看到仓库名 andrej-karpathy-skills,以为是 Karpathy 本人的配置。

实际情况是这样的:作者叫 Forrest Chang,创建于 2026 年 1 月 27 日,只是把 Karpathy 前一天的长推文做了提炼和结构化。

这不是"官方认证",是"社区最佳实践"。

但这不意味着它不好用。恰恰相反,正因为是从实战抱怨中提炼出来的,每一条规则都对应着真实的坑。

AI 编程最大的坑,不是你不会写代码了

很多人担心用 AI 编程会导致技能萎缩。确实会,就像用导航会忘路、用计算器会忘心算一样。

但这不是最致命的问题。

最致命的问题是:AI 写的代码质量不可控。

我用 Claude Code 重构一个老 Spring Boot 项目时,踩过不少这样的坑:

AI 会在不确定时静默猜测,然后自信地继续;会提前做用不上的抽象;会顺手改一些跟需求无关的代码;写完之后不会主动验证自己到底做对了没有。

这些问题,正是 Karpathy 抱怨的那三个。

而那 4 条规则,就是针对这些问题设计的第一道防线。

规则一:Think Before Coding — 别让 AI 静默猜测

规则原文很简单:

Before implementing: State your assumptions explicitly. If uncertain, ask. If multiple interpretations exist, present them — don't pick silently.

翻译成大白话就是:不确定的时候,停下来问,别自己瞎猜。

我踩过这个坑。

有一次让 Claude 给 User 实体类生成测试用的模拟数据。它生成了这样的代码:

User user = new User();
user.setUsername("testuser");
user.setEmail("test@example.com");
user.setStatus(1);

看起来没问题,跑测试也过了。

后来才发现 User 继承了 BaseEntity,里面有 createdBy、updatedBy 这些审计字段,AI 完全没设置。测试之所以过了,是因为我的测试用例只验证了业务字段,根本没验证审计字段。

AI 看到 User 类的定义,但没有读父类 BaseEntity。它自己假设只需要设置当前类的字段,没问:"要不要设置父类字段?"

开发者坐在木桌前,温暖的台灯光下,面前悬浮着User类代码和被推挤到边缘的BaseEntity父类,AI的假设导致的遗漏一目了然

如果遵循"Think Before Coding",AI 应该先问:

我看到 User 继承了 BaseEntity,里面有审计字段(createdBy、updatedBy、createdAt、updatedAt)。测试数据需要设置这些字段吗?

这条规则的价值,不是让 AI 变聪明,而是强制它把不确定性说出来。说出来,你才能纠正;不说出来,bug 就埋下了。

规则二:Simplicity First — 只写必要的代码

规则原文:

No features beyond what was asked. No abstractions for single-use code. If you write 200 lines and it could be 50, rewrite it.

大白话:没让你做的别做,能用 50 行写完的别写 200 行。

我也踩过这个坑。

让 Claude 写一个"导出用户列表到 Excel"的功能。我只说了一句话,它给了我这样的代码:

public interface ExcelExporter<T> {
    void export(List<T> data, OutputStream out);
}

public class UserExcelExporter implements ExcelExporter<User> {
    // 100+ 行的通用导出逻辑
}

public class ExcelExporterFactory {
    public static <T> ExcelExporter<T> getExporter(Class<T> clazz) {
        // 工厂模式
    }
}

一套"可扩展的导出框架",接口、工厂、策略模式全上了。

我就导出一个用户列表。

AI 看到"导出"两个字,联想到"未来可能导出订单、导出商品",提前做了抽象。这些抽象在当前需求里是死代码,只会增加维护负担。

如果遵循"Simplicity First",AI 应该直接写:

public void exportUsers(List<User> users, OutputStream out) {
    // 50 行搞定
}

等真的需要导出第二个实体时,再抽象也不迟。提前优化的本质是浪费。

需要提醒的是:这条规则也有反面。有时候 AI 过于遵循"只改必要的",会漏掉潜在的关联代码修改。比如你改了个方法签名,它可能不会主动提醒你还有哪些调用方需要同步修改。遇到这种情况,用完这条规则后要追问一句:"还有哪些地方受影响?"

规则三:Surgical Changes — 只改你要求改的地方

规则原文:

When editing existing code: Don't "improve" adjacent code, comments, or formatting. Match existing style, even if you'd do it differently. The test: Every changed line should trace directly to the user's request.

大白话:让你改什么就改什么,别顺手"优化"旁边的东西。

我被这个坑坑得最狠。

让 Claude 给 UserService 加一个"根据邮箱查询用户"的方法。它改完之后,我看 diff 发现它顺手做了这些:

  • 把原有方法的注释从中文改成了英文
  • 把 findById 方法里的 Optional.orElse(null) 改成了 Optional.orElseThrow()
  • 重新排列了方法顺序

凌乱的桌面散落着便签和代码纸页,上面满是划掉的修改痕迹——中文注释改成了英文、Optional.orElse改成了orElseThrow、方法顺序被打乱重排

这些改动和我的需求完全无关。

orElseThrow() 的改动尤其要命——原来返回 null,现在抛异常,调用方可能根本没处理这个情况。AI 看到"不够优雅"的代码就想顺手改,但这些"改进"没经过验证,可能引入 bug。

如果遵循"Surgical Changes",AI 应该只加新方法,diff 里的每一行改动都应该能追溯到"加一个根据邮箱查询的方法"这个需求。

当然,规则也有例外:有时候现有代码风格本身就很糟糕,AI 严格遵循现有风格会导致新代码也不优雅。这时候需要权衡——小范围改动,忍一忍保持一致;大范围重构,单独开一个"统一代码风格"的任务来做。

规则四:Goal-Driven Execution — 用成功标准替代实现步骤

规则原文:

Transform tasks into verifiable goals: "Add validation" → "Write tests for invalid inputs, then make them pass" "Fix the bug" → "Write a test that reproduces it, then make it pass"

大白话:告诉 AI 什么是对的,让它自己循环验证。

以前我会说"给 User 的 email 字段加个格式校验",AI 会直接加上 @Email 注解,然后说"完成了"。

但我不知道校验是否真的生效,也不知道边界情况(空字符串、null、格式错误)是否都覆盖了。

现在我换一种说法:

写个测试,验证 email 字段的格式校验: - 正常邮箱格式应该通过 - 空字符串应该报错 - null 应该报错 - 格式错误(缺少 @)应该报错

然后让这些测试通过。

AI 会先写测试,跑一遍——大概率失败,然后加校验注解,再跑一遍,直到全部通过。

第一种方式是告诉 AI 做什么,第二种方式是给 AI 成功标准让它自己循环。

后者利用了 LLM 的迭代能力,而我能通过测试结果验证它确实做对了。

这 4 条规则解决的是质量问题,不是技能萎缩

Karpathy 本人在采访里说了一句话很扎心:

"It hurts the ego, but too powerful to ignore."

他承认手工编程能力正在萎缩,自己的工作流在两个月内从 80% 手工编码变成了 80% AI Agent。

技能萎缩是大势所趋,不可逆,也不必恐慌。

但这 4 条规则解决的不是萎缩问题,是质量问题:让 AI 写出人类水准的代码。

没有这些规则,AI 会静默猜测、过度复杂化、顺手改无关代码。你的项目会充斥"看起来对但实际有坑"的代码。

程序员独自提着灯笼在黑暗的代码丛林中摸索,周围是纠缠的代码藤蔓、迷雾般的假设和被随意改动的代码残骸

有了这些规则,AI 会在不确定时停下来问你、只写必要的代码、只改你要求改的地方、用测试验证自己做对了。你的 diff 更干净,重写更少,翻车更少。

实操建议:四周时间养成习惯

如果你也在用 Claude Code 或其他 AI 编程工具,可以按这个节奏来:

第一周重点关注 Think Before Coding。每次 AI 给出方案时,看它有没有主动列出假设、有没有问你不确定的地方。没有的话,手动追问:"你确定吗?有没有其他可能?"

第二周重点关注 Simplicity First。发现代码可以简化时,反问 AI"为什么没有遵循规则简化实现?"让它重写。

第三周重点关注 Surgical Changes。每次看 diff,检查变更是否都能关联到你的需求。无关改动直接拒绝。

第四周重点关注 Goal-Driven Execution。把"做什么"的指令改成"成功标准是什么",让 AI 自己循环迭代。

一个月后,你会发现 AI 生成的代码质量明显提升,翻车次数明显减少。

写在最后

Anthropic 的一位工程师 Boris Cherny 分享过,他们团队 100% 的代码都是用 Claude Code 写的,持续两个月了。

AI 编程变革的关键,从来不是你还能不能手写代码,而是你能不能让 AI 写出你信任的代码

开发者站在代码之桥的一端,向对岸的发光AI精灵伸出手,两人之间是温暖的信任之光,照亮了整个协作空间

这 4 条规则,就是那把尺子。

查看文章页 ↗