作者:find goo
链接:http://www.zhihu.com/question/36032573/answer/94592816
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

我为什么反对用各类框架。

什么ssh,orm,spring,struct,复杂,速度慢,最后把自已框进去了。

如果有有一百万种框架学一百万年后,知道了那个最好,再开发?
(这句话原本是,是如果人类几百年后有一百万种疫苗,你打一百万种疫苗来防病?这不是根本解决之道,根本解决之道是卫生锻炼)

java占语言榜第一,全世界实际各个公司框架加在一起超过了一百万种。

答案是否定的,因为人的精力是有限的。

软件开发中复杂不会消失,用多种框架,复杂因会从代码跑到xml,更加复杂。

与其用各类多如牛毛的框架,多如牛毛的配置,不如用好jsp。

一,可视化是关键

为什么用jsp,当然是有原因的,一是ide支持,各个java ide都支持jsp,包括dreamwaver,好排版。你用各个标签ide不支持或支持有限,相当于用cgi拼文本来开发。

二、热更新

jsp和php类似支持热布置,各类标签,标注,模块,都是在走邪路,你要再开发一套支持它的ide或web排版工具,这不是捡了芝麻丢了西瓜。你再开发类似jsp的热更新,你又在重复造轮子。

三、jquery+ajax+json淘汰了mvc

没有ajax时,html标签和js,和jsp混在一起,但有了json,view层(html+jquery)通过json和c层(类似servlet,无html的jsp)通信,这样,在服务器实际mvc没有任何意义。

四、动态语言淘汰了spring

什么aop,ioc,各种概念无非是实际了动态化加载,关键用的xml丑陋无比。

其实软件需要动态性时我只要加入动态语言如groovy,beanshell,jtyhon,如beanshell(才200kb),你玩各种概念时,我已经用动态语言+代码生成器实现业务逻辑,早就好了,而且动态性没有我的高,我可以放入数据库中,web中做到真正的动态。

五、代码生成器淘汰了orm

第一次用orm时感觉很oop,但现在感觉orm是为了oop而oop,性能低下会导致你的网站没有可伸缩性,12306初期慢一部分归功于orm。不要忘了jdbc,其实这些orm代码我可以用代码生成器从jdbc生成orm,比各类orm性能高得多。

这样构建系统就不用ssh了。

显示层:jsp+jquery(json)+jsp.service=jsp做排版html+另一个jsp做排版json提供接口

jsp(只返回json)调用逻辑层。

逻辑层:groovy+java,必要时groovy的dsl也可以用上

数据访问层:代码生成器,生成类似orm,主要是灵活,性能最高,方便省事。

这样的快速开发,业务逻辑用groovy vs java+代码生成器的jdbc+jsp(也可用代码生成器生成部分),性能比ssh高得多,开发速度也快得多。

c,c++,python,c#,php,不用spring一样管理好程序,程序的框架说白了是一种管理代码能力,面向过程一样能管理好程序,java现在是过度oop的,过度设计模式,过度interface,过度xml,过度强调设计,过度依赖框架,很多优秀的开源工程,很少引用各种jar包,而各大做类erp的信息管理程序,一个程序本身可能只有几m,而jar包达到几百m,几个g,需要ibm的机器才能跑得动。

反思java,在web上,php就很好用,为什么?实际上jsp,完全可以胜过php,但因为引入了java的框架,导致jsp依赖下面的各种jar包,最后成了重量轻的框架,说实在的根本没必要引用各种多于牛毛的框架与jar包。因为引入任何框架和jar包会导致性能下降厉害,越是重量级的,越是下降得厉害,因为反射消耗性能。不要跟我说性能不重要,你写几个人用的程序,用asp就可以搞定,如果你写类似google全球人用的程序,每节省1%,服务器电费就节省1%。

反思java,是让java回归到简单模式,任何复杂,不会因为你用了什么语言会降低复杂性,复杂是守恒的,但语言的特征会带来复杂的乘数,如果java的框架把复杂乘数加到几倍,又是走入了c++的复杂泥谭,很多时候,我们只要写个代码生成器,根本不要什么ioc,aop,反射,这种影响性能的东西,用这些东西,我还不如直接加入jython,groovy,这种动态语言,如同c++加入lua一样。

c语言进入了依赖指针的泥潭(除数组传值你会死吗?)

c++进入了模板的泥潭(能不能不要用模板装(a_c)?)

c#进入了拖拉控件的泥潭(生成的html你看得下去吗?)

java进入了过度框架的泥潭(不用框架就不能编程?)

