奇怪!Java 為何一直被唱衰?

2021-01-26 11:14:58

來源:CSDN

在我的印象中,上一次編寫 Java 代碼已是三年前的事兒了。雖然我的第一份工作就是 Java 程序員,但是后來因為容器與微服務的出現,Java 就從我的工作中消失了。可萬萬沒想到,如今我和 Java 又一次重逢了,居然還是在微服務領域。

Java 的優勢

這一切都要從微服務的熱潮說起,眾所周知微服務的優勢在于:易于擴展、高可用性、無需考慮并發和多線程,而且還能享受容器帶來的便攜性。

如今,以 Kubernetes 為代表的微服務席卷了全球,讓人感覺 Java 的時代已經成為了過去,而且這些語言無法很好地融入容器與微服務的生態系統。

雖然 Java 一直被集簡潔與優雅于一身的編程語言(比如 Python)所詬病,但作為 Java 曾經忠實的擁護者,我認為 Java 在某些方面仍然有著不可否認的優勢。

首先,我們都知道 Java 有著強大的多線程處理能力,對于銀行等企業應用程序來說這是非常重要的功能。多線程處理能力使得程序能夠具有更好的交互性、實時性。Java 在多線程處理方面性能超群,具有讓你驚喜的強大功能,而且在 Java 語言中進行多線程處理很簡單。

其次,雖然說比較 Java 與腳本語言的性能有點不公平,但 Java 的性能確實無與倫比。然而,在水平伸縮與微服務架構的世界里,語言本身的性能根本無關緊要,只需要增加容器就可以獲得優異的性能。雖然腳本語言能夠利用容器隨意擴大或縮小規模,但 Java 語言本身的性能優勢很明顯(至少在微服務領域)。

然而,另一方面,在此次會面中,Java 及其過時的框架(比如 Spring)也給我帶來了無窮無盡的煩惱。

Java 以及 Spring 的缺點

首先,我們來說一說 Spring。眾所周知,Spring 臃腫,入門難度大,充滿了各種謎之注釋,開發人員只能依靠教程或示例代碼。Java 語言本身就很古板,Spring 又加入了一大堆單行注釋和看似簡化的方法封裝,結果卻適得其反,獲得的通常都是一些壓根沒有必要的類調用和實例化。開發人員都明白,語言的控制、命令和透明性對于有效的軟件開發至關重要。也就是說,作為一名開發人員,你需要準確地掌握代碼的一切,以及代碼執行的例程,但 Spring 卻斬斷了這種可能性。

如果在 Spring 代碼中,每個類前面都要加上六個注釋,而且這些注釋各說各得,它們之間的關系錯綜復雜,就會讓人感覺深陷泥漿。而這樣做的并不僅僅是 Spring,例如 Lombok 庫也做了類似的事情。這種壓縮代碼的方式只能適得其反,并不利于 Java 的發展。

Java 不應該與腳本語言比較簡潔性。首先,這會犧牲 Java 代碼的一致性。想象一下,所有的 getter 和 setter 都消失了,取而代之的是一行注釋 @NoArgsConstructor。說好的一致性呢?

其次,這讓本來就已令人費解的抽象層次更難以理解。例如,Spring 會在幕后進行自動裝配(bean 注入),這是可以理解的,但是 Lombok 在應用程序中的定位又是什么,二者之間如何傳遞消息?如果每個類都需要六個注釋,那么這些注釋還需要實例化多少例程或類才能完成一個簡單的任務?沒有開發人員會希望這些多余的代碼潛伏在角落。可悲的是,三年之后我所見到的 Java 代碼就是這個樣子。一切都是原來的樣子。即便是有一些微小的變化,也是讓情況變得更糟。

最后,Java 的發展搞錯了重點。時至今日,Java 依然在糾結一些愚蠢的規則,比如類的命名,類應該放入哪個包中,以及變量是私有的還是保護的。反觀 Python,官方沒有提供有關訪問說明符的文檔,而是相信開發者會自己管理好這一切。這種做法很快就引起了我的共鳴。

KISS 原則

KISS 原則是如今軟件行業盛行的一句話,“保持簡單和愚蠢”(Keep it Simple and Stupid),換句話說來,“簡單就是美”。Java 想要發展下去,就要認真思考這句話了。

如今,微服務在軟件行業大肆普及。許多企業和組織都在從單體架構向微服務架構轉變,他們希望簡化設計,并提高可擴展性。對于程序員而言,這意味著將龐大的代碼庫或復雜的業務邏輯分解成更簡潔的小功能,這種方式可以避免在代碼中管理狀態,同時也可以避免并發問題和多線程的噩夢。

歸根結底,所有的服務(無論是哪種形式)都只不過是在處理某種格式(JSON 或 XML)的數據,然后將這些數據傳遞到 Kafka 之類的消息總線上進行進一步處理。然而,即便在這樣簡單的環境中,Java 和 Spring 仍在糾結過時的語法問題,應用程序上下文,復雜的 bean 注入,POJO 映射器,吞噬大量內存的 JVM,以及 class loader 等等,讓人一想到就頭疼。

網友看法

就 Java 是否已死這個話題,很多網友發表了各自的看法。

評論1

現在 Spring 越來越大,這就導致大多數程序員對 Spring 的體系及結構都一知半解,才會感覺頭疼。但如果你知道如何篩選自己想要的功能,就不會覺得臃腫,反而會很簡潔。例如:

● 你想實現 Rest 服務,那么可以參考 Spring MVC 預置的功能。

● 如果你不想自己寫 DAO,那么 Spring Data 可以替你做,模板代碼全部都可以替你實現,而且對 JPA 或 NO-SQL 的支持也很方便。

Java 生態系統非常龐大,需要學習的庫和框架也非常多。這些框架可以幫你省卻大量的樣板代碼,但是前提是你需要下一番功夫認真學習。

評論 2

Java 的優點很多,包括安全性、分布式、可移植性(一次編譯到處運行)、高性能、多線程以及動態性。

根據 TIOBE 發布的 2021 年 1 月編程語言排行榜,Java 是位列第二的編程語言。我完全沒有看到 Java 沒落的跡象。

關鍵詞: Java