以下為譯文:
我擔(dān)任過架構(gòu)師、技術(shù)負(fù)責(zé)人以及高級開發(fā)工程師,在我的職業(yè)生涯中,Java是我主要使用的編程語言。近年來,我也有時會使用Go、Node.js和.Net技術(shù)。我發(fā)現(xiàn)Java,尤其是SpringBoot,是建立企業(yè)級應(yīng)用最常用的平臺。
在一些有關(guān)編程語言選擇的討論中,我注意到有些人不喜歡Java。在一些社交媒體上,我看到很多對于Java復(fù)雜性的調(diào)侃。雖然我很享受其中的幽默感,但是這么多人都認(rèn)為Java很復(fù)雜,我很好奇其中的原因。這也導(dǎo)致一些剛剛開始工作,甚至根本沒有接觸過Java的人也強烈抵觸Java,認(rèn)為Java很復(fù)雜。
如果一些有經(jīng)驗的開發(fā)人員認(rèn)為Java很復(fù)雜,那么他們大概率是在2004受到過Java的“傷害”,反而也能夠理解他們了。當(dāng)時很多人在使用JSF 1.x(JavaServer Faces)時肯定都發(fā)過誓,說有生之年再也不碰JSF項目。即使JSF 2已經(jīng)改進(jìn)了許多,仍然有一些人不愿意再次嘗試JSF。我想Java對于一些人來說也是這樣。
所以,不能夠排除有的人因為過去糟糕的經(jīng)歷,而認(rèn)為Java很復(fù)雜。也許有的問題,我們并沒有重視,因為我們已經(jīng)習(xí)慣了,所以不再把它們看作是問題,但對有些人而言,并非如此。另外,可能有更好的編程語言或者平臺,但我們沒有意識到,這也導(dǎo)致了每個人對于Java的看法不一。當(dāng)然,業(yè)界不同的意見很重要的,適當(dāng)?shù)芈犎∫恍﹦e人的意見,也便于我們在下一個項目中選擇合適的技術(shù)棧且做出更好的決定。
基于這一點,我在Twitter上提出了這個問題:
看到這么多人認(rèn)為Java比其他語言復(fù)雜,我感到很驚訝。因為我主要使用Java工作,近年來我也使用過Go和Node.js,我認(rèn)為Java沒那么復(fù)雜,而且更具有生產(chǎn)力。
有什么具體的觀點可以說明為什么你認(rèn)為Java很復(fù)雜嗎?
- Siva (@sivalabs) 2022年4月1日
很多人都給予了我回復(fù),包括一些新手、專家和一些行業(yè)傳奇人物。
有趣的是,在對Java提出批評的同時,也有很多人對Java平臺表示贊賞。
我把這些評論歸類,并加上了我自己的看法。
Java糟糕的入門體驗
作為一個擁有超過15年Java開發(fā)經(jīng)驗的開發(fā)者,我對Java生態(tài)系統(tǒng)了如指掌。所以我知道我可以安裝哪種JDK、如何去管理多個JDK版本、有哪些IDE、構(gòu)建工具、常用庫等等。
但是對于剛開始接觸Java的新手而言,他們更多的是這樣來入門的:
我想安裝Java,谷歌搜索讓我訪問Java的下載地址:https://www.oracle.com/java/technologies/downloads/
我不確定Oracle JDK是免費使用的還是需要付費的商業(yè)版本,就自身而言,我想使用免費并且開源的版本。
經(jīng)過進(jìn)一步搜索,我了解到Oracle JDK有一些免費的替代品,如OpenJDK、AdoptOpenJDK、Amazon Correto、Microsoft OpenJDK、Zulu、Temurin。但我不知道它們之間有什么區(qū)別,于是我隨便選擇了一個(OpenJDK)。
安裝了OpenJDK,設(shè)置了JAVA_HOME,并將JAVA_HOME/bin添加到PATH中,我就可以開始使用了。
打開VS代碼,創(chuàng)建了一個.java文件,復(fù)制粘貼HelloWorld程序,然后做了javac HelloWorld.java nad java HelloWorld
準(zhǔn)備寫一個測試。谷歌建議我使用JUnit。
如何使用JUnit庫?再次在谷歌上搜索,大多數(shù)文章都顯示將JUnit與Maven或Gradle一起使用。
什么是Maven/Gradle?好吧,它們是構(gòu)建工具。于是我又安裝了Maven/Gradle,搞定...
如何創(chuàng)建一個Maven/Gradle項目?大多數(shù)教程都展示了使用Eclipse或IntelliJ IDEA創(chuàng)建項目。所以現(xiàn)在我需要安裝一個IDE。
從IDE創(chuàng)建Maven/Gradle項目后,我發(fā)現(xiàn)為了構(gòu)建HelloWorld項目,我已經(jīng)使用了一半的流量......好吧,沒關(guān)系,我的流量充足。
雖然這個過程看起來沒那么容易,但是也沒那么可怕。而且,很多任務(wù)都是一次性設(shè)置的。但是,無形之中也給入門級小白一種印象:Java需要復(fù)雜的設(shè)置,沒有繁瑣的IDE設(shè)置就無法使用Java。
而JavaScript或者Node.js開發(fā)者的 "入門經(jīng)驗 "是這樣的:
根據(jù)你的操作系統(tǒng)安裝Node.js
進(jìn)行構(gòu)建
npm init --yes
npm install express
npm start
test npm
npm build
Node.js有一個內(nèi)置的默認(rèn)打包管理器npm,這是一種管理第三方依賴關(guān)系的方法。如果對npm不滿意,我可以使用yarn或pnpm,但我有工具鏈來執(zhí)行開箱即用的普通任務(wù)。
與Java相比,這確實很容易上手。
Java專家是怎么做的?
對于Java技術(shù)專家而言,他們會采取非常簡單的方法,譬如使用SDKMAN。
"https://get.sdkman.io" | bash curl -s
source "$HOME/.sdkman/bin/sdkman-init.sh"
sdk list java
sdk install java 17-open
sdk install maven
sdk install gradle
sdk install jbang
gradle init <- For gradle project
pId=com.mycompany -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false <- for creating maven project mvn archetype:generate -Dgrou
SDKMAN還支持安裝其他各種工具,如Maven、Gradle、JBang等。如果你想以學(xué)習(xí)為目的使用Java,我建議你使用JBang。
雖然大多數(shù)的Java開發(fā)者都使用功能全面且強大的IDE,如Intellij IDEA、Eclipse或NetBeans,但你也可以用VS Code來開發(fā)Java程序。
核心標(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)有太多的選擇時,新手們會感到困惑,不知道該選哪一個。
最啰嗦的語言Java
Java是最啰嗦的語言,這是對Java最常見的評論。
(這只是表明你還沒有使用過Go語言)
我的觀點
人們討厭setters、getters等,但我不認(rèn)為這有什么不好。因為可以用Lombok和Records來避免編寫模板。通過使用正確的庫,可以編寫出不那么冗長的Java代碼。
事實上,我認(rèn)為Java在冗長和簡潔之間取得了適當(dāng)?shù)钠胶?。通常,基于Java的企業(yè)應(yīng)用程序會被維護(hù)很多年,而被認(rèn)為冗長的東西實際上會幫助人們理解它。
其中一個回答說明了一切。
任何時候,我都會選擇傳統(tǒng)的Java而不是傳統(tǒng)的Node.js。
復(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ù)棧來處理這些問題。
庫作者處理的問題越來越復(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)上,其后果不甚明了
太多的抽象性
雖然現(xiàn)代框架使專業(yè)開發(fā)者很容易構(gòu)建應(yīng)用程序,但對于新手來說卻變得很困難。大多數(shù)的框架都是非常抽象的。當(dāng)他們試圖多了解一些東西的時候,就像剝洋蔥一樣,發(fā)現(xiàn)需要了解的東西無窮無盡。
非本地的FP支持
雖然從Java 8開始,Java增加了一些函數(shù)式編程支持,但Java絕對不是作為函數(shù)式編程語言設(shè)計的核心。有些人提到他們可以用FP構(gòu)建軟件,比用OOP好用得多。你也可以在Java中應(yīng)用一些FP的概念,如純函數(shù)、不變性,但不會像Clojure或Haskell等FP語言那樣自然。
其他原因
使用舊版應(yīng)用程序的幾率更高
糟糕的面試經(jīng)歷
“x語言很復(fù)雜”不可信
我之所以問 "為什么你認(rèn)為Java很復(fù)雜?"是為了了解別人的觀點。雖然我不同意一些觀點,而且有些事情對我來說不是什么大問題,但這有助于我理解其他人的想法。
在我看來,任何語言、框架和庫都是為了解決一個主要問題而創(chuàng)建的,在這個過程中,它可能也會有一些非主要的功能。Java被設(shè)計成面向?qū)ο蟮恼Z言,如果你想讓它成為一種功能編程語言,它就沒有Clojure或Haskell那么好。每種編程語言都有它的利基領(lǐng)域,比如Python用于機器學(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)行交互。
是的,你需要學(xué)習(xí)和了解大量的東西,才能有效利用這種快速應(yīng)用開發(fā)平臺。這是為了實現(xiàn)這種生產(chǎn)力可能需要付出的代價。
不要因為互聯(lián)網(wǎng)上有 "語言X很復(fù)雜 "的調(diào)侃就簡單地拋棄任何編程語言或者平臺。不要因為聽信別人根據(jù)他們2004年的經(jīng)驗說 "X語言很復(fù)雜 ",就一直重復(fù)這個說法。自己試試吧,你可能喜歡,也可能不喜歡。值得一看的是,這些舊的東西是否仍然糟糕,又或者經(jīng)過這些年,它們已經(jīng)有了很大的改進(jìn)。
原文標(biāo)題:那些被 Java 復(fù)雜性嚇退的開發(fā)者們
文章出處:【微信公眾號:程序人生】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
審核編輯:湯梓紅
-
JAVA
+關(guān)注
關(guān)注
19文章
2967瀏覽量
104750 -
編程
+關(guān)注
關(guān)注
88文章
3616瀏覽量
93733 -
開發(fā)人員
+關(guān)注
關(guān)注
0文章
19瀏覽量
6595
原文標(biāo)題:那些被 Java 復(fù)雜性嚇退的開發(fā)者們
文章出處:【微信號:coder_life,微信公眾號:程序人生】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論