有过一些项目经验的程序员们,是否也会有这样的疑问,
为什么软件项目总会延期?
我在入行成为一个专职的程序员之前,也曾写过一些代码,
那时候并没有项目的概念,
想什么时候完成就什么时候完成,最多只是要求自己尽快完成而已。
接着,刚开始工作时,也没有明显感受过任务的紧迫感,
没有人要求我某件事必须在什么时间点之前完成,
因此也就没有延期的说法。
直到后来,我有幸遇到了一位爱打官腔的同事,
他说:“你务必明天之前把它做完”。
于是我才首次体会到了延期的痛苦。
这件事就像打开了潘多拉魔盒一样,
我发现,对于软件开发而言,
按照事先约定好的时间点完成任务,是多么的困难。
工作量膨胀
项目延期的一个原因是,我们很难事先知道开发任务的工作量,
往往是真正做起来,或者说做着做着,
才发现事情远不是之前考虑的那么简单。
因为,要想把软件做好,不关心细节是不行的。
程序员的水平,不能用他是否有创造性,或者思维是否具有逻辑性来衡量,
而是要看他,能否把所有可能的场景都考虑到。
Programmers are not to be measured by their ingenuity and their logic but by the completeness of their case analysis.
从这一点来看,软件开发工作符合二八定律,
大致的完成工作只需 20% 的时间,
而要做到不出问题,却需要付出几倍的时间。
通常,我们在讨论业务逻辑的时候,只会考虑正常的流程,
可是实际情况,软件总是会出现各种预料之外的场景。
比如,我们在调用其他系统的时候,它可能会暂时不可用。
那么此时应该如何表现?我们考虑过这种场景吗?
整个链路上的异常情况我们都得考虑到,并进行相关处理,
因为默认行为通常不能满足要求。
一旦考虑了所有可能出现的场景,
完整的业务逻辑,会比单纯只考虑正常流程的业务逻辑复杂好几倍。
最后做出来的软件,比之前预估的软件更复杂了。
超出预期时间点把它做完,也是不可避免了。
需求变更
实际项目中出现的需求变更,概念上会更加宽泛,
可能是需求本身发生了变化,之前说好了这样做,后来又要那样做,
也可能是对需求的理解发生了变化,我原以为这样做,结果不是那么回事。
还有可能是对需求细节进行了补充,之前我们都没想到这一点,现在加上。
即需求范围发生了变化,之前说好了只做这些,后来增加了另外一些内容。
不论哪一种,软件待解决的问题都发生了变化,
当然,这种变化,并不一定总会加大工作量,
也有很少的情况下,是减少了工作量。
但是,在项目快要发布的时候,即项目的后期进行这些变更,
总是会导致项目延期,
因为删除功能,并保证不会引发别的错误,也是需要成本的。
不幸的是,软件是一种知识密集型工作,
在开发的过程中,导致对需求产生了新的认识,几乎是不可避免的。
除非以前做过类似的软件,
否则总是做着做着,冒出了一些新的问题。
比如,我们想做一个商品的展示页面,大部分商品都能正常展示,
后来发现有一类特殊的商品,需要按另外的方式展示。
这会导致软件中的很多概念发生变化,甚至有些假设都是错误的。
变数
我们知道时代的发展着的,社会现实也是瞬息万变的,
尤其是为繁荣的业务领域编写代码的程序员,
在做一个项目的过程中,都会产生变数。
这种变数包括,来自业务的变数,也包括来自人员的变数。
我曾多次在开发某个项目的时候,临时被叫去开发另一个紧急项目。
甚至繁忙的时候,要在3-5个项目之间来回切换。
任务切换诚然会造成很多损耗,不过这其实还不算什么,
更重要的是,开发完紧急项目之后,原项目一般并不会因此接受延期。
还会要求在原来的时间点完成。
另外一种情况,就是人员的变动,
可能项目组的成员去了其他团队,或者离职了,
但是已经答应到时完成的开发任务,也不会因此接受调整。
每个人剩下了更少的时间,需要完成更多的任务。
估算
看到这里,有人可能会问,
既然意识到会延期,当时为什么要确定一个这么紧迫的交付时间呢?
即为什么我们明知道有这么多事情要做,却还剩下了这么少的时间?
这件事有好几个原因。
从技术角度来讲,如果不确定一个截止日期,
那么软件可能就没有做完的时候。
一直做就会一直发现新的东西,永远做不到完美。
因此,Facebook 流传着这么一句话,比完美更重要的是完成。
Done is better than perfect.
此外,人们可能会认为项目延期是估算不准确造成的。
其实不然。因为,从非技术角度来讲,
不满足客户预期估算,即使再准确,也无法被接受。
我们估算了一个月才能完成,但是客户只给一天,
这种情况下,即使估算是准确的,又有什么用呢?
再好的管理方式,再有效的资源利用手段,
似乎也无法完成这种不可能完成的任务 —— 死亡行军。
因此,如果无法说服客户,这么低的成本达成商业目标是不可能的,
那么一切估算都是妄言。
结语
项目延期是由很多因素造成的,
原因之一是,制定截止期限的那个人不用为期限负责。
因此才有了“这件事情很简单,具体实现我不管”的讽刺言论。
不过,究其根本,还在于人们总是期望投入比预算更少的成本达成目标,
谁不想花更少的钱,买更多的东西呢?
大家都想追求性价比。
这个问题似乎是无解的,
但是知道存在问题,知道造成这个问题的原因是什么,
总比没有意识到问题的存在更好一些吧。