Andrej Karpathy 的一條推,炸出來一個 149K Stars 的 Agent Skill

作者:01麻瓜社
日期:2026年5月25日 上午6:33
來源:WeChat 原文

整理版優先睇

速讀 5 個重點 高亮

Karpathy 推文引爆 149K Stars Agent Skill - CLAUDE.md 四規則對症 LLM 三毛病

整理版摘要

呢篇文章講嘅係 Andrej Karpathy 喺 X 上分享佢用 Claude coding 嘅體感。佢發現自己由 80% 手寫 code 變成 80% 由 agent 寫,形容係「用英文寫程式」。呢個現象引起好大迴響,Hacker News 有八百幾條評論,GitHub 上仲有人專門整咗一份 CLAUDE.md 嚟對應佢講嘅問題,三個月攞到 149K stars。

文章拆開嚟睇 Karpathy 總結 LLM 嘅三個老毛病:沉默地假設、過度複雜化、順手亂改。佢提出解決方法係由 imperative 轉 declarative,即係唔好下命令,而係定成功標準,等 agent 自己跑。不過 Karpathy 無詳細講點樣寫 CLAUDE.md,而 multica-ai/andrej-karpathy-skills 呢個倉庫就做到咗——用四條規則對症下藥:先思考再編碼、先求簡單、外科手術式修改、目標驅動執行。

整體結論係:同 LLM 合作嗰陣,寫清楚規則可以大幅提升效率,令 agent 更可靠、少亂改。呢份 CLAUDE.md 得 65 行,貼入 project root 就用得,值得試。

  • Karpathy 發現自己從 80% 手寫 code 變成 80% 由 agent 寫,形容係「用英文寫程式」,體感似作弊。
  • LLM 有三個老毛病:沉默地假設、過度複雜化、順手亂改,至今未改。
  • 解決方法係由 imperative 轉 declarative:唔好落命令,而係定成功標準,等 agent 自己跑。
  • multica-ai/andrej-karpathy-skills 嘅 CLAUDE.md 用四條規則對症:先思考、求簡單、做手術、目標驅動。
  • 真正生效嘅信號係 diff 變細、重寫變少、澄清出而家動手之前。
值得記低
連結 github.com

multica-ai/andrej-karpathy-skills

對應 Karpathy 推文嘅 CLAUDE.md 倉庫,包含四條規則,65行 markdown 檔

整理重點

一條推文炸出集體共鳴

Karpathy 呢條推開篇就話,11月仲係80%手敲、20%俾 agent 寫;到12月直接顛倒——80%俾 agent 寫,自己只做20%收尾。佢話「我而家係用英文寫程式」,感覺有啲傷自尊,好似作弊咁,仲話過去20年未見過咁大嘅工作流變化。

用英文寫程式

傷自尊

作弊

工作流變化

整理重點

LLM 嘅三個老毛病

  1. 1 沉默地假設——模型替你做錯誤假設,然後一路跑落去,唔驗證、唔澄清、唔暴露不一致。
  2. 2 過度複雜化——100行搞得掂嘅事,佢寫成1000行嘅臃腫建築。
  3. 3 順手亂改——修一個 bug,佢順手將冇讀懂嘅註釋刪咗,將佢覺得風格不對嘅函數重構咗。

沉默地假設

過度複雜化

順手亂改

Karpathy 嘅處方係一句好核心嘅話:「Don't tell it what to do, give it success criteria and watch it go.」即係由 imperative 轉 declarative,唔好下命令,而係定成功標準。

整理重點

四條規則對症下藥

