在我的印象中,上一次编写 Java 代码已是三年前的事儿了。虽然我的第一份工作就是 Java 程序员,但是后来因为容器与微服务的出现,Java 就从我的工作中消失了。可万万没想到,如今我和 Java 又一次重逢了,居然还是在微服务领域。
Java 的优势
这一切都要从微服务的热潮说起,众所周知微服务的优势在于:易于扩展、高可用性、无需考虑并发和多线程,而且还能享受容器带来的便携性。
如今,以 Kubernetes 为代表的微服务席卷了全球,让人感觉 Java 的时代已经成为了过去,而且这些语言无法很好地融入容器与微服务的生态系统。
虽然 Java 一直被集简洁与优雅于一身的编程语言(比如 Python)所诟病,但作为 Java 曾经忠实的拥护者,我认为 Java 在某些方面仍然有着不可否认的优势。
首先,我们都知道 Java 有着强大的多线程处理能力,对于银行等企业应用程序来说这是非常重要的功能。多线程处理能力使得程序能够具有更好的交互性、实时性。Java 在多线程处理方面性能超群,具有让你惊喜的强大功能,而且在 Java 语言中进行多线程处理很简单。
其次,虽然说比较 Java 与脚本语言的性能有点不公平,但 Java 的性能确实无与伦比。然而,在水平伸缩与微服务架构的世界里,语言本身的性能根本无关紧要,只需要增加容器就可以获得优异的性能。虽然脚本语言能够利用容器随意扩大或缩小规模,但 Java 语言本身的性能优势很明显(至少在微服务领域)。
然而,另一方面,在此次会面中,Java 及其过时的框架(比如 Spring)也给我带来了无穷无尽的烦恼。
Java 以及 Spring 的缺点
首先,我们来说一说 Spring。众所周知,Spring 臃肿,入门难度大,充满了各种谜之注释,开发人员只能依靠教程或示例代码。Java 语言本身就很古板,Spring 又加入了一大堆单行注释和看似简化的方法封装,结果却适得其反,获得的通常都是一些压根没有必要的类调用和实例化。开发人员都明白,语言的控制、命令和透明性对于有效的软件开发至关重要。也就是说,作为一名开发人员,你需要准确地掌握代码的一切,以及代码执行的例程,但 Spring 却斩断了这种可能性。
如果在 Spring 代码中,每个类前面都要加上六个注释,而且这些注释各说各得,它们之间的关系错综复杂,就会让人感觉深陷泥浆。而这样做的并不仅仅是 Spring,例如 Lombok 库也做了类似的事情。这种压缩代码的方式只能适得其反,并不利于 Java 的发展。
Java 不应该与脚本语言比较简洁性。首先,这会牺牲 Java 代码的一致性。想象一下,所有的 getter 和 setter 都消失了,取而代之的是一行注释 @NoArgsConstructor。说好的一致性呢?
其次,这让本来就已令人费解的抽象层次更难以理解。例如,Spring 会在幕后进行自动装配(bean 注入),这是可以理解的,但是 Lombok 在应用程序中的定位又是什么,二者之间如何传递消息?如果每个类都需要六个注释,那么这些注释还需要实例化多少例程或类才能完成一个简单的任务?没有开发人员会希望这些多余的代码潜伏在角落。可悲的是,三年之后我所见到的 Java 代码就是这个样子。一切都是原来的样子。即便是有一些微小的变化,也是让情况变得更糟。
最后,Java 的发展搞错了重点。时至今日,Java 依然在纠结一些愚蠢的规则,比如类的命名,类应该放入哪个包中,以及变量是私有的还是保护的。反观 Python,官方没有提供有关访问说明符的文档,而是相信开发者会自己管理好这一切。这种做法很快就引起了我的共鸣。
KISS 原则
KISS 原则是如今软件行业盛行的一句话,“保持简单和愚蠢”(Keep it Simple and Stupid),换句话说来,“简单就是美”。Java 想要发展下去,就要认真思考这句话了。
如今,微服务在软件行业大肆普及。许多企业和组织都在从单体架构向微服务架构转变,他们希望简化设计,并提高可扩展性。对于程序员而言,这意味着将庞大的代码库或复杂的业务逻辑分解成更简洁的小功能,这种方式可以避免在代码中管理状态,同时也可以避免并发问题和多线程的噩梦。
归根结底,所有的服务(无论是哪种形式)都只不过是在处理某种格式(JSON 或 XML)的数据,然后将这些数据传递到 Kafka 之类的消息总线上进行进一步处理。然而,即便在这样简单的环境中,Java 和 Spring 仍在纠结过时的语法问题,应用程序上下文,复杂的 bean 注入,POJO 映射器,吞噬大量内存的 JVM,以及 class loader 等等,让人一想到就头疼。
网友看法
就 Java 是否已死这个话题,很多网友发表了各自的看法。
评论1
现在 Spring 越来越大,这就导致大多数程序员对 Spring 的体系及结构都一知半解,才会感觉头疼。但如果你知道如何筛选自己想要的功能,就不会觉得臃肿,反而会很简洁。例如:
● 你想实现 Rest 服务,那么可以参考 Spring MVC 预置的功能。
● 如果你不想自己写 DAO,那么 Spring Data 可以替你做,模板代码全部都可以替你实现,而且对 JPA 或 NO-SQL 的支持也很方便。
Java 生态系统非常庞大,需要学习的库和框架也非常多。这些框架可以帮你省却大量的样板代码,但是前提是你需要下一番功夫认真学习。
评论 2
Java 的优点很多,包括安全性、分布式、可移植性(一次编译到处运行)、高性能、多线程以及动态性。
根据 TIOBE 发布的 2021 年 1 月编程语言排行榜,Java 是位列第二的编程语言。我完全没有看到 Java 没落的迹象。
关键词: Java