2012 年,如果你精通 CoffeeScript,你在 JavaScript 社群是搶手的。你知道所有的 -> 語法、class 宣告、splat 運算子。你的 .coffee 檔寫得行雲流水。

2015 年,ES6 發布。三年後,CoffeeScript 基本上已經死了。你那些語法知識,幾乎沒有地方可以用。

這不是 CoffeeScript 特有的問題。Ruby on Rails 讓 Ruby 在 2000 年代中期火了十年,現在幾乎沒有新創公司在選它。Perl 是 1990 年代的必備技能,現在主要活在系統管理腳本裡。2013 年的 Angular 1.x 和 2016 年的 Angular 2+ 語法幾乎完全不同——你的舊語法知識要重學。

語法是語言的選擇,不是你的知識。語言可以拋棄你的投資。


那些沒有過時的東西

現在回頭看 1978 年 Tony Hoare 提出的 CSP(Communicating Sequential Processes)——Go 的 channel 並行模型直接源自這個。

1968 年 Edsger Dijkstra 寫的 semaphore 論文,今天每一個作業系統課程還在用。

1958 年 McCarthy 設計的 LISP,引入了 garbage collection,Python、Java、Go 的 GC 都在解同一個問題。

並行、記憶體管理、錯誤處理、型別系統——這幾個模型的核心問題在 1960-1980 年代就已經被清楚地定義了。每一代語言的設計選擇,都是在這些問題上的新取捨,不是全新發明。

學會這些模型,你學的是不折舊的東西。


兩種學習策略的回報率

想像你花 100 小時學 Ruby:

  • 30 小時:Ruby 語法、慣用法(mapselectinject
  • 30 小時:Rails 生態系(Devise、ActiveRecord)
  • 40 小時:在 Ruby 專案裡實作功能

五年後,Ruby 市場份額下滑。你那 60 小時的語法和生態系知識,報酬率接近零。剩下 40 小時的「在專案裡解決問題」的經驗,部分可以遷移——但你實際用 Ruby 解決問題的方法,大量依賴 Ruby 特有的機制。

現在換一種方式,你花同樣 100 小時,不綁語言:30 小時理解並行模型(Thread vs Event Loop vs Coroutine 的底層差異),30 小時理解記憶體管理(GC 怎麼運作、為什麼 Rust 選擇 ownership),40 小時用不同語言實作同一個問題(Worker Pool 在 Go、Python、Node.js 各自長什麼樣)。

五年後你換語言,你知道要找的並行 primitive 在哪、GC 的行為會是什麼、錯誤處理的慣例是哪種型。這 100 小時,在每個語言裡都繼續有回報——不是「有點參考價值」,是直接能用。

這不是說語法學習無用。你用的主要語言,語法要精通。說的是學第二、第三語言的策略——那裡的投資應該優先放在模型,而不是語法。


為什麼概念比語法更難教

語法很好教:給一個 hello world、給幾個例子、背一下 API。

概念不好教,因為概念需要「為什麼」的理解,不是「怎麼做」的記憶。

理解 GC 不是知道「Python 有 GC」,是知道「GC 在解什麼問題、tracing GC 和 reference counting 的差異、為什麼 Go 的 GC 停頓時間比 Java 短、什麼情況下 GC 壓力會變高、這對你的 API latency 有什麼影響」。語法課三分鐘就能讓你跑起來 hello world,GC 的這個理解大概要幾週、要真的在某個服務上看過 latency spike 才會有感。

這也是為什麼這種理解很難被快速複製——它需要真正踩過,不是讀過。

下一篇:為什麼要分「共通概念」跟「語言特定」