一個程式訓練營可以在六週內教會你一門語言的語法。但真正花上十年時間學習的是其他所有東西:程式的接縫在哪裡、資料如何流動、哪些決策會伴隨整個程式碼庫的生命週期。這是資深開發者在觀察三十年差異後,對學習者真正應該追求的東西的看法。
幾年前,我在審查一位初級工程師的拉取請求,使用的是我從未專業寫過的語言。我無法憑記憶說出標準函式庫的內容,還得查詢 lambda 的語法。但我知道,未執行程式碼前,這個函式是錯的。
那是五行程式碼,卻應該只用一行。結構錯誤。資料流出、回來、重塑、再回來,最後回到起點,帶著些微損傷。變數名稱沒問題,語法沒問題,函式也完成它宣稱要做的事。但仍然錯誤,因為它做的事不是程式中該做的事。
我能看出來,是因為我寫程式很久了。初學者看不出來,是因為他們只學會了一門語言。這兩者不是同一種能力,而這中間的差距,是這份工作中幾乎沒有人在入門階段教的部分。
市面上幾乎所有入門課程、影片和訓練營都只教某一語言的語法,並稱之為程式設計。其實不是。程式設計是跨語言共通的部分:系統如何組合、接縫在哪裡、資料流向何處、哪些決策下個月還能輕易改變,哪些決策會伴隨程式碼庫一生。
我在其他地方寫過這個論點的更深層版本。關於現代程式教育基礎理解衰退的書章,說明了真正流失的是什麼:機械同理心、對底層機器的誠實心智模型、解釋系統形態的歷史脈絡。那篇文章是結構性論述,這篇則是隨之而來的實務指南。如果你讀過那章並問「那學習者該怎麼辦」,這就是答案。
大約在 cmcweb 時代第二年,我在為一位客戶寫 Visual Basic 6 的業務應用程式。我帶著一位初級工程師,他已跟我合作過三個專案,熟悉 VB 語法,能睡著寫 For Each 迴圈。他寫的程式碼是正確的,但很平面。每個表單都是一個龐大程序,從頭跑到底,再分派給其他龐大程序。語言是事件驅動,他卻像寫 1970 年代的主機批次程式,多了些步驟。
三月某個星期二,某件事突然開竅了。我不知道是什麼。他寫了一小段連接兩個表單的膠水程式,使用事件的方式正是執行環境預期的。接著他寫的東西越來越好。月底時,他的程式碼有了不同的質感,看起來像 VB,而不是附加視窗的 Pascal。
語言沒變。他在那個星期二之前已寫了兩年 VB6。改變的是他開始理解自己身處什麼系統。他不再把想法翻譯成 VB,而是直接用事件思考。語法、標準函式庫、IDE 都一樣。變成另一種開發者了。
這部分無法放進六週課程。無法放在投影片,也無法用 YouTube 短片傳授。它會發生,也可能不會,通常是在學習者寫了足夠多程式碼,對其中部分感到尷尬之後。
語法、標準函式庫、慣用風格、型別系統、建置工具、套件管理器的運作與故障排除,這些都很重要,也必須學會。但只有這些的開發者只是翻譯者。他們能將人類語言的指令轉成機器可讀的文字,甚至能用三、四種目標語言轉換,且翻譯正確。至於指令本身是否正確,那是別人的問題。
程式設計師是決定指令應該是什麼的人。
資深開發者每天做的大部分事,初學課程裡都沒有。這些是不起眼的工作:閱讀程式碼,追蹤資料在他人設計的五層結構中流動,形成錯誤假設、測試並縮小範圍,辨識函式過大並找出可獨立存在的部分,理解資料結構反映 2019 年的決策,且該決策成為未預期負載的支撐,判斷檔案中五個看似誘人的重構哪個會在生產環境出問題,哪個安全。
這些不在語言裡,而在打字者的腦中。語言只是鍵盤。
優秀開發者真正擁有的能力,而訓練營版本缺乏的清單:
我每天使用 Claude Code,兩天前寫過一篇文章。這工具很棒,但對沒有判斷力的學習者來說,是通往更差程式碼庫的捷徑。
這不是抱怨 AI,而是我三十年來一直強調的觀點,現在有了新的放大器。模型寫出看似合理的程式碼。如果提示者分不清合理與正確,合理的程式碼就會被交付。如果能分辨,模型就是資深者的倍力器,幫助快速輸入接縫。
瓶頸從來不是「你寫程式碼有多快」,而是「你知道該寫什麼程式碼、順序如何、各部分間的契約是什麼」。模型沒改變這點,只改變了產出程式碼行數的成本,決定程式碼行數的成本依舊如昔。
初學者若學程式是「描述想法給模型,接受回傳結果」,他們學的是更遠離機器的翻譯者,不是更接近程式設計者,且中間產物更漂亮。
如果你剛開始讀到這裡,這是我會告訴 25 歲自己的簡短建議:
選一門語言深入學習,深入到你用它交付過非瑣碎專案、維護過一年、修正過因為過去對執行環境誤解而產生的錯誤。只學教程是不夠的。然後選第二門結構截然不同的語言。C# 和 Python 是實用組合,C 和 JavaScript 更尖銳。對比是重點。你要找的是兩者共通的部分,因為那才是真正的程式設計。
閱讀程式碼。真實程式碼庫中的程式碼,包括醜陋的部分。開源專案充滿這些。閱讀問題追蹤和拉取請求討論,不只合併的程式碼。真正有趣的論點很少在差異中。
從頭到尾做一個專案。真實的專案,有真實使用者,即使使用者是你自己。不要再做另一個待辦清單教學。交付它,然後維護至少一年。注意痛點。痛點清單就是沒人能替你寫的課程。
找一位資深開發者讓你觀察他工作。與比你資深十五年的人配對編程,是這領域最高頻寬的學習,幾乎沒人在 YouTube 上分享,因沒人付錢給他們。主動問。大多數資深者如果你不煩人,都會答應。
閱讀非語言特定的書籍。《實用程式設計師》、《Code Complete》、《軟體設計哲學》、《Kernighan 和 Pike 的程式設計實踐》。這些書隨時間沉澱,經典不衰。你現在用的框架流行書不會。
看語言教學時,選擇針對有經驗開發者學新語言的教學。訊號對語法比率高,因為作者不會每兩分鐘解釋一次變數是什麼。
對任何承諾十二週成為開發者的課程保持懷疑。你可以成為六個月後有第一個有用貢獻的初級員工,但那是不同的承諾,不是市場上宣傳的。
這個領域不需要更多會用七種語言寫 for 迴圈的人,而是需要更多能面對空白編輯器,決定該建什麼、順序如何、接縫在哪裡的人。這部分需要十年,幾乎沒人在入門教,因為沒人能在固定長度課程裡教陌生人。
如果你是學習者,問題不是「我該先學哪種語言」,而是「哪位老師能教我系統如何組合」。第一個問題到處都有廉價答案,第二個罕見且值得花時間尋找。
關於為何這差距存在,以及基礎理解在記憶、抽象和計算推理層次的真正意義,請參考我對現代程式教育基礎理解衰退的完整論述。
這篇文章是實務指南,那是教科書。