0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

為什么開(kāi)發(fā)人員認(rèn)為Java很復(fù)雜

程序人生 ? 來(lái)源:CSDN技術(shù)社區(qū) ? 作者:章雨銘 ? 2022-04-12 18:10 ? 次閱讀

以下為譯文:

我擔(dān)任過(guò)架構(gòu)師、技術(shù)負(fù)責(zé)人以及高級(jí)開(kāi)發(fā)工程師,在我的職業(yè)生涯中,Java是我主要使用的編程語(yǔ)言。近年來(lái),我也有時(shí)會(huì)使用Go、Node.js和.Net技術(shù)。我發(fā)現(xiàn)Java,尤其是SpringBoot,是建立企業(yè)級(jí)應(yīng)用最常用的平臺(tái)。

在一些有關(guān)編程語(yǔ)言選擇的討論中,我注意到有些人不喜歡Java。在一些社交媒體上,我看到很多對(duì)于Java復(fù)雜性的調(diào)侃。雖然我很享受其中的幽默感,但是這么多人都認(rèn)為Java很復(fù)雜,我很好奇其中的原因。這也導(dǎo)致一些剛剛開(kāi)始工作,甚至根本沒(méi)有接觸過(guò)Java的人也強(qiáng)烈抵觸Java,認(rèn)為Java很復(fù)雜。

如果一些有經(jīng)驗(yàn)的開(kāi)發(fā)人員認(rèn)為Java很復(fù)雜,那么他們大概率是在2004受到過(guò)Java的“傷害”,反而也能夠理解他們了。當(dāng)時(shí)很多人在使用JSF 1.x(JavaServer Faces)時(shí)肯定都發(fā)過(guò)誓,說(shuō)有生之年再也不碰JSF項(xiàng)目。即使JSF 2已經(jīng)改進(jìn)了許多,仍然有一些人不愿意再次嘗試JSF。我想Java對(duì)于一些人來(lái)說(shuō)也是這樣。

所以,不能夠排除有的人因?yàn)檫^(guò)去糟糕的經(jīng)歷,而認(rèn)為Java很復(fù)雜。也許有的問(wèn)題,我們并沒(méi)有重視,因?yàn)槲覀円呀?jīng)習(xí)慣了,所以不再把它們看作是問(wèn)題,但對(duì)有些人而言,并非如此。另外,可能有更好的編程語(yǔ)言或者平臺(tái),但我們沒(méi)有意識(shí)到,這也導(dǎo)致了每個(gè)人對(duì)于Java的看法不一。當(dāng)然,業(yè)界不同的意見(jiàn)很重要的,適當(dāng)?shù)芈?tīng)取一些別人的意見(jiàn),也便于我們?cè)谙乱粋€(gè)項(xiàng)目中選擇合適的技術(shù)棧且做出更好的決定。

基于這一點(diǎn),我在Twitter上提出了這個(gè)問(wèn)題:

看到這么多人認(rèn)為Java比其他語(yǔ)言復(fù)雜,我感到很驚訝。因?yàn)槲抑饕褂肑ava工作,近年來(lái)我也使用過(guò)Go和Node.js,我認(rèn)為Java沒(méi)那么復(fù)雜,而且更具有生產(chǎn)力。

有什么具體的觀點(diǎn)可以說(shuō)明為什么你認(rèn)為Java很復(fù)雜嗎?

- Siva (@sivalabs) 2022年4月1日

很多人都給予了我回復(fù),包括一些新手、專家和一些行業(yè)傳奇人物。

有趣的是,在對(duì)Java提出批評(píng)的同時(shí),也有很多人對(duì)Java平臺(tái)表示贊賞。

我把這些評(píng)論歸類,并加上了我自己的看法。

Java糟糕的入門體驗(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ù)等等。

但是對(duì)于剛開(kāi)始接觸Java的新手而言,他們更多的是這樣來(lái)入門的:

我想安裝Java,谷歌搜索讓我訪問(wèn)Java的下載地址:https://www.oracle.com/java/technologies/downloads/

我不確定Oracle JDK是免費(fèi)使用的還是需要付費(fèi)的商業(yè)版本,就自身而言,我想使用免費(fèi)并且開(kāi)源的版本。

