`
cyberblue
  • 浏览: 12379 次
  • 性别: Icon_minigender_1
  • 来自: 天津
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

为什么我拒绝Spring项目

阅读更多
为什么我拒绝Spring项目?就是因为Spring项目的高失败率。在国内一线城市里的表现还不明显,因为有政府和国企的采购托着一线城市众多的软件公司,养活了太多的不应该存在的公司和产品,但是在二线城市表现得就非常明显了,因为二线城市的政府和国企项目金额少很多,数量上也差得远,现有合同额难以填满Spring项目的损耗,亏损是必然的,甚至不少一线城市的公司都在抱怨二线城市里政府项目的钱难挣,不少二线城市的公司从一线城市重金挖来的团队却把公司赔个底掉。据我观察,每十个Spring项目中,至少有7到8个是失败的,大部分投资并没有得到回报,活下来的项目至少有一半也是和政府和国企相关且质量低劣(原因很简单,既然高损耗无法避免,那么只能靠降低质量盈利了),Spring成了名副其实的浪费民脂民膏的东西。招聘方面的情况就是这个现象的旁证,二线城市以Spring为主要技术架构的公司特别是初创公司,每三年就会大面积更换,消失的那些公司除了少部分是因为更名外,绝大部分都死掉了。虽然Spring项目不需要在收费的应用服务器上运行,但是在你上手之後,很多足以压垮项目的隐性成本就逐渐显现,在下文中就为您细细讲来。

一、非标准化带来的成本上升

Spring的风格更像是一种反叛,有人说生产力的发展需要反叛精神,但是反叛的结果可不一定是光明的未来,我们经常看到是一地鸡毛,况且做产品需要科学精神和工匠精神而不是反叛精神,我们看到的Spring项目中那些“炫酷”的东西里充斥着太多的隐患,最让人诟病的是静态变量和滥用的线程,以至於在标准化的JavaEE和JavaWeb容器上无法重新部署,非要重新启动服务器不可,浪费的时间大家可以自己计算一下。在JBoss或Weblogic上开发和运行一个Spring项目更是困难重重,只能在tomcat和jetty等功能简单的服务器上运行,如果你想念应用服务器上的很多便捷的功能,对不起,你最好选择功能相近的Spring模块,否则就是无尽的麻烦,这些模块里的bug和设计问题,你只能默默忍受。因为Spring是非标准化的,你不要再想像以前一样从Weblogic、Websphere和JBoss之间互相迁移,你的项目已经被Spring套牢了,你不满意也没有退路。

二、Spring是一堆半成品的松散组合而非整套方案

Spring给人的印象,就是一大堆的软件半成品,几乎所有功能都需要人手动组合,每个开发都有自己的组合方法,而且Spring代码库复杂,一旦遇到Spring模块中的bug很难定位到出问题的地方,要么自己修正要么想办法避开,对付模块组合中的问题你需要付出很多额外的成本。另外由於每个开发者都有自己的模块组合方式,造成他人难以适应。标准的JavaEE项目在其他人接手时通过代码和配置文件很容易就可以梳理出清晰的脉络,但是如果你接手的是Spring项目,这个基本上很难,更别说你碰上个奇葩架构师。

三、Bug成堆

笔者遭遇过Spring MVC、Spring Security上的好几个bug,还有几个filter里的bug无法确切定位是哪个Spring Filter里带来的,甚至对HTTP POST信息的解析都有bug,开发过程中这些bug造成了很多麻烦,至少我以前在应用服务器上做JavaEE开发时从来没遇到过这么多严重的问题。而且,因为Spring是非标准化的,你没有替代品,你只能硬着头皮用下去,绕过这些bug所造成的时间成本你也只能硬扛下去。为了解决这些问题,你需要雇佣很多“Spring高手”来解决问题,你从应用服务器上省下来的钱就这么逐渐被消耗殆尽,更别说浪费的时间成本。这是造成Spring项目在後期步履维艰的一个重要原因。

四、被单一提供商套牢

之前在使用标准的JavaEE应用服务器开发时,如果对方对可靠性和可扩展性比较在乎,你可以选择Websphere和Weblogic等知名厂商的产品,这些应用服务器一般都带有灾难恢复和集群功能,你可以免去很多开发工作,如果你要做的软件比较简单,JavaEE的基本功能就够用了,你完全可以选择开源免费的JBoss,而且JBoss的灾难恢复和集群功能同样很牢靠,如果你需要更轻量级,你可以选择Apache的TomEE。但如果你选择了Spring,对不起,你将不再有这种辗转腾挪的空间,你只能按照Spring的行事方式行事,研究他们的模块,处理他们的bug,你甚至不再像以前一样享有不满意的权利,因为你没有其它兼容的产品可以选择,悬崖勒马对於Spring开发者来讲是一种奢望,你只能按着Spring给你的路一直走下去,哪怕结局是失败。

五、人员浪费

因为Spring的架构是一堆需要自行组合的半成品,没有良好的封装,所以启动一个项目需要招募更多的开发者来组合这对半成品并测试其中的问题,使用更多的开发者来做以前完成了无数次的工作,这本身就是一种浪费,在项目推进过程中,仍然会间歇性地遭遇到那些半成品组合後出现的问题。经本人观察,无论是启动项目的人数和项目膨胀後的最大规模,Spring项目在人员上的投入往往是标准JavaEE项目的两倍。

六、开发水平的倒挂

Spring这种松散的架构理应需要水平更高的开发者来使用,实际上并非如此,这种经过大量定制的松散架构理应是软件中的奢侈品,因为它没有标准化的接口和独立的模块设计,但大多数参与Spring项目的人员都是接受培训没多久的新手,工程思想和对工程师文化的认识都欠缺。就算是老手,搞通Spring这种松散架构也要付出比标准JavaEE项目更多的努力,在实际项目过程中,Spring项目到了後期无一例外地陷入混乱。不少人这时候都想到一个“妙招”,就是将Spring项目的架构进行中央集权式的统一管理,这种做法在初期都会显现出一些好的效果,但在後期效果却反过来,由於没有考虑到不同开发者的不同情况,这种方法做出来的架构到後期往往会发生比前者混乱得多得局面,然後仓促的加入很多东西导致整个项目每一步都走得异常艰难。那些所谓的“创造性思维”,在成本面前是那么的软弱无力。

在现实情况下,将设想变成实际的产品,需要的是设计师和工程师,而非艺术家,产品在用户使用过程中会发生很多意想不到的情况,所以就需要在设计上反复推敲,在实现上细致入微,如果用Spring这种松散架构,你就要做好付出很多额外成本的心理准备,因为Spring里面很多非标准化的设计,没有经过现实的反复考验,会出现很多未知的问题,解决这些问题造成的额外成本往往无法预估,所以Spring这种松散架构只能用来做奢侈品和实验品,难当大任。如果你确定要采用Spring,你就要为这个框架所带来的项目高失败率做好心理准备。
分享到:
评论

相关推荐

    SpringCloud微服务项目:nacos+springsecurity+gateway+令牌桶限流

    本项目聚焦于SpringCloud微服务框架的几个核心组件,包括Nacos、Spring Security、Gateway以及令牌桶限流策略。下面将详细介绍这些知识点。 1. **Nacos**: Nacos是阿里巴巴开源的一款动态配置服务和发现服务,它...

    Spring_Security入门demo(maven项目)

    **Spring Security 入门教程** Spring Security 是一个强大的和高度可定制的身份...通过实践这个项目,开发者将深入理解Spring Security的工作原理,并能将其应用到实际的项目开发中,为应用程序提供可靠的安全保障。

    Spring Security.pdf

    Spring Security是基于Spring框架的身份认证和用户授权的安全框架,其目的在于为Web应用程序提供一套完整的安全性解决方案。Spring Security利用了Servlet过滤器、Spring的依赖注入(IOC)和面向切面编程(AOP)技术...

    Spring Security 完整实例

    例如,可以创建一个名为`CustomUserDetailsService`的类,它连接到自定义的用户和角色表,查询用户信息,并将其转换为Spring Security的`UserDetails`对象。 **自定义登录页面** 默认的Spring Security登录页面是...

    spring+mybatis项目

    - **事务管理**:Spring负责事务的管理,可以设置为编程式事务或声明式事务。声明式事务通常更简便,只需在需要事务的方法上添加@Transactional注解。 2. **SpringMVC处理请求** - **SpringMVC架构**:SpringMVC...

    SpringSecurity入门小demo(SSM+Spring Security)

    **Spring Security ...通过这个小 demo,你可以对 Spring Security 有初步的认识,了解如何在 SSM 项目中集成和配置它,为实际项目中的安全需求打下基础。继续深入学习,你将掌握更复杂的访问控制策略和定制化技巧。

    spring 安全框架例子

    在本文中,我们将深入探讨Spring安全框架的基本概念、核心组件以及如何在实际项目中实现安全控制。 首先,Spring Security是一个强大的、高度可定制的安全框架,它允许开发者在Web应用程序中实现复杂的权限管理。其...

    Spring MVC Security-添加自定义登录表单,显示无效凭据、基于角色的访问、自定义访问被拒绝的错误消息.zip

    这个压缩包包含的项目"SpringMVCSecurity-master"很可能是用来演示如何配置和使用Spring Security来实现自定义登录表单、处理无效凭证、基于角色的访问控制以及自定义访问拒绝错误消息的示例代码。 在Spring ...

    Spring security oauth源码

    Spring Security OAuth 是一个用于保护RESTful Web服务的框架,它为OAuth 1.0a和OAuth 2.0协议提供了全面的支持。在这个源码中,我们可能会看到如何将Spring Security与OAuth结合,以构建安全的Web应用程序和服务。...

    springsecurity使用demo

    通过这个示例,你可以了解如何在实际项目中整合 Spring Security,设置安全策略,以及处理认证和授权的细节。进一步学习 Spring Security 的高级特性,如 LDAP 集成、JWT 令牌、CORS 支持等,将有助于构建更安全的 ...

    spring security demo2

    在"spring security demo2"项目中,我们很显然会深入探索如何在实际应用中配置和使用Spring Security来确保Web应用程序的安全性。让我们详细讨论Spring Security的核心概念、配置以及它在实践中的应用。 1. **核心...

    spring security 参考手册中文版

    23.4.1为什么同源? 185 23.4.2 Spring WebSocket允许的来源 186 23.4.3添加CSRF到Stomp头 186 23.4.4在WebSockets中禁用CSRF 187 23.5使用SockJS 187 23.5.1 SockJS和框架选项 187 23.5.2轻松放松CSRF 188 第五部分...

    Spring Security OAuth 2.0

    Spring Boot Security 是 Spring Boot 的一个子项目,提供了一个简洁的安全解决方案。使用 Spring Boot Security,可以快速构建安全的 Web 应用程序。 首先,需要创建一个 Spring Boot 项目,然后添加 Spring Boot ...

    spring security方法鉴权使用示范项目

    在这个"spring security方法鉴权使用示范项目"中,我们将深入探讨如何利用Spring Security进行方法级别的权限控制。 首先,Spring Security 提供了基于注解的方法安全特性,这允许我们在方法级别定义哪些用户或者...

    Spring Security3.1入门Demo

    本示例是基于Spring Security 3.1版本的一个入门级演示项目,旨在帮助开发者快速理解并开始使用该框架。 在Spring Security 3.1中,主要涉及的核心概念有以下几点: 1. **安全过滤器链**:Spring Security通过一...

    spring_security_management.zip

    通过这个项目,开发者可以深入了解Spring Security的配置和实现细节,学习如何为自己的应用构建安全的用户认证系统。同时,这也是一个很好的实践平台,能够帮助我们熟练掌握Spring Security的核心概念和技术。

    springcloud整合oauth2和jwt

    本篇文章将深入探讨如何在Spring Cloud项目中整合OAuth2和JWT,以及与MyBatis的集成。 首先,OAuth2是一个开放标准,主要用于授权。它允许第三方应用在用户许可的情况下访问其私有资源,而无需获取用户的用户名和...

    一个比较好的spring security实例

    在这个名为 "mysecurity" 的压缩包中,很可能是包含了一个实际的Spring Security配置和示例项目,我们可以从中学习到Spring Security的多个关键知识点。 首先,Spring Security的核心概念包括认证(Authentication...

    spring-security-oauth2-authorization-server.zip

    在这个项目中,我们将配置Spring Security为OAuth2的授权服务器,使用MySQL数据库存储令牌信息。 2. **Resource Server**:保护实际的API,接收带有令牌的请求并验证其有效性。虽然这个项目不直接包含资源服务器,...

Global site tag (gtag.js) - Google Analytics