一年之前的那段时间,我一直在维护一个断断续续持续了近5年的项目的程序,直观的印象的惨不忍睹,从未读过如此糟糕的代码。没有任何的设计,完全是想到哪里写到哪里。代码中细节非常多,最明显的是有大量的临时使用的中间变量,从不自己定义对象,需要数据结构的时候,就随便的定义一个list或者一个map凑合着使用。而且从来不用泛型,对于IDE工具的警告置之不理。大段大段重复的代码,从来不提取方法,需要相似的功能就直接把代码段复制过去,然后修改几个变量。从来不使用foreach循环,偏爱while+迭代器。大多数的类都超过3000行,大多数的方法都在150行上下。而且还没有任何的文档,或者DOC注释。程序中虽然有一些注释,但是基本上如同梦中呓语,不知所云。还有大段大段注释掉的代码,总之可读性极差。
这个项目还有一个显著的特点,就是在竭尽全力的使代码行数增多,而且尽可能的写的晦涩,使用大量的错别字来误导你,让你不读它200行的逻辑就不明白它的意思。临时变量不但多而且名称还特别怪,都是一些符号,既不是汉语拼音也不是英文,大小写还很随意,想大写就大写,想小写就小写,完全没有规律,就像被混淆过的。最为过分的是,居然还有大段大段完全无用的代码,这些代码的执行对于方法的结果完全没有影响,删除之后程序完全正常。WTF?
这个项目还有一个有趣的地方,就是似乎完全不知道java的命名约定,类名和接口名称想大写就大写,想小写就小写,既不用骆驼命名法,也不用下划线。错别字奇多,使用英文单词,要不少几个字母,要么多几个字母,总之就是故意恶心你。完全不知道java是有对象的,特别喜欢在方法里罗列一堆一堆的String或者Strhig数组。特别喜欢用sb(StringBuilder)的append来自己拼接JSON字符串,想怎么拼就怎么拼,明明就是一个字符串,还是要拆成好几个append拼接。有的时候这个拼接的过程跨越上百行代码。特别喜欢拼sql玩,而且分的很开,之间毫无关系,先拼几个条件,然后干点别的事情,在忽然拼一个表名,再拼几个条件,过程拉的很开很大气,总之凡是拼接的至少都要跨越几百行。
其实我觉得在这个代码基础上做任何的修补工作都是无济于事的。就如同让鲁迅来修改小学生的作文,让王羲之来修改毛新宇的书法,让食神把一泡狗屎做成美味一样。最好的做法其实就是重做吧。注意是重做不是重构。重构也是要有基础的,不是什么样的代码都能够重构的出来,至少要基本正确才行。
这个项目让我更加的明白了框架的作用,我一直在思考,如果这个项目使用了Sping会怎么样?因为Spring里面有很好的JDBC封装,很好的MVC封装,大概不会让程序变成现在这个样子吧。框架可以限制水平差的程序员的破坏性。我觉得我的老板并没有认识到这个问题。因为他水平太高了,他总觉得我们的这个项目的功能是十分简单的。而且他十分的重视数据模型的设计,认为数据模型才是系统的核心。他这个理解其实不能说是错的。但是在我看来,一个项目,他的方方面面其实都是非常重要的,而且最需要关心的其实就是代码的质量。你数据模型设计的再好,没有好的应用,也无法体现出来。应用层其实才是系统最具有价值的地方。因为数据其实仅仅是原材料,再好的数据没有应用的支持,也无法发挥其作用的。
不重视代码质量其实是很多软件公司的通病。大家都喜欢与天花乱坠的设计,以及花里胡哨的功能,却从来不关心实现是怎么做的。也从来不认为实现也是一个极具技术含量的工作。这种错误的认识毁灭了无数花哨的设计,终结了无数的公司以及创业的梦想。而其实成功总是从脚踏实地中得来的,必须要关注每一个细节。