为什么软件项目总会延期

有过一些项目经验的程序员们,是否也会有这样的疑问,

为什么软件项目总会延期


我在入行成为一个专职的程序员之前,也曾写过一些代码,

那时候并没有项目的概念,

想什么时候完成就什么时候完成,最多只是要求自己尽快完成而已。


接着,刚开始工作时,也没有明显感受过任务的紧迫感

没有人要求我某件事必须在什么时间点之前完成,

因此也就没有延期的说法。


直到后来,我有幸遇到了一位爱打官腔的同事,

他说:“你务必明天之前把它做完”。

于是我才首次体会到了延期的痛苦。


这件事就像打开了潘多拉魔盒一样,

我发现,对于软件开发而言,

按照事先约定好的时间点完成任务,是多么的困难。

工作量膨胀

项目延期的一个原因是,我们很难事先知道开发任务的工作量,

往往是真正做起来,或者说做着做着,

才发现事情远不是之前考虑的那么简单。


因为,要想把软件做好,不关心细节是不行的。

程序员的水平,不能用他是否有创造性,或者思维是否具有逻辑性来衡量,

而是要看他,能否把所有可能的场景都考虑到。


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.


此外,人们可能会认为项目延期是估算不准确造成的。

其实不然。因为,从非技术角度来讲,

不满足客户预期估算,即使再准确,也无法被接受


我们估算了一个月才能完成,但是客户只给一天

这种情况下,即使估算是准确的,又有什么用呢?


再好的管理方式,再有效的资源利用手段,

似乎也无法完成这种不可能完成的任务 —— 死亡行军


因此,如果无法说服客户,这么低的成本达成商业目标是不可能的

那么一切估算都是妄言。

结语

项目延期是由很多因素造成的,

原因之一是,制定截止期限的那个人不用为期限负责。

因此才有了“这件事情很简单,具体实现我不管”的讽刺言论。


不过,究其根本,还在于人们总是期望投入比预算更少的成本达成目标,

谁不想花更少的钱,买更多的东西呢?

大家都想追求性价比


这个问题似乎是无解的,

但是知道存在问题,知道造成这个问题的原因是什么,

总比没有意识到问题的存在更好一些吧。