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

以下为译文:
我担任过架构师、技术负责人以及高级开发工程师,在我的职业生涯中,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 复杂性吓退的开发者们
文章出处:【微信公众号:程序人生】欢迎添加关注!文章转载请注明出处。


华为耗资4亿英镑在英国建立宽带芯片研发中心
一座特殊“城市”——机器人未来城
iSuppli:HDD出货量已从泰国水灾中恢复,还可能会破纪录
SAR图像导航定位检测方案的简介
磐石测控:DAGE 4800焊接强度测试仪的数据分析?
为什么开发人员认为Java很复杂
灵活调节、应用广泛,精密测量实验理想之选BT-TOTS系列双远心光学实验台
AR说丨华为在AR圈正式出道了?
CES如今更强调的是人工智能和机器人以及虚拟现实对于现实的重新定义
中科院量子信息基础研究和集成应用处国际领跑地位
PSA和华为合作有成 推出连网车DS 7 Crossback
2017年医疗机器人市场渗透率增加,远程医疗领域进步巨大
采用FPGA器件实现数据采集系统中高速大容量存储板的设计
荣耀note10对比小米8
巨擘扎堆精品纷呈 NEPCON China 2013即将开幕
稳压器不升压怎么回事 升压器和稳压器有什么区别
ROM和RAM的主要区别是什么?它们是如何影响计算机性能的?
浅谈线路板电镀工艺的流程
新型金刚石半导体
混合示波器和普通示波器的对比