我现在的c#代码生成器用的codesmith,
crud整个框架的80%以上代码完全在ide中自动生成。

我用的java代码生成器是mygeneration,比codesmith慢一点,但也比eclipse的灵活得多,可直接生成js,html,crud程序75%以上代码可以自动生成

我的c++,python代码生成器也是mygeneration,因为mygeneration是开源可以生成任意语言,codesmith和vs集成好但不开源

说到分层,看到分一层的php,asp程序很好用,分二层的winform可以快速开发,分三层的java很多,mvc+三层开始复杂,html+jquery+json+mvc+三层开始头痛,最后发现有人用十二层,十五层做开发,中间分通信层,反sql注入层,报表层,安全检查层,插件层,业务流层,性能分析层,mock数据层,缓存处理层,负载均衡层等等,每层之间用spring强行隔离,报起错来大汗淋头,你这不是带着镣铐带着木枷跳舞吗?如果不是我骂他们,估计要分到十八层。下次干脆把开发人员放地狱拉倒。而且用你们这种框架分层开发出来的东西根本没办法复用,不符合软件工程的基本理论,软件主要讲究复用,用你这种框架出来后,能打个jar包到android下用吗?显然不能,因为依赖框架太多,很多框架在android下用不了或jar太大不好用。表面上追求复用无所不用其极,实际上你又进入了依赖分层,依赖框架的不可复用软件开发的陷阱上去了。

如果你要处罚一个程序员,让他用java的十八层框架开发,呵呵!

java已经很慢,不要再用框架绑住了java的腿,不用把代码写进xml,不要使用存储过程,不要使用orm,不要使用spring,不要使用struts,不要使用servlet。

用jquery代替mvc,用json代替mvc,用jsp代替mvc,代替servlet,用groovy代替spring,用代码生成器代替orm。

jsp(做html显示,除session权限外没有任何java代码,和java没关系,方便美工可视化编辑)+jquery(ajax,获取json绑定)+jsp(调用业务逻辑java类,根据java业务逻辑生成json返回,没用任何html,类似restful接口)。

另外数据库表不要用自增id,用程序生成唯一标识符,现在硬盘都tb级别了,省几个字节解决不了问题,那一天数据访问量上去了,你的程序也不用改成id,分布性好,如果uuid太长,用base64转一下。

这个极其简单方案比ssh方便得多,性能高得多,可以分布式运行,伸缩性很好。

反思框架,反思框架,反思框架,重要的事说三遍。

c语言面向过程,一样管理几千万行的linux系统。

python面向过程,一样开发引力波程序。

c++面向过程和oop,一样可以开发搜索引擎。

不要把面向对象oop当做宝,面向对象主要是模拟人的思维,而人的思维和电脑是不一样的,所以面向对象性能低下,c++实际上通过编译把oop编译成了面向过程程序。其实很多时间用一个dsl动态程序或数据库操作就可以轻松搞定的,非要搞什么ioc,aop,反射,这种反人类的xml配置,结果Java成了web开发中复杂的代名词,和c++成了复杂语言一样,走偏了路。

用java开的android为什么比ios下的obj-c慢,原因很简单,过度包装过度设计,加上java虚拟机,影响性能,有了八核还会卡。有什么功能是ios实现不了,而android可以实现,几乎没有。android表面上设计先进,但实际是陷入了过度包装,过度设计的陷阱中。unix/ios/osx/linux/nginx,这种简单设计的软件,性能稳定而直接。

面向对象(类,接口,泛型,等,复杂度设5)比面向过程复杂(函数,文件管理,算法,复杂度设3),如果加上框架(复杂度设10种),加上设计模式(复杂度23种),5*3*10*23=3450,复杂度超过了3450,再加上系统本身的复杂度(设为20),3450*20=69000,所以面向对象的复杂性,需要一个图书馆才能写下,所以类似c++这种可以用模板,用宏,用多重承继,用多级指针,用多种库的程序更加复杂,最后导致没人愿意用或只取一个子集,java的框架常见的有几十种,如果加上分层十来种,加上xml的复杂度,加上反射,加上工程化这些,程序的复杂度开始赶上c++了。所以很多老程序员宁愿用go语言,python语言,用php,用c语言,这种简单直观的程序,否则会掉进复杂程序的几万种排列组合的大坑中不能自拔,只会感觉软件越写越累,越写越烂,越写越慢,越写越不可维护,越写越需要学习更多。

