zz Spring 是一种反模式
Java 将会消亡 – Martin Vysny – 第一性原理思考
原文标题“Java 将会消亡”, 我并不认可 Java 会消亡一说, 作者还处于 FP 亢奋期,而我已经从 FP 回归 OO,这个话题有机会再展开。”Spring 是一种反模式” 是第二节的标题。
让我们引用一下原文:
Spring 是一种反模式
正如上面演示的那样,Spring 是为了弥补 Java 的缺点而发明的,并且自那以后,它不知何故发展成为启动 Java 项目时事实上的首选。引用为什么是 Spring?:
Spring 使 Java 编程对每个人来说都更快、更轻松、更安全。Spring 专注于速度、简单性和生产力,使其成为世界上最受欢迎的 Java 框架。
真是一派胡言。让我们揭穿这个营销垃圾的真面目。但首先,简单和轻松之间有一个非常重要的区别。Spring 允许您以一种简单的方式管理事务,没错,但这样做会带来 20 MB 的垃圾,并迫使您使用依赖注入等复杂模式。而这很难被视为“简单”。在向我讲述简单之前,请尝试调试一个 200 行长的堆栈跟踪,该跟踪指向 Spring 事务魔法深处的某个地方,在抽象和代理的意大利面条中。
轻松编写代码并不意味着最终的解决方案会简单。
**注意这个说法:简单并不等于容易。 simple is not easy.
因此,Spring 代码片段可能看起来很简单,但下面的冰山绝对不简单。
从任何意义上来说,它都不是“更安全”的:只要记住当它突然开始应用恶意拦截器时它是多么安全,因为在beans.xml作为传递依赖项拉入的 jar 中的某个地方有一个隐藏的东西。
速度:是的。在我使用 Spring 开发的应用程序中,你点击运行,等待 30-60 秒,它会初始化 bean,然后才会失败,因为 Spring XML 或@Component其他什么地方的某个深处存在运行时配置错误。
也许在输出代码方面有生产力,但绝对不是在运行速度和可维护性方面。
更快?在什么情况下?绝对不是在运行时:CPU 需要浪费大量周期来处理大量 Spring 抽象和动态生成的代理才能到达您的代码。也许比用普通的 Java 7 编写代码更快。
当然,我可以牺牲一些运行时速度,只要我能得到一些回报。例如,现在我有了 JDK 和 GC,我再也不会使用 C++ 了。但牺牲速度并获得反模式作为回报,这对我来说听起来不是什么好生意。
刚刚读了《为什么我讨厌Spring》(原文链接失效)。
那么,让我们重写上面的 Spring 引言,可以吗?
Spring 使 Java 编程变得更快、更简单。Spring 不知何故成为了世界上最流行的 Java 框架。
是的,没有人因为从 IBM 购买而被解雇,对吧?Spring 的营销非常出色,但也仅此而已。它是一种反模式,在一门不差劲的编程语言中是没有立足之地的。甚至它在 Java8+ 中的使用也值得怀疑。
依赖注入是一种反模式
好的,关于可维护性的话题。随着代码库的扩大,代码的维护变得比开发重要得多。在维护时,你绝对需要完全控制你的代码库。你必须能够清楚地知道给定函数的作用。有关更多详细信息,请参阅我的“代码局部性” 文章。
Spring 和任何依赖注入框架所做的恰恰相反。在@Inject
注入东西时,你完全无法控制要注入的内容。它是一个类,还是一个使用某些类定义库的黑魔法动态创建字节码并进行类加载的代理类?它还能序列化吗?不可变的?POJO?几乎不可能!当你调用注入的东西的方法时,会应用哪些拦截器?它们在哪里定义?当我的调试器不断输入名为的动态创建的方法时,我该如何调试这个垃圾$$$Proxy$Whatever?
如果我包含一个 jar,它会突然重新配置 Spring 并添加一些我最初不想要的拦截器,该怎么办?我现在如何推断代码的正确性?
你不能。使用依赖注入,不可能推断代码的正确性,因为你不可能知道还会执行什么。
但不仅依赖注入本身是一种反模式,松散耦合本身也是一种反模式。当然,如果能更清楚地向同事传达你的想法,那么可以添加一两个接口(另请参阅文学编程- 核心思想是你为你的同事而不是计算机编写代码)。但你添加的抽象和松散耦合越多,维护者就越难推理代码本身。
注意:松散耦合本身也是一种反模式,微服务无疑也是,我在解决这个问题,但这是毫无疑问的事实。
所有抽象都是可维护代码的敌人。当它们带来清晰度时使用它们,但要谨慎使用。
Spring 正在杀死 Java
Spring 太难学了:学习曲线的“简单”形象被第一个指向 Spring 深处的庞大堆栈跟踪打破了。Spring 也是一种反模式。它是邪恶的,最好的编程方式是不要使用 Spring。
然而,Spring 现在已经深深扎根于 Java 社区。许多人认为 Java 和 Spring 是不可分割的。然而,Spring 学习起来很困难,维护起来也很麻烦,它正在损害 Java 社区,阻止程序员寻找其他解决方案。它就像一个寄生虫,吸食 Java 宿主并在此过程中杀死宿主。如果 Java 不能摆脱这个寄生虫,它就会随之消亡。而且,Java 毕竟是 Java,我不能说它会被怀念。
Java 8 还行(因为它有闭包)。但 Java 无法与 Kotlin 竞争,未来会遇到困难;它被 Spring 玷污了,这让它的地位更加糟糕。
带有 Spring 的 Java 肯定会消亡。没有 Spring 的 Java 也可能会消亡,但这将需要更长的时间。
另外,不要学习 Spring——投入大量时间去学习一门过时的技术是没有意义的。
对于矮子看戏的大众来说,大家都用 Spring 我为什么不用,那是因为你只写过增删改查没写过真正的程序。
作为架构师话我们也喜欢开发一个框架提供简单的界面给下游程序员用,Spring 就是这种类型的东西。但是你要我们自己用,我就要想想值不值了。我主要会看这个框架是不是够薄,是不是可以直接穿透。
遗憾的是,很多公司的程序员入行以后就只能玩spring,没有机会真正的编程了,等他们干了十几年,就误以为这是最好的东西。
反思我自己也是,d2js 设计的比 spring boot 之流好很多,很薄,甚至也可以直通 java,但是同样也有这样的问题,一个 d2js 的高手算是程序员高手吗?答案是显然的。