在软件开发的过程中, 总是会经常碰到这样的窘境:修改已有的代码. 这些代码, 有的是前人或者前前人留下的, 有的是自己的, 修改的次数, 少则一次两次, 多则10次8次(真的,丝毫不夸张), 修改程度, 轻则某个方法,某几个方法, 重则整个类,甚至整个包.
而在这个地球上做开发的人都知道, 修改代码, 是一件多痛苦的事情啊:
1. 由于年月久远, 你要努力回忆当初的此情此景, 你要尝试去读懂它的原有逻辑;
2. 由于不是你写的(或者是你写的,但是当时却是少年不知愁滋味), 你可能要捂着鼻子,忍受这些旧代码到处散发出来的臭味;
3. 更由于缺乏完毕的自动化回归测试(相信大部分项目都是如此), 到了下笔时的心态, 那真是小心翼翼+心惊胆颤+如履薄冰, 生怕一不小心, 优化没成,新生出巨大的bug!
所以, 如果有机会,如果允许, 如果有选择, 我将永远不想去修改已有的代码(不管它是谁的), 而如果我是项目经理, 如果有可能, 如果可以, 如果有这个权利, 我将会给所有的项目人员下这个死命令:"你的一个方法,只有一次来做,不会给你任何修改的时间". 因为, 这是一件费劲的事,不但充满了各种风险, 还更可能吃力不讨好.
但是(但是终于出现了哈), 有同学举手表示反对了, 说:"这根本不可能嘛,你的项目,难道不进行迭代开发?迭代了,怎么可能不修改,优化已有的代码?","项目的需求,谁敢保证一次就明了?变更一产生, 谁会保证不会对已有的产生冲击? ","一次写出的代码, 就敢说质量最高,绝不能被改动?"
"是的,这位同学, 我灰常agree你的看法,请把你的手放下, 请坐下!"
项目的迭代, 需求的变更, 代码经过多次才发现最优, 这些事情,大都确实是如此真实的发生, 而且,它们还是会继续在未来发生!
不过, 而今天所说的, 都先撇开这些因素,只说如何做事,只说写代码的心态, 而且, 以上的这一切, 也都不是要你萌生出修改已有代码这个想法的全部理由.
大多数人认为, 修改(或曰优化, 而大师们更为此发明了一个词儿:重构)是不可避免的,总是有下一次的机会把这段代码写好的. 是吗? 事情真的如此吗?
众多的项目实践证明, 这很可能是错误的, 更可以说是有偏差的, 所谓的"经常重构", 那就是一块给我们当作心理安慰的遮羞布. 自从有了"重构"这个词以来,每个人, whoever, 一看到时间紧, 一碰到想马虎了事的代码, 这些都"有理有据"了,可以对着leader说:"这次时间紧哈,我就先(这么xxx,那么xxx的)做了(对此,还有一个词,叫"苟且"),等下次(有时间了,有精力了, 头脑清醒了, 心情愉悦了...),我会保证(马上,一定确定以及肯定)进行重构!"
于是, 怀着这种心态, 自己和leader就这么被忽悠过去了(忽悠自己很容易, 另外请相信, leader也总是能被忽悠, 因为大部分的他们, 都先重视结果,才重视过程); 于是, 那段本来可以有80分, 现在55分就交差的代码出现了; 于是, 这段代码被修改的契机(或曰隐患)就留下了, 于是, 下次修改代码会产生新的bug的机会出现了; 于是, 每个都如此, 整个项目出现众多bug的机会来了, ...
"上天曾经给过我一个机会, 让我写好这段代码, 但是我却没有珍惜, 直到失去才*&*&^%,如果%^&(*%$, 我将会*(&(^%) ...!" 是的, 你本可以在老天给你的那一次机会中,去做好的事情,现在被分成了多次,多次造成的后果,是更多的bug, 而多次修改代码, 是项目质量低下的源泉.
就当你是最后一次吧,用尽全力, 最后一次写这段代码,确保它是最简单的,性能最好的, 结构最优化的,跟其他代码的耦合性是最低的,...不要想着,在"下一次"再去优化它, 因为:
1. 如果在下一次, 那么时间成本会更高, 你往往需要重新付出阅读80行以上代码的时间,才敢往里面加那么的10行;
2. 如果在下一次,老天作证, 它实现的风险会更高,出现新bug的概率会更大;
3. 老天作证, 即使你有下一次, 那感觉也不一定是美好的, 更多时候,它将会让你倒胃口, 郁闷,痛苦,甚至抓狂.
就当你是最后一次吧, 别以等下一次再重构为借口,只有这样, 那么你每一次编程的时候,就会竭尽全力,全力以赴, 那么:
1. 原来马虎了事, 现在则要留心,提交代码前又多检查了几次或测试了几次, 原来可能产生bug8个,现在就极有可能缩减为3个了,保证了高质量, 当下一次真的来临时, 就不会那么的痛苦;
2. 从时间上来讲, 可能几次的事情,现在一次就做完, 效率更高, 不需要再次回顾代码和回归测试;
3. 你已使出全力打这一掌, 这已不是态度问题,而是功力问题, 如果仍是会臭味满天,bug遍地, 你将知道如何改进自己的编码
请当这是你的最后一次吧! 很多项目, 其实不会再有下一次机会了, 它可能在你的"下一次"到来之前, 就已经失败,就已经倒下, 而它的失败倒下, 却恰恰可能是因为: 大量的,数不清,堆积成山的这一次(的苟且)!