是他妈傻子写的么?

最近帮一个朋友做些Community Server改造的工作, 说实话, 我早就对这玩意深恶痛绝了, 也许是太长时间不干, 恶心劲儿过去了, 也就勉强答应了。

今天看了一段代码,我就他妈那一个操, 这是他妈傻子写的么? 傻子能写出二十来万行代码外加几十万行杂七杂八的aspx以及配置文件, 也真不容易。

想想这玩意儿居然也卖的出去, 卖的还挺贵, 我真得琢磨琢磨了。 说实在的, 虽然Discuz大多数地方和丫估计在一个水平线上, 有些涉及到认识方面的水平还稍低(虽然Community Server就一大杂烩), 不过Discuz绝不会有这么傻的开发人员。

那些Community Server对一些问题的正确认识(其实也就那几点), 也绝非因为他们脑子更好使或者知识更多, 只不过正好处在IT行业的风口浪尖, 受外部环境影响, 不小心就按照正确的方式理解了罢了。问题是理解对不代表用的好,所以CS的维护和二次开发成本居然会那么高。

微软居然也敢用它的产品,这说明什么?美国人的脑子怎么长的真是值得研究一下; 顺便又想起前阵子美国程序员效率是中国程序员10倍的××言论了。严重支持Discuz好好完善, 进军美国。

说实话, 这世界上烂货很多, 水平高的组织很少, 好多兄弟就是不相信这一点, 不相信自己绝对能超过这帮丫的, 于是一辈子就是一打工仔。 也许只有傻子才能义无反顾的拿着一把刷子就上了。

该聪明的地方聪明,该傻的地方看来还真得傻点。

Update 自回复:

更早的版本,2.1 SP3, 不过除非2007和2008是完全重写的, 否则我敢打包票很多问题还在。

比如: Pemission.Administer, 如果你是一个Gallery的Onwer你就有这个权限,如果你是Weblog的,却不能保证; 当然这是从数据持久上就出问题了,问题是初始化Gallery和Weblog这个数据的SQL就肩并肩挨在一起, 怎么也看见了。在整个项目里查, 它没有用Administer去进行Blog的权限检查, 但是Gallery和其它一些ApplicationType却用了,也就是说这是一个全面的不统一, 而不是一个失误。

这样的问题, 也不仅仅这一处, 要真仔细挑, 估计且得挑一阵子挑不完。不一致性隐藏在伪装一致性之中, 比重复代码还烂。 这些并不是那种普通的缺陷,而是说明他们的开发人员缺乏很多一直被倡导的优良理念。

然后你看看PostCategory的Sort,比如NameDesc和Name, 他们自己写了一个继承自DropDown的控件, 里面SortOrder和SortBy基于Sort和SortBy的enum.ToString()相加去DropDownList.Items查找,这一块实现的效率、优雅咱们都不谈, 居然会加出NameDesc_Descending这样的东西,然后根本查找不到。

可能有些人觉得写出这样的代码只不过是一时失误(比如程序员累了烦躁了什么的), 其实根本不是。 这就是典型的不合格程序员的不合格设计思路,导致这种问题频出, 他们所谓的“支持资源太多”, 完全是因为他们自己弄得烂,导致越扩展,维护成本越高昂。

确实,他们对ASP.NET的机制认识很好, 非常好, 相当的好。 但是没有更基本的指导思想, 把握不住正确的视角, 最后就只会把正确的认识用到错误的地方。比如他们的Theme系统充分的利用的ASP.NET WebForm的特点,可是仔细摸一下, 脉络却非常不清楚, 各种不同层面的行为、概念,全都交织在一起。

再说流程, 由于没有建立统一的基于过程和请求的上下文模型而仅仅搞一个CSContext这样的当前请求全局对象, 导致不同控件对多个相同的Routine的多次*无必要*的重复。而CSContext的设计也是漏洞百出: 除了少数几个基本的属性,根本无法判断什么属性在什么时候其值是健康的。

再说所谓的大客户,大客户的Section应该很多吧? 微软早在2.1之前就用他们的程序了, 你看看Section的获取这一块写的, 获取全部的Section然后再foreach看看哪个符合条件。 大客户有钱买硬件, 也不能这么浪费啊。

硬编码根本不是关键问题, 各种相似子程序的重复太厉害了; 比如Gallery和Weblog很多地方代码除了类型变了,细节稍微有点不同, 总体来说就没什么变化,基本就是复制粘贴的结果。 而好不容易复用的东西, 又经常产生了隐蔽的非正交,导致问题很多。如果不是一处两处, 我觉得就很说明问题了, 其开发者根本就不知道如何就这种相似进行合理的设计(虽然前瞻性不靠谱, 但是也不能一点这种能力都没有吧), 只能等不堪重负,再根据现有情况重构。

如果整理一下的话,功能不变的前提下,我判断它的代码至少可以精简到一半(说白了就是拿现在的版本当个素材库整个重写)。 如果没有这种大动作,我敢打包票, 无论他们重构出什么东西, 很快就又会产生新的问题。 这根本不是代码的问题, 而是人的水平问题; 而且他们的水平长进速度也是相当的慢。

比如最上面提到的Permission的问题, 可以想象是因为缺乏统一性而不愿意轻易动以前的设定, 问题是个现代程序员都知道, 对这种问题姑息下去, 最终会越来越糟; 可是只要程序还能转, 就克服不了心里的阻力去统一一下。 CS升级这么多年了,里面各个方面到处都是这种妥协, 都成了习惯了, 这样的开发和维护过程最终必定积重难返。

这个产品(如果2007/2008不是推倒重来的), 除了你说的确实体现了他们对ASP.NET的认识, 从头到尾是不折不扣的垃圾。 以我现在看问题的方式,如果让我选择, 我宁可选一个ASP式的东西,也不愿意用它; 可惜微软平台上, 如果二次开发, 就他功能最全了。

说实在的, 要是我这朋友有足够的资金和人力, 我绝不会让他基于Community Server做二次开发。
原文地址:https://www.cnblogs.com/guaiguai/p/1141266.html