大家都下过棋,普通人业余学学,五子棋几个子最简单,所以不需要学习,几分钟就入门了,象棋(明白几子规则即可)需要学习几天入门,而围棋(布局,定式,打劫,大龙对杀,妙手,收宫,流派要学的太多了,需要从几岁学起学几十年才有可能成为大师)因为复杂维数太大,需要学习几年,用电脑则需要google那种一天电费n万的深度学习系统才能玩得转,因为这种复杂性的增长到了后面会是指数增长,根本没办法控制。很多软件工程就是死在复杂性指数增长上,复杂度上去了,多一个乘数会把风险放大十倍以上,完不成任务是必定的,加班也是无法逃脱的。

过度设计,过度包装都不是好事,c++的模板类就是过度设计的结果,java中的各类框架也是过度设计结果。

我现在用面向对象用的是带类和接口的面向过程语言,尽量不用泛型,反射,动态加载,因为根本没必要,只要增加本项目的复杂度,如同用带模板的c++开发程序,如atl,这种东西很烦人,报起错误来一兜一兜的。

别为了技术而玩技术,如同c++一样,复杂被玩坏了,都没有人想学它了,java也是被这样技术狂热份子搞得越来越复杂,结果开发时间都浪费在这种复杂性学习和调试下,因为业务逻辑就很复杂,你再搞这个复杂乘数一乘,嘿嘿,自我折磨。

搞个xml配置就已为搞了个大新闻?实际上实现动态性的很多方法比这个水平高多了,比华来士的炸鸡更香。黑黑。

如果你跳出java接触了更多的软件或框架,很多程序根本不需要sping这种东西,如sap是用abap做为业务语言,是编译支持的,不需要Java这种复杂配置,virtualbox可以用python开发插件,很多游戏是用lua+c++实现动态性,firefox用的引擎加插件实现动态性,office是用的vba实现动态性,很多oa用提工作流实现动态性,最不管用的用友u8用的是多放几个备用字段实现动态性,最新的云计算公司用微服务实现动态性,还有一些商业开发平台用的是元数据实现动态性(和数据库原理一样),还用很多规则引擎,dsl,外挂,插件系统。。。总之静态语言实现动态性方法很多,或直接用python等动态语言,根本不需要用spring。

在只有sql数据库时代,人们总认为符合三范式的设计才是合格的设计,才是理所当然,等到移动互联网,大数据时代一来,三范式反而成了性能的裹脚布。软件开发,程序设计没有一层不变的真理,没有金科玉律,不要迷信前人的结论,有时需要反思,有时需要简化,需要以结果为导向,以效果为追求,才能取长补短。未来程序的框架和设计会越来越面向业务,而不是大一统的ssh这种缺乏弹性与伸缩性的n层的低性能框架。

ssh这种框架来源于sun的ejb的开源实现,ejb掉进了重量级的坑,sun以前一直靠卖提高这种重量级框架性能的服务器支撑着这个坑,据说有的做成cpu硬件指令,后来卖不掉了,不行了就卖给了oracle,前车之鉴,和c#的winform一样的,是两大奇葩,是oop过度设计的结果。主要原因是过度包装,过度设计影响服务器性能,框架复杂度乘数增长了软件工程成本,需要更多的人,天天在招人,天天在加班,需要更科层化的组织,更多签字的领导,很多程序弄来弄去只是内部的interface,程序内耗和沟通成本成指数增长。以至于一个操作系统内核面向过程语言可能十人就可以扛起80%代码,而一个类erp的oop框架系统可能需要上百个开发人员还不够,一个人加几个帮手可能开发出初始的android 系统,而几个团队可能开发一个android应用还吃力。可见简化管理能带来工作效率的提高,过度oop,复杂框架或设计是自找麻烦。

君不见一个facebook的phper可以和google比肩,三个程序员的独角兽公司可以秒国内n个程序员的类erp。他们肯定不是用ssh这种重量级框架。

面向过程开发者天天在旅游体验大道至简写好一个函数,面向对象开发者天天在梦游总想发明银弹实现万能框架。

总之用最简单方法管理代码,不为了oop而oop,相信类似c语言函数,加简单类式管理,这样管理就很简洁,只要管理方法好,同样能管理几千万行代码,这样学习成本低,调试方便直观。不要沉浸在框架与银弹设计(类似民科制造永动机)中,不断重复制造轮子。赶紧从各框架和造轮子功夫解放出来,用简单直观的方法设计程序,解决业务问题才是根本,复杂的问题用dsl或内存数据库或引擎模式或插件模式或商业组件或内嵌动态语言或智能算法来解决,不要寻求花拳绣腿重复造轮子,客户或公司需要的是稳定可靠的软件产品,不是各种框架的坑。

