无论你看的是哪家排名,比如 TIOBE 指数、编程语言流行指数、RedMonk 的双年度语言排名,或者是 GitHub 的年度Octoverse状态,Java 自 1995 年发布以来都是一直跻身前三名。然而,如果听一听开发人员们近段时间以来的流言蜚语,你可能会认为 Java 实际上正处于一个大的衰退期,甚至到了垂死挣扎的边缘。仔细看看这些人气数据,你可能会认为 Java 已经慢慢地将市场份额拱手让给了它的竞争对手,这是它即将灭亡的另一个明显迹象。一些支持者可能会反驳说,只是因为有越来越多的语言在不断出现,因此大家能分到的蛋糕也越来越小。
虽然在早期 Java 遇到过一些小问题,但如今这门语言及其更大的生态系统已经加快发展步伐,以各种方式来满足未来的需求。事实上,它一直都没有离开过:亚马逊、谷歌、Netflix、Pinterest、Spotify、Square 和 Zoom 等公司都在其庞大的代码库中使用了 Java。更不用说在过去的十年中,许多大型数据基础设施都是由 Java 来提供支持的,该语言是 Apache Hadoop、Kafka 和 Spark 等公司的支柱。随你怎么说它已经死了,但我们现在看到的是 Java 的复兴;是为那些最近认为它无法满足的未来用例而进行的语言复兴。
也就是说,Java 可以用 LL Cool J 不朽的名言来描述:“别叫它卷土重来,我已经在这里呆了很多年了//我让同龄人感到震撼,让那些傻瓜们感到恐惧。”
那些年对 Java 的不满
Java 于 1995 年首次亮相,并承诺能够“一次编写,随处运行”(WORA),这一特性使它在当时占主导地位且依赖平台的语言(如 C 和 C++)中脱颖而出。在推出后不久,它就通过 Java 小程序(applet)进入了 Web 浏览器,开发者们就突然有了一种可以跨越苹果与 PC 战线的语言,并进入到蓬勃发展的万维网。虽然在 1995 年还诞生了 PHP、Ruby 和 Javascript,但它们都没有像 Java 那样迅速流行起来。
接下来短短两年时间,Java 的受欢迎程度就排到了第三名,仅次于 C 和 C++。到 1998 年,它超过了 C++,并于 2001 年超过 C,攀升至第一宝座。在六年的时间里,Java 主导了软件开发世界。虽然这一地位持续了十多年,但在 Java 世界中,并非所有人都对它感到满意。
EPI-USE Labs 的首席解决方案架构师 Andrich van Wyk 回忆起 Java 语言发展停滞不前的时期,那时候尽管它处于主导地位,但也受到了质疑。低谷出现在 2009 年左右,当时 Java 6 已经推出将近三年,而 Java 7 还差两年才能问世。当 Java 7 最终问世时,van Wyk 回忆说,它“虽然经过了 5 年的开发,但它还是一个相对平庸的版本”。
他将当时描述为“开发人员渴望更现代的语言功能、更少的冗长代码、以及新的编程范式”的时代。Ruby 的 Rails 框架可能正处于其最初的操作周期的顶峰,而 Node.js 才刚刚出现,两者都体现了代码简洁、快速原型化、以及可用于快速构建现代 Web 应用程序的库等特性。换句话说,它们有许多 Java 所没有的东西,至少在当时来看是这样的。
“所有这些东西后来都可以通过现代版本和 Spring Boot 等框架在 Java 中使用,但我们不得不等到 2014 年 Java 8 的发布来启动这种复兴。”van Wyk 回忆说,Java 6 和 8 之间间隔了近十年是问题的关键之处。
所以如果说有可以让 Java 几乎宣告死亡的时刻,大概就是那时候。对 Java 来说,幸运的是,公司和开发人员已经在全力以赴地开发 Java,并且它在许多组织中已经是根深蒂固。所以即使有许多用户越来越不满意,以及语言的创新停滞不前,但 Java 仍然在提供大量库和工具的同时也提供了性能。也许它从未真正实现“一次编写,随处运行”的承诺,但它具备高性能、内存安全等特点,是互联网基础设施和大规模应用的理想选择。
不管怎么说,2014 年 Java 8 和 Spring Boot 的推出还是给 Java 生态系统带来了一股新鲜空气,开启了一段复兴期。Spring Boot 是十年前推出的流行的 Spring 框架的继任者,它帮助开发人员消除 Java 的冗长,而 Java 8 引入了开发人员一直在破解期待的许多功能,如日期和时间 API 以及 Lambda 表达式。
转折点
虽然 van Wyk 指出 2014 年是 Java 的一个重要转折点,但 Eclipse 基金会执行董事 Mike Milinkovich 指出了另外的两个关键时刻。首先是 2018 年,随着 Java SE 10 的发布,Java 的发布节奏就发生了变化,确保每六个月发布一个新版本而不是像之前那样长达数年的时间。
“Java 现在正与许多快速发展的平台竞争,”甲骨文的产品经理 Dalibor Topić说。“因此,它还必须得开始更快地前进,最大限度地减少 Java 用户和开发人员等待新版本的痛苦,同时以惯有的高质量水平交付每个新的 Java 版本。”
通过致力于定期发布的节奏,Java 加入到了许多现代语言的行列。Ruby、.NET、Python 和 Javascript 都采用一年一次的发布节奏,而 Go 每六个月发布一个新版本,Rust 每六周发布一个新的稳定版本。有了 6 个月的节奏,Java 的功能可以更早地被推出,并且在没有准备好时可以更容易地推迟发布,因为等待不再是不确定事件了。
“在 2018 年前后,随着 Java 9 和发布周期的增加,Java 真正迎来了它的高潮,”他说。“更小但更频繁的版本发布确实效果不错。”
与此同时,Milinkovich 指出,Oracle Java 开发工具包(JDK)的变化,对 Java 开发人员和在生产或商业用途中运行 Java 应用的公司带来了巨大的影响。
甲骨文在 2017 年首次宣布,要求这些用户购买年度订阅服务(2019 年 4 月生效),以继续获得 Oracle Java 平台标准版(Java SE)产品、Oracle JDK 8 和 11 的安全补丁。
“过去多年来,对 Java 的长期支持实际上是免费的。作为一家企业,你可以在 Java 上运行你的应用程序,而不必频繁地升级版本。这种现状被变化了,迫使 Java 用户要么每六个月迁移一次,要么从甲骨文或其他公司那里寻求商业支持许可证,”Milinkovich 解释道。
这不仅没有阻碍创新,反而使 Java 生态系统更加繁荣。这一变化刺激了许多云计算供应商,如亚马逊、微软、IBM、阿里巴巴云和华为,提供他们的技术兼容性套件(Technology Compatibility Kit,TCK)以测试和支持 OpenJDK 版本作为回应。首个回应来自伦敦 Java 用户组(Java User Group)发布的 AdoptOpenJDK。
伦敦 Java 用户组的负责人 Martijn Verburg 表示,该组首先发布了 AdoptOpenJDK 是因为他们不确定在甲骨文围绕 OpenJDK 的变化下,开发者的使用权是什么。Verburg 说:“他们想确保有一个永久免费的 OpenJDK 二进制文件供开发者永久使用。”Verburg 解释道。
AdoptOpenJDK 是一个“多方利益相关者项目”,最终“转移给了 Eclipse 基金会(作为 Adoptium),以便在软件基金会中实现对自由二进制文件(Temurin)的访问。”
Milinkovich 说,OpenJDK 的变化“鼓励了多家公司加入成为自己的 Java 平台供应商的游戏。生态系统中供应商数量的增长对 Java 的多样性和可持续性是有帮助的,因为许多相关方都被迫投资于生产高质量的 Java 运行时,而不是像以前那样。”
来自 JVM 生态系统的推动
继续回首过去,我们还可以看到,在 Java 虚拟机(JVM)上运行的两种语言 Kotlin 和 Scala 是 Java 所谓复兴的参与者。JVM 可以运行任何 Java 字节码,这是 Java“一次编写,随处运行”承诺的关键部分。Scala 和 Kotlin 都是专门为编译成 Java 字节码并在 JVM 上运行而设计的。Scala 首次出现于 2004 年,就在 Java 在创新上陷入困境之前,Kotlin 则是在 2011 年出现,正好处于同一时期的中期。
Kotlin 和 Scala 可以利用 JVM 的稳定性和普遍性,同时也享有做 Java 根本无法承担的事情的自由。与此同时,对于任何一种语言来说,产生的风险都可以作为一个积极的证据,证明该特性可以在 JVM 上按预期运行,且不会导致系统崩溃。对于 Java 开发人员来说,JVM 上的其他语言在提供 Java 兼容性的同时,也许还能解决他们对 Java 缺陷的担忧。像 Kotlin 和 Scala 这样的语言不仅是独立的语言,有其自身的优势和用例,而且它们为开发人员提供了一种方式来熟悉 Java 之外的概念,这些概念最终可能会被引入到 JPL 中。
“在 JVM 上使用其他语言是一种非常好的方法,可以看出哪些新颖的想法可以在各自的社区中得到关注,而不必立即尝试将它们嵌入到 Java 中。”Topić说。“相反,我们可以挑选获胜的想法,并与学术界、工业界和其他开源项目的合作者公开合作,逐步调整和完善这些想法,使它们真正适用于 Java 本身,将其作为语言和库的功能浮出水面,最终让人觉得它们是‘原生’于 Java 的。”
“我们经常谈论 Kotlin 是一个生产游乐场。”Pinterest 的团队负责人兼软件工程师 Christina Lee 说。“Kotlin 不像很多 JVM 用例那样有很多遗留问题,所以他们的语言可以发展得非常快。这不是你在 Java 中可以做到的。这些分支语言让我们有能力快速尝试所有这些功能,然后将其中最好的特性功能补充到 Java 编程语言。”
Lee 指出了 Java 的一些新特性,如 Record 类和 Field 类,而 Kotlin 已经拥有这些特性好些时间了。Van Wyk 同样指出,模式匹配他是从 Kotlin 开始熟悉的一种语言特性,现在也已经进入到了 Java 中。“这是后发优势。”van Wyk 说。“正是因为 Java 是最后一个实现这些特性的,所以它可以挑选自己想要的,从而为开发人员带来他们所需要的东西,而不会搬起石头砸自己的脚。”
Van Wyk 指出 Scala 是最初帮助他学习函数式编程并让他站稳脚跟的语言。“Java 8 出现了,它也有函数式编程,我当时就想‘嘿,我已经知道如何使用它了!’”他说。类似地,Kotlin 帮助他了解了协程(Coroutine)支持,这是一个由 Go 编程语言普及的功能特性。“如果没有 Kotlin,一些即将推出的 Java 特性就会更加令人费解,”van Wyk 说。
2017 年,谷歌宣布它将在安卓系统上正式支持Kotlin,与 Java 并列,自那时起,Kotlin 语言便开始流行起来了。Lee 表示,自那以后,Kotlin 一直是她的首选语言,而且她不打算回头,尤其是当谷歌自己宣布,从 2019 年开始所有的 Android 开发都将是“首选 Kotlin”。
对于 Lee 来说,Kotlin 提供了一种面向 Android 开发的方式,可以避免 Java 的一些陷阱,在面向移动平台开发时,这些陷阱尤其危险。例如,在编写 Java 时,NullPointerException 是一种常见错误,它可能会使应用程序崩溃,但直到运行时才能发现。Lee 说,这对于移动开发来说是个问题,因为与 Web 应用不同,Web 应用一旦部署,客户就可以立即获得缺陷修复,而应用商店可能需要几天或几周才能批准新版本。“比起在另一个生态系统中工作,我会更加重视语言的安全性。”Lee 说。“Java 是一门伟大的语言,但它没有像 Kotlin 那样为我们提供在 JVM 之上的这些层相同的工具来编写正确的代码。”
Lee 说,她没有把 Kotlin 和 Java 看成一场零和游戏,即一种语言的普及意味着另一种语言的衰落,她认为这两种语言是共生共存的。毕竟,它们实际上可以在同一个应用程序中并肩存在。事实上,对于有兴趣学习 Kotlin 的 Java 开发人员来说,他们可以简单地用 Java 编写一些东西,将其粘贴到 Kotlin 文件中,然后通过 IDE 将其自动转换为 Kotlin。“在我看来,这就是 Kotlin 如此成功的部分原因,”Lee 说。“这就是可转移性。”
Lee 给出了苹果选择从 Objective C 迁移到 Swift 的比较,在这一过程中,两种语言之间的通信需要额外的步骤。“他们没有互操作性的故事。要把 iOS 应用程序迁移到 Swift 上就困难多了。在 Pinterest,当我们第一次引入 Kotlin 时,你只需添加一个 Kotlin 文件,一切都能正常工作。你可以轻松地在文件之间调用,这为采用这些语言开辟了一条巨大的通道,否则就不会这么容易了。我认为这些语言能够很好地结合在一起的事实使它们非常、非常有凝聚力。”Lee 说。
她说,Kotlin 提供了一个完美的中间地带。“你可以保留所有现有的基础设施,并解决一些用户体验上的痛点,而不用将婴儿与洗澡水一起倒掉。完全脱离 JVM 的理由变得越来越少了。”
Java 使自己稳定且不那么缓慢地步入未来
在 Java 使用了近 30 年之后,你可能会认为该语言已经出现了一些“磨损”的迹象,但事实并非如此。2022 年的 Java 并不是一门衰落中的语言,而是一门为软件开发的蓬勃发展而准备的语言。当 Java 终于在 2010 年代中期再次开始创新时,云原生开发的阴影已经笼罩在头顶,现在它越来越成为默认配置,特别是对于大规模运行的企业和软件而言。VMware 软件工程副总裁 Ryan Morgan 说,虽然诸如 Go 之类的其他语言被视为是为云而设计的,但 Java 通常被认为是笨重的。
“Java 一直被笼罩在阴影中,人们认为‘它臃肿、笨重,不是云原生的,也不是为云而创建的,它不允许你在公共云中实现你可能想要的密度。”Morgan 说。“为了真正消除这些误解,我们做了很多工作。”
就其本身而言,VMware 正在努力通过即将发布的 Spring Framework 6 和 Spring Boot 3(Morgan 称之为 Spring 的“第三幕”)来提高 Java 的云原生性”,使用GraalVM构建的 Spring 将会提供“Spring 中完全的原生支持,这意味着你将能够把任何 Spring 应用程序编译成本地二进制文件,并减少占用空间和启动时间。这对你可能在边缘地区看到的各种其他工作负载都非常有益。”
Spring 并不是唯一一个这样努力的。红帽的Quarkus和Micronaut项目都在帮助推动 Java 进入一些以前被认为是不可能的领域:走向边缘计算,进入微服务架构,在这些领域,小规模和快速的启动时间是关键。类似地,Project Loom旨在通过在 JVM 中而不是在操作系统内核中实现线程,将轻量级线程引入 Java 平台。“这代表了 Java 支持并发能力的显著提高,使该平台与当今许多云级应用程序更加相关。”Milinkovich 说。“有了 Loom 项目,用 Java 编写高并发应用程序对开发人员来说将会变得更加简单,可扩展性也更强。”
在 Milinkovich 看来,正是 Quarkus、Micronaut、Loom 和 Adoptium 等项目将 Java 带到了下一代开发人员中。
“Java 已经活了 25 年了,我相信它还会再活 25 年。我认为它正在经历一次复兴,无论是从技术角度,还是从生态系统角度来看,都是如此。”Milinkovich 说。“开发人员需要记住的一件事情是,Java 技能的需求量很大。这将真正有助于开发人员的持续支持,我想你会看到,在可预见的未来,Java 将继续保持在最受欢迎的语言/平台的前三名。”
原文链接:
https://github.com/readme/featured/java-programming-language