一個叫 multica-ai/andrej-karpathy-skills 嘅倉庫將呢套理念濃縮成一份 65 行嘅 CLAUDE.md,三個月攞到 149K stars。四條規則正好對應前面三個毛病:

  1. 1 先思考,再編碼(對症沉默假設):唔好假設,將權衡攤出嚟。加用戶登錄前要先確認認證方式、session/JWT、數據庫現狀。
  2. 2 先求簡單(對症過度複雜化):解決問題嘅最少代碼,冇要嘅唔好加。讀 JSON 就兩行 with open,唔好整 factory class。
  3. 3 外科手術式修改(對症順手亂改):只動你必須動嘅,只清理你自己製造嘅爛攤子。每一行 diff 都要追溯到用戶請求。
  4. 4 目標驅動執行(對症標準模糊):將指令翻譯成可驗證目標,例如寫 test 然後跑 pytest,全綠就係做完。
簡單 vs 複雜 python
# 先求簡單嘅例子:
# BAD - 你只是想讀個 JSON 文件
class JSONLoaderFactory:
 def __init__(self, strategy, cache):
 self.parser_pool = ParserPool()
 def load_async(self, path, **kw):
 return self._with_retry(...)
# 200 行,只被調用 1 次

# GOOD - 就這兩行
with open(path) as f:
 data = json.load(f)

先思考,再編碼

先求簡單

外科手術式修改

目標驅動執行

整理重點

點樣用同埋 tradeoff

用法好簡單:cd 入 project 目錄,將份 CLAUDE.md 拉落嚟,或者直接放喺 project root。可以用 curl 指令:curl -O https://raw.githubusercontent.com/multica-ai/andrej-karpathy-skills/main/CLAUDE.md

要留意一個 tradeoff:呢套規則偏向謹慎而非速度。瑣碎任務你自己用判斷力就好,唔使每次都行曬成個流程。

判斷佢有冇生效,睇三件事

  • diff 更細
  • 重寫更少
  • 澄清出而家動手之前

diff 更細

重寫更少

澄清出而家動手之前

一月底,Andrej Karpathy 喺 X 度發咗段 claude coding 嘅隨手記。冇標題,冇分章節,成段意識流。

圖片

三日之內被瘋轉,Hacker News 八百幾條評論,GitHub 上面有人專登畀佢整咗份配套嘅 CLAUDE.md,三個月儲咗 149K stars。倉庫叫 multica-ai/andrej-karpathy-skills

圖片


我會將 Karpathy 畀 LLM 總結嘅 3 個老毛病同 multica-ai/andrej-karpathy-skills 嘅 4 條規則一齊拆開嚟睇 - Karpathy 描述嘅體感係咩、對應嘅 CLAUDE.md 點寫、貼入項目根目錄之後應該睇邊幾個信號判斷佢生效。希望對大家有幫助。

圖片

一條令到所有 20 年老程序員都中招嘅推

Karpathy 呢條推開頭就係一記重錘。佢話,11 月份仲係 80% 自己打、20% 畀 agent 寫;到咗 12 月,直接掉轉咗 - 80% 畀 agent 寫,自己只做 20% 嘅收尾。

"I'm mostly programming in English now."

佢冇迴避嗰種感覺,原話有三句幾有意思 - 第一,有啲傷自尊;第二,好似喺度作弊;第三,過去 20 年未見過比呢個更大嘅工作流程變化。

嗰種感覺相信好多人都有體會過。坐喺度睇 agent 唰唰唰將兩個鐘嘅嘢喺兩分鐘之內交咗。理智上知道呢個係工程進步,情感上仲係想問一句 - 我呢 20 年係咪白學咗。

LLM 呢 3 個老毛病,到依家都未改

不過 Karpathy 冇只係讚,佢幫 LLM 總結咗 3 個老毛病。

第一單,沉默噉假設。 模型代你做錯嘅假設,然後一路行落去 - 唔驗證、唔澄清、唔暴露唔一致,應該反推嘅時候都唔反推。講白咗,佢唔係睇唔到歧義,佢係扮睇唔到。

第二單,過度複雜化。 100 行搞得掂嘅嘢,佢寫成 1000 行嘅臃腫建築。你話「做個待辦應用」,佢默認畀你交一份企業級解決方案。

