素材巴巴 > 程序开发 >

为什么我这个 Java 死忠倒向了 Node.js?

程序开发 2023-09-07 19:57:06

作为一个在Sun微系统公司Java SE团队工作了十多年的人,难道不应该是体内流淌着Java字节码的血、只要一息尚存就要不断实现抽象接口吗?但对于我这个前Java SE团队成员来说,2011年学习了Node.js平台后就像是呼吸到了新鲜空气一样——我在2009年1月被Sun裁退之后(正好在Oracle收购之前),开始学习Node.js并被它深深所吸引。

我是怎样被吸引的?从2010年起,我就开始写各种关于Node.js编程的东西了。具体来说,写了四版《Node.js Web开发》,加上一些其他的书,和数不清的关于Node.js编程的教程。可以说,我花了非常多的时间解释Node.js和JavaScript语言的发展。

在Sun微系统工作时,我相信一切都能用Java描述。我在JavaONE上演讲,与别人共同开发了java.awt.Robot类,举办了Mustang Regressions Contest(为Java 1.6发布准备的找bug竞赛),帮助别人启动了“Java的分布式授权”,就是在OpenJDK出现之前为Linux发行版发布JDK的解决方案,后来还在启动OpenJDK项目上扮演了一个小角色。

一路走来,我在java.net上有过一个博客(现在荒废了),连续六年坚持每周写一到两篇文章,讨论Java生态系统中发生的一切。最常见的话题就是反驳那些唱衰Java的论调。

在这里插入图片描述

Duke奖,颁发给努力超越自己的员工。我在举办了Mustang Regressions Contest这个为Java 1.6发布而准备的找bug竞赛之后获得了这个奖励。

那么,说好的靠着Java字节码生存和呼吸呢?我这篇文章的目的就是想解释下一个Java字节码的忠实粉丝是如何变成了Node.js/JavaScript的传道者。

其实并不是说我和Java完全不相干了。

过去三年里我也写了许多Java/Spring/Hibernate代码。虽然我很喜欢我的工作——我在Solar Industry工作,做一些实现梦想的事情,如写数据库查询语句查询用电量等,但用Java编程已经是昨日黄花了。

两年的Spring编程让我清楚地意识到一件事:掩盖复杂性并不会让其变简单,只会欲盖弥彰。

本文要点:

Java包含了大量样板代码,扰乱了程序员的意图。Spring和Spring Boot的教训:掩盖复杂性只会让事情更复杂性。Java EE是个“由委员会设计”的项目,覆盖了企业应用开发所需的一切,导致过度复杂。Spring的编程体验非常好,但是一旦在子系统深处出现模糊难懂、从未见过的异常信息,就需要花掉三天以上才能找出问题是什么。如果框架允许程序员完全不写代码,那产生的额外开销会有多少?虽然像Eclipse之类的IDE很强大,但都是Java复杂度的症状。Node.js是一个人磨砺并精炼轻量级事件驱动架构的结果,直到Node.js自己揭露了真相。JavaScript社区似乎很感谢去掉样板代码,可以让程序员专注做有意义的事。回调陷阱的解决方案async/await函数就是移除样板代码的例子。用Node.js写程序很愉快。JavaScript缺少Java那种严格类型检查,但这是个双刃剑。编程变得容易了许多,但需要更多测试才能保证正确。npm/yarn包管理器非常优秀,也非常好用,相对的就是令人生厌的Maven。Java和Node.js都提供优秀的性能,这与“JavaScript很慢因此Node.js的性能必然不好”的传说正相反。Node.js的性能要归功于Google为了加速Chrome浏览器而在V8上的投入。浏览器之间的激烈竞争使得JavaScript变得越来越强大,反过来帮助了Node.js。

Java已成为负担,用Node.js编程很愉快

一些工具或对象是设计师多年精心磨砺并提炼的结果。他们会尝试不同的想法,去掉不需要的特性,最后得到为某个目的量身打造的对象。因此这些对象都有强大的简单性,所以非常吸引人。而Java并不是这种系统。

Spring是个流行的Java Web应用程序开发框架。Spring,特别是Spring Boot,其核心目标是个预配置的、易用的Java EE栈。Spring程序员不需要考虑所有servlets、数据持久、应用服务器,以及构成系统的其他不知所云的东西。Spring会处理这一切,而你只需要专注写代码即可。例如,JPA Repository类会将数据库查询合成为方法,名字类似于“findUserByFirstName”,这样你无需写任何代码,只需要调用方法,Spring就会处理剩余的一切。

——这个想法很不错,而且的确很好用,直到某种情况发生。

如果你得到一个Hibernate PersistentObjectException,提示“ detached entity passed to persist”,也就是说到达REST访问点的JSON有ID值,而这层含义往往需


标签:

上一篇: thymeleaf实现树状下拉框 下一篇:
素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。