為什麼.NET一開源一跨平臺 一些人就在喊Java去死?

zhihu發表於2014-11-18

  本文來自知乎吳濤的回答

  今天的 Java 是程式設計領域的 lingua franca:作為一門語言,它比 C / C++ 學起來更容易,比 Perl / Lisp 讀起來更正常,比 VB / PHP 用起來更專業。幾乎沒有人看不懂 Java,所以講解個什麼概念,用 Java 寫出來大家都能明白。

  而作為平臺的 Java,有無所不包的類庫,極度優化的虛擬機器,根深蒂固的開源專案,結果就是,無論你想做任何事情,理論上——乃至 99% 的實際上——都可以用 Java 實現。

為什麼.NET一開源一跨平臺,一些人就在喊Java去死?

  我寫下這些文字的片刻,就又有幾萬行 Java 程式碼在世界上誕生了,所以如果以「不再有任何人使用」為一種技術的死亡界限,那 Java 顯然活著,並且活得還不錯;如果以「能找得到工作」作為一種技術的死亡界限,那 Java 更是生龍活虎,國內的狀況我不清楚,但在歐美任何一個求職網站上以 Java 為關鍵字搜尋職位,都可以很容易地看出它拳打 C++、腳踢 PHP 的霸主地位。

  沒有人質疑它為什麼活著,我們 take for granted 它活著,就像我從來不質疑明天去上班時還有沒有活幹一樣,granted。

  但如此一來,倒不如就說 Java 已獲永生算了。因為,如果你按照上面的兩個定義巡視一遍 TIOBE,就會發現沒有什麼稍微有點名氣的程式語言(及其背後的技術)真的死去了。Visual Basic 還活著,Delphi 還活著,COBOL 活著,Fortran 活著,甚至連 FoxPro 都活著。

  至於比這些更小眾的例子,你們聽過 IBM AS/400 系統麼?我的上個東家還在用,維護它的程式設計師剛入職的薪水就高得離譜,因為整個公司二十年核心業務邏輯都在裡面,一損俱損。AS/400 也活著。

  所以當我說「Java 去死 / 已死」的時候,「死」意味著什麼呢?很簡單:沒人愛了。

  本版同文那篇改寫尼莫拉詩句的答案是對 Paul Graham 那句「of all the great programmers I can think of, I know of only one who would voluntarily program in Java」的完美呼應:十個寫 Java 的人裡面有九個是「因為工作需要」——剩下一個是因為不會別的。在所有我能想像到的寫程式的動機裡面,「因為工作需要」是最令人心如死灰的一個。

  犧牲著前列腺和脊椎的健康久坐在螢幕前忍受著用 Java 寫程式只為混口飯吃,反正我覺得沒意思。如果你還能笑出來,good for you。

  而只要你不是剛從一九九五年穿越過來,就應該能看到現在的 Java 也的確並不可愛。

  語言特性方面,與其說它沒有什麼太大的問題,倒不如說它的那些問題已經有了很多成熟的 workaround,比如無法被 override 的靜態方法,畫蛇添足的 checked exceptions,還有半屁股的泛型。而真正令人難受的是那些它缺失的特性——我可以說 C# 裡面的 struct、delegate、async / await、event handler、accessor、operator overloading 支援(好吧這個不一定是好事)乃至 type inference 之類都是 Java 所缺失(或者只有靠隔靴搔癢的第三方庫才能實現)的,當然還有真正的執行時泛型。分開來看每一點你都會覺得沒什麼,但是當所有這些積累起來時,C# 就比 Java 可愛得多。

  這些功能有朝一日也許終歸會在 Java 中出現,就像 Java 7 終於有了 switch on string 和 try with resource、Java 8 終於有了 lambda 一樣,但是它們出現之前,你就得忍著,連同 Java EE 那堆臃腫龐雜、詰屈聱牙的技術迷宮一起忍著。而且感謝 Oracle,你還不知道要忍多久——作為一個參照值,Java 8 大概相當於 .NET Framework 3.0,而 .NET Framework 3.0 是二〇〇六年的事情,那時候手機市場的第一巨頭是諾基亞。

  Oracle 以任何標準衡量都不是一個會為開發者著想去改進工具的公司,比 Microsoft 更令開發者厭惡,後者至少有組織良好、行文詳盡的 MSDN 資料庫,有雖然平庸但不斷改善的 CodePlex 開源平臺,還有個禿頂胖子汗溼了襯衫站在講臺上大喊過 developers developers developers。

  而 Oracle 做過什麼?把 MySQL 留在路邊喂狗。把 OpenOffice 的開發社群趕出家門。無厘頭地起訴 Android。

  所以 James Gosling 在 Sun 被 Oracle 收購的同時辭職,就叫做先見之明。

  也難怪大家會競相在 JVM 上發明新語言,並且將其他語言移植到 JVM 上,只是這些嘗試努力的方向太過分散,沒有誰能夠一統江湖讓 Java 社群看到希望。

  我們的現狀是,二〇〇七年之後已經不再有人寫 Java ME;Java SE 除去幾個 IDE 專案之外最著名的程式只有 Minecraft;Java EE 和 Android 就是 Java 唯二仍舊還算 alive and kicking 的部分。Dalvik 那是另立門戶沒什麼可說的,那麼 *nix 上的 JVM,其實是作為平臺的 Java 所僅剩的基石。以前它從來沒有過一個像樣的競爭對手——要麼太嫩,要麼太虛,這種狀況一直持續到二〇一四年十一月十二日為止。

  而這就是你問題的答案:那個十多年前總裁說過「Linux 是一種癌症」的微軟,從今天起官方支援其核心價值觀輸出平臺跑在 Linux 上面了,還開源免費。

  全世界所有能賣給你一臺虛擬主機跑 Linux 的服務商一夜之間都變成 .NET 主機服務商,不愛 Java 的人忽然有了一個新的選擇,文件詳盡,支援良好,路線清晰,社群強大,工具易用,有企業級的可靠程度,而且最爽的一點是,之前寫 Java 的經驗,九成都可以無縫移植。

  我從沒有說過這件事的成效立等可取,不過想想 Java 曾經是如此無孔不入的東西——它甚至跑在你的 SIM 卡里面,直到今天——卻也許能在我的有生之年變成一九七三年的 COBOL,就會覺得世事無常。我相信現有 Java 系統會漸漸成為 legacy code,人們繼續維護它們,只是因為它們必須被繼續維護下去。

  新的掙扎仍舊會出現,畢竟瘦死的駱駝比馬大,一群老鼠啃駱駝的屍體也能啃上一段時間——為了減輕你的柔弱心靈讀到剛才這句話所遭受的痛楚,我承 認我也只是啃食 Java 的老鼠身上的一隻跳蚤(嗯?其實你根本不痛苦?你看,連你也不愛 Java)——這無疑會是個漫長的過程,所以如果你是個剛入行的 Java 程式設計師,大可不必擔心自己的事業發展,只要人類不發明永生技術,你就活不到因為只懂 Java 而找不到工作的那一天。

  退一萬步而言,你若真的能把自己逼到那樣的絕境裡,還是趁早去做管理吧。

  最後,我並沒有「喊」Java 去死,因為這並不是一種宣告,更不是什麼詛咒,只是陳述在觀察現狀之後得出的結論而已。當然,「去死」很難不帶感情色彩地解讀,就好比我輸入 kill -9 時很難不讓人覺得我不痛恨那個程式一樣。雖然我真的並不痛恨它。要痛恨也只有那麼一下下而已。

  又,所謂「大牛隻選擇最適於解決問題的工具,而不去爭論誰好誰壞」之類的論調,前半句不假,後半句完全是迷思。不是每個人都是 pragmatist,爭論工具好壞的大牛多了去了,說這話的人閱讀量太少。

  利益申明暨 disclaimer:

  我目前是個 Java 程式設計師。準確來說,我從事正職的時間裡如果在寫程式碼,有六成是寫 Java,包括 EJB、JPA、JSF,Swing,甚至還有 GWT,而我上次正經寫超過十行 C# 是在八年以前。我開始寫這個答案是因為等飛機無聊,能寫這麼長我也沒想到。我沒想說服誰,所以如果你不同意,good for you

相關文章