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