如何學習寫程式 - Geohot
# 程式語言The only advice I have for learning programming is go program.
看了那麼多寫程式的頻道跟文章,還是覺得 Geohot 講得最精闢。江湖一點訣、說穿不值錢——你不會看了影片就突然變強,也不會有 AI 輔助就突然開竅成為開發者(雖然善用 AI 確實能加速這段過程),而是要開始寫。
這句話來自他上 Lex Fridman Podcast 的一段剪輯。整個 Podcast 有三個小時,很值得完整看完。
Geohot 是誰
簡單概述:他破解了 PS3 金鑰後被 Sony 告,也破解過 iPhone,讓 iPhone 不只能在 AT&T 網路上跑。近幾年他在做自動駕駛軟體 comma.ai,以及深度學習框架 tinygrad(可以想成 PyTorch)。tinygrad 是他在 Twitch 直播時開的小專案,目標是用 1000 行以內寫出一個好用的深度學習框架。YouTube 上找得到直播存檔,或直接到 GitHub 看程式碼。
關於他更多事蹟我打算另外寫一篇來介紹。
該學什麼語言
Geohot 推薦的順序是 C、Assembly、Python,再來是三條延伸路線:
- Functional Programming。例如 Haskell,理解純函數的世界。他自己用 Haskell 寫過一個簡單的 Scheme 直譯器,寫直譯器可以讓你理解一個程式語言是怎麼變成電腦可以實際執行的過程。詳細可以到他的直播存檔看看。
-
Verilog 或其他 HDL 語言,理解硬體的世界。硬體跟軟體是兩種完全不同的心智模型。Geohot 之前曾經開了一個叫 fromthetransistor 的 Repository,寫了一份大綱,打算從電晶體一路往上建構一個簡易的瀏覽器。概念上跟 From Nand To Tetris 很像。
-
Deep Learning,例如 PyTorch。他學習的方式是直接讀 Paper,然後在 tinygrad 上想辦法把它實作出來。這其實是學習深度學習最有效的方式——不然很多工程師都是把現有的框架套一套、調幾個參數,對背後的原理完全沒概念。
先理解底層怎麼運作,C 怎麼編譯成組合語言、組合語言又會自然帶出 Stack、Heap、CPU、RAM 這些計算機架構的核心概念。理解了這些,你才會感謝 Python 給你的一切。
從直播裡可以學到什麼
從 Geohot 的直播可以撿到很多寶。
他當時的直播大部分用 Vim(自從發現 VS Code 的好之後改用 VS Code),打字跟思考都非常快——快到你真的能感覺到他對 Vim 的熟練度,以及遇到問題時要從哪邊下手。
我以前並不在意打字速度,也沒特別注意手是不是維持在鍵盤上,但這件事比我想像中重要:不夠快,思考就容易被打斷。這是在 LLM 還沒辦法取代日常開發時的訪談,所以手寫程式仍是主流;不過 Geohot 自己最近的直播也比較少手寫了,改用 Opencode。
他的 Debug 風格同樣值得看。就算是大神等級的工程師,遇到問題也是查語法、查文件,沒有什麼神秘技巧。直播裡可以看到大量試錯:這邊加一個 log、那邊加一個 log,看看結果如何,簡單但有效。他會盡量保持程式碼簡單,只寫一小段就馬上驗證,而不是寫一大段才開始跑,出問題還不知道從哪裡找起。
這幾年下來他累積了不少專案,有興趣可以到有人幫他存檔的 YouTube 頻道挖寶。
為什麼這種人這麼稀有
最近我也發現,有不少工程師功能還沒寫多少,就先喊 DDD、要用最新框架、狀態管理 A 不夠還要疊 B 跟 C,動不動就喊重構,但對重構的理解是把一坨程式碼包成函數搬到別的地方。結果功能還沒做出來,專案已經複雜到改不動了。
前端因為特性使然,沒有 Bundler 寫網頁確實有點綁手綁腳(但還是做得到),不過很多時候寫專案真的不需要那麼多花俏的包裝。
Geohot 曾經半開玩笑地說過,只要你能送優質的 Pull Request 過來,他才不管你是人還是猴子,薪水用香蕉支付也可以。
在我十年的職涯裡,合作過數十位在各自領域都有相當深入理解的工程師,但對於底層也理解透徹的,只遇過一位。跟這樣的人合作,看問題的角度、debug 的方向、對「複雜」的容忍度,都和一般工程師明顯不同。