第三單,順手亂改。 修一個 bug,佢順手將冇讀明嘅註釋刪咗,將佢覺得風格唔啱嘅函數重構咗 - 就算同你嘅任務完全冇關。

Karpathy 都畀咗處方,呢句話好核心:

"Don't tell it what to do, give it success criteria and watch it go. Change your approach from imperative to declarative to get the agents looping longer and gain leverage."

唔好下命令,定標準,等佢自己跑。將命令式改成聲明式。

但 Karpathy 並冇分享點樣編寫咁樣一份 CLAUDE.md 文件。

一個 149K stars 嘅倉庫復現咗佢

倉庫名叫 multica-ai/andrej-karpathy-skills。一個文件,65 行 markdown,文件名就叫 CLAUDE.md,貼入項目根目錄就用得。3 個月,149K stars,28 日 GitHub trending 第一。

爆紅唔係因為佢發明咗啲咩新嘢,而係因為佢將嗰種「我都係咁覺得」嘅集體認同,蒸餾成咗 4 條命名規則。呢 4 條規則正好對症前面嗰 3 個老毛病。

先思考,再編碼

對症「沉默噉假設」。唔假設,唔收起困惑,將權衡攤喺枱面。英文名 Think Before Coding。

舉個例,用戶話,加個用戶登錄,你點處理?

差嘅反應係噉:「收到,我用 email + password 默認 hash 一下,加個 JWT,順便將 users 表建咗,加咗 6 個字段。」 - 認證方式、加密、過期時長、數據庫結構,4 個假設佢已經代你拍板咗,成程你一句說話都冇講。

好嘅反應係:「開始之前我要確認 3 件事 - email/password 定係 OAuth?session 定係 JWT?數據庫裏面 users 表已經存在咗未?」 - 唔確定就問先,唔好寫先。

先求簡單

對症「過度複雜化」。解決問題嘅最少代碼,冇要嘅唔好加,推測嘅唔好用。英文名 Simplicity First。

# BAD - 你只是想讀個 JSON 文件
class JSONLoaderFactory:
    def __init__(self, strategy, cache):
        self.parser_pool = ParserPool()
    def load_async(self, path, **kw):
        return self._with_retry(...)
# 200 行,只被調用 1 次

# GOOD - 就這兩行
with open(path) as f:
    data = json.load(f)

判據好簡單:senior 睇一眼會唔會皺眉。會,就重寫。

外科手術式修改

對症「順手亂改」。只係鬱你一定要鬱嘅,只清理你自己製造嘅爛攤子。英文名 Surgical Changes。

修一個 token 過期嘅 bug,兩種 diff:

# BAD
auth.py    | +248 -187
login.tsx  | +92  -84
utils.py   | +34  -29
PR 標題:"修 token 過期 bug" - review 的人根本不知道動了啥

# GOOD
auth.py    | +3 -1
PR 標題:"修 token 過期 bug" - 每一行 diff 都能解釋為啥要改

看見 utils.py 有死代碼?喺 PR 入面提一句,但唔鬱佢。判據 - 每一行 diff 都可以追溯到嗰個用戶請求。

目標驅動執行

對症「標準模糊靠反覆問」。先定成功標準,然後自己走一輪驗證。英文名 Goal-Driven Execution。

「加個郵箱校驗」唔係一個可以令 agent 獨立跑完嘅指令。弱標準嘅反應係寫個 validate_emailreturn "@" in e,然後停喺度等你確認。

強標準嘅反應係將指令翻譯成可驗證目標:

  1. 寫 test_invalid_email(),verify 佢失敗
  2. 實現 validate_email(),verify 測試通過
  3. 跑全套 pytest,verify 0 failures

全綠就係「做咗」,佢自己判斷到。呢個就係 declarative,唔係 imperative。

點用,同一個 tradeoff

