作者: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或内存数据库或引擎模式或插件模式或商业组件或内嵌动态语言或智能算法来解决,不要寻求花拳绣腿重复造*,客户或公司需要的是稳定可靠的软件产品,不是各种框架的坑。
作者:墨晓竹
链接:http://www.zhihu.com/question/36032573/answer/105555679
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
对于那个赞成次数最多的东西,我只能觉得这个人真的已经钻牛角尖了,没法解释。各种框架和模式的意义就是提高开发效率,减少重复造*的过程。
现在程序有几个重要原则:1.一个函数(方法)只做一件事 2.方法尽可能的简化 3.DRY 4.持续重构代码。
把 @find goo 的意思直译过来就是别用框架自己写,都是过度设计,没用。最终结果是什么呢?就是这个程序足够大的时候,你不断共通,不断的抽象化代码,结果就是你的程序的底层代码就是一个框架。
再次从来不觉得为了设计模式是增加复杂度,其实设计模式不是生搬硬套的。只有你需要的时候你才去用,这才是正道。设计模式是编程里的工具,就如同计算机是生活的工具一样,该用的用,不该用的别用。
假设一个网站合起来也不过10个HTML页面,还不需要什么后台编辑,你说你非得SpringMVC Mybatis什么的,你不是抽风么,我找个美工不就搞定了。
个人之前也遇到过,当时有一个项目后台有一个工厂方法,总共产生的类,不过才2-3个,所以就没有用工厂,过了一段时间以后,客户那边业务扩展,产品扩张,一下子增长到10个左右,这个时候你还不用工厂模式,那这个东西怎么搞?
再说了,什么叫重复造*?本来呢,就像工厂方法一样,本来只写一个地方,结果你在十个地方都写相同的代码,你说是不是抽风了?如果再修改,你是在给自己增加负担吗?
我们不否认框架为了满足更多人的需求提供了许多额外的接口和功能,这些接口和功能在某一个项目上用的很少,只用了几个核心的功能,但是这些额外的接口和功能在现在计算机的性能上我们完全可以忽略不计。
照 @find goo所言,世界上最快的程序就是只有一个main函数了,毕竟函数的调用也是花时间了,难道我们就不去做设计了吗?
我们提倡大家使用框架,但是得适度的使用,否则就成了累赘了,用框架别把自己埋里面,你得明白框架的意义,和能解决的问题。
JavaEE就是一套规范和框架,难道这套框架还降低大家开发JavaWeb程序的效率了?只能说见识浅薄。