經(jīng)過(guò)進(jìn)一步搜索,我了解到Oracle JDK有一些免費(fèi)的替代品,如OpenJDK、AdoptOpenJDK、Amazon Correto、Microsoft OpenJDK、Zulu、Temurin。但我不知道它們之間有什么區(qū)別,于是我隨便選擇了一個(gè)(OpenJDK)。

安裝了OpenJDK,設(shè)置了JAVA_HOME,并將JAVA_HOME/bin添加到PATH中,我就可以開(kāi)始使用了。

打開(kāi)VS代碼,創(chuàng)建了一個(gè).java文件,復(fù)制粘貼HelloWorld程序,然后做了javac HelloWorld.java nad java HelloWorld

準(zhǔn)備寫一個(gè)測(cè)試。谷歌建議我使用JUnit。

如何使用JUnit庫(kù)?再次在谷歌上搜索,大多數(shù)文章都顯示將JUnit與Maven或Gradle一起使用。

什么是Maven/Gradle?好吧,它們是構(gòu)建工具。于是我又安裝了Maven/Gradle,搞定...

如何創(chuàng)建一個(gè)Maven/Gradle項(xiàng)目?大多數(shù)教程都展示了使用Eclipse或IntelliJ IDEA創(chuàng)建項(xiàng)目。所以現(xiàn)在我需要安裝一個(gè)IDE。

從IDE創(chuàng)建Maven/Gradle項(xiàng)目后,我發(fā)現(xiàn)為了構(gòu)建HelloWorld項(xiàng)目,我已經(jīng)使用了一半的流量......好吧,沒(méi)關(guān)系,我的流量充足。

雖然這個(gè)過(guò)程看起來(lái)沒(méi)那么容易,但是也沒(méi)那么可怕。而且,很多任務(wù)都是一次性設(shè)置的。但是,無(wú)形之中也給入門級(jí)小白一種印象:Java需要復(fù)雜的設(shè)置,沒(méi)有繁瑣的IDE設(shè)置就無(wú)法使用Java。

而JavaScript或者Node.js開(kāi)發(fā)者的 "入門經(jīng)驗(yàn) "是這樣的:

根據(jù)你的操作系統(tǒng)安裝Node.js

進(jìn)行構(gòu)建

$ npm init --yes$ npm install express$ npm start$ npm test$ npm build

Node.js有一個(gè)內(nèi)置的默認(rèn)打包管理器npm,這是一種管理第三方依賴關(guān)系的方法。如果對(duì)npm不滿意,我可以使用yarn或pnpm,但我有工具鏈來(lái)執(zhí)行開(kāi)箱即用的普通任務(wù)。

與Java相比,這確實(shí)很容易上手。

Java專家是怎么做的?

對(duì)于Java技術(shù)專家而言,他們會(huì)采取非常簡(jiǎn)單的方法,譬如使用SDKMAN。

$ curl -s "https://get.sdkman.io" | bash$ 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$ mvn archetype:generate -DgroupId=com.mycompany -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false <- for creating maven project

	

SDKMAN還支持安裝其他各種工具,如Maven、Gradle、JBang等。如果你想以學(xué)習(xí)為目的使用Java,我建議你使用JBang。

雖然大多數(shù)的Java開(kāi)發(fā)者都使用功能全面且強(qiáng)大的IDE,如Intellij IDEA、Eclipse或NetBeans,但你也可以用VS Code來(lái)開(kāi)發(fā)Java程序。

核心標(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)置的(類似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ù)。

在我看來(lái),添加第三方庫(kù)并不是一個(gè)大問(wèn)題。

挑戰(zhàn)在于,當(dāng)有太多的選擇時(shí),新手們會(huì)感到困惑,不知道該選哪一個(gè)。

最啰嗦的語(yǔ)言Java

Java是最啰嗦的語(yǔ)言,這是對(duì)Java最常見(jiàn)的評(píng)論。

(這只是表明你還沒(méi)有使用過(guò)Go語(yǔ)言)

我的觀點(diǎn)

人們討厭setters、getters等,但我不認(rèn)為這有什么不好。因?yàn)榭梢杂肔ombok和Records來(lái)避免編寫模板。通過(guò)使用正確的庫(kù),可以編寫出不那么冗長(zhǎng)的Java代碼。

事實(shí)上,我認(rèn)為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。

復(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í),也有處理類加載器問(wèn)題的經(jīng)驗(yàn)。

幸運(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)題。