用法好簡單。cd 入項目目錄,將嗰份 CLAUDE.md 拉落嚟,同你已經有嘅合併,或者直接放落項目根目錄:

curl -O https://raw.githubusercontent.com/multica-ai/andrej-karpathy-skills/main/CLAUDE.md

要講一個 tradeoff - 呢套規則偏向謹慎而唔係速度。瑣碎任務你自己用判斷力就得,唔使每次都要 agent 行完整套澄清流程。

判斷佢有冇生效,睇三件事:diff 更細,重寫更少,澄清出現喺動手之前。呢三件事變成常態,佢就係度做緊嘢喇。

Karpathy 嗰條推打動人嘅唔係論點新鮮 - 而係佢將一種大家都隱約感覺到嘅體感寫清咗。LLM 係會代你做決定嘅實習生。你唔話畀佢知邊啲決定應該問、邊啲應該等,佢就一路代你拍板。multica-ai/andrej-karpathy-skills 這份 CLAUDE.md 做嘅事,就係將呢條邊界寫出嚟畀佢睇。65 行,貼入項目,你同你嗰位「實習生」嘅合作,就上一個台階。

一月底,Andrej Karpathy 在 X 上發了一段 claude coding 的隨手記。沒標題,沒分章節,一整段意識流。

圖片

三天之內被瘋轉,Hacker News 八百多條評論,GitHub 上有人專門給它做了一份配套的 CLAUDE.md,三個月攢下 149K stars。倉庫叫 multica-ai/andrej-karpathy-skills

圖片


我會把 Karpathy 給 LLM 總結的 3 個老毛病和 multica-ai/andrej-karpathy-skills 的 4 條規則一起拆開來看 - Karpathy 描述的體感是什麼、對應的 CLAUDE.md 怎麼寫、貼進項目根目錄之後該看哪幾個信號判斷它生效。期望對大家有所幫助。

圖片

一條把所有 20 年老程序員都點了的推

Karpathy 這條推開篇就是一記重錘。他說,11 月份還是 80% 手敲、20% 讓 agent 寫;到了 12 月,直接顛倒了 - 80% 讓 agent 寫,自己只做 20% 的收尾。

"I'm mostly programming in English now."

他沒回避那種感覺,原話有三句挺有意思的 - 第一,有點傷自尊;第二,像在作弊;第三,過去 20 年沒見過比這更大的工作流變化。

那種感覺相信很多人都體會過。坐在那兒看 agent 唰唰唰把兩小時的活兒在兩分鐘裏交了。理智上知道這是工程進步,情感上還是想問一句 - 我這 20 年是不是白學了。

LLM 這 3 個老毛病,至今沒改

不過 Karpathy 沒只誇,他給 LLM 總結了 3 個老毛病。

第一樁,沉默地假設。 模型替你做錯誤假設,然後一路跑下去 - 不驗證、不澄清、不暴露不一致,該反推時也不反推。說白了,它不是沒看到歧義,它是裝沒看到。

第二樁,過度複雜化。 100 行能搞定的事,它寫成 1000 行的臃腫建築。你說“做個待辦應用”,它默認給你交一份企業級解決方案。

第三樁,順手亂改。 修一個 bug,它順手把沒讀懂的註釋刪了,把它覺得風格不對的函數重構了 - 哪怕跟你的任務毫不相關。

Karpathy 也給了處方,這句話挺核心的:

"Don't tell it what to do, give it success criteria and watch it go. Change your approach from imperative to declarative to get the agents looping longer and gain leverage."

別下命令,定標準,讓它自己跑。把命令式改成聲明式。

但 Karpathy 並沒有分享如何編寫這麼一份 CLAUDE.md 文件。

一個 149K stars 的倉庫復現了它

倉庫名字叫 multica-ai/andrej-karpathy-skills。一個文件,65 行 markdown,文件名就叫 CLAUDE.md,貼進項目根目錄就能用。3 個月,149K stars,28 天 GitHub trending 第一。

