很久以前,在我刚开始编写程序,新手程序员通过编写维护程序,以提高技能和累积经验。只有老手们才写新代码。新手们从事调试和修正仍被公司所用的老代码。我一直参与新项目的开发,但是现在的我会专门地编写维护程序。我参与过许多曾失败的从零开始的“绿色”项目,我更倾向于软件产品的调试、修正和增强工作。我喜欢和真正的用户一起工作,而不是假设用户样例。我认为,建立自信心,使用户满意我的工作,好过于去与人争论软件特性、规则说明书、预算和进度表等问题。针对已有代码,定义良好的任务优先列表,好过于去想一些天马行空的软件规则说明书。我喜欢按小时收费,而不是按照项目来收费,这样用户不会回避我的效率问题。
我现在主要从事Web应用领域,专门针对带背后数据库的网站。我很少去着手全新的项目开发,但别人常常让我去“抢救”被整坏的项目。客户和开发人员的决裂,常常使得产品代码被弃绝了。开发人员对新产品投入了精力,对程序的bug和老客户的扩展要求置之不理。我是按小时付费的,我拿到工作,因为我没有告诉客户们他们需要抛弃所有的东西,从头开始 — 而这点正是其他的顾问所建议的。
通常,软件使用的时间比我们当初写代码时所想的时间要长。直到最近,我为一个律师事务所的账单系统做维护工作,该系统采用OMNIS 3,写于1986年,不能在新于SE/30的Mac上运行。依赖这些遗留系统客户们会支付很多开销,保持这些系统的运行,因为他们不能冒着风险采用新软件产品,也无法支付新产品开发、数据迁移和人员培训等任务带来的费用。相对少许的维护费用对于客户们是可以接受的,但很多程序员们却对维护工作嗤之以鼻,不管客户是否适用,他们更喜欢开发全新的项目。
以下列举了维护编程的一些好处:
学会调试
比起调试自己代码,调试他人代码要更认真努力。必须一步一步追溯问题;不能假定自己知道哪里错了,跳着去修改错误。阅读和调试他人代码,会自己思考,代码如何可行,如果不可行,而不是你知道代码应该可行。
学会编更好的程序
调试和扩展好代码比坏代码更容易,这样你会学会区分好代码和坏代码。学会解释代码,推理原作者的意图。有经验的程序员可以意识到好代码为之好,坏代码为之坏的原因。通过调试很多代码后,方能这样的分辨经验。自己便会得出窍门,找到不熟悉代码的根基,搜查到坏代码的味道。
学会优化
原程序员作者已经做了早期优化,因此你必须找到并处理真正影响效率和性能的瓶颈。全新开发项目的团队常常花费很多时间和精力,担心不切实际的性能问题。已经在运行的系统具有真实存在的性能问题。找到这些问题,并解决他们,这个过程是十分有趣的,也是一项伟大的技能。客户常常注意到,而且也感激,程序员对应用效率的提高。
学会新技能和新工具
你可能不会处理现行使用的语言,但你将会学习,原本并不会去学习的,语言、函数库、工具、以及产品环境等。也会更多参与到常用主流商业工具的工作中。全新考分项目常常因为选择语言和使用工具的决定而停滞不前。你不必要做这些决定,销售给客户,或因其受责备。你需要花时间学习晦涩的专业工具或语言,但这些也是值得的。大公司自有的IT部分会做自身的维护工作,但常常也会租用具有专门知识和技能的承包商。
学习估值数据和数据库
应用系统仍采用,古老的数据处理教科书中,输入->处理过程->输出模型。在读懂代码之前,你必须理解数据,知道数据通过系统的流程。几乎所有的应用都采用某种数据库,常常是关系数据库管理系统(如MySQL, PostgreSQL, Oracle, SQL Server等)。有经验的程序员知道关系的概念,并知道操纵产品数据库。不明白数据库的残废程序员常常写出很多坏代码,去做MBMS本来该做的事情。我经重构很多页缓慢且很多错误的代码,只需要用SQL来替换它们。
客户会肯定你所做的
你修复的每个bug,以及对人们常用应用的提高,真正的使用者会注意到这些变化,并给与即时的反馈。当对全新的软件开发时,每个细则的改变,延迟,额外的花费都会引起和客户的冲突。当你交付所存在的实际问题,每件事会让你的客户高兴。
具有更好的说明书细则和清晰的限制
比起从头开发,代码修复和增强是更细致,且定义更好的任务。现有的代码和环境限制了你的选择。你必须记住解决实际问题。你和客户一直认同所处理的任务,导致误解的机会比较少。面对新客户,我常常要求他们列出他们软件的前五大痛处,然后我去修复这些问题,并应许他们如果我没有解决,就不需要付钱。
更容易摆脱坏客户
我们也需要面对我们不想合作的客户。你和这样的客户有大开发项目的合同,很难从这个关系中出来,因为时间和金钱的投入,客户对新系统有很大的期待。而维护项目更短期,任务更细致,你可以有很多机会终止这样的关系,不需要破坏合同,或者损失金钱。
天生快捷
修复bug和增强代码让你能快捷的工作,不需要销售给客户你的方法学。他们只想很快修复问题,你能给出增量开发的版本,与新用户协作得出即时反馈,处理具体细节任务。
学会业务
产品软件反映了一些真实的业务需求。学习什么时候软件可以服务于业业,什么时候不能。和熟悉软件的真正的股东一起工作,这迫使你学习业务。比起编写新的程序语言,知道业务应用将有助于提高你的职业生涯。
学习人际技巧
全新项目开发的程序员们主要是彼此协作。新系统不存在真正的用户,你得到是用户案例和股东管理。维护型程序员和真正的用户大交道。这些人直接与软件的应用、体验、bug打交道,知道软件那些方面不满足实际使用需要。学会倾听和交谈,这些人没有跟你一样的假设和编程文化,但可以扩展你的视角,使你走出程序员的外壳。
会得到随后的业务和推荐
你认为谁会得到更多业务和推荐:伟大的汽车销售人员,伟大的技工?比起开发系统,人们更需要修复和增强自己的软件。对你满意的客户会推荐你,因为他们的朋友或同事手里也有“破”软件系统。
你的工作不会被外包
但可能最终你会维护你客户的外包实验的结果。