我担任过架构师、技术负责人以及高级开发工程师,在我的职业生涯中,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
进行构建
Node.js有一个内置的默认打包管理器npm,这是一种管理第三方依赖关系的方法。如果对npm不满意,我可以使用yarn或pnpm,但我有工具链来执行开箱即用的普通任务。
与Java相比,这确实很容易上手。
Java专家是怎么做的?
对于Java技术专家而言,他们会采取非常简单的方法,譬如使用SDKMAN。
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语言很复杂 ",就一直重复这个说法。自己试试吧,你可能喜欢,也可能不喜欢。值得一看的是,这些旧的东西是否仍然糟糕,又或者经过这些年,它们已经有了很大的改进。
END
WWDC21 以去年线上会议形式创纪录的参与度与成功的经验为基础,为开发者提供一个了解新技术、工具和框架的机会,他们可以据此打造更多具有平台差异的创新 app 和游戏。
39 年前,Charles Geschke 博士与其同事 John Warnock 联手创立软件公司 Adobe,该公司先后带来了引领桌面出版革命的 PostScript、图像处理软件 Adobe Photoshop
而最近消息却表示 Windows 10X 已经被取消了,但有些UI设计将延续到普通版本 Windows 10 上面。
当这些更新发布时,开发者需要获得明确的许可,才能访问设备上的 IDFA 或广告标识符,以跟踪应用程序和网站上的用户,来实现广告定向目的。
js 的作者 Marak 近日故意破坏了 GitHub 上的这个开源库,已经将项目所有代码清空,并在 commit 中留下“endgame”字样,还在 README 中写道“What really happened
这里感觉有点坑,如果启动类不加@EnableScheduling 注解,项目中也可以正常配置定时任务时间表达式,但不会执行,大意的开发者可能需要花费更多的调试时间和查询资料。
1、将数据长度过大的数据类型在返回时,手动改为String类型以字符串的形式输出,这样全部被当成字符串输出自然不会被科学计数法,问题得到解决。
目前 node 相关开发,由于国外的npm服务器下载太慢了,很多开发者为了提高插件的安装速度,一般首选都会将 npm 源配置为淘宝镜像。
9 月 13 日消息,目前来看,Android 应用程序开发商想通过诉讼阻止谷歌收取 30% 佣金的做法不容乐观。因为上周五,一名美国联邦法官批准苹果应用商店向开发商收取类似费用。
这几年中国在移动互联网这块发展非常迅猛,各种创业公司、小团队如雨后春笋般冒出来,对Java开发这几年中国在移动互联网这块发展非常迅猛,各种创业公司、小团队如雨后春笋般冒出来,对Java开发的需要变大。
如今的Java项目开发,Springboot/Springcloud、Swagger已经成为了标配,下面我们来说说如何在项目中引入Swagger…… 引入Swagger只需要以下3步,即可使用Swagger
Kibana 是一个免费且开放的用户界面,能够让您对 Elasticsearch 数据进行可视化。为便于开发者下载,特提供Kibana的历史版本页面下载地址,记得收藏哦!
Java 开发中,使用 XStream 将 xml 转为 Java 实体对象时,提示异常信息: 出现如上的异常信息,是因为没有设置权限级别导致,加上权限级别控制即可解决。
已经证实由于 SerializationUtils#deserialize 基于 Java 的序列化机制,可导致远程代码执行 (RCE),使用JDK9及以上版本皆有可能受到影响。
然后,显卡不好买、挖矿性能又被NVIDIA限制,矿工们自然要想点其它办法。软件开发者Yifan Gu(顾屹凡)找到了M1 MacBook Air实现以太坊挖矿方法,并在GitHub上开源。
进入下载页面,分别有 Ultimate 和 Community 版本可供选择,Community 版本即为社区版,是不用激活可直接使用,只是相对于 Ultimate 版本,功能没有那么丰富,但可以满足日常开发需要
微信用户在关注、取消关注、点击菜单等相关操作时,如果配置了回调接口,微信会将这些事件信息回传到开发者配置指定的URL地址。
Java开发过程中,我们会有数组与集合相互转换的情况,无论是数组还是集合,对于Java编程语言而言,都是比较常见的数据类型。下面通过程序的方式直观明了的讲解数组与集合的相互转换案例。
同 Spring Cloud 一样,Spring Cloud Alibaba 也是一套微服务解决方案,包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务