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