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 的高手算是程序员高手吗?答案是显然的。

zz Spring 是一种反模式的更多相关文章

  1. [转]为什么我说ORM是一种反模式

    原文地址:http://www.nowamagic.net/librarys/veda/detail/2217 上周我在在上讨论了ORM,在那以后有人希望我澄清我的意思.事实上,我曾经写文章讨论过OR ...

  2. SQL反模式学习笔记2 乱穿马路

    程序员通常使用逗号分隔的列表来避免在多对多的关系中创建交叉表, 将这种设计方式定义为一种反模式,称为“乱穿马路”. 目标:  存储多属性值,即多对一 反模式:将多个值以格式化的逗号分隔存储在一个字段中 ...

  3. 《SQL 反模式》 学习笔记

    第一章 引言 GoF 所著的的<设计模式>,在软件领域引入了"设计模式"(design pattern)的概念. 而后,Andrew Koenig 在 1995 年造了 ...

  4. ORM 是一种讨厌的反模式

    本文由码农网 – 孙腾浩原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! (“Too Long; Didn’t Read.”太长不想看,可以看这段摘要 )ORM是一种讨厌的反模式,违背 ...

  5. Spring 实现两种设计模式:工厂模式和单态模式(单例模式)

    本文摘自:李刚 著 <轻量级 Java EE企业应用实战 Struts2+Spring+hibernate整合开发> 在Spring 中大量使用的以下两种设计模式:工厂模式和单态模式. 工 ...

  6. Java的三种代理模式(Spring动态代理对象)

    Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩 ...

  7. spring ioc三种注入方式

    spring ioc三种注入方式 IOC ,全称 (Inverse Of Control) ,中文意思为:控制反转 什么是控制反转? 控制反转是一种将组件依赖关系的创建和管理置于程序外部的技术. 由容 ...

  8. Python编程中的反模式

    Python是时下最热门的编程语言之一了.简洁而富有表达力的语法,两三行代码往往就能解决十来行C代码才能解决的问题:丰富的标准库和第三方库,大大节约了开发时间,使它成为那些对性能没有严苛要求的开发任务 ...

  9. Apache Hadoop最佳实践和反模式

    摘要:本文介绍了在Apache Hadoop上运行应用程序的最佳实践,实际上,我们引入了网格模式(Grid Pattern)的概念,它和设计模式类似,它代表运行在网格(Grid)上的应用程序的可复用解 ...

  10. 开发反模式 - SQL注入

    一.目标:编写SQL动态查询 SQL常常和程序代码一起使用.我们通常所说的SQL动态查询,是指将程序中的变量和基本SQL语句拼接成一个完整的查询语句. string sql = SELECT * FR ...

随机推荐

  1. 【赵渝强老师】第一个Oracle的手工备份和恢复

    一.什么是手工管理的备份与恢复? 尽管在Oracle中,已经有了RMAN的备份与恢复.但是作为Oracle备份恢复的一种方式,我们将在本文中通过一个例子来为大家介绍如何使用手工的方式来完成Oracle ...

  2. 简化部署流程:Rainbond让Jeepay支付系统部署更轻松

    在如今的开发环境中,部署一套像 Jeepay 这样的 Java 支付系统往往需要开发者面对繁琐的配置.依赖环境管理以及服务的高可用性保障,手动部署和运维变得异常艰巨和费时.然而,借助 Rainbond ...

  3. 五行八字在线排盘api接口免费版_json数据格式奥顺互联内部接口

    「八字在线排盘」谁都想知道自己一生中的事业.财运.婚姻.功名.健康.性格.流年运程将是怎样,通过八字排盘,四柱八字排盘会有你想知道的答案.一个人出生的年月时天干地支的排列组合(即八字)就是命.不过仅凭 ...

  4. 什么是 RBAC 权限控制

    RBAC是Role Based Access Control的英文缩写,意思是 基于角色的访问控制. RBAC实际上就是针对产品去挖掘需求时所用到的Who(角色).What(拥有什么资源).How(有 ...

  5. LookupViT:类似SE的token压缩方案,加速还能丰富特征 | ECCV'24

    视觉变换器(ViT)已成为众多工业级视觉解决方案的事实标准选择.但由于每一层都计算自注意力,这导致其推理成本对许多场景而言是不可接受的,因为自注意力在标记数量上具有平方的计算复杂度.另一方面,图像中的 ...

  6. 学习JavaScript第三天

    文章目录 1.数组 1.1创建数组 1.2数组方法 1.3数组遍历 2.函数 2.1函数的定义 2.2函数的参数以及返回值 2.3函数的作用域 2.4函数传参 3.对象 1.数组 在JavaScrip ...

  7. docker存储配置与管理--项目三

    一.Docker存储概念 1.容器本地存储与Docke存储驱动 容器本地存储:每个容器都被自动分配了内部存储,即容器本地存储.采用的是联合文件系统.通过存 储驱动进行管理. 容器本地存储空间:分层结构 ...

  8. 初识GO语言--并发

  9. 如何使用程序生成一个复杂的2D迷宫游戏地图

    相关: I Solved The World's Hardest Maze (with Code) 本文不做过多的内容介绍,本文主要是分享上面的这个视频内容,该内容介绍了一些自动生成复杂2D迷宫的算法 ...

  10. debug指南-基础bug

    基础Bug 本章节主要阐述一些最基本的bug. 虽然这些bug看起来很弱智简单,但正是因为这些小bug,让我们调代码的时间增加至少 \(2,3\) 个小时. 本系列的宗旨就是综合这些小bug极其对应解 ...