0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为什么开发人员认为Java很复杂

程序人生 来源:CSDN技术社区 作者:章雨铭 2022-04-12 18:10 次阅读

以下为译文:

我担任过架构师、技术负责人以及高级开发工程师,在我的职业生涯中,Java是我主要使用的编程语言。近年来,我也有时会使用Go、Node.js和.Net技术。我发现Java,尤其是SpringBoot,是建立企业级应用最常用的平台。

在一些有关编程语言选择的讨论中,我注意到有些人不喜欢Java。在一些社交媒体上,我看到很多对于Java复杂性的调侃。虽然我很享受其中的幽默感,但是这么多人都认为Java很复杂,我很好奇其中的原因。这也导致一些刚刚开始工作,甚至根本没有接触过Java的人也强烈抵触Java,认为Java很复杂。

如果一些有经验的开发人员认为Java很复杂,那么他们大概率是在2004受到过Java的“伤害”,反而也能够理解他们了。当时很多人在使用JSF 1.x(JavaServer Faces)时肯定都发过誓,说有生之年再也不碰JSF项目。即使JSF 2已经改进了许多,仍然有一些人不愿意再次尝试JSF。我想Java对于一些人来说也是这样。

所以,不能够排除有的人因为过去糟糕的经历,而认为Java很复杂。也许有的问题,我们并没有重视,因为我们已经习惯了,所以不再把它们看作是问题,但对有些人而言,并非如此。另外,可能有更好的编程语言或者平台,但我们没有意识到,这也导致了每个人对于Java的看法不一。当然,业界不同的意见很重要的,适当地听取一些别人的意见,也便于我们在下一个项目中选择合适的技术栈且做出更好的决定。

基于这一点,我在Twitter上提出了这个问题:

看到这么多人认为Java比其他语言复杂,我感到很惊讶。因为我主要使用Java工作,近年来我也使用过Go和Node.js,我认为Java没那么复杂,而且更具有生产力。

有什么具体的观点可以说明为什么你认为Java很复杂吗?

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

很多人都给予了我回复,包括一些新手、专家和一些行业传奇人物。

有趣的是,在对Java提出批评的同时,也有很多人对Java平台表示赞赏。

我把这些评论归类,并加上了我自己的看法。

Java糟糕的入门体验

作为一个拥有超过15年Java开发经验的开发者,我对Java生态系统了如指掌。所以我知道我可以安装哪种JDK、如何去管理多个JDK版本、有哪些IDE、构建工具、常用库等等。

但是对于刚开始接触Java的新手而言,他们更多的是这样来入门的:

我想安装Java,谷歌搜索让我访问Java的下载地址:https://www.oracle.com/java/technologies/downloads/

我不确定Oracle JDK是免费使用的还是需要付费的商业版本,就自身而言,我想使用免费并且开源的版本。

经过进一步搜索,我了解到Oracle JDK有一些免费的替代品,如OpenJDK、AdoptOpenJDK、Amazon Correto、Microsoft OpenJDK、Zulu、Temurin。但我不知道它们之间有什么区别,于是我随便选择了一个(OpenJDK)。

安装了OpenJDK,设置了JAVA_HOME,并将JAVA_HOME/bin添加到PATH中,我就可以开始使用了。

打开VS代码,创建了一个.java文件,复制粘贴HelloWorld程序,然后做了javac HelloWorld.java nad java HelloWorld

准备写一个测试。谷歌建议我使用JUnit。

如何使用JUnit库?再次在谷歌上搜索,大多数文章都显示将JUnit与Maven或Gradle一起使用。

什么是Maven/Gradle?好吧,它们是构建工具。于是我又安装了Maven/Gradle,搞定...

如何创建一个Maven/Gradle项目?大多数教程都展示了使用Eclipse或IntelliJ IDEA创建项目。所以现在我需要安装一个IDE。

从IDE创建Maven/Gradle项目后,我发现为了构建HelloWorld项目,我已经使用了一半的流量......好吧,没关系,我的流量充足。

虽然这个过程看起来没那么容易,但是也没那么可怕。而且,很多任务都是一次性设置的。但是,无形之中也给入门级小白一种印象:Java需要复杂的设置,没有繁琐的IDE设置就无法使用Java。

而JavaScript或者Node.js开发者的 "入门经验 "是这样的:

根据你的操作系统安装Node.js

进行构建

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

Node.js有一个内置的默认打包管理器npm,这是一种管理第三方依赖关系的方法。如果对npm不满意,我可以使用yarn或pnpm,但我有工具链来执行开箱即用的普通任务。

与Java相比,这确实很容易上手。

