有些人,尤其是年輕人,在知道這一點時會睜大眼睛。Java比較老式,與現代語言相比效率低下,並且註定要失敗,這基本上就是我一直聽到的內容。但是真的是這樣嗎?
老式的
是的,Java提供的基本構造和約束是老式的,並且依賴於20年前的代碼編寫方式。程序設計語言不是在無菌氣泡中創建的。開發人員的習慣和需求對於語言設計至關重要,而發明者試圖將創新注入其中,而忽略人們將如何實際使用它卻是愚蠢的。Java的第一個裡程碑可追溯到1995年,儘管它的一些基礎塊至少在10年之前就具有遠見,但很顯然,在 24年後的 29 年……還不算什麼。
但是,這不僅僅是時間問題。在過去的十年中,發生了很多變化。其中一些內容似乎與本主題無關,但實際上是討論的中心。例如,廉價內存的更大可用性在大規模重新採用生產軟體中的功能編程中起著核心作用。然後,這與採用反應式編程宣言有關。
可訪問和可管理的雲計算簡化了微服務模型的概念化,當容器成為現實時,微服務模型就可以發揮生產作用。
然後,微服務模型賦予了特別適合於某些任務而對其他任務不太出色的程式語言的尊嚴。
它並沒有就此結束。大數據帶來的新挑戰導致了新的任務優化的資料庫系統的發明,該系統能夠吸收大量數據,然後必須對其進行分析。實際上,這並不是導致新語言誕生的原因,而是對現有語言的重新思考,證明它非常適合完成此任務。
更不用說人工智慧的第二青年了。
Python現在已經成為機器學習的黃金標準,但是如果您快速瀏覽一下Wikipedia頁面,您很快就會意識到它比Java更舊,並且可以追溯到1990年!
那麼R,數據分析的常見選擇呢?1993年。
JavaScript嗎?奇怪的是,1995年,就像Java。
二郎?1986年…
為什麼這些語言不是老式的,而是Java?
因為我們改變了,並且與我們在一起,所以挑戰也隨之改變。
例如,Python一直是實用程序和數據處理程序的絕佳腳本語言,但通常認為它不適用於大型企業應用程式。但是,微服務通常是由小型程序和數據管道組成的,這些小型程序和定義良好的小型程序主要是功能性步驟。
JavaScript一直是使網頁動態化的唯一解決方案,但是隨著複雜的Web應用程式的激增,將其也帶到伺服器端也是合理的。
總而言之,Java之所以被認為是過時的,是因為它非常適合使用數百萬行代碼來構建胖的(大多是單片的)應用程式,需要大量的計劃和嚴格的順序,而Java則需要這樣做。
嘗試使用JavaScript進行同樣的操作,您將很快意識到「死亡不是終點,而只是過渡」(同上)。
無效的
相關。
我經常用這個比喻來解釋Java:
如果您需要建造一個火柴盒,則首先要拿10噸木材,建造一個原木,然後將其砍成火柴盒。
Java強制採用一種鼓勵建立適當的類層次結構的正式,嚴格的方法,因此不可避免地要像白痴一樣以適當的方式設置所有內容,即使是很小的任務。
就是這樣。鑑於我們在上一章中已經說過的話,在Java中沒有一件容易的事會很輕鬆。
請注意,簡單並不是說易於實現,而是在體系結構方面很容易。編寫複雜的算法是一項艱巨的任務,我發現在Python中更容易做到。
在這一點上,很明顯,我們正在迭代相同的概念:正確的工作工具。
Java是(並且曾經是)一種非常通用的程式語言,已被用來解決各種情況下的各種類型的問題,但是隨著時間的推移和挑戰的變化,Java似乎越來越無法倖免。不再是專業化了-不是因為它已經發展成一種專業語言,而是因為其他語言在特定任務中的適用性強。
如果您要構建具有大量內部編排,龐大的代碼庫,瘋狂的並行性等的大型企業平臺(或至少是其中心節點),那麼Java仍然是野獸。等等,是嗎?
Java註定要失敗
就像這條黑暗的勵志名言中所解釋的那樣:「不要害怕未來,您不會經歷很多事情。」 此時您應該大聲笑...
隨著年齡的增長,Java非常像開發人員。您不像十年前那樣頭腦清醒,但是作為交換,您更加明智,更加穩定和可靠。當然,您仍然可以學習Rust,但是它永遠不會像比您小10歲的人感到正確。同樣,現代化Java的競賽也在不斷地進行,當新功能問世時,您會覺得在適當的時機之後,它們已成為現實。例如,當他們第一次引入lambda時,反應不是「是的!狂歡吧!」 但更多「看在上帝的份上,你花了這麼長時間嗎?」
另一方面,人們沒有意識到Java的最大成就不是語言本身。
極好的生態系統
規劃大型軟體時,仍然讓我回到Java的是生態系統。Java提供了一流的優質庫,可滿足您在Internet上夢想的一切。
想想Spring,Akka,Tomcat-我可以說幾百個-這些不是車庫項目,而是非凡的成就。我並不是說這不能用其他語言來完成,而是大企業推動Java創造了使此類軟體得以實現的前提條件。到達這裡花了好幾年,時間因素也很重要,因為處於邊緣的20年對於生態系統的成熟是很長的時間。
您可以找到適用於多種語言的特殊庫,但是您很快就會意識到它們是否存在,在很大程度上取決於大型公司是否認可該項目。
例如,找到適用於Python的好的機器學習庫非常容易,而且您不能說Google在其中沒有發揮作用。藉助Facebook,您可以使用React.js(JavaScript)開發出色的Web應用程式。
您實際上是指JVM
除了前面提到的龐大的生態系統之外,Java的最大成就是JVM。雖然該語言可能會因年齡而受到影響,但根據我們普通人可以理解的內容,JVM看起來很健康。
現在,有人可能會說容器化消除了對JVM的需求,從某種意義上講,就是這種情況。實際上,對JVM的最初需求是允許程序在任何OS上執行,但是容器在這方面改變了一切,因為容器提供了可以在任何地方(在紙上)執行的OS 的模擬。
但是JVM不僅限於此。內存管理和垃圾回收,安全性,基本的編程庫以及調試和檢查功能-所有這些使JVM變得非常安全,舒適。
「但是JVM太重而且很慢!」 這是我收到的經典回推,儘管其內存佔用量和引導時間在一定程度上是正確的(這使其非常不適合面向任務的程序),但是從性能的角度來看,最近20年發生了一些事情或者。
以下是使用流行算法進行的一些基準比較:
· Python 3與java
· Node js與java
· GO與java
· Erlang HiPE與java
儘管由於算法只是故事的一部分,所以這種基準測試不能使所涉及的語言公平化,但是您可以清楚地知道JVM絕對不是拖到墳墓場的病態大象。
然而…
我有點同意,儘管JVM仍然運行良好,但Java仍在努力使其在陽光下保持位置。Oracle知道這一點,並正在努力推動Java再次變得出色,儘管這提供了一些出色的結果,但沒有人真的認為這會停止老化過程。這不是一件壞事。
JVM是創建更現代,更有效的語言的平臺。公平地說,並不多,但有些非常成功。
這就是重點。國王沒有死,但那咳嗽聽起來也不好。然而,它的後代在這裡繼承了它的遺產。
· Scala我的第二次戀愛。一種非常強大的語言,是靜態類型化,面向對象和功能性的。儘管仍未被廣泛採用,但它是目前掌握該技術最經濟實惠的技能之一。通常是由Akka actor模型實現豐富的,它是為Play框架提供動力的語言;
· Clojure它是Lisp語言的一種非常受歡迎的方言,並以並發計算中的出色功能而聞名,通常用於處理龐大的數據集。
· Groovy 我通常將動態編程和腳本語言稱為Java語言(但是我確信創建者不同意)。Groovy被廣泛用於腳本編寫目的,也是為Grails框架提供支持的語言。
· Kotlin 最後但並非最不重要的一點是,JetBrains的靜態類型化,面向對象和功能性語言現已成為Google Android開發的首選工具。
而且我們並不是在談論Java的擴展。這些是全新的程式語言,肯定可以借鑑Java的知識,但最重要的是,它們充分利用了JVM和Java生態系統。
但實際上...
Java程式語言不會很快消失。
不僅是因為使用它構建了大量軟體,而且還因為您是否同意它的所有缺陷,它仍然是新項目的非常合適且經過實踐檢驗的選擇。
當然,它的角色發生了變化。從您唯一需要的東西來看,它現在是圖片的一幅,但是很牢固。
即使考慮到我對Scala的致命吸引力,也必須說Oracle和社區在改善Java方面做得不錯,而且我們所有人都在享受這種進步的好處。新功能的質量可以很好地解決它們的回味,比我們想像中的時間表晚了一點。
畢竟,程式語言發展的緩慢進步可能是放棄的標誌,也可能是成功的標誌。當您的語言被如此大規模地使用時,重大更改應引起重視。您進行的每個步驟都需要考慮會產生什麼影響,以及它如何影響向後兼容性。不能掉以輕心。
結論
我以為我已經在該領域工作了很長時間,以了解它的某些特質。當然,在過去的十年中,這個領域的發展加速了,但是進步主要來自於整體。
當這種情況發生時,您可能會感覺到一切都會改變。這些進步的成堆來自他們過度激動的思想家的工作組,他們樹立並大喊大叫。但是,當他們踢起的塵埃落定時,那一刻,您可以清楚地看到成就的真正本質,並從中合理地發揮最大的作用。
就像我說的那樣,Java並沒有走到任何地方,但是以我的誠實觀點,它要想在這些成就中發揮最大作用的努力還遠遠沒有贏。
我對所有Java愛好者或討厭者的建議是:享受這個奇妙的技術時代所提供的多樣性!
最後,開發這麼多年我也總結了一套學習Java的資料與面試題,如果你在技術上面想提升自己的話,可以關注我,私信發送領取資料或者在評論區留下自己的聯繫方式,有時間記得幫我點下轉發讓跟多的人看到哦。