我是一個從事Java / Scala / Groovy工做的傢伙,這不是一個祕密。有些人,特別是年輕人,在聽到這話時就會衝我翻白眼。算法
與現代語言相比,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:享受這個美妙的科技時代帶來的多樣性!