Java还没有消亡


我是一个Java/Scala/Groovy的人,这不是一个谜。有些人,尤其是年轻人,当他们知道这件事时,会翻白眼。与现代语言相比,过时、无效、注定失败——这基本上是我一直听到的。但是真的是这样吗?

老式的

是的,Java提供的基本构造和约束是过时的,依赖于20年前代码是如何编写的。编程语言不是在消毒的泡泡里创造的。开发人员的习惯和需求是语言设计的核心,当发明者试图将创新注入其中时,忽视人们将如何实际使用它是愚蠢的。Java的第一个里程碑可以追溯到1995年,虽然它的一些基础模块看起来至少有10年是有远见的,但很明显2924年后……没有那么多。

不过,这不只是时间问题。在过去的十年里,发生了很多变化。这些事情中的一些看起来可能与这个话题无关,但它们实际上是讨论的中心。例如,廉价内存的更大可用性在大规模重新采用functional programming生产软件。这与采用reactive programming manifesto

可访问和可管理的云计算简化了microservices模型,当containers变成了现实。
微服务模型赋予了特别适合某些任务的编程语言以尊严,但对其他任务来说就不那么出色了。

它不会就此结束。大数据带来的新挑战导致了新的任务优化数据库系统的发明,该系统能够吸收大量数据,然后必须对这些数据进行分析。这实际上并没有导致新语言的诞生,而是对已有语言的重新思考,这些语言被证明非常适合这项任务。

更不用说第二代人工智能青年又把一切都搅乱了。

但是等一下……

Python现在是机器学习的黄金标准,但是如果你快速浏览一下它的Wikipedia page,您很快就会意识到它比Java更古老,可以追溯到1990年!

数据分析的一个常见选择——R,怎么样?1993.

JavaScript?奇怪的是,1995年,就像Java一样。

二郎。1986年…

为什么这些语言不被认为是过时的,而Java是?

因为我们改变了,和我们一起,我们的挑战也改变了。

例如,对于实用程序和数据处理程序来说,Python一直是一种非常棒的脚本语言,但是它通常被认为不适合胖企业应用程序。但是微服务——一般来说——小程序和数据管道是由小的、定义明确的、主要是功能性的步骤组成的。

JavaScript一直是使网页动态化的唯一解决方案,但是随着复杂的网络应用程序的激增,将它引入服务器端也是合理的。

总而言之,考虑Java的原因是过时的它非常适合构建大部分是单块的应用程序,有数百万行代码,需要大量的计划和严格的顺序,这是Java设计所要求的。

尝试用JavaScript做同样的事情,你会很快意识到这一点“死亡不是终点,只是一个过渡”(同前。)。

无效的

相关的。
我经常用这个比喻来解释Java:

如果你需要造一个火柴盒,你首先要拿10吨木材,造一根木头,然后把它敲成一个火柴盒。

因为Java强加了一种正式的、严格的方法,鼓励创建proper class hierarchies这是不可避免的,以像一个白痴一样工作来以适当的方式安排一切,即使是一个非常小的任务。

事情就是这样。鉴于我们在上一章中所说的,在Java中没有简单的任务是容易的。

请注意,我所说的“容易”并不是指容易实现,而是指架构上的容易。编写复杂的算法是一项艰巨的任务,我发现用Python更容易做到。

很明显,在这一点上,我们在重复同一个概念:适合这项工作的工具。
Java是(并且一直是)一种非常通用的编程语言,已经被用来在各种场景中解决各种类型的问题,但是随着时间的推移和挑战的变化,似乎越来越明显的是,Java不能再免于专门化了——不是因为它已经发展成为一种专门化的语言,而是因为其他语言非常适合于特定的任务。

如果你正在构建一个大规模的企业平台(或者至少是它的中心节点),有大量的内部编排、庞大的代码库、疯狂的并行性等等。Java仍然是一头野兽。等等,是……?

Java注定要失败

某种程度上,正如这段黑暗的激励名言所解释的:“不要害怕未来,你不会经历太多。”在这一点上你应该开心…

随着年龄的增长,Java很像一个开发人员。你不像10年前那样头脑清醒,但作为交换,你变得更聪明、更稳定、更可靠。当然,你仍然可以学习铁锈,但它永远不会像对一个比你小10岁的人那样有感觉。同样,Java现代化的竞赛也在不断地落后,当新的特性出现时,你会有这样的印象,它们在适当的时机已经成为现实。例如,当他们第一次引入lambdas时,反应并不是这样“耶!让我们聚会吧!”但是更多“看在上帝的份上,你怎么这么久才来?”

另一方面,人们没有意识到Java最大的成就不是语言本身。

一个非常好的生态系统

在规划大规模软件时,仍然让我回到Java的是生态系统。Java为你能在互联网上梦想到的任何东西提供了极好的高质量的库。

