核心論點#

Joel 認為 Java 不是一種足夠難的程式語言,無法用來區分優秀程式設計師和普通程式設計師。大學計算機系的課程中有兩個傳統的「篩選」知識點——指標(pointer)遞迴(recursion)——許多人從來都沒有真正搞懂過,而 Java 恰好把這兩個難題都藏起來了。

指標和遞迴的真正價值,不僅在於它們本身的實用性,更在於學習過程中鍛鍊出的深度思維能力抗壓韌性——這些都是建造大型系統不可或缺的素質。

指標與遞迴的篩選作用#

  • 進入大學後,學生首先接觸「資料結構」課程,大量使用指標
  • 這些課程非常困難,學不會的學生就會轉換專業——這是一種優勝劣汰的篩選機制
  • 計算機系的淘汰率通常在 40% 到 70% 之間
  • 另一門關鍵篩選課程是函數式程式設計(functional programming),包含遞迴程式設計
  • MIT 的經典課程 6.001(教材為 Structure and Interpretation of Computer Programs)就是代表

Java 學校的問題#

  • 學習 Java 的學生永遠不會遇到 segfault(段錯誤),不需要處理記憶體管理
  • 他們不需要思考純函數中變數值為何會變化的矛盾
  • 不需要太多動腦筋就可以在專業課上拿到好成績

只教 Java 的大學培養出的畢業生,往往只會用 Java 編寫簡單的記帳程式。讓他們寫更難的東西,他們就束手無策了。

對產業的影響#

  • 過去十年,大量優秀學校紛紛轉向 100% Java 教學
  • 用 grep 過濾簡歷的企業招聘主管樂見其成——Java 沒有什麼太難的地方,搞不懂指標或遞迴也沒關係
  • 計算機系的淘汰率因此降低,學生人數上升,經費預算變大
  • 但結果是:雇主越來越難分辨學生是否真的聰明,還是只是 Paul Graham 所說的「Blub 程式設計師」

OOP 不能取代指標與遞迴#

  • OOP(物件導向程式設計) 不夠難,無法起到篩選作用
  • OOP 教學的主要內容是記住一堆專有名詞(封裝、繼承、多型、重載)
  • 沒學好 OOP,程式依然可以運行;但沒學好指標,你連程式出了什麼錯都不知道

指標在實際開發中仍然非常重要——如果不用指標,你根本無法開發 Linux 核心,也看不懂任何作業系統的程式碼。同樣地,不懂函數式程式設計,你就無法理解 MapReduce 這類讓 Google 達到巨大規模的演算法。

計算機科學的本質#

  • 計算機科學由證明(遞迴)、演算法(遞迴)、語言(lambda 演算)、作業系統(指標)、編譯器(lambda 演算) 組成
  • 只教 Java、不教 C 語言、不教 Scheme 語言的學校,實際上根本不是在教授計算機科學
  • Joel 諷刺地指出:「Java 大遷移」爭論中,最大的議題竟然是 Java 是否還不夠簡單、不適合作為教學語言