Java专家是怎么做的?

对于Java技术专家而言,他们会采取非常简单的方法,譬如使用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等。如果你想以学习为目的使用Java,我建议你使用JBang。

虽然大多数的Java开发者都使用功能全面且强大的IDE,如Intellij IDEA、Eclipse或NetBeans,但你也可以用VS Code来开发Java程序。

核心标准库不够用

通过调研,我们还发现了以下一些问题:

一个常见的问题是Java的核心标准库不够用,许多任务需要一些外部库,这也是事实。

没有内置的测试库、JSON(取消)编组支持,等等。

虽然Java NIO是一个很大的进步,但与其他语言相比,Java中的文件I/O仍然是复杂而冗长的。

没有内置的(类似Kotlin)对不可变数据结构的支持。

我的观点

Java有很好的标准库,如Collections、Streams、Java NIO等。

使用文件I/O、JDBC等仍然感觉非常低级和冗长。

有很好的第三方库,如commons-lang、commons-io、Jackson、Gson、Vavr、Eclipse Collections来执行这些任务。

在我看来,添加第三方库并不是一个大问题。

挑战在于,当有太多的选择时,新手们会感到困惑,不知道该选哪一个。

最啰嗦的语言Java

Java是最啰嗦的语言,这是对Java最常见的评论。

(这只是表明你还没有使用过Go语言)

我的观点

人们讨厌setters、getters等,但我不认为这有什么不好。因为可以用Lombok和Records来避免编写模板。通过使用正确的库,可以编写出不那么冗长的Java代码。

事实上,我认为Java在冗长和简洁之间取得了适当的平衡。通常,基于Java的企业应用程序会被维护很多年,而被认为冗长的东西实际上会帮助人们理解它。

其中一个回答说明了一切。

任何时候,我都会选择传统的Java而不是传统的Node.js。

复杂的 "企业级"产品

另一个常见的话题是关于复杂的企业级产品,如ClassLoaders、JNDI、OSGI、JMX、Reflection、AOP、ByteWeaving、Dynamic Proxies、应用服务器等。

我的观点

十年前,我在EJB 2中使用EAR打包,我知道处理ClassLoader的问题是多么令人沮丧。另外,

我在JBoss/WildFly等应用服务器中部署Spring应用时,也有处理类加载器问题的经验。

幸运的是,在过去的7、8年里,我没有再使用EJB、OSGI、JMX、应用服务器。在现代的Java世界中,应用程序被构建成fat jars,而框架则负责做AOP、ByteWeaving、动态代理等。

除非你还在开发传统的应用程序,否则我认为你不会用现代Java技术栈来处理这些问题。

库作者处理的问题越来越复杂

与典型的商业应用开发者相比,高级用户、库作者要处理的复杂性达到了全新的高度。

一些高级用户提到关于Java的挑战是:

类的加载

类型擦除

功能性接口的异常语义

反射

原理

空值

默认可变性

多线程

通用平等

因为我没有建立过任何复杂的库,所以我没有太多的话语权。

除此以外,还有一些问题。

微服务的高内存占用率

Streaming arch分层在一个老化的生态系统上,其后果不甚明了

太多的抽象性

虽然现代框架使专业开发者很容易构建应用程序,但对于新手来说却变得很困难。大多数的框架都是非常抽象的。当他们试图多了解一些东西的时候,就像剥洋葱一样,发现需要了解的东西无穷无尽。

非本地的FP支持

虽然从Java 8开始,Java增加了一些函数式编程支持,但Java绝对不是作为函数式编程语言设计的核心。有些人提到他们可以用FP构建软件,比用OOP好用得多。你也可以在Java中应用一些FP的概念,如纯函数、不变性,但不会像Clojure或Haskell等FP语言那样自然。

其他原因

使用旧版应用程序的几率更高

糟糕的面试经历

“x语言很复杂”不可信

我之所以问 "为什么你认为Java很复杂?"是为了了解别人的观点。虽然我不同意一些观点,而且有些事情对我来说不是什么大问题,但这有助于我理解其他人的想法。

在我看来,任何语言、框架和库都是为了解决一个主要问题而创建的,在这个过程中,它可能也会有一些非主要的功能。Java被设计成面向对象的语言,如果你想让它成为一种功能编程语言,它就没有Clojure或Haskell那么好。每种编程语言都有它的利基领域,比如Python用于机器学习,Go和Rust用于系统编程,Java和Node.js用于企业应用开发等等。

Java的优势在于建立大型企业应用程序,而不是在控制台中打印 "Hello World"!!!。Java生态系统的发展是为了满足企业的需求,并提高开发人员的生产力。

