102年1月14日,写代码的一些感想

    今天吃饭的时候偶然听到同事在谈论东方财富通的下一版要大改。
不过也好,之前同事之间已经在讨论重构东方财富通的问题,但是迟迟不敢改,因为怕开销太大,现在大改的消息一出,我们又把重构的议题摆在桌面上了。当然也不能保证最终进行重构,因为我们的决策层决策的实在是不够干脆。
实际上东方财富通到了今年,它的代码维护成本甚至比重构还要大了。我个人认为彻底重构是一件必然的事情。做软件很有趣,一个软件在被写出来之后,根据时间的推移,终有一天会被大范围重构,或者就弃用了。各个阶段给程序员的心理反馈都很有特点。
以做手机客户端为例(可能后台编程和这个有点偏差),最轻松和有趣的就是白手起家,没有任何历史包袱,这一个阶段往往会有很多的灵感和创意,道路也是如此的明细,让人有只要合理地设计就能构造出一个完美的程序的错觉。虽然这一个阶段工作量巨大无比,但一方面一个软件从无到有会给人很大的成就感,另一方面程序员可以根据自己的喜好来编写自己负责的代码,所以整个过程是非常愉快的。
等到第一版上线之后,要是没有其他新产品要做的话(比如我们公司),就会进入一个非常空闲的修改bug期。因为这一版的代码所有的在职程序员都了如指掌,所以修改bug是相当容易的。一些稍微好一点的程序员会在这个阶段进行小范围地重构代码并且对代码进行比较详细的注释,这既可以加深自己对已经写过代码的了解,又可以帮助下一代程序员读懂自己的意思。但如果遇到不太负责的程序员,那么程序在这个阶段会开始慢慢腐化。但是这个阶段大家心情都还不错。
接下来需求要改了,大家就开始在心里骂一下需求组的变态需求。但是这时候根据需求改程序说难也不难,毕竟大家对自己的代码还是非常了解的。但跟改小bug不同的是,因为需求的变化,在白手起家的时候做出的结构可能开始不适应新的需求。此时好的程序员会再次进行小范围重构,以保证用一个比较明晰的结构来适应新的需求,而不怎么负责的程序员依然在老的基础上通过加减一些变量来完成新需求,而这个过程中代码会进一步腐化。
终于,有几个第一代程序员开始离职了,他们把任务交接给第二代程序员,或者第一代程序员的其他人。这个时候问题开始显现。读别人的代码总是比自己写代码要难一点。在修改他人的代码时,最好先通读一遍了解整体架构,由于此时离白手起家不算太长时间,所以读别人的代码还是比较容易。这时候如果离职的是个高手,那么被交接的程序员就有一个很好的机会来研读他的代码从而学到点东西,如果很不幸离职的是一个不太负责的程序员,这时候被交接者心理肯定各种不爽。如果被交接者是个负责的程序员,那么他可能会在通读一遍之后,按照自己的思路进行适当的小范围重构,而如果被交接者是不太负责的程序员,那么很有可能出现在未读懂别人代码的情况下根据自己的思路增减代码,这个时候,就会出现代码中有一部分被弃用而未被注释或者删除的情况,代码进一步腐化。
事情的分水岭在第一代程序员全部离职之后。这时代码离白手起家已经有很长一段时间了,加之前面几个阶段的腐化,很可能被交接的程序员要通读自己负责的一块已经有点困难了。并且没有了第一代程序员,一些代码的初衷,需要第二代程序员自己去领悟。这时通读代码的代价会越来越高,并且小范围重构的风险已经显现,多数程序员会选择在原先的基础上增减变量来维护,并且一些被弃用的代码,因为风险的缘故,不敢把他们删掉或者注释掉。这个时期出现代码加速腐化的几率会非常高。程序员的心情也会相当糟糕,很多人边骂上一代程序员,边加速代码的腐化,除非有一个比较有魄力的程序员或者领导,对代码进行小范围的重构,但事实是很少发生,因为大多数程序员都关心尽快上线而并不在意代码质量。另外一方面,第二代程序员中可能会有应届毕业生这样的新手存在,在读腐化代码的时候,肯可能会养成一些不好的习惯。
等到第二代程序员全部离职,在第三代程序员维护的时候,如果之前一直没有进行小范围重构,那么随着时间的推移,这个软件的维护成本将成指数形式增长。这个时候维护代码的心情就会极差,甚至程序员会花费很多时间去找某个功能的切入点在哪里。在白手起家阶段很容易的事情,在这个时候会非常困难了,因为你可能看到一个有着一万多行代码的文件,却不知道这一万多行里面哪些是有用哪些是没用的。更不可能去通读一遍。这就是我们现在东方财富通遇到的情况,唯有进行彻底的重构,才能解决问题。
由于我们组同时维护三个大软件,所以以上几个阶段中的大部分我在短短的半年多的时间里都经历过。财富管家我扮演了第一代程序员的角色,第一版上线之后,这个程序就很少去改动了。在天天基金的项目中,我既扮演了第一代程序员的角色,也扮演了接过离职的第一代程序员的任务的被交接者。而在东方财富通的项目中,我们整个组都属于第三代程序员。在这几个月里,我很能感受到开发一个软件白手起家容易,维护起来困难。
其实回头想一想,这跟执政很像。打江山容易,守江山难。很多既有制度在其创立者全部去世之后,需要后人揣摩制度的本意,甚至揣摩制度本身是否还合理,历史文献就像注释一样,帮助下面几代的执政者去领悟前人的意思。然而随着时间流逝,人心的变化,一些制度会出现很多bug甚至体制会和当前的形势不合,这时就需要小范围地重构,那就是改革。但如果后继执政者没有改革的魄力,而只是在前任的基础上进行有限的修修补补,甚至认为前任提出的制度必须一百年不动摇,那便会加速架构的腐坏。日积月累,终有一天架构的维护成本(例如伪稳)会变得异常高昂,甚至出现满足不了新需求的问题。此时只能等待彻底重构。而彻底重构所耗费的资源、产生的损失将是巨大的。中国2000多年来的王朝,基本就是这么轮回着。要跳出这个循环,只能靠有能力的人在中间阶段不断地小范围重构,而即便是这样,也许也不能改变制度腐化的最终归宿。

No Comments

Post a Comment