因為它太容易了。
Java的容易不僅在簡單好學,更在於它超強的健壯性:靜態類型系統和自動垃圾收集保駕護航,很靠譜的的運行環境和層出不窮的自動工具雙雙加持,把Java環境開發難度降到前所未有的低。對著文檔東抄抄西改改,基本上只要能編譯過,Eclipse沒抱怨什麼,這份代碼也就差不多能用了。
如果換去寫 C, 只要你寫一個比 Hello World 複雜一點的程序,你就要開始考慮一大堆設計問題:數據結構,內存管理,句柄誰關閉指針跑哪了等等等等,設計考慮只要有一點沒到位,結果通常只有一個——直接掛掉。即使你去寫 Javascript, 難度也比 Java 高,人說 Javascript 是 copy&paste 語言,Java 纔是正宗 copy&paste 語言:你的 Javascript 工程只要稍微大點,你就不得不考慮代碼規範、設計模式約束之類,不然你的代碼就是一灘扶不上牆的爛泥。而 Java 呢,嘿嘿,再龐大的代碼庫你都能一直 copy&paste 下去。
所以,如果程序員能在 C 或者 Javascript 這種險惡的開發環境下生存下來,做出能用的東西,他們的水平也差不到哪去 —— 沒錯,我的意思是,程序開發語言可以作為一個水平篩選器,Haskell 開發強,不見得全是語言好,而是它的類型系統和 monad 給團隊成員做了個強度不低的智商測試。至於 Java,它用優異的語言特性和工具生態,把門檻設置得無可再低。
低要求必然造成低水平的程序員入行,低水平的程序員必然造成爛設計,而爛設計是會傳染的。
當然,門檻低不代表 Java 社區裡沒好程序員,沒好設計。不,我也見過很多好Java代碼,可是他們的工作並沒有得到應有的獎賞。這是因為一種 Java 社區特別熱衷的東西——設計模式。Java被宣稱是「面向對象」語言,給人一種用 Java, 把有的沒的都塞進對象裡就面向對象編程了的假象。而這個社區熱衷的「設計模式」,也是一個思路:把模式背熟了會套用了,也就會做設計了。如果天天胡寫亂改不思進取還讓程序員內心有一絲不安的話,設計模式大補丸的橫空出世讓他們徹底放了心:看幾本設計模式書就能習得N年設計功力,「設計」也終於變得如此廉價。
一個好的架構師分析項目,採用 DI, 精心定義接口和 DI 使用的範疇,在一個看過幾篇文章試用過Guice就言必稱DI的新手看來也不過爾爾,甚至還會嫌不夠標準和純粹。我看過的 Java 好代碼,外面往往被疊床架屋地壘上了各式各樣的模式接口抽象,似乎只有這樣才能合乎他們的口味吃得下去。爛設計固然不會給項目帶來什麼好處,但還是拜 Java 的健壯性所賜,如此胡鬧,代碼還是能跑下去,既然能跑,還有什麼可抱怨的?
好設計還是會閃光的,好設計更容易維護,隔好久都不用改動。而爛設計,即使堆砌上了無數設計模式,過不久就會被發現不再合用。這時,最後一個大殺器「重構」終於出場了:工具太好用了,重構太容易了。這個模式不 work, 下次重構時就做另一個模式咯…… 沒人會去想,早幹嘛去了?如果當初設計做得好,為什麼現在要重構?不過沒所謂了,反正重構很容易嘛,而且這麼有追求的行為,說出去也好聽。真正的設計功力,再次被忽略了。
今天的Java, 有強大可靠的核心基礎,有大量標準化的規範、模式,一群不需要什麼經驗的代碼工人就能做出基本符合預期的軟件來。這就是工業化大生產:產品不夠漂亮精緻,但便宜量又足,規格標準肯定能用;工人水平比專家差一大截,但規模優勢吞噬一切。他們不需要大師:大師能做到100分,一群工人可能只能做到60分,但對世界上大多數人,60分足夠了,更何況工人一抓一大把,大師卻可遇不可求。
我還是把自己當成一個手藝人,所以我討厭Java.