在一个典型的企业商业应用中,你需要通过与其他几个外部系统的集成来构建复杂的业务流程,以及与关系型数据库、NoSQL数据库、消息传递系统、缓存提供商、云服务等进行交互。

是的,你需要学习和了解大量的东西,才能有效利用这种快速应用开发平台。这是为了实现这种生产力可能需要付出的代价。

不要因为互联网上有 "语言X很复杂 "的调侃就简单地抛弃任何编程语言或者平台。不要因为听信别人根据他们2004年的经验说 "X语言很复杂 ",就一直重复这个说法。自己试试吧,你可能喜欢,也可能不喜欢。值得一看的是,这些旧的东西是否仍然糟糕,又或者经过这些年,它们已经有了很大的改进。

原文标题:那些被 Java 复杂性吓退的开发者们

文章出处:【微信公众号:程序人生】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2954

    浏览量

    104510
  • 编程
    +关注

    关注

    88

    文章

    3578

    浏览量

    93551
  • 开发人员
    +关注

    关注

    0

    文章

    19

    浏览量

    6578

原文标题:那些被 Java 复杂性吓退的开发者们

文章出处:【微信号:coder_life,微信公众号:程序人生】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Java开发人员必须重视HTML5的5点理由

    ` 本帖最后由 海同iotek 于 2014-12-2 14:53 编辑 过去,Java 开发人员都是依赖 Web 浏览器作为应用程序的前端。但过程往往令人沮丧:HTML 笨拙
    发表于 12-02 14:42

    RemoTI基本远程开发人员指南

    `RemoTI基本远程开发人员指南目录`
    发表于 03-16 16:28

    嵌入式开发人员需要重点监控的五个重要特征

    特征密切相关。无论一个嵌入式系统多简单或多复杂,有5个关键特征是需要开发人员特别留意的。有一些特征显而易见,如RAM和ROM的使用情况;还有一些特征容易被开发人员忽视,如系统时序和执
    发表于 03-02 13:23

    java开发人员不了解jvm调优对工作有影响吗

    作为一名java开发人员,不了解jvm调优对工作有什么影响?
    发表于 04-10 11:57

    用于物联网开发java

    具有巨大的互操作性,因此自然而然地,它是复杂物联网项目的优秀选择。物联网程序员倾向于Java,因为它的多功能性和灵活性。开发人员认为它是物联网的理想选择,因为它一次编写就可以在任何地方
    发表于 12-24 14:12

    开发人员看的视频

    英特尔®软件频道旨在通过向开发人员提供示例,教程,提示,技巧以及如何将开发人员与影响者,创新者联系起来,帮助他们。
    的头像 发表于 11-01 06:26 2365次阅读

    什么是英特尔开发人员专区

    什么是英特尔®开发人员专区? 观看此视频,了解正在使用工具和资源满足编码需求的软件开发人员
    的头像 发表于 11-12 06:55 2453次阅读

    WebVR:开发人员使用的资源介绍

    这是WebVR系列的最后一集。 在这里,我们将向您介绍一些可供开发人员和爱好者使用的资源。
    的头像 发表于 11-12 06:05 1880次阅读

    英特尔开发人员专区:Android开发

    Android *英特尔®开发人员专区
    的头像 发表于 05-31 09:37 2876次阅读

    Intel开发人员专区

    Intel®开发人员专区
    的头像 发表于 05-31 09:24 1580次阅读

    开发人员的应用程序和网络安全

    ,揭示了网络安全问题与涉及应用程序的网络安全支持之间的差距。报告发现,大多数开发人员(85%)认为安全性对于编码和开发过程非常重要,而75%的开发人员则表示他们对这些应用程序的安全性感
    的头像 发表于 11-22 11:01 3246次阅读

    为什么开发人员和设计师需要动画原型

      使用动画原型是设计人员开发人员改进应用程序和界面创建过程的一种极其有效的方法——一种简化复杂操作的有价值的方法。
    的头像 发表于 07-04 09:12 1114次阅读

    IoT 开发人员必须考虑设计和安全性

    IoT 开发人员必须考虑设计和安全性
    的头像 发表于 01-03 09:45 497次阅读

    IzoT BACnet 开发人员指南

    IzoT BACnet 开发人员指南
    发表于 03-13 19:31 1次下载
    IzoT BACnet <b class='flag-5'>开发人员</b>指南

    IzoT BACnet 开发人员指南

    IzoT BACnet 开发人员指南
    发表于 07-04 20:48 0次下载
    IzoT BACnet <b class='flag-5'>开发人员</b>指南