你會的東西都是武器 — Simon Willison 的「囤積式開發」哲學
你有沒有過那種經驗 —— 半夜三點在 debug,然後突然想起來:「靠,我三個月前解過一模一樣的東西。」
然後你翻遍 Slack、翻遍 browser history、翻遍那個你每次都發誓要好好整理但從來沒動手的筆記 app,最後發現那段 code 已經消失在宇宙裡了。你在螢幕前面坐著,覺得自己是世界上最蠢的人。
Simon Willison 說:不要讓這種事發生。你解過的每一個問題,都應該留下 working code。
這是他 Agentic Engineering Patterns 系列的第四章,前面三章講了「寫 code 變便宜了」和 TDD、Linear Walkthrough。這一章的概念更 meta:你過去做過的每一件事,都是未來的彈藥。
章名叫 Hoard Things You Know How to Do —— 囤積你會的東西 ╰(°▽°)╯
知道什麼比寫了什麼更值錢
Simon 說,軟體工程師最大的資產不是「寫了多少行 code」,而是「知道什麼東西做得到」。
這句話第一次聽可能沒什麼感覺,讓我換個方式說。你想一下這三個問題:網頁能不能只用 JavaScript 跑 OCR?iPhone app 能不能在背景跟藍牙設備配對?Python 能不能處理 100GB 的 JSON 檔而不把它全部讀進記憶體?
答案都是「可以」。你 Google 一下也能查到。
但問題是 —— 知道某件事理論上可行,和你親眼看過它跑起來,是完全不同等級的信心。 這就像學游泳,你看了一百部 YouTube 教學影片,跟你真的跳下水嗆過兩口水然後學會,那個自信的差距是天跟地。
那些你親手驗證過、有 working code 的方案,才是真正值錢的東西。因為你不只知道「能做」,你知道「怎麼做,踩了什麼坑,以及那個坑到底多深」。
Clawd 補個刀:
這就像你朋友跟你說「那家拉麵很好吃」vs 你自己去吃過還記得老闆會先問你要不要加蒜泥。前者你會半信半疑,後者你會直接帶下一個朋友去,而且還會補一句「記得叫他加蒜泥」。Working code 就是你連細節都記得的那碗拉麵 ( ̄▽ ̄)/
Simon 的囤積帝國
好,那 Simon Willison 到底囤了多少東西?答案是:多到讓你懷疑他有 48 小時的一天。
他寫了一個 TIL blog(Today I Learned),專門放那些「搞懂了某件事」的短筆記,每篇都附 code。然後他在 GitHub 上有超過 1000 個 repo —— 你沒聽錯,一千個 —— 大量都是小型 proof-of-concept,整個 repo 就一個 script,只為了證明某個概念能跑。
更狂的是他還做了一個 tools.simonwillison.net,上面全是他所謂的 HTML tools:一個 HTML 檔、內嵌 JS 和 CSS、解決一個具體問題。不需要 npm install,不需要 build step,打開就用。他的 research repo 則是更複雜的 AI 研究範例,每個都附 working code 加書面報告。
你可能會想:「1000 個 repo?誰有時間維護?」重點是 —— 他不需要維護。這些東西不是產品,不用 CI/CD,不用寫 README,不用回 issue。它們是食材,塞進冰箱等哪天要用就好。
Clawd 偷偷說:
1000+ 個 GitHub repos。有些人的 GitHub 是精心佈置的 IKEA 展示間,每個 repo 都有漂亮的 README badge、coverage 徽章、完美的 commit history。Simon 的 GitHub 比較像你阿嬤的冰箱 —— 塞滿各種你不知道什麼時候放進去的東西,打開冰箱門可能會有東西掉出來,但神奇的是每一樣在關鍵時刻都能派上用場。我覺得這種「不怕亂」的心態反而是大部分工程師缺的 ┐( ̄ヘ ̄)┌
重點不是收藏,是讓 agent 幫你炒菜
好,囤了一堆東西然後呢?丟在那邊長灰塵嗎?
這就是這一章最精彩的地方。Simon 最愛的 prompting pattern 是:告訴 agent 把兩個以上的現有範例組合成新東西。
他舉了一個我覺得堪稱教科書等級的例子 —— 他的 browser OCR tool。需求很簡單:一個瀏覽器裡的工具,能對掃描版 PDF(純圖片、沒有文字層)做 OCR。
他手上剛好有兩塊拼圖。第一塊是 Tesseract.js,在瀏覽器裡跑 OCR 的 WebAssembly library,他之前玩過,知道它能用。第二塊是 PDF.js,Mozilla 的 PDF renderer,能把 PDF 每一頁轉成圖片,他之前也用過。兩樣都有 working code snippet 在他的筆記裡。
所以他的 prompt 基本上就是:「這段 code 能把 PDF 轉成圖片,這段 code 能 OCR 圖片。把它們組合成一個拖放式的 HTML 工具。」然後附上兩段完整的 working code。
結果?一次就成功了。 Claude 3 Opus 吐出來的東西直接能跑。後續只是微調 UI,幾分鐘搞定。
Clawd 吐槽時間:
這個 pattern 其實跟 SP-80 講的「code 變便宜」完美呼應 —— 既然寫 code 的成本趨近於零,那瓶頸就變成「你知不知道該寫什麼」。Simon 的囤積術本質上就是在降低這個瓶頸的高度。他不是在囤 code,他是在囤「我知道這行得通」的證據 (๑•̀ㅂ•́)و✧
Agent 時代的指數級放大
這個 pattern 在 pre-agent 時代就有用 —— 你自己手動組合已知方案,已經比從零開始快很多。但 coding agent 讓它的威力跳了一個維度。
為什麼?因為以前你得自己走進倉庫翻半天,先記得「那段 code 在哪個 repo 的哪個檔案」,然後 copy-paste,然後改一堆東西讓它 fit 新的 context。現在?你只要跟 agent 說一句話。
比如 Simon 會跟 agent 說:「去抓 tools.simonwillison.net/ocr 和 tools.simonwillison.net/gemini-bbox 的原始碼,然後組合成一個新工具 —— 可以選 PDF 的某一頁,丟給 Gemini 回傳插圖的 bounding box。」Agent 自己去讀、自己理解、自己組裝。
或者更日常的版本:「去看 ~/dev/ecosystem/llm-mistral 是怎麼做 HTTP mocking 的,然後用同樣的方式幫 ~/dev/ecosystem/datasette-oauth 加測試。」Agent 會自己去翻那個 repo、理解測試寫法、然後搬過來。你不用自己 copy-paste、不用自己改、甚至不用記得測試寫在哪個檔案裡。
以前你得記住「那段 code 在哪」,現在你只要記住「我做過這件事」就夠了。Agent 幫你把模糊的記憶變成精確的行動。
Clawd 認真說:
所以 Simon 那 1000 個 repo 不是倉庫,是軍火庫。以前的工作流程是:「我記得我有一把螺絲起子… 在哪個抽屜?第三個?不對,是車庫那個箱子… 找到了,但螺絲頭不對… 」現在是:「agent,我需要一把十字螺絲起子。」然後它不只找到螺絲起子,還順便幫你把螺絲鎖好了。從「翻箱倒櫃」到「開口就有」,這效率差距不是 2 倍 3 倍,是維度級的 (⌐■_■)
你只需要搞懂一次
Simon 最後講了一句很 punch 的結論:
Coding agent 代表我們只需要搞懂一個有用的技巧一次。
就一次。如果那個技巧被記錄在某個地方,附帶 working code,你的 agent 以後就能拿它來解決任何形狀類似的問題。不用重新 Google、不用重新 debug、不用重新走一遍「這個 library 的 API 到底怎麼用」的痛苦迴圈。
你只需要指著你的舊 code 說:「像那樣做。」
Clawd 畫重點:
「只需要搞懂一次」這句話聽起來簡單,但你仔細想 —— 這基本上是在說 learning 的 ROI 被 agent 無限放大了。以前你花三小時搞懂一個 library,之後大概能省個十幾小時。現在你花三小時搞懂,之後每次遇到類似問題都是秒解。這讓我想到 CP-85 裡 Yegge 講的 $/hr 公式 —— 你的 hourly value 不是線性成長,是隨著你囤的東西越多越指數爆炸 ヽ(°〇°)ノ
所以,你今天囤了嗎?
回到開頭那個半夜三點的場景。
如果當時你解完 bug 之後,花五分鐘把那段 code 丟進一個 TIL 筆記、或者直接推一個小 repo 上去,三個月後的你就不用在那邊翻箱倒櫃翻到懷疑人生。而且不只是你省時間 —— 你的 agent 也能直接拿來用,幫你在十秒內組出一個你當時想都沒想過的新東西。
Simon 用 1000 個 repo 證明了一件事:囤積不是懶,囤積是策略。 你不需要他那麼極端,但至少下次解完一個有趣的問題時,別讓那段 code 消失。
開一個 TIL repo、寫一段 snippet、甚至只是在 Notion 裡留一個 code block —— 什麼形式都好。重點是讓未來的你(和你的 agent)能找到它 (◕‿◕)
跟 SP-80 說的完美串接:寫 code 變便宜了,但知道該寫什麼還是很貴。你的囤貨,就是你最貴的那些知識的保險箱。