考虑Spring,Akka,Tomcat——我可以举出数百个——这些不是车库工程,而是非凡的成就。我并不是说这不能用其他语言来完成,而是大企业推动Java的方式为这种软件的诞生创造了先决条件。到达这里花了很多年,时间因素也很重要,因为边缘的20年是生态系统成熟的漫长时间。

您可以找到许多语言的特殊库,但是您很快就会意识到它们是否存在在很大程度上取决于一个大公司是否认可这个项目。

例如,为Python找到好的机器学习库非常容易,你不能说谷歌没有在其中发挥作用;您可以使用开发出色的web应用程序React.js多亏了脸书。

你真的是指JVM吗

除了我们前面提到的巨大生态系统之外,Java最大的成就是JVM。虽然语言可能会因年龄而受损,但基于我们普通人的理解,JVM看起来很健康。

现在,有些人可能会说容器化扼杀了对JVM的需求,从某种意义上说,就是这样。事实上,JVM最初的需求是允许程序在任何操作系统上执行,但是容器改变了这方面的一切,因为容器提供了一个可以在任何地方(在纸上)执行的操作系统。

但是JVM已经变得不止如此了。内存管理和垃圾收集、安全性、基本编程库以及调试和检查功能——所有这些都使JVM成为一个非常安全、舒适的地方。

"但是JVM太重太慢了!"这是我收到的一个典型的推诿,虽然这在内存占用和引导时间上是部分正确的(这使得它非常不适合面向任务的程序),但是从性能的角度来看,在过去的20年左右发生了一些事情。

以下是一些使用流行算法的基准比较:

虽然这种基准测试对所涉及的语言不公平,因为算法只是故事的一部分,但是您可以清楚地看出,JVM绝对不是一只把自己拖进坟墓的病象。

然而…

我有点同意这样的观点,当JVM还活着并且运行良好的时候,Java正在努力保持自己的位置。甲骨文知道这一点,并正努力推动天然气让Java再次变得伟大虽然这带来了一些特别的结果,但没有人真的认为这将会阻止衰老过程。这不是一件坏事。

JVM为创建更现代、更有效的语言提供了一个平台。公平地说,不多,但有些非常成功。

这就是重点。国王没有死,但咳嗽听起来也不太好。然而,它的后代在这里传承它的遗产。

  • Scala。我的第二个爱。一种非常强大的静态类型、面向对象和功能性语言。虽然还没有被广泛采用,但它是目前最值得掌握的经济技能之一。经常被Akka演员模型的实现,是语言推动了Play Framework
  • Clojure。这是一种被广泛接受的Lisp语言方言,以其在并发计算方面的惊人能力而闻名,它经常被用来处理庞大的数据集。
  • Groovy。一种动态编程和脚本语言,我通常称之为Java方言(但我确信创建者不同意)。Groovy被广泛用于脚本编写,也是支持Grails framework
  • Kotlin。最后但同样重要的是,静态类型、面向对象和函数式语言JetBrains现在是谷歌安卓开发的必备工具。

我们不仅仅是在讨论Java的扩展。这些都是全新的编程语言,肯定从Java中借用了一些东西,但最重要的是,它们很好地利用了JVM和Java生态系统。

但现实地说……

Java编程语言短期内不会走向任何地方。

这不仅是因为用它构建了大量的软件,也是因为不管你同意与否,尽管它有很多缺陷,但它仍然是一个非常适合新项目的、久经考验的选择。

它的角色确实变了。从你唯一需要的东西,它现在是画面的一部分,但却是坚实的一部分。

即使考虑到我对Scala的致命吸引力,也必须说甲骨文和社区在改进Java方面做得不错,我们都很享受这些进步的好处。新功能的质量可以很好地解决它们在我们想象的时间表上有点晚的余味。

毕竟,编程语言进化的缓慢进展可能是放弃的标志,也可能是成功的标志。当你的语言被如此大规模地使用时,突破性的改变应该被认真对待。您所做的每一步都需要考虑会有什么影响,以及这将如何影响向后兼容性。不能掉以轻心。

结论

我有理由相信我在这个领域已经呆了足够长的时间来理解它的一些特质。这一领域的发展在过去的10年里确实加快了,但进展大多是断断续续的。

当这种情况发生时,你可能会觉得一切都要改变了。这些巨大的进步伴随着一群过度兴奋的意识形态主义者,他们四处游荡,大喊大叫。但当他们扬起的尘埃落定时,你就能清楚地看到成就的真正本质,并理性地充分利用它们。

正如我所说的,Java不会去任何地方,但是在我看来,它要从这些成就中获得最大收益的努力还远远没有成功。

我给你们所有人的建议,无论老少,爪哇爱好者或憎恨者,是:

享受这个美妙的技术时代所提供的多样性!