核心論點#
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 是否還不夠簡單、不適合作為教學語言