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. 2021年1月国产数据库排行榜:OceanBase重回前三,TDSQL增长趋势最强劲!

    墨天轮国产数据库排行榜新年第一期已发布.2021年1月份排行榜前三甲依次为 TiDB .DaMeng.OceanBase .PingCAP TiDB 稳居冠军的宝座,短时间内难以撼动,开源的商业数据库 ...

  2. vue项目中的package.json的private选项的作用

    { "name": "项目名称", "description": "描述", "version": ...

  3. ⼯作⾥中的token是怎么管理的?

    我们公司的token管理都是通过vuex配合本地存储来做的,使⽤vuex是因为token数据⽐较特殊,在很多 模块中都可能会⽤到,vuex⽅便管理,配合本地存储⽐如localstorage,是因为vu ...

  4. 《使用Gin框架构建分布式应用》阅读笔记:p77-p87

    <用Gin框架构建分布式应用>学习第5天,p77-p87总结,总计11页. 一.技术总结 1.Go知识点 (1)context 2.on-premises software p80, A ...

  5. 容器部署DNS你会吗?

    docker快速部署DNS,实现快速上线 概念 环境介绍 部署DNS 下载相关镜像 创建并启动DNS容器 简单介绍三种创建方式 容器启动停止 创建dns交互式容器 配置DNS容器相关配置 测试 修改客 ...

  6. Flink Checkpoint & Savepoint

    Flink checkpoint Checkpoint是Flink实现容错机制最核心的功能,能够根据配置周期性地基于Stream中各个Operator的状态来生成Snapshot,从而将这些状态数据定 ...

  7. git常见问题Q&A

    git基本命令解释 git restore --staged .:移除暂存区文件,不影响本地(撤销git add . 操作) git add -u:将删除文件的操作同步到暂存区.将本地的删除同步到版本 ...

  8. 10-3 定制操作lambda

    目录 10.3.1 向算法传递函数 谓词 排序算法 10.3.2 lambda表达式 引入 介绍lambda 向lambda传递参数 使用捕获列表 调用find_if 使用for_each 完整的bi ...

  9. 一文搞懂 ARM 64 系列: PACISB

    1 PAC AMR64提供了PAC(Pointer Authentication Code)机制. 所谓PAC,简单来说就是使用存储在芯片硬件上的「密钥」,一个「上下文」,与「指针地址」进行加密计算, ...

  10. i-MES生产制造管理系统-可视化看板

    可视化看板最主要的目的是为了将生产状况透明化,让大家能够快速了解当前的生产状况以及进度,通过大数据汇总分析,为管理层做决策提供数据支撑,看板数据必须达到以下基本要求: 数据准确--真实反映生产情况 数 ...