当前位置: 首页 > 科技观察

为什么Java正在消亡

时间:2023-03-12 10:11:58 科技观察

为了在我的新工作中更好地适应技术堆栈,在过去的两周里,我一直在和一个老朋友Java一起重塑自己。不久前,它以无与伦比的热情和活力开始了我的软件生涯。这个过程持续了大约两年半,但随着容器和微服务的出现而迅速消失。到今天为止,距离我上次编写任何严肃的Java代码已经三年了。老实说,我从没想过它会再次出现,尤其是在微服务领域。所以发生了什么事?答案很简单:无处不在的微服务浪潮正在席卷我们。易于扩展高可用性无需担心并发和多线程简化的代码库容器化带来可移植性所有这些因素都让我们质疑Java(更具体地说是JVM)的功效,更不用说Java最臭名昭著的框架了。有时,沉浸在Kubernetes等技术中的人们感觉Java的时代已经过去,它在容器和微服务生态系统(这是软件可扩展性和高可用性的关键)中发挥不佳。然而,作为曾经是Java坚定支持者的人——尽管我一直受到Python等语言的简单和优雅的影响(现在它是我的首选语言)——我继续阻止Java的某些领域不可否认的优势。例如,我非常了解Java强大的线程功能,在我职业生涯的早期就直接在关键的银行应用程序中使用它们。虽然将编译语言的性能指标与脚本语言的性能指标进行比较是不公平的,但Java坚如磐石的性能是无与伦比的。但在水平可扩展性和微服务架构的世界中,这种语言的内在性能太重要了,因为可以简单地生成更多容器以获得出色的性能。显然,这些脚本语言,以及它们在容器领域动态扩展或缩小的能力,让Java物有所值。我一劳永逸地相信Java已经完成了(至少在微服务领域)。我是对的!在我的新工作中,这些信念只会得到进一步强化,我很痛苦地意识到这种语言已经变得多么烦人、恼人和令人费解——部分原因是Spring等过时的仪式框架。Java和Spring的仪式让我们从声名狼藉的Spring框架开始。与五年前相比,Spring庞大而复杂,充满了无穷无尽的注释,使开发人员每次需要完成工作时都依赖教程或示例代码。细读Spring自身的详尽文档既是一项艰巨又艰巨的任务。事实上,我最喜欢的是像Spring这样的框架,而不是Java本身。Spring通过采用一种已经礼貌的语言并用单行注释和看似简化的包装器来掩盖它,最终调用通常不需要的类的调用和实例化,从而加剧了这个问题。狂欢。正如任何开发人员都会同意的那样,语言控制、命令和透明度对于有效的软件开发至关重要。简而言之,作为一名开发人员,您想要确切地知道您的代码中发生了什么以及执行了哪些例程-至少在较高级别上。但是Spring在这方面痛苦地阻止了你。如果您必须在一个类的顶部放置六个注释,每个注释都做自己的事情并且在Spring上下文的网格中错综复杂地相互连接,那么您就处于一个模糊的地方。不仅仅是春天。以Lombok库为例。这是其头版宣传的第一行:“ProjectLombok是一个Java库,可自动插入您的编辑器并构建工具,为您的Java添加光彩。永远不要编写另一个getter或equals方法,用一个注解的类将具有完整的函数生成器、自动记录变量等。”这种压缩Java代码的反常目标令人沮丧,并且为该语言工作而不是真正做任何事情是痛苦的。Java应该停止尝试匹配脚本语言的简单性。首先,这牺牲了Java代码的一致性:想象一下回到Java只是发现所有的getter和setter都消失了(我们曾经学到的对于Spring自动装配很重要),现在被单行注释@NoArgsConstructor取代。一致性在哪里?其次,它增加了已经很复杂的抽象数组。在这里,例如,Spring可以在幕后设置自动装配(bean注入),这是可以理解的,但是Lombok在应用程序上下文中处于什么位置,我如何协调两者之间的消息传递?如果我的每个类都有六个注释,那么这些注释实例化了多少其他例程或类来完成这项简单的工作?没有真正的开发人员愿意让所有这些额外的代码潜伏在角落里。遗憾的是,这就是我三年后遇到的Java代码。一切都没有改变。事实上,即使是很小的改变也只会让事情变得更糟。Java仍然专注于关于应该使用什么类名、应该使用什么包以及变量应该是私有的还是受保护的愚蠢规则。说真的,谁在乎?相反,“我们都是成年人”实际上是Python对语言中缺少访问说明符的官方回答。这种嘲讽的引人入胜的单行回应立即引起了我的共鸣。最终,它使我经常觉得荒谬和不必要的概念变得更加理智。KeepitSimple,StupidKISS如果您在软件行业中一次又一次听到一件事,那就是首字母缩写词KISS:KeepitSimple,Stupid。如果Java想要生存下去,这是需要认真考虑的事情。如今,微服务模式在软件行业几乎已经普及。甚至许多运行遗留应用程序的组织也越来越多地更换他们的旧单体,以简化设计和提高可扩展性。对于程序员来说,这意味着将他们庞大的代码库或复杂的业务逻辑分解为更简单、简洁的函数——一种消除代码中状态管理需求的范例,使其免于并发问题和多线程噩梦。归根结底,所有服务,以某种形式或形式,只是以某种格式(JSON或XML)处理数据,然后将它们传递给消息总线(如Kafka)以进行进一步处理。即使在这样一个简单的设置中,Java和Spring也在驳斥礼貌代码语法、应用程序上下文、复杂bean注入、自动装配、POJO映射器、内存匮乏的JVM和臭名昭著的类加载器的过时言论。毫无意义地应付。判决?“保持简单,笨蛋!”