與現代語言相比,Java老套、低效、而且已經完蛋了,基本上他們都會這樣對我說。然而,實際情況確實如此嗎?
老套
沒錯,Java的基本結構和限制都比較老套,而且還依賴于20年前寫代碼的方式。
編程語言并不是憑空產生的,開發人員的習慣和需求是語言設計的核心,雖然語言的發明者試圖將創新融入其中,但是忽略人們實際的使用方法是很愚蠢的做法。
Java史上的第一個里程碑可以追溯到1995年,雖然它的一些基礎模塊的設計看起來至少有10年的遠見,然而很明顯,24年后的今天……看起來不是那么一碼事了。
但這不僅僅是時間的問題。在過去的十年中,Java發生了很多變化。其中一些變化似乎與Java本身無關,卻無比重要。
例如,廉價的內存對于生產軟件中大規模重新采用函數編程起著舉足輕重的作用。而這又與反應式宣言(The Reactive Manifesto)息息相關。
便于訪問和管理的云計算促進了微服務模型概念的發展,這種模型隨著容器的出現走向了生產環境。
于是,在微服務模型的發展中,一些非常適合于某些任務,但在其他任務上表現平平的編程語言脫穎而出。
編程語言世界的變化遠不止于此,大數據帶來的新挑戰催生了專門為處理大數據而優化過的新的數據庫系統,這些數據庫能夠攝取大量的數據,然后對其進行分析。
實際上,這并沒有催生新的語言,而是為適合于這項任務的語言找到了另一種使用方式。
更不用說人工智能又一次掀起了爭先恐后的熱潮。
但是,等一下......
如今,Python成為了機器學習的黃金標準,但是如果快速瀏覽一下它的維基百科頁面,你就會發現Python的誕生早于Java,甚至可以追溯到1990年!
那么R呢?這可是數據分析常見的選擇。R語言始于1993年。
那么JavaScript呢?奇怪的是,JavaScript出現于1995年,與Java同年!
Erlang呢?1986年......
為什么沒人說這些語言老套,卻單單說Java呢?
因為我們改變了,還有我們面臨的挑戰也發生了變化。
例如,Python一直是編寫實用工具和數據處理程序的一種出色的腳本語言,但通常我們不認為它適合于臃腫的企業應用程序。
然而,一般來說微服務是一些小程序和數據管道,它們由明確定義的功能型小組件組成。
一直以來,JavaScript是動態網頁的唯一解決方案,但隨著復雜Web應用程序的激增,將JavaScript帶到服務器端也算合情合理。
總而言之,我們說Java老套,只是因為它非常適合構建臃腫的單體應用,這些應用往往擁有數百萬行的代碼量,需要大量的規劃和嚴格的順序,而Java的設計目的本來就在于此。
如果試試看用JavaScript構建這樣的應用,你很快就會意識到“死亡不是終點 ,而是一種轉變”(摘自:夢劇院樂隊的歌曲《Fatal Tragedy》)。
低效
聽上去確實如此。
我經常用下面的比喻來解釋Java:
如果你需要做一個火柴盒,那么首先你需要10噸木材,建造一個小木屋,然后再一點點削成火柴盒。
由于Java強調用一種正式嚴謹的方法來鼓勵開發人員創建適當的類層次結構,所以開發人員即使覺得這種做法很白癡,也不得不采用正確的方式設置所有內容,即使對于一個非常小的任務也是如此。
然而,這就是問題所在,就像我們上面所說,Java的任務都不容易。
請注意,我所說的“不容易”指的是不容易實現,但在架構方面卻很容易。
編寫錯綜復雜的算法是一項艱巨的任務,而且我發現用Python來寫更容易。
對于這一點,很明顯我們一直在反復討論同一個概念:選擇正確的工具。
一直以來,Java都是一種非常通用的編程語言,而且被用于解決各種情況下各種類型的問題,但隨著時間的推移和挑戰的變化,似乎越來越明顯Java也并非無所不能——這并不是因為它已經演變成了一種專門的語言,而是因為其他語言更加擅長處理特定的任務。
如果你想構建一個大型企業平臺,其中包含大量的內部構造,巨大的代碼庫,瘋狂的并行性等等。
那么Java仍然很給力。等一下,真的是這樣嗎……?
Java已經完蛋了
也許有點陰暗,但是有一句話說的好:“不要害怕未來,你也活不了那么長。” 你是不是感覺想笑……
Java就像一名開發人員一樣,隨著時間流逝一天天老去,你不再像10年前那樣擁有清醒的頭腦,但是你會變得更聰明、穩定和可靠。
當然,你仍然可以學習Rust,但你永遠無法像比你年輕10歲的人那樣,你總覺得哪里不對勁。
同樣,Java也在現代化的競爭中不斷落后,當新功能出現時,你總感覺在經歷了諸多波折后,它們終于成為了現實。
例如,當他們第一次引入lambdas時,你的反應不是:“哇!歡呼吧!”,而更像是:“天啊,為什么到現在才出來啊?”
另一方面,人們沒有意識到Java的大成就不在于語言本身。
良好的生態系統
在規劃大型軟件時,讓我想起Java的另一個因素就是Java的生態系統。無論是何種互聯網上你夢寐以求的東西,Java都可以為你提供卓越高品質的庫。
想想Spring、Akka、Tomcat等等(我可以說出來幾百個),這些都不是業余項目,而是非凡的成就。
我并不是說其他語言做不到,但是在大企業的推動下,Java創造了這種軟件生存的先決條件。
此外,一個良好的生態系統需要花費數年才能培養起來,時間因素也非常重要,對于Java生態系統成熟來說,20年可以說是很長的時間了。
當然,你也可以找到適用于多種語言的特殊庫,但是很快你就會意識到這些庫的存亡,在很大程度上取決于大公司是否認可這些項目。
例如,為Python找到好的機器學習庫非常容易,但你不能否認Google在其中發揮的作用。在Facebook的支持下,你才有了React.js(Javascript)開發出色的Web應用程序。
Java大的成就是JVM
除了我們之前提到的龐大生態系統之外,Java大的成就是JVM。雖然語言可能因年齡的增長而面臨重重困難,但至少在我看來JVM很健康。
如今,有人可能會說容器化已經削弱了對JVM的需求,從某種意義上說,此言非虛。
JVM初的需求是允許程序在所有操作系統上執行,但容器改變了一切,因為在容器的幫助下,我們可以假定操作系統可以在任何地方運行,甚至是紙上。
然而,JVM的作用遠不止于此。內存管理和垃圾收集、安全性、基本編程庫以及調試和檢查功能,JVM承擔起了所有的這些工作,為我們提供了一個安全舒適的環境。
人們常常反駁我說:“但是JVM非常臃腫,非常慢!”雖然從內存的占用和引導時間來看,這話沒錯,然而從性能的角度來看,過去的20年中發生了很多變化。
我們經常會通過常用的算法,進行下述的比較:
Python 3 Vs. Java
Node js Vs. Java
Go Vs. Java
Erlang HiPE Vs. Java
雖然這種比較對一些語言不太公平,因為算法只是性能因素的一部分,但從中可以看出JVM絕非病入膏肓。
然而…...
從某種程度上,我同意雖然JVM狀況良好,但Java卻在努力保住自己的地位。
Oracle明白這種形式,而且他們正在努力再次將Java推向巔峰,雖然這種做法會產生一些意想不到的后果,但沒人能夠阻止老化的過程。
然而,這也未必是一件壞事。
JVM充當了創建效率更高的現代化語言的平臺。雖然不是很多,但憑良心說,有一些還是非常成功的。
這就是關鍵所在。Java這個霸主并沒有死,雖然有些咳嗽。然而,它的后代將繼續傳承它的遺產。
Scala。我的第二個心中所愛。這是一種非常強大的語言,它是靜態類型、面向對象的函數式編程語言。雖然仍未被廣泛采用,但目前它是值得投資掌握的技術之一。Scala是Play Framework的實現語言,它還經常和Akka的actor模型搭配使用。
Clojure。一種被廣泛接受的類似于Lisp的語言,以其在并發計算方面的強大功能而聞名,它經常用于處理龐大的數據集。
Groovy。動態編程的腳本語言,我常常覺得它與Java非常類似。Groovy廣泛用于腳本編寫,也是支持Grails框架的語言。
Kotlin。雖然后一個出場,但并不是說這種語言不重要,它是JetBrains的靜態類型面向對象的函數式編程語言,如今是Google Android開發的首選工具。
上述我們討論的不是Java的擴展。這些是全新的編程語言,但它們都借鑒了Java,重要的是它們充分利用了JVM和Java生態系統。
但實際上......
Java編程語言不會在近期內走向消亡。
不僅因為大量的軟件都是用Java編寫的,而且無論你同意與否,它雖然有缺陷,但仍然是一種久經考驗非常適合于新項目的編程語言。
當然,Java承擔的角色會發生變化。從前“你唯一需要的只有Java”,而如今只能在部分領域發揮作用,但它仍然是堅實可靠的一部分。
雖然我對Scala非常感興趣,但是我也必須說Oracle和社區在改進Java方面做出了很大貢獻,我們都享受著這些改進帶來的優勢。
雖然新功能的到來比我們預想得晚,但在質量上卻沒得說。
畢竟,編程語言發展緩慢可能意味著被棄用,也可能是成功的標志。
既然人們如此大規模地使用你的編程語言,那么你就不得不認真地對待所有的重大改變。
你所做的每一步都需要考慮影響的程度,以及向后兼容性的方式。任何問題都不能掉以輕心。
總結
我在這個領域已經很長時間了,所以我有理由相信我對Java這門編程語言的某些特質有了一定的了解。
在過去10年中,這個領域的發展加快了速度,但是這些發展主要集中在某些領域。
出現這樣的情況時,你可能會感覺一切都將發生變化。這些發展讓部分人過于激動和興奮,所以他們四處喧嚷。
但是,當喧囂過后,你就可以清楚地看到這些發展的真實本質,并盡力利用好這些發展。
正如我上述所說,Java依然是Java,但是坦白地說,多年來Java努力達成的所有輝煌還無人能及。(相關推薦:Java多線程面試題)
我想對你們所有人說——無論是年輕人還是老年人,無論你喜歡還是討厭Java:享受這個美妙的科技時代帶來的多樣性!