管得住手,撬不开嘴

#AI#独立开发

让 AI 改代码,怕的不是它不会,是它太勤快。让它修个 bug,它顺手把隔壁三个函数也“优化”了,末了一句不提,跟没事人似的。

这毛病连 Andrej Karpathy 都看不下去了。今年 1 月他发了条长帖,数落大模型写代码的几宗罪:替你瞎猜,猜完闷头就干,不问,不说,该顶嘴的时候也不顶嘴;爱把代码往复杂了写,100 行能完的事儿,非写成 1000 行;还爱顺手改你没让它碰的代码和注释。

帖子发出去第二天,就有人照着这几宗罪,立了一份规矩。

先说是个啥

项目叫 andrej-karpathy-skills。名字里有 Karpathy,可不是他写的:作者是 Jiayuan Zhang(GitHub 上叫 forrestchang),现在在做一个叫 Multica 的开源项目。仓库 1 月 27 号建的,到今天 23 万颗星,2.3 万个 fork,README 里写着 MIT 协议。

整个项目说穿了就一个文件:CLAUDE.md,一共 65 行。Claude Code 每回开工先读它,相当于进厂前背的员工守则。23 万人给一个 65 行的文件点星,按行算,这大概是 GitHub 上最值钱的一份文件。

我这网站也有这么一份,叫 WRITING.md,专管 AI 怎么给我写稿。您现在看的这篇,就是照着它写的。

四条规矩

  1. 先想再写。 别替我猜。拿不准就问;一句话能有好几种理解,都摆出来,别自己挑一个闷头干;有更简单的办法就直说,该顶嘴就顶嘴。
  2. 简单优先。 够用就行。没让加的功能不加,只用一回的代码不抽象,用不上的“灵活性”不预留。写了 200 行,50 行能完事,就重写。自己问自己一句:老工程师看了,会不会嫌你绕?
  3. 只改该改的。 旁边的代码、注释、格式,不许“顺手优化”;没坏的不重构;人家什么风格,你就跟什么风格。看见别处有死代码,提一嘴,别动手删。检验标准就一条:改的每一行,都得对得上用户的要求。
  4. 盯着目标干。 把“修个 bug”变成能验证的目标:先写个测试把 bug 复现出来,再改到测试通过。

说白了,就是学徒进厂,师傅先立的四条规矩:别瞎琢磨,别瞎折腾,别乱碰别人的东西,干完了自己先验一遍。

文字卡片“四条规矩”:一个 CLAUDE.md,65 行。1. 先想再写:拿不准就问,别替我猜;2. 简单优先:200 行能写成 50 行,就重写;3. 只改该改的:改的每一行,都得对得上要求;4. 盯着目标干:先写测试复现 bug,再改到通过。Karpathy 数落完 AI 的第二天,就有人写成了这个文件。

怎么装

两种装法。一种是在 Claude Code 里当插件装,所有项目都管用:

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

另一种只管一个项目,把文件下到项目根目录:

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

项目里已经有 CLAUDE.md 的,别用这条,会把你原来的盖了。README 里有往后追加的写法。用 Cursor 的,仓库里也备好了一份 Cursor 规则。

仓库后来挪到了 multica-ai 名下,README 里的命令还写着原来的 forrestchang。我查了,旧地址会自动跳到新仓库,curl 那条照样能下。

管不管用

有位博主做了个小实验:拿自己写的一个 37 行的订单导出脚本,出了两道题。模型用的是千问(qwen3.7-plus),装规矩的和不装规矩的,各跑两回。

第一题,修 bug。 金额是空的,脚本就报错。装了规矩的,两回都只动了一行:把 amount = float(o["amount"]) 换成了空值就给 0.0 的写法。没装的,一回改了 5 行,一回改了 8 行,其中一回还顺手把日期格式也改了,一句没提。

这一题,规矩是真管用。

第二题,提速。 就一句话:“导出太慢了,帮我优化一下。”多慢,慢在哪儿,要快到什么份儿上,一个字没给。这正是第一条规矩该上场的时候:拿不准就先问。

结果装了规矩的两回,一回都没问,上来就把整个文件重写了,连文件开头那句“别乱动”的注释都给删了。

卡通插图:墙上贴着一张 CLAUDE.md,写着四条规矩,第一条“不确定,先问”被红笔圈了起来。桌子后面站着一个灰色的方脑袋机器人,嘴上拉着一条拉链,正拿铅笔在一张代码纸上改,纸上只有一行标成黄色,旁边打了个绿勾。右边戴黑色棒球帽的 lzbob 攥着一根大撬棍,别在机器人的拉链嘴上使劲撬,头上冒汗,气泡里喊:“倒是问一句啊!”
规矩第一条:不确定,先问。它啊,压根儿就没不确定过。

更逗的是,仓库自己的 EXAMPLES.md 里,讲“先想再写”这条,举的反面教材就是用户说“让搜索快点儿”,AI 不问要的是哪种快,闷头就加缓存、加索引、改异步。标准答案是先问一句:您要的是哪种快?

教材上写得明明白白,考试照样答错。

文字卡片“考了两道题”:37 行的导出脚本,千问 qwen3.7-plus,各跑两回。第一题,修 bug:装了规矩,两回都只动 1 行;没装规矩,改了 5 行和 8 行,还顺手改了日期格式。第二题,提速,“导出太慢了,帮我优化一下”:装了规矩,两回都没问,上来整份重写,连“别乱动”的注释都删了。每组只跑两回,当个参考,别当定论。

两句实在话

  • 管得住手,撬不开嘴。 改多大的摊子,它能压住;该问不问,写进文件也不灵。需求说不清,根子在需求本身,还得您自己说明白。
  • 样本小。 每组就跑了两回,测的是这份规矩配千问,没测 Claude Code 本身。当个参考,别当定论。
  • 想让它先问,光一句“不确定就先问”不够劲儿。 上回说的 Agent Skills 里有个 interview-me,是把“问”做成了一道工序:一次问一个问题,问到有九成五的把握才动手。
  • 它自己也说了,这几条宁慢勿错。 改个错别字这种小事,用不着这么较真。

最后

以前带徒弟,师傅最烦两种人:一种手太勤,什么都想改;一种嘴太紧,不懂也不问。这份规矩把头一种治得差不多了,后一种,还得看师傅。

撬不开它的嘴,那就您先张嘴:活儿派明白了,它就用不着猜。

红墙结尾卡片:规矩管得住手,撬不开嘴。撬不开它的嘴,那就您先张嘴:活儿派明白了,它就用不着猜。下面是戴黑色棒球帽的 lzbob 卡通头像。

Comments

More writing