爆火不是因為它發明了什麼新東西,而是因為它把那種“我也這麼覺得”的集體認同,蒸餾成了 4 條命名規則。這 4 條規則正好對症前面那 3 個老毛病。

先思考,再編碼

對症“沉默地假設”。不假設,不藏起困惑,把權衡攤到桌面上。英文名 Think Before Coding。

舉個例子,用戶說,加個用戶登錄,你怎麼接?

爛的反應是這樣:“收到,我用 email + password 默認 hash 一下,加個 JWT,順便把 users 表建了,加了 6 個字段。” - 認證方式、加密、過期時長、數據庫結構,4 個假設它已經替你拍板了,全程你一句話沒說。

好的反應是:“開始之前我得確認 3 件事 - email/password 還是 OAuth?session 還是 JWT?數據庫裏 users 表已經存在嗎?” - 不確定就先問,別先寫。

先求簡單

對症“過度複雜化”。解決問題的最少代碼,沒要的別加,推測的別上。英文名 Simplicity First。

# BAD - 你只是想讀個 JSON 文件
class JSONLoaderFactory:
    def __init__(self, strategy, cache):
        self.parser_pool = ParserPool()
    def load_async(self, path, **kw):
        return self._with_retry(...)
# 200 行,只被調用 1 次

# GOOD - 就這兩行
with open(path) as f:
    data = json.load(f)

判據很簡單:senior 看一眼會不會皺眉。會,就重寫。

外科手術式修改

對症“順手亂改”。只動你必須動的,只清理你自己製造的爛攤子。英文名 Surgical Changes。

修一個 token 過期的 bug,兩種 diff:

# BAD
auth.py    | +248 -187
login.tsx  | +92  -84
utils.py   | +34  -29
PR 標題:"修 token 過期 bug" - review 的人根本不知道動了啥

# GOOD
auth.py    | +3 -1
PR 標題:"修 token 過期 bug" - 每一行 diff 都能解釋為啥要改

看見 utils.py 有死代碼?在 PR 裏提一句,但不動它。判據 - 每一行 diff 都能追溯到那個用戶請求。

目標驅動執行

對症“標準模糊靠反覆問”。先定成功標準,然後自己跑一輪驗證。英文名 Goal-Driven Execution。

“加個郵箱校驗”不是一個能讓 agent 獨立跑完的指令。弱標準的反應是寫個 validate_emailreturn "@" in e,然後停在那兒等你確認。

強標準的反應是把指令翻譯成可驗證目標:

  1. 寫 test_invalid_email(),verify 它失敗
  2. 實現 validate_email(),verify 測試通過
  3. 跑全套 pytest,verify 0 failures

全綠就是“做完了”,它自己能判定。這就是 declarative,不是 imperative。

怎麼用,以及一個 tradeoff

用法很簡單。cd 進項目目錄,把那份 CLAUDE.md 拉下來,跟你已有的合併,或者直接放到項目根目錄:

curl -O https://raw.githubusercontent.com/multica-ai/andrej-karpathy-skills/main/CLAUDE.md

要說一個 tradeoff - 這套規則偏向謹慎而非速度。瑣碎任務你自己用判斷力就好,不必每次都讓 agent 走完整套澄清流程。

判斷它有沒有在生效,看三件事:diff 更小,重寫更少,澄清出現在動手之前。這三件事變成常態,它就在幹活兒了。

Karpathy 那條推打動人的不是論點新鮮 - 而是它把一種大家都隱約感覺到的體感寫明白了。LLM 是會替你做決定的實習生。你不告訴它哪些決定該問、哪些該等,它就一路替你拍板。multica-ai/andrej-karpathy-skills 這份 CLAUDE.md 做的事,就是把這條邊界寫出來給它看。65 行,貼進項目,你跟你那位“實習生”的合作,就上一個台階。