高级软件工程第四章主讲人:张小平3.1软件项目估算3.1.1估算的意义软件项目估算包括工作量估算和成本估算两个方面。以成本估算笼统的表示。一个成功的项目“应该在工程允许的范围内满足成本、进度和质量目标的要求,而不需要对它的进度或预算进行增补”。软件项目工作量估算的失真,将导致软件成本上升,开发周期延长,从而使项目管理失效。估算是指通过预测构造软件项目所需工作量的过程。•初步的估算用于确定软件项目的可行性;•详细的估算用于指导项目计划的制定。•进度计划是从时间的角度对项目进行规划;•成本估算是从费用(工时、人员或各种材料等)的角度对项目进行规划;第四章软件项目估算与进度管理3.1.2估算的时机软件产品的生命周期的5个阶段:计划软件产品、开发软件产品、验证软件产品、使用软件产品和淘汰软件产品。10个子阶段:客户需求、产品定义、系统设计、系统实现、系统测试、系统评审、系统运行、系统维护、系统升级和系统变更。软件产品生命周期计划软件产品开发软件产品验证软件产品使用软件产品淘汰软件产品客户需求产品定义系统设计系统实现系统测试系统评审系统运行系统维护系统升级更换系统E1E2E3E4E5软件估算提供初步信息权衡产品的可行性产品的完整体系结构资源消耗达到高峰,初步软件产品可测试对估算工作的评价,为以后项目积累经验3.2软件规模3.2.1工作分解结构工作分解结构(WBSWorkBreakdownStructure):表现为一种层次化的树状结构,定义了整个工程项目的工作范围。建立WBS的原则:(1)应在各层次上保证项目内容的完整性,不能遗漏任何必要的组成部分。(2)一个项目单元只能从属于某一上层单元,不能同时属于两个上层单元。(3)项目单元应能区分不同的责任者和不同的工作内容,应有较高的整体性和独立性。(4)应考虑WBS与承包方式、合同结构的影响。本文转自项目管理者联盟(5)能够符合项目目标管理的要求,能方便的应用工期、质量、成本、合同、信息等手段。(6)WBS不要太多层次,以四至六层为宜。最低层次的工作包的单元成本不宜过大、工期不要太长。软件规模:软件的程序量,是软件工作量的主要影响因素。两种软件度量标准:代码行(LOCLinesofCode);功能点(FPFunctionPoints)。3.2.2代码行代码行分为无注释的源代码行(NCLOCNon-CommentedSourceLinesOfCode)和注释代码行(CLOCCommentedSourceLinesOfCode)。源代码总行数(LOC)=NCLOC+CLOCKLOC=1000xLOC代码行(1LOC)价值和人月均代码行数可以体现一个软件生产组织的生产能力。软件规模:KDSI(Kilo-ThousandsofDeliveredSourceInstructions):千行代码指令。3.2.3功能点是在系统需求阶段基于系统功能的一种(宏观)规模估算方法。通过研究初始应用需求来确定各种输入、输出、查询、外部文件和内部文件的数目,从而确定功能点数量。未调整(源)的功能点数(UFCUnadjustedFunctionPointsCount)的计算步骤:(1)计算所需要的输入、输出、查询、外部文件和内部文件数量;(2)对项目的复杂性划分为:简单、一般、复杂三种情况。UFC=∑((功能点中各项数量)×(功能点中各项复杂性权重))功能点计算步骤:(1)非功能性技术复杂度因子(TCFTechnicalComplexityFactor):有14个组成部分(A1~A14)每部分对应6个级别(无影响、影响很小、有一定影响、重要、比较重要、很重要)。TCF=0.65+0.01×∑Ai(Ai=0~5)(i=1~14)(TCF的取值范围:0.65~1.35)(2)功能点:FP=UFC×TCF功能点有助于在软件项目的早期做出规模估算。3.2.4PERT规模估计PERT(计划评审技术,ProgramEvaluationandReviewTechnique):假设项目持续时间以及整个项目完成时间是随机的且服从某种概率分布。PERT可以估计整个项目在某个时间内完成的概率。假设软件项目满足正态分布。其中:a为软件可能的最低规模;b为软件可能的最高规模。则:期望规模:E=(a+b)/2标准偏差:σ=(b-a)/6较好的PERT规模估算技术是一种基于β分布的技术:E=(a+4m+b)/6σ=(b-a)/63.2.5软件生产率1.影响因素软件生产率因素:影响每个人月平均完成代码数量的因素。软件生产率因素受到软件产品类型、软件项目规模和软件变更的程度影响。环境因素对生产率的影响也较为显著,如开发环境面积、安静程度、私密程度、受干扰程度等。规模(kdsi)产品类型10(小)10-50(中)50(大)语言1.83.94.0控制1.61.82.4通信1.01.62.0变更或新增的百分比产品类型20%20%-40%40%语言3.06.06.6控制1.52.32.3通信1.41.81.9软件规模和产品类型对生产率的影响软件变更和产品类型对生产率的影响生产率因素生产率因素软件生产率因素取决于软件类型、项目规模、软件变更的程度2.生产率数据的获取步骤如下:(1)选择一些最近完成的,并且与待完成项目相似的项目。(2)获得各项目的LOC数据(软件规模)。(3)对于更改过的项目,记录更改代码所占比例,仅计算新增或更改部分LOC数量。(4)计算投入到每个项目的人员数。(5)计算各个项目的软件生产率,即LOC/PM(每个人月生产代码的数量),进而求出平均值作为类似项目的典型软件生产率。3.3软件项目成本估算考虑因素:材料、人力、实施、固定、可变等成本。系统免维护期结束成本=开发成本+维护成本成本估算是对完成软件项目所需费用的估计和计划。成本估算是在一个无法以高度可靠性预计的环境下进行的。影响估算的因素:(1)需求的不确定性、(2)计划不落实、(3)规模和工作量不确定、(4)人力因素的影响、(5)外部环境的影响。3.3.1成本估算方法开发成本=工作量×劳动力成本;工作量与系统规模和生产效率有关。1.算法模型(1)线性模型工作量=a0+a1x1+a2x2+…+anxn(成本驱动因素的若干变量的函数)…2.专家判定与一位或多位专家商讨,专家根据自己的经验和对项目的理解对项目成本做出估算。(1)求中值或平均值(2)召开小组会议(3)Delphi技术Delphi法的步骤是:1)协调人向各专家提供项目规格和估计表格;2)协调人召集小组会各专家讨论与工作量相关的因素;3)各专家匿名填写迭代表格;4)协调人整理出一个估计总结,以迭代表的形式返回专家;5)协调人召集小组会,讨论较大的估计差异;6)专家复查估计总结并在迭代表上提交另一个匿名估计;7)重复4-6,直到达到一个最低和最高估计的一致。(4)WidebandDelphi技术3.类比将当前项目和以前作过的类似项目比较,通过比较获得其工作量的估算值。(可在整个项目级上进行,也可以在子系统级上进行)。类比的基础是项目的特征(比较)因子,例如:软件开发方法、功能需求以数及接口数等。步骤:选择类比项目,得出估算值,同时要考虑新项目的不同点对软件成本可能产生的影响。4.自顶向下从软件项目的整体出发,推算出项目的总体成本或工作量,然后按比例分配到各个组成部分中去。5.自底向下把待开发的软件逐步细化(利用WBS),直到能明确工作量,由负责该部分的人给出工作量的估算值,然后把所有部分相加,就得到了软件开发的总工作量。软件部分:库存情况更新开发阶段任务单元人日小计规划和需求需求定义开发计划516产品设计产品设计初步用户手册测试计划63110详细设计详细PDL描述数据定义测试数据和过程用户手册442212编程及单元测试编码单元测试结果61016集成及测试编制文档组装及测试459总计53人/日任务单元法样(自底向上)例3.3.2成本估算模型1.模型的分类静态模型:用一个惟一的变量(如程序规模)作为初始元素来计算所有其他变量(如成本、时间),且所用计算公式的形式对于所有变量都是相同的。动态模型:没有类似静态模型中的惟一基础变量,所有变量都是相互依存的。单变量模型:只用一个基础变量来计算其他所有变量。多变量模型:需要多个变量来描述软件过程,再结合相关公式给出时间和费用的估算值。(1)静态单变量模型用同一个基本公式通过同一个预测量(如程序规模)来估算所需要的值。一般公式:C=aLbC是待估算的量,L是用作输入的预测量,a和b是根据历史经验得到的参数。例如:SEI模型:E=1.4L0.93;DOC=30.4L0.90;D=4.6L0.26(2)静态多变量模型仍是基于C=aLb这样的公式,但还取决于几个能代表软件开发环境的各种因素的变量。(C=aLb×EAF)(3)动态多变量模型通过多个变量的相互作用对软件过程做出估算。Putnam模型方程S=C×E1/3t4/32.已有模型…3.3.3COCOMO(ConstructiveCostModel,构造性成本模型)模型1.原始COCOMO模型COCOMO模型包括:基本、中级和详细模型三个子模型。COCOMO模型是一个采用自底向上的方法进行估算的模型。E=aSb×EAFE是以人月为单位的工作量,S是以千行源代码(KLOC)计数的程序规模,EAF(EffortAdjustmentFactor)是一个工作量调整因子,EAF在基本模型中取值1,a和b是两个随开发模式而改变的因子。三种开发模式:有机式(Organic),半分离式(Semidetached),嵌入式(Embedded)。(1)基本COCOMO模型工作量的计算公式:E=aSbE(PM)工作量:(1PM=19人日=152人时(8时/日)=1/12人年),S(KLOC)程序规模,a、b是随开发模式而改变的因子。开发时间的计算公式:t=cEd(t以月计)c、d是随开发模式而改变的因子。开发模式ab有机式2.41.05半分离式3.01.12嵌入式3.61.20三种开发模式在基本COCOMO模型中的取值(通过统计63个历史项目的历史数据,得到如下计算公式。)开发模式cd有机式2.50.38半分离式2.50.35嵌入式2.50.32开发时间参数(2)中级COCOMO模型在基本COCOMO模型的基础上,考虑了软件开发环境的因素,引入15个成本驱动量(附加预测量),分为四大类:产品、计算机、人员、项目。工作量计算公式:E=aSb×EAFEAF是工作量调整因子。调整前的工作量aSb称名义工作量。15个成本驱动量,分为四类:产品、计算机、人员、项目。每个有6个等级,即“很低”、“低”、“一般”、“高”、“很高”、“非常高”。每个成本驱动量对应一个等级有一个取值(权重)。EAF=∏(15个成本驱动量的评分值)部件估算(自底向上):E=∑EiEi是第i个部件工作量估算值。开发时间的计算公式:t=cEd总体类型工作量进度有机式K=2.4XS1.05T=2.5XE0.38半分离式K=3.0XS1.12T=2.5XE0.35嵌入式K=3.6XS1.20T=2.5XE0.32(3)详细COCOMO模型在中级COCOMO模型的基础上,进一步提高估算精度,15个成本驱动因子被分成不同的层次且在软件生存周期的不同阶段被赋予不同的值。改动内容:a.名义工作量和开发时间的计算公式和中级COCOMO模型相同;名义工作量计算公式:E=aSb开发时间的计算公式:t=cEd(t以月计)b.阶段敏感的成本驱动因子。把软件开发划分成四个阶段,即需求计划和产品设计(RPD)、详细设计(DD)、编码和单元测试(CUT)、集成测试(IT)。c.三层次的产品分级结构。为软件产品提供了一个模块—子系统—系统的三层分解结构。随各模块的不同而变化的因素(4个)放在模块级处理;不经常变化的因素(11个)放在子系统级处理;系统级则处理与软件项目总体规模等相关的问题。表格:模块级驱动因素表、子系统级驱动因素表(驱动因素,等级,四阶段)。工作量在四个阶段的分布表(开发模式,工作量阶段分布%,规模)