【CSDN 本文作者Siva从事开发工作已经有15年了,他担任过架构师、技术负责人以及高级开发工程师,Java这是他主要使用的语言。但他很好奇为什么这么多人不喜欢它。Java,他收集了不同人的观点,整理出来了解大家讨厌。Java的理由吧。
原文地址:https://www.sivalabs.in/2022/04/my-attempt-to-understand-why-people-perceive-java-as-complex/
本文由CSDN翻译、转载应注明来源。
译者 | 章雨铭 责编 | 屠敏 出品 | CSDN(ID:CSDNnews)
以下是译文:
在我的职业生涯中,我担任过架构师、技术负责人和高级开发工程师,Java这是我主要使用的编程语言。近年来,我有时会使用它Go、Node.js和.Net技术。我发现了Java,尤其是SpringBoot,是建立企业级应用最常用的平台。
在一些关于编程语言选择的讨论中,我注意到有些人不喜欢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下载地址: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技术专家而言,他们会采取非常简单的方法,譬如使用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、Dyamic 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用于企业应用开发等等。
在一个典型的企业商业应用中,你需要通过与其他几个外部系统的集成来构建复杂的业务流程,以及与关系型数据库、NoSQL数据库、消息传递系统、缓存提供商、云服务等进行交互。
是的,你需要学习和了解大量的东西,才能有效利用这种快速应用开发平台。这是为了实现这种生产力可能需要付出的代价。
不要因为互联网上有 "语言X很复杂 "的调侃就简单地抛弃任何编程语言或者平台。不要因为听信别人根据他们2004年的经验说 "X语言很复杂 ",就一直重复这个说法。**自己试试吧,你可能喜欢,也可能不喜欢。**值得一看的是,这些旧的东西是否仍然糟糕,又或者经过这些年,它们已经有了很大的改进。