项目是指以一定的成本在一定时间内取得预期收益的系列活动。项目的“生命期”是管理项目的重要指标,而对项目周期的估算则是管理项目的重要一环。本期“项目管理”介绍对软件项目周期进行估算的技巧。
估算是软件开发中很重要的一个环节:项目周期估算过短会造成人力低估、成本预算低估、日程安排过短,最终人力资源耗尽,成本超出预算,为完成项目不得不 赶工,影响项目质量,甚至导致项目失败;项目周期估计过长表面看来影响不大,但是实际上也会带来成本估计过高、充分效率低下的后果。周期估算如同盖楼房中 打地基,是后续工作的基础,它的影响会贯穿整个项目。
但软件开发是一项非常复杂的工程,不仅包含需求分析、设计、编码、测试、实施、维护等不同的子过程,还涉及到开发工具、开发人员、项目管理、风险等众多因素,不同因素对估算产生的影响不尽相同。在进行软件估算时(包括利用工具辅助估算)必须考虑到这些方面,否则估算结果就会和实际结果有很大的偏差。下面,我们对几个常见的因素做一些探讨。
软件规模是项目估算的基础
软件规模通常指的是软件的大小,可以通过程序代码行的长度、功能函数的数量、数据库中表的数量、数据库的大小等要素来描述软件规模。一般而言,软件规模越大,所花费的开发周期就越长。但这并不是一个简单的线性函数关系,也要考虑代码重用问题。比如一个模块代码很长,但是可能包含了很多公用函数,那么在估算时就应适当减少代码行数量。
软件项目中包含的功能模块越多、越复杂(或者说软件越大),开发周期越长。这个时间绝不是模块开发时间的简单叠加,因为模块功能数量的增加直接带来了软 件模块间相互关联度、复杂度的成倍增加,这导致了在需求、设计等阶段需要花费更多的时间,比单独考虑一个模块复杂得多。另一方面,对于产品化程度高的项目 开发,随着模块数量增加,开发周期的增加却不是特别明显。这是因为相当数量的模块可以完全重用,实际开发量大大减少。
所以,在实际进行软件开发周期估算的时候,软件规模肯定是首先考虑的因素。具体估算时,在考虑软件规模时要去除可重用的部分。另外,软件功能之间的关联所造成的复杂性也必须足够重视。
风险影响周期
任何一个项目都或多或少存在风险,软件项目开发过程中也避免不了这种情况而且有自己的特点。最常见的风险来自于:技术、客户、项目人员等方面。开发周期估算时项目风险应该适当考虑,尤其是技术风险和客户风险——
技术风险技 术风险主要来自于软件本身的技术难度。对于一套成熟的产品,定制开发的技术风险相对非常小,因为重要的技术已经成型,客户也很少有新的、能带来高难度技术 问题的需求,这种风险较小。但是对于完全重新开发的项目,或是研发类的项目,技术风险必须特别重视。以开发平台为例,开发平台必须适合本项目所涉及的软件 开发、满足最终的需求,平台的错误选择将导致庞大的开发工作量,即便满足了用户需求也可能造成系统效率低下、扩展性差的致命问题,软件可能会很快被淘汰。
在实际估算中,建议将技术难度分为十级,每一级在初次估算的代码行上增加10%,
最终估算代码长度=初始估算代码长度×(1+0.1×n)
假设模块A的初次估计代码行为15000行,但考虑技术难度高的风险,设定技术难度级别为二级,最终代码行的估算数量为15000×(1+20%)=18000。
由于技术风险的分析是一项技术性很强的工作,要求做技术风险分析的人必须是技术专家,在相关技术领域有着丰富的经验。对重大技术风险的分析结果必须要经过评审,保证准确性。
客户风险客户风险存在于客户化项目中,客户行业特点不尽相同,技术、理解水平也相差甚远。在我经历开发的项目中,80%的项目延期是由于客户方的原因,而且这种风险可控性很低,对项目影响超过技术风险。
在开发周期估算前,项目经理要仔细分析客户的具体状况,包括客户方的计算机水平、管理水平、可沟通程度,在此基础上结合以往的经验综合判断是否会对开发 带来明显的影响,可以按照上述的技术风险的方式将客户分级,最终确定开发周期。在这个过程中,项目经理的经验极其重要,对客户的分析基本上要依赖经验做判 断,要求管理人员有大量的客户经验和行业分析能力。
项目团队影响速度
对于软件开发项目来说,人力资源是核心力量。人力资源对估算的影响表现在技术水平、理解能力、沟通能力等几个方面。项目技术人员编程水 平、工作效率、团队适应性、沟通能力等素质,都会对开发进度产生影响,其中技术水平是最关键的因素。评价程序员的技术水平可以从编程熟练程度、编程速度、 解决技术问题的能力等几个因素考虑:编程熟练程度指的是程序员使用编程工具实现软件的功能的熟悉程度;编程速度指的是完成某个功能的速度;解决技术问题的 能力可以反映程序员的技术功底—如果以100%作为总和,这三个因素分别占的合适比例为70%、15%和15%。
软件开发周期估算前,应对开发人员定级,建议按新手、初级程序员、中级程序员、高级程序员来划分,每一级人员再评定上述三个因素。初次估算时可以假定开发人员为中级程序员,然后依据项目组实际人员的水平做修正,这样结果的准确度能大大提高。
宝贵的经验
依据历史数据估算软件开发周期是一种比较常见的方法,这种方法以历史软件开发周期为依据,在估算时把当前软件项目的情况与历史数据加以对比,从而得出最终结果。
按照历史数据估算开发周期的准确度还是相当高的,但这种方法只适用于对某类软件的开发,比如某个行业业务系统的开发。当要估算的软件与历史软件相差太 多,比如开发工具完全不同、或者项目类型完全不同,就不能再依赖这种方法,最起码应该辅助使用其它估算法。如果没有历史数据或是开发一种新领域软件,可以 使用代码行或功能点估算法,在此基础上再通过其它方法校正。
在实际使用历史数据估算法时,建议项目经理建立一个历史项目数据库。在库中 包含以前所有项目的开发周期、项目规模、开发人员状况、客户状况等详细数据。当估算时根据当前项目的状况在库中寻找最类似的历史项目,然后再比较两个项目 之间在项目规模、项目风险、人力资源之间的区别,我们假定历史项目开发周期为A,当前项目的周期可以依据下列公式得出:
估算项目周期 = A×(2×S+R+P+2×C)/6
S:代表软件规模 R:代表风险 P:代表人力资源 C:代表客户
(以上值均指当前项目与历史项目的比率)
实际的比较因素应该不止这些,但软件规模、风险、人力资源及客户状况是其中最重要的,对软件开发的影响也最大,所以这个公式中只考虑了这些因素。其中软件规模和客户两项占的权重最大,这也是根据项目管理经验得出的,在实际使用历史数据估算法时还可以灵活加入其它因素