更新時間:2022年12月22日14時52分 來源:傳智教育 瀏覽次數(shù):
有不少同學(xué)在剛接觸Java時會崩潰,如Java糟糕的入門體驗、核心標(biāo)準(zhǔn)庫不夠用、最啰嗦的語言Java、復(fù)雜的 "企業(yè)級"產(chǎn)品、庫作者處理的問題越來越復(fù)雜、太多的抽象性、非本地的FP支持等等原因。
今天我們一起來看一下,覺得Java技術(shù)難學(xué)的原因:
1、Java糟糕的入門體驗
作為一個擁有超過15年Java開發(fā)經(jīng)驗的開發(fā)者,我對Java生態(tài)系統(tǒng)了如指掌。所以我知道我可以安裝哪種JDK、如何去管理多個JDK版本、有哪些IDE、構(gòu)建工具、常用庫等。
很多任務(wù)都是一次性設(shè)置的,但無形之中也給入門級小白一種印象:Java需要復(fù)雜的設(shè)置,沒有繁瑣的IDE設(shè)置就無法使用Java。
2、核心標(biāo)準(zhǔn)庫不夠用
通過調(diào)研還發(fā)現(xiàn)了以下一些問題:一個常見的問題是Java的核心標(biāo)準(zhǔn)庫不夠用,許多任務(wù)需要一些外部庫,這也是事實。沒有內(nèi)置的測試庫、JSON(取消)編組支持等。雖然Java NIO是一個很大的進(jìn)步,但與其他語言相比Java中的文件I/O仍然是復(fù)雜而冗長的。沒有內(nèi)置的(類似Kotlin)對不可變數(shù)據(jù)結(jié)構(gòu)的支持。
我的觀點:Java有很好的標(biāo)準(zhǔn)庫,如Collections、Streams、Java NIO等。使用文件I/O、JDBC等仍然感覺非常低級和冗長。有很好的第三方庫,如commons-lang、commons-io、Jackson、Gson、Vavr、Eclipse Collections來執(zhí)行這些任務(wù)。添加第三方庫并不是一個大問題。挑戰(zhàn)在于當(dāng)有太多的選擇時,新手們會感到困惑不知道該選哪一個。
2、最啰嗦的語言Java
Java是最啰嗦的語言,這是對Java最常見的評論。
我的觀點:人們討厭setters、getters等,但我不認(rèn)為這有什么不好。因為可以用Lombok和Records來避免編寫模板。通過使用正確的庫,可以編寫出不那么冗長的Java代碼。事實上Java在冗長和簡潔之間取得了適當(dāng)?shù)钠胶狻Mǔ?,基于Java的企業(yè)應(yīng)用程序會被維護(hù)很多年,而被認(rèn)為冗長的東西實際上會幫助人們理解它。其中一個回答說明了一切,任何時候都會選擇傳統(tǒng)的Java而不是傳統(tǒng)的Node.js。
3、 復(fù)雜的 企業(yè)級產(chǎn)品
另一個常見的話題是關(guān)于復(fù)雜的企業(yè)級產(chǎn)品,如ClassLoaders、JNDI、OSGI、JMX、Reflection、AOP、ByteWeaving、Dynamic Proxies、應(yīng)用服務(wù)器等。
我的觀點:十年前,在EJB 2中使用EAR打包,處理ClassLoader的問題是多么令人沮喪。另外,在JBoss/WildFly等應(yīng)用服務(wù)器中部署Spring應(yīng)用時也有處理類加載器問題的經(jīng)驗。
在過去的7、8年里,我沒有再使用EJB、OSGI、JMX、應(yīng)用服務(wù)器。在現(xiàn)代的Java世界中應(yīng)用程序被構(gòu)建成fat jars,而框架則負(fù)責(zé)做AOP、ByteWeaving、動態(tài)代理等。除非你還在開發(fā)傳統(tǒng)的應(yīng)用程序,否則我認(rèn)為你不會用現(xiàn)代Java技術(shù)棧來處理這些問題。
4、庫作者處理的問題越來越復(fù)雜
與典型的商業(yè)應(yīng)用開發(fā)者相比,高級用戶、庫作者要處理的復(fù)雜性達(dá)到了全新的高度。一些高級用戶提到關(guān)于Java的挑戰(zhàn)是:類的加載、類型擦除、功能性接口的異常語義、反射、原理、空值、默認(rèn)可變性、多線程、通用平等。
因為沒有建立過任何復(fù)雜的庫,所以沒有太多的話語權(quán)。除此以外還有一些問題:微服務(wù)的高內(nèi)存占用率、Streaming arch分層在一個老化的生態(tài)系統(tǒng)上,其后果不甚明了。
5、太多的抽象性
雖然現(xiàn)代框架使專業(yè)開發(fā)者很容易構(gòu)建應(yīng)用程序,但對于新手來說卻變得很困難。大多數(shù)的框架都是非常抽象的。當(dāng)他們試圖多了解一些東西的時候,就像剝洋蔥一樣,發(fā)現(xiàn)需要了解的東西無窮無盡。
6、非本地的FP支持
雖然從Java 8開始,Java增加了一些函數(shù)式編程支持,但Java絕對不是作為函數(shù)式編程語言設(shè)計的核心。有些人提到他們可以用FP構(gòu)建軟件,比用OOP好用得多。你也可以在Java中應(yīng)用一些FP的概念,如純函數(shù)、不變性,但不會像Clojure或Haskell等FP語言那樣自然。
7、其他原因
使用舊版應(yīng)用程序的幾率更高;糟糕的面試經(jīng)歷。
8、x語言很復(fù)雜不可信
之所以問 "為什么你認(rèn)為Java很復(fù)雜?"是為了了解別人的觀點。雖然我不同意一些觀點,而且有些事情對我來說不是什么大問題,但這有助于我理解其他人的想法。
任何語言、框架和庫都是為了解決一個主要問題而創(chuàng)建的,在這個過程中,它可能也會有一些非主要的功能。Java被設(shè)計成面向?qū)ο蟮恼Z言,如果你想讓它成為一種功能編程語言,它就沒有Clojure或Haskell那么好。每種編程語言都有它的利基領(lǐng)域,比如Python用于機(jī)器學(xué)習(xí),Go和Rust用于系統(tǒng)編程,Java和Node.js用于企業(yè)應(yīng)用開發(fā)等等。
Java的優(yōu)勢在于建立大型企業(yè)應(yīng)用程序,而不是在控制臺中打印 "Hello World"!!!。Java生態(tài)系統(tǒng)的發(fā)展是為了滿足企業(yè)的需求,并提高開發(fā)人員的生產(chǎn)力。在一個典型的企業(yè)商業(yè)應(yīng)用中,你需要通過與其他幾個外部系統(tǒng)的集成來構(gòu)建復(fù)雜的業(yè)務(wù)流程,以及與關(guān)系型數(shù)據(jù)庫、NoSQL數(shù)據(jù)庫、消息傳遞系統(tǒng)、緩存提供商、云服務(wù)等進(jìn)行交互。