李娟lijuan@bjut.edu.cn项目估算项目计划2015/10/3123软件项目规划是软件项目管理者最重要的工作之一。项目规划建立于项目的开始,并存在于项目生存周期以下三个阶段:1.投标提案阶段,需要做出计划帮助管理者判断是否有完成这个项目所需的资源,并估算出价格。2.项目开始阶段,确定人员;将工作分解;分配资源;完善最初的工作量估计。3.贯穿于项目过程中,根据项目进展的信息定期修改计划。4项目规划的一个重要的前提是项目估算,估算软件的成本和工作量。软件工作量估算的失真,导致软件成本上升,开发周期延长,使项目管理失效。初步的估算用于投标,详细的估算用于指导项目计划的制定。一般以团队的历史经验为基础,可让团队中的一线人员参与估算,以保证项目计划的可行性。软件开发是复杂的和不可见的软件开发是人力密集型工作,不能以机械的观点看待传统的工程项目经常会以相近的项目做参考,不同的只是客户和地点,而绝大多数软件项目是独一无二的新技术不断出现和应用缺少项目经验数据,许多组织无法提供原有项目数据,即使能够提供也未必有用2015/10/315帕金森定律(Parkinson’sLaw)◦“工作总是用完所有可利用的时间(Workexpandstofillthetimeavailable)”,这意味着容易达到的目标将使员工工作上变得松懈布鲁克斯定律(Brooks’Law)◦实现一个项目需要的工作量不是与分配到项目的员工数成比例地增长。当项目组的规模增长时,投入管理、协调和沟通的工作量也在增长。◦极端情况下,Brooks定律会出现这样的情况:“投入更多的人到一项延迟的工作上,可以导致该项工作更加延迟”。◦人月=人*月,月≠人月/人2015/10/316MicrosoftWordforWindows1.0开发。包含249,000行代码,投入660人月,前后历时5年,实际花费时间为预期时间的5倍导致WinWord1.0开发延迟的几个主要因素:项目初期制定的开发目标是不可实现的。盖茨下达的指示是用最快的速度开发最好的字处理软件,争取在12月内完成。实现这两个目标中的任何一个都是困难的,同时达到则是不可能的。过紧的进度计划降低了计划的精确度。开发过程中频繁换人。5年中共换了4个组长,其中有2人因进度压力离职,1人是出于健康的原因而离职。迫于进度压力,开发人员匆忙写出一些低质量的和不完整的代码,然后宣称已实现某些性能。这造成了WinWord不得不将用于提高软件稳定性的时间由预计的3个月增加到12个月。高层的决定不总是睿智的◦启示:估算应该征求所有项目相关人员的意见没有最快,只有更快!2015/10/3111失败因素:无根据的估算完全不可信◦估算依赖的是经验而不是猜测人们容易低估小项目的工作量,而过分夸大大项目的工作量成功因素:估算的群体讨论,依靠更多的意见开发人员参与估算,并使用几种不同的估算技术,并比较它们的结果2015/10/3112失败因素:多些时间做估算,并不能得到更准确的结果。成功因素:留出估算的时间,并做好计划;估算本身也是一个项目。理智的方法是先给出大的区间,在软件开发过程本身中逐步缩小区间成本及工作量的估算不是一门精确的科学,估算方法有几种选择:◦基于已完成的类似项目进行估算;◦使用分解技术以生成项目成本及工作量的估算自顶向下自底向上◦使用一个或多个算法模型COCOMO模型规模估算方法◦代码行◦功能点2015/10/31131.分解技术◦自顶向下◦自底向上2.类比法3.三点法或计划评审技术(PERT)4.专家判定法(Delphi或WideBandDelphi)5.功能点法6.COCOMO模型2015/10/3114151、分解技术分解技术采用“分而治之”的策略进行软件项目估算。将项目分解成若干主要功能及相关的软件过程活动,通过逐步求精的方式进行成本及工作量估算。产生工作分解结构WBS(WorkBreakdownStructure)。然后分别采用基于经验的方法和/或某种估算方法,对分解得到的各块进行成本和工作量估算,进而获得对项目软件的整体估计。如对每块估算以下内容:16①代码行(Loc)的数量;②功能点(FP)数量,即估算每个信息域特征(用户输入数、输出数、读写的文件数、查询数、与外部程序和硬件的接口数)并与14个复杂度系数加权计数;③实现每个功能所需的人月数;④每个软件过程活动所需人月数。估算的具体方法可以采用:自底向上估算(细分估算法)、自顶向下估算(周期估算法)该方法将整个项目系统分解成若干个小系统,逐个估算所需的工作量,然后求和。◦优点:每部分的估算较为精确。◦缺陷:难以把握系统级的整合成本。该方法适合于项目规划的后期。如果应用在前期,那么必须对最终的系统作出一些假设,例如对软件模块的数量和大小进行假设按软件开发周期进行划分,估算各阶段或任务单元的成本,然后进行汇总合计。很适合瀑布型软件开发过程。◦优点:重视系统级的事务成本(如系统集成、质量保证、配置管理等)。但是需要估算者对软件工程各个阶段的作业量和相互间的比例具有相当的了解。◦缺陷:难以识别较低级别上的技术困难。202、类比方法又被称为基于案例的推理(Case-basedreasoning)方法。主要思想是使用过去类似项目的确切数字,考虑与当前项目的差异程度,来估计当前项目的相应数据。公式为:当前项目估计=参考项目数据×(1+差异百分比)其中:差异百分比:当前项目比参考项目多或少的百分比。规模估计可以选取功能、输入输出等作为比较的参考依据。该方法的缺陷:无法搞清以前的项目究竟在多大程度上代表了新项目的特点。有两种情况可以使用这种方法:其一是以前完成的项目与新项目非常相似,其二是项目成本估算专家或小组具有必需的专业技能该方法寻找已经完成的项目,这些项目与需要开发的新项目在许多特征上必须是类似的。通过比较获得工作量的估算值。在项目成本估算精确度要求不高的情况下使用的项目成本估算方法有两种情况可以使用这种方法◦其一是以前完成的项目与新项目非常相似,其二是项目成本估算专家或小组具有必需的专业技能。PertSizing是一种加权平均法,可以用于估计软件项目的规模、工作量和成本等在估计每一项任务时,首先按最佳的、可能的、悲观的三种情况给出估计值,记作:a、m、b然后用以下公式计算期望值,期望值就是最终的估计值:◦期望值=(a+4*m+b)/62015/10/3122例如认为一个模块的软件规模:◦最大值是100K代码行◦最小值是50K代行◦最可能值是60K代码行则所获得的规模估计初始期望值为:◦(50+4×60+100)/6=65K代码行2015/10/3123当只有一个人参与估算时,则需要估算人估算三个数值:悲观值、可能值、乐观值,然后套用公式1就可以了。当有2个人参与估算时,则需要2个估算人分别估算三个数值:悲观值、可能值、乐观值,然后分别计算这3个数值的平均值,再将悲观值、可能值、乐观值的平均值代入公式1就可以了。当有3个人参与估算时,有2种方法:◦类似第(2)种情况处理,此时总共需要估计9个数;◦每个人只估计一个数,取最大最小值作为悲观值与乐观值,取中间的数值作为可能值,代入公式1。当有N个人(N3)参与估算时,也有2种方法:◦类似第(2)种情况处理,此时总共需要估计3N个数;◦每个人只估计一个数,取最大最小值作为悲观值与乐观值,对中间的N-2个数值取平均值作为可能值,代入公式1。N62015/10/3124254、专家判定法(Delphi或WideBandDelphi)在难以获得经验、历史数据时,可考虑采用专家判定作为一种有效的估计方法。该方法通过专家群体的智慧和交流分析来获得不断趋向准确和一致的估计结果。成立估计小组,首先介绍项目和产品情况,分发软件需求说明书和记录估算值的表格。而后让估计小组成员分别对软件的规模、工作量、成本进行估计,将结果反馈给小组成员。然后分别进行下一轮估计。在反复估计的基础上进行最后的调整,得到最终的估计结果。标准Delphi技术不强调专家们讨论,不利于获得足够的交流信息,也不利于调整自己的估算值。WideBandDelphi将小组会议和Delphi技术结合起来。2015/10/3126准备估计的内容时,有两个要点:◦(1)完备的识别被估计的内容。◦(2)尽管Delphi方法既可以对颗粒度比较大的任务进行估计,也可以对颗粒度比较小的任务进行估计,但是还是要细分任务,其目的是为了提高估计的准确度与加快估计值收敛的速度。如果让一个人去估计一幢大楼的使用面积和去估计一个房间的使用面积,估计的准确率显然差别很大。由作者将被估计的内容细分为更小颗粒度的问题,这样更容易把握,估计时更容易快速收敛。2015/10/3127估计小组有协调人、作者和3到6名估计专家组成。◦协调人负责计划和协调软件估计活动,协调人在担任此角色时不能用自己的观点去引导专家,也不能因为自己的认识或偏见而对软件估计的结果进行歪曲。◦协调人不能是作者,也不必作为专家。◦专家的数量不宜太多,否则成本比较高。◦专家必须具备2个条件:(1)有业务与技术经验,熟悉被估计的内容;(2)要有估计的经验,接受过估计方法的培训,并曾经在实践中评价过自己的估计准确率。2015/10/3128协调人负责召开启动会议,在启动会议上主要进行以下工作:◦作者向专家介绍估计的内容、项目的各种假设和限制条件。◦专家对被估计的内容达成一致,并确认各种假设和限制条件。◦专家对估计结果的度量单位达成一致。比如估计软件的规模时,是用行还是千行作为计量单位,代码行是否包括注释行、空行、开发平台自动生成的语句等要达成一致。◦对估计结束的准则达成一致。结束的准则包括:估计结果可接受的判断方法,即估计结果在多大的偏差范围内是认为是可接受的,此时称为估计结果收敛。在连续几轮无法收敛后,估计应该结束;对于不能收敛的估计内容如何确定估计结果。结束准则也可以由协调人和作者在活动2中确定。2015/10/3129在专家进行独立估计时,需要注意:◦专家的估计活动不应受外界压力的影响,协调人或者作者不能给出估计结果的上下限或其他限定。◦各专家之间没有讨论和咨询。◦各专家采用的估计方法也不受限制。各专家即可以根据自己的经验估计,也可以采用类比的方法进行估计。◦如果专家认为被估计的内容中存在不明确的地方,应记录自己所做出的各种假设。2015/10/3130收集各专家的估计结果,制作本轮的估计结果表:差异率的计算方法以及接受的准则应该在活动2或者活动3时确定,比如可以采用如下的差异率计算公式及接受准则:◦(1)差异率=max(最大值-平均值,平均值-最小值)/平均值;◦(2)当差异率25%时接受平均值为最终估计结果。注意识别离群点,如果存在离群点,可以考虑删除之2015/10/31312015/10/3132将本轮的匿名估计结果公布给各专家讨论不收敛的估计项◦在讨论时只对被估计的内容的理解进行讨论,不讨论每个人具体的估计结果,为了达成一致的理解,此时可能需要重新细化估计内容或确定估计假设。2015/10/3133对于估计结果未被接受的估计项,执行活动4,如此不断反复,直至满足以下任何一项条件:◦完成多轮估计(如4轮),该条件已经在结束准则中确定了。◦所有的估计结果收敛于一个可以接受的范围;◦所有专家拒绝对各自的估计结果进行修改。2015/10/3134对于结束了多轮估计后,仍然未收敛的估计项,可以采用如下的方法确定最终估计结果:◦按照少数服从多数的原则,忽略少数与其他估计结果差异很大的估计结果。◦采用“掐头去尾求平均值”的方法。即:排除最大与最小值后,求剩余数值的平均值作为最终估计结果。◦由各专家进行讨论,形成一个一致的意见。当然,也不限于采用其他方法确定最终的估计结果。2015/10/3135估计小组对最后汇总的估计结果进行审核,并对结果达成一致。估计小组可以对宽带Delphi方法进行思考,