软件开发的计划应该由技术人员来做,项目计划应该由项目管理人员来做。软件开发计划和项目计划分别包含哪些具体的内容,这不是本书讨论的重点(略有涉及),我们关注的是计划的本质。 什么是计划?
计划是在行动之前对行动的任务、目标、方法、措施所做出的预见性确认。在这个定义中,预见性是最重要的关键词。
预见是指从现实事物的发展规律中把握其未来发展的趋势。和猜测不同,预见必定基于现实事物的发展规律。这些发展规律往往表现为严密的逻辑推理和科学的计算方法。
例如,围棋棋手预见到10步棋后的中腹局面,这是经过了大量计算得到的。再例如,气象局预报3天后的天气状况,也是经过了卫星采集的信息并经过大量计算得到的。而猜测,是通过经验性的直觉来完成的。
所以,按照计划的定义,由猜测产生的计划不是真正的计划。
我所遇见过的绝大多数计划都不是真正的计划。这些计划的制定没有自圆其说的逻辑推理,没有严格的计算过程。它们往往是项目管理人员拍脑袋(甚至是拍大腿)的结果。很明显,这种基于猜测的计划和事物的实际发展趋势相去甚远。
在如何有效地制定计划上,CMM正尝试为项目管理人员提供一些帮助。
CMM建议,软件开发组织应该好好地维护自己的知识资产库。一般地,组织的知识资产库中包括以往项目的各种统计数据、软件开发人员的生产率数据、项目上曾经遭遇到的风险以及相应的解决方案等。
按照CMM的说法,基于这些信息,并通过一定的计算方法和逻辑关系来制定计划,可以得到比较好的效果,换句话说,按照CMM的说法,用它推荐的方式来制定的计划,与事物的实际发展趋势更接近。
事实上呢?接近了一些,但是离预见性的目标还很远。
这些年,在软件开发领域中,基于预见性的软件开发方法,例如,瀑布模型 ,正在被越来越多的软件开发人员质疑。
瀑布模型是一个非常理想化的模型。它的出现是基于这样一种假设,我们预见的每一步都是正确的。 按照瀑布模型制定的计划是一份长期的、静态的、精细的计划。在这份计划中,各个任务之间环环相扣,一个任务的失败,会对计划造成很大的影响。这种影响体现在,一个任务的失败,会使相关任务的时间点发生改变,会使开发成本发生改变,会使人员安排发生改变等。为了保持计划对行动的指导性,我们必须重新预见未来,并调整计划。
可是,由于任务失败或延迟完成是经常发生的,所以,计划也必须经常进行调整,而每一次调整都几乎无一例外地牵涉到大量的人力和时间。 这种精细计划有意义吗?它对行动的价值究竟有多大?
根据我们的实践经验,计划总是处在不断的变化之中。因此,我们有理由怀疑,未来真的是可以预见的吗?如果可以预见,又可以预见到什么程度呢?
有一种理论认为,非线性系统具有多样性和多尺度性,换句话说,未来是无法确定的,如果你某一天确定了,那是你撞上了。这就是混沌理论,由美国气象学家爱德华•诺顿•劳仑次 于1963年提出。
混沌理论认为,在一个动态的系统中,即使初始条件发生了十分微小的变化,但是,经过不断放大,对其未来状态会造成极其巨大的差别。 有一首流传的西方民谣,非常形象地说明了这个理论。
这首民谣说: 丢失一个钉子, 坏了一只蹄铁; 坏了一只蹄铁, 折了一匹战马; 折了一匹战马, 伤了一位骑士; 伤了一位骑士, 输了一场战斗; 输了一场战斗, 亡了一个帝国。
混沌理论可以解释很多现象,我们也完全可以用它来解释软件开发过程中的一些问题。
例如,由于没有考虑(或考虑不周全)用户的一个潜在需求,导致软件架构的变化;软件架构的变化,导致开发成本的增加;开发成本的增加,导致项目亏损;项目亏损,导致相关人员利益受损;相关人员利益受损;导致人才流失;人才流失,导致新项目的开发成本增加。 以此类推,没有谁知道这件事的影响到底有多大。
话说回来,我在上面举的例子或许有点夸张,但是,混沌理论的科学性已经在很多领域中得到了验证,却是一个不争的事实。有兴趣的读者可以去查阅相关的资料。
盖米尼咨询公司的咨询顾问奈尔•格拉斯在谈到企业决策时指出:
过去作为决策基础的三个主要假定已经不再成立。
这些假定是:
假定1:企业是一个“说到做到”的封闭系统。外界对企业决定采取的行动没有多大干扰。
假定2:经营环境是稳定的。管理者能够充分把握经营环境,从而制定出详尽具体的战略。
假定3:管理者对事件的因果关系有着足够的认识。他们能够顺藤摸瓜,找出每一事件将会导致的变化。
这些旧的假定已经被三个新的现实所代替:
现实1:企业是复杂的“开放”系统,既影响着其所处的环境,又在很大程度上受环境的影响。这意味着,企业的行动可能无法达到它所预期的结果。 现实2:环境是瞬息万变的(不断创造着机会和威胁)。高层管理者不能指望制定出在付诸实施时仍完全有效的详尽战略。
现实3:作为传统决策理论基础的简单线性因果关系模型已经失灵。因此,各种事件的后果是无法预料的。
混沌学家总是自豪地说:“相对论,消除了关于绝对空间和时间的幻想;量子力学,消除了关于可控测量过程的牛顿式的梦;而混沌,消除了拉普拉斯关于决定论式可预测的幻想。” 的确如此,混沌理论在如今的气象、航空及航天等领域的研究中,都正在发挥着重大的作用。
我们不妨对前面讨论的思路做一次重新整理。
我们说,首先,建立在猜测基础上的计划是没有任何预见性的;其次,完全基于科学计算产生的计划(拉普拉斯的决定论是可预测理论)不适用于动态系统;再次,混沌理论提供了一种兼具质性思考与量化分析的方法,它建议用整体、连续的数据关系对未来进行预测;最后,从混沌中理出规则存在着可能性,但对于软件开发这类工程没有实用性。
基于上面的思路,我们也许要重新考虑软件工程中的计划的作用。该如何来为软件项目制定计划呢?
在这一点上,敏捷方法似乎走在前面,它非常明智地强调计划的适应性而非预见性。
适应性的计划不会描述中长期的具体工作内容(会有个轮廓),它更多地描述短期的、可以预见的工作内容,更重要的是,它时时刻刻都在准备着对计划进行调整。
我赞同敏捷方法的思想,也想用简单的一句话来表明自己的结论:对于软件项目来说,制定长期的、静态的、精细的计划是没有价值的;最有效的方法是建立短期的、精细的计划,以及长期的、粗放的计划。