庫(kù)作者處理的問(wèn)題越來(lái)越復(fù)雜

與典型的商業(yè)應(yīng)用開(kāi)發(fā)者相比,高級(jí)用戶、庫(kù)作者要處理的復(fù)雜性達(dá)到了全新的高度。

一些高級(jí)用戶提到關(guān)于Java的挑戰(zhàn)是:

類的加載

類型擦除

功能性接口的異常語(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)上,其后果不甚明了

太多的抽象性

雖然現(xiàn)代框架使專業(yè)開(kāi)發(fā)者很容易構(gòu)建應(yīng)用程序,但對(duì)于新手來(lái)說(shuō)卻變得很困難。大多數(shù)的框架都是非常抽象的。當(dāng)他們?cè)噲D多了解一些東西的時(shí)候,就像剝洋蔥一樣,發(fā)現(xiàn)需要了解的東西無(wú)窮無(wú)盡。

非本地的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ǔ)言那樣自然。

其他原因

使用舊版應(yīng)用程序的幾率更高

糟糕的面試經(jīng)歷

“x語(yǔ)言很復(fù)雜”不可信

我之所以問(wèn) "為什么你認(rèn)為Java很復(fù)雜?"是為了了解別人的觀點(diǎn)。雖然我不同意一些觀點(diǎn),而且有些事情對(duì)我來(lái)說(shuō)不是什么大問(wèn)題,但這有助于我理解其他人的想法。

在我看來(lái),任何語(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)行交互。

是的,你需要學(xué)習(xí)和了解大量的東西,才能有效利用這種快速應(yīng)用開(kāi)發(fā)平臺(tái)。這是為了實(shí)現(xiàn)這種生產(chǎn)力可能需要付出的代價(jià)。

不要因?yàn)榛ヂ?lián)網(wǎng)上有 "語(yǔ)言X很復(fù)雜 "的調(diào)侃就簡(jiǎn)單地拋棄任何編程語(yǔ)言或者平臺(tái)。不要因?yàn)槁?tīng)信別人根據(jù)他們2004年的經(jīng)驗(yàn)說(shuō) "X語(yǔ)言很復(fù)雜 ",就一直重復(fù)這個(gè)說(shuō)法。自己試試吧,你可能喜歡,也可能不喜歡。值得一看的是,這些舊的東西是否仍然糟糕,又或者經(jīng)過(guò)這些年,它們已經(jīng)有了很大的改進(jìn)。

原文標(biāo)題:那些被 Java 復(fù)雜性嚇退的開(kāi)發(fā)者們

文章出處:【微信公眾號(hào):程序人生】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:湯梓紅


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2946

    瀏覽量

    104362
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3541

    瀏覽量

    93462
  • 開(kāi)發(fā)人員
    +關(guān)注

    關(guān)注

    0

    文章

    19

    瀏覽量

    6559

原文標(biāo)題:那些被 Java 復(fù)雜性嚇退的開(kāi)發(fā)者們