我为什么反对用各类框架相关推荐

  1. GitHub上受欢迎的Android UI Library-项目开发实战篇:带各类框架链接地址详细解说及使用方法

    这是我列举的下列所有框架github地址:https : //github.com/opendigg/awesome-github-android-ui 抽屉菜单类的框架 MaterialDrawer ...

  2. 各种框架性能分析,和语言性能分析

    作者:find goo 链接:http://www.zhihu.com/question/36032573/answer/94592816 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非 ...

  3. 程序员为什么焦虑于编程语言和框架?

    近日读到一篇文章,作者是做海量分布式服务器系统设计开发的,文中提到: 核心能力是什么?是架构设计,关键细节设计的能力和经验. 在海量服务器设计领域,核心能力,大概包含物理设计和软件设计.物理设计包含: ...

  4. 训练 GPT-3,为什么原有的深度学习框架吃不消?

    本文梳理了深度学习框架在支持大规模预训练模型时面临的技术挑战,以及当前各类框架的基本解决思路,帮助算法工程师对业界各类框架的分布式训练能力有更清晰的认知. 作者 | 一流科技CEO袁进辉 头图 | 下 ...

  5. php框架是不是累赘,PHP框架,伤不起啊,伤不起

    自从Rails刮起了一阵框架风,其它语言群起响应,Java,Python,Scala,PHP,无论静态动态语言都出现了模仿Rails模式的框架出现,其中,PHP语言的框架生产力更是一流,主流的PHP框 ...

  6. 机器学习入门(二):工具与框架的选择

    原址 所需工具 根据具体场景的需要(科研/工程),以及团队规模大小,开发人员能力等问题,选择合适的语言及框架和辅助工具来进行开发是十分必要的.这不但降低了开发难度,同时也提升了开发效率. 由于框架的快 ...

  7. html5响应式前端设计,15个最新的响应式设计前端框架

    你会发现,随着响应式Web设计的不断成熟,各类框架也变得越发健壮和可靠.也许是受到了Bootstrap.Foundation和Gumby的影响,如今很多新的框架都开始向一体化多功能的模式进化,它们提供 ...

  8. 写自己的ASP.NET MVC框架(上)

     开始 ASP.NET程序的几种开发方式 介绍我的MVC框架 我的MVC框架设计架构 回忆以往AJAX的实现方式 MyMVC中实现AJAX的方式 如何使用MyMVC框架中的AJAX功能 配置MyM ...

  9. 云原生Web服务框架ESA Restlight

    云原生Web服务框架ESA Restlight ESA Stack(Elastic Service Architecture) 是OPPO云计算中心孵化的技术品牌,致力于微服务相关技术栈,帮助用户快速 ...

最新文章

  1. VSS admin用户忘记密码的解决方法
  2. 第一章——数据结构之绪论
  3. Ubuntu下添加定时任务执行php文件
  4. 云上高并发系统改造最佳实践
  5. 『操作系统』 进程的描述与控制 Part4 线程
  6. 网页视频15分钟自动暂停_在15分钟内学习网页爬取
  7. linux 分区 flags,linux磁盘分区
  8. centos6.5 x86_64安装rsyslog + loganalyzer
  9. java创建数据库mysql数据库_用Java创建MySQL数据库
  10. LeetCode 103——二叉树的锯齿形层次遍历
  11. Tomcat------如何配置域名和80端口
  12. 计算机应用基础教学改革参考文献,计算机考试论文,关于计算机等级考试计算机应用基础教学改革相关参考文献资料-免费论文范文...
  13. 苹果APP Store应用上架流程
  14. 教你打造 Win7 中的高清设备图标
  15. 微信小程序实现物流步骤条
  16. 使用meshBaker合并多个mesh进行优化
  17. 金山助手流氓软件-被进程sjk_daemon.exe坑死
  18. 两份重磅文件明确互联网平台分类分级,淘宝、微信、抖音等将迎“超级监管”...
  19. FRM 5.3业绩衡量比率
  20. ubuntu 19.04 与win10双系统 搜狗输入法安装教程

热门文章

  1. 原创 导出微信收藏到电脑
  2. 使用endnote自动批量生成毕业论文参考文献
  3. TIFF图像文件(四):LZW压缩
  4. 谷歌Chrome浏览器就能远程控制安卓手机,电脑远程控制手机的快捷方法get!
  5. 记一次git pull 错误
  6. w ndows7与windows10区别,windows7和10区别
  7. 共阳极、共阴极数码管编码表(0~9、A~P……全亮)
  8. JS 之 图片编辑器插件
  9. Js勾选同意协议教程-更新篇
  10. CSS教程:dashed和dotted的区别