文章出處:【微信號(hào):coder_life,微信公眾號(hào):程序人生】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Java開(kāi)發(fā)人員必須重視HTML5的5點(diǎn)理由

    ` 本帖最后由 海同iotek 于 2014-12-2 14:53 編輯 過(guò)去,Java 開(kāi)發(fā)人員都是依賴 Web 瀏覽器作為應(yīng)用程序的前端。但過(guò)程往往令人沮喪:HTML 笨拙
    發(fā)表于 12-02 14:42

    RemoTI基本遠(yuǎn)程開(kāi)發(fā)人員指南

    `RemoTI基本遠(yuǎn)程開(kāi)發(fā)人員指南目錄`
    發(fā)表于 03-16 16:28

    嵌入式開(kāi)發(fā)人員需要重點(diǎn)監(jiān)控的五個(gè)重要特征

    特征密切相關(guān)。無(wú)論一個(gè)嵌入式系統(tǒng)多簡(jiǎn)單或多復(fù)雜,有5個(gè)關(guān)鍵特征是需要開(kāi)發(fā)人員特別留意的。有一些特征顯而易見(jiàn),如RAM和ROM的使用情況;還有一些特征容易被開(kāi)發(fā)人員忽視,如系統(tǒng)時(shí)序和執(zhí)
    發(fā)表于 03-02 13:23

    java開(kāi)發(fā)人員不了解jvm調(diào)優(yōu)對(duì)工作有影響嗎

    作為一名java開(kāi)發(fā)人員,不了解jvm調(diào)優(yōu)對(duì)工作有什么影響?
    發(fā)表于 04-10 11:57

    用于物聯(lián)網(wǎng)開(kāi)發(fā)java

    具有巨大的互操作性,因此自然而然地,它是復(fù)雜物聯(lián)網(wǎng)項(xiàng)目的優(yōu)秀選擇。物聯(lián)網(wǎng)程序員傾向于Java,因?yàn)樗亩喙δ苄院挽`活性。開(kāi)發(fā)人員認(rèn)為它是物聯(lián)網(wǎng)的理想選擇,因?yàn)樗淮尉帉懢涂梢栽谌魏蔚胤?/div>
    發(fā)表于 12-24 14:12

    開(kāi)發(fā)人員看的視頻

    英特爾?軟件頻道旨在通過(guò)向開(kāi)發(fā)人員提供示例,教程,提示,技巧以及如何將開(kāi)發(fā)人員與影響者,創(chuàng)新者聯(lián)系起來(lái),幫助他們。
    的頭像 發(fā)表于 11-01 06:26 ?2342次閱讀

    什么是英特爾開(kāi)發(fā)人員專區(qū)

    什么是英特爾?開(kāi)發(fā)人員專區(qū)? 觀看此視頻,了解正在使用工具和資源滿足編碼需求的軟件開(kāi)發(fā)人員
    的頭像 發(fā)表于 11-12 06:55 ?2428次閱讀

    WebVR:開(kāi)發(fā)人員使用的資源介紹

    這是WebVR系列的最后一集。 在這里,我們將向您介紹一些可供開(kāi)發(fā)人員和愛(ài)好者使用的資源。
    的頭像 發(fā)表于 11-12 06:05 ?1854次閱讀

    英特爾開(kāi)發(fā)人員專區(qū):Android開(kāi)發(fā)

    Android *英特爾?開(kāi)發(fā)人員專區(qū)
    的頭像 發(fā)表于 05-31 09:37 ?2856次閱讀

    Intel開(kāi)發(fā)人員專區(qū)

    Intel?開(kāi)發(fā)人員專區(qū)
    的頭像 發(fā)表于 05-31 09:24 ?1550次閱讀

    開(kāi)發(fā)人員的應(yīng)用程序和網(wǎng)絡(luò)安全

    ,揭示了網(wǎng)絡(luò)安全問(wèn)題與涉及應(yīng)用程序的網(wǎng)絡(luò)安全支持之間的差距。報(bào)告發(fā)現(xiàn),大多數(shù)開(kāi)發(fā)人員(85%)認(rèn)為安全性對(duì)于編碼和開(kāi)發(fā)過(guò)程非常重要,而75%的開(kāi)發(fā)人員則表示他們對(duì)這些應(yīng)用程序的安全性感
    的頭像 發(fā)表于 11-22 11:01 ?3213次閱讀

    為什么開(kāi)發(fā)人員和設(shè)計(jì)師需要?jiǎng)赢?huà)原型

      使用動(dòng)畫(huà)原型是設(shè)計(jì)人員開(kāi)發(fā)人員改進(jìn)應(yīng)用程序和界面創(chuàng)建過(guò)程的一種極其有效的方法——一種簡(jiǎn)化復(fù)雜操作的有價(jià)值的方法。
    的頭像 發(fā)表于 07-04 09:12 ?1089次閱讀

    IoT 開(kāi)發(fā)人員必須考慮設(shè)計(jì)和安全性

    IoT 開(kāi)發(fā)人員必須考慮設(shè)計(jì)和安全性
    的頭像 發(fā)表于 01-03 09:45 ?471次閱讀

    IzoT BACnet 開(kāi)發(fā)人員指南

    IzoT BACnet 開(kāi)發(fā)人員指南
    發(fā)表于 03-13 19:31 ?1次下載
    IzoT BACnet <b class='flag-5'>開(kāi)發(fā)人員</b>指南

    IzoT BACnet 開(kāi)發(fā)人員指南

    IzoT BACnet 開(kāi)發(fā)人員指南
    發(fā)表于 07-04 20:48 ?0次下載
    IzoT BACnet <b class='flag-5'>開(kāi)發(fā)人員</b>指南