中国海洋大学信息学院Email:green.lyn@gmail.com教材:软件工程导论(第5版)张海藩编著清华大学出版社软件工程第13章软件项目管理所谓管理就是通过计划、组织和控制等一系列活动,合理地配置和使用各种资源,以达到既定目标的过程。软件项目管理先于任何技术活动之前开始,并且贯穿于软件的整个生命周期之中。为了使得对程序规模的估计值更接近实际值,可以由多名有经验的软件工程师分别做出估计。每个人都估计程序的最小规模(a)最大规模(b)和最可能的规模(m),分别算出这3种规模的平均值a’,b’和m’之后,再用下式计算程序规模的估计值13.1估算软件规模13.1.1代码行技术代码行技术是比较简单的定量估算软件规模的方法。这种方法依据以往开发类似产品的经验和历史数据,估计实现一个功能所需要的源程序行数。代码行技术的主要优点是,代码是所有软件开发项目都有的“产品”,而且很容易计算代码行数。代码行技术的缺点是:源程序仅是软件配置的一个成分,用它的规模代表整个软件的规模似乎不太合理,用不同语言实现同一个软件所需要的代码行数并不相同;这种方法不适用于非过程语言。6a’+4m’+b’L=(13.1)13.1.2功能点技术功能点技术依据对软件信息域特性和软件复杂性的评估结果,估算软件规模。1.信息域特性功能点技术定义了信息域的5个特性,分别是输入项数(Inp)、输出项数(Out)、查询数(Inq)、主文件数(Maf)和外部接口数(Inf)。(1)输入项数:用户向软件输入的项数,这些输入给软件提供面向应用的数据。输入不同于查询,后者单独计数,不记入输入项数中。(2)输出项数:软件向用户输出的项数,它们向用户提供面向应用的信息,例如,报表和出错信息等。报表内的数据项不单独记数。(3)查询数:查询即是一次联机输入,它导致软件以联机输出方式产生某种即时响应。(4)主文件数:逻辑主文件(即数据的一个逻辑组合,它可能是大型数据库的一部分或是一个独立的文件)的数目。(5)外部接口数:机器可读的全部接口(例如,磁盘或磁带上的数据文件)的数量,用这些接口把信息传送给另一个系统。2.估算功能点的步骤用下述3个步骤,可估算出一个软件的功能点数(即软件规模)。(1)计算未调整的功能点数UFP首先,把产品信息域的每个特性(即Inp,Out,Inq,Maf和Inf)都分类为简单级,平均级或复杂级,并根据其等级为每个特性分配一个功能点数(例如,一个简单级的输入项分配3个功能点。一个平均级的输入项分配4个功能点,而一个复杂级的输入项分配6个功能点)。然后,用下式计算未调整的功能点数UFP:UFP=a1×Inp+a2×Out+a3×Inq+a4×Maf+a5×Inf其中,ai(1=i=5)是信息域特性系数,其值由相应特性的复杂级别决定,如表13.1所示。表13.1信息域特性系数值特性系数复杂级别简单平均复杂输入系数a1346输出系数a2457查询系数a3346文件系数a471015接口系数a55710(2)计算技术复杂性因子TCF这一步骤度量14种技术因素对软件规模的影响程度。这些因素包括高处理率,性能标准(例如,响应时间),联机更新等,在表13.2中列出了全部技术因素,并用Fi(1=i=14)代表这些因素。根据软件的特点,为每个因素分配一个从0(不存在或对软件规模无影响)到5(有很大影响)的值。然后,用下式计算技术因素对软件规模的综合影响程度DI:DI=∑Fi技术复杂性因子TCF由下式计算:TCF=0.65+0.01×DI因为DI的值在0-70之间,所以TCF的值在0.65-1.35之间。表13.2技术因素序号Fi技术因素1F1数据通信2F2分布式数据处理3F3性能标准4F4高负荷的硬件5F5高处理率6F6联机数据处理7F7终端用户效率8F8联机更新9F9复杂的计算10F10可重用性11F11安装方便12F12操作方便13F13可移植性14F14可维护性(3)计算功能点数FP用下式计算功能点数FP:FP=UFP×TCF功能点数与所用的编程语言无关,看起来功能点技术比代码行技术更合理一些。但是,在判断信息域特性复杂级别和技术因素的影响程度时,存在着相当大的主观因素。13.2工作量估算软件估算模型使用由经验导出的公式来预测软件开发工作量,工作量是软件规模(KLOC或FP)的函数,工作量的单位通常是人月(pm)。13.2.1静态单变量模型这类模型的总体结构形式如下:E=A+B×(ev)c其中,A,B和C是由经验数据导出的常数,E是以人月为单位的工作量,ev是估算变量(KLOC或FP)。下面给出几个典型的静态单变量模型。1.面向KLOC的估算模型(1)Walston_Felix模型E=5.2×(KLOC)0.91(2)Bailey_Basili模型E=5.5+0.73×(KLOC)1.16(3)Boehm简单模型E=3.2×(KLOC)1.05(4)Doty模型(在KLOC9时适用)E=5.288×(KLOC)1.0472.面向FP的估算模型(1)Albrecht&Gaffney模型E=-13.39+0.0545FP(2)Maston,Barnnett和Mellichamp模型E=585.7+15.12FP从上面列出的模型可以看出,对于相同的KLOC或FP值,用不同模型估算将得出不同的结果。主要原因是,这些模型多数都是仅根据若干应用领域中有限个项目的经验数据推导出来的,适用范围有限。13.2.2动态多变量模型动态多变量模型也称为软件方程式,它是根据从4000多个当代软件项目中收集的生产率数据推导出来的。该模型把工作量看作是软件规模和开发时间这两个变量的函数。动态多变量估算模型的形式如下:E=(LOC×B0.333/P)3×(1/t)4(13.2)其中,E是以人月或人年为单位的工作量;t是以月或年为单位的项目持续时间;B是特殊技术因子,它随着对测试,质量保证,文档及管理技术的需求的增加而缓慢增加,对于较小的程序(KLOC=5-15),B=0.16,对于超过70KLOC的程序,B=0.39P是生产率参数,它反映了下述因素对工作量的影响:●总体过程成熟度及管理水平;●使用良好的软件工程实践的程度;●使用的程序设计语言的级别;●软件环境的状态;●软件项目组的技术及经验;●应用系统的复杂程度。开发实时嵌入式软件时,P的典型值为2000;开发电信系统和系统软件时,P=10000;对于商业应用系统来,P=28000.可以从历史数据导出适用于当前项目的生产率参数值。从(13.2)式可以看出,开发同一个软件(即LOC固定)的时候,如果把项目持续时间延长一些,则可降低完成项目所需要的工作量。13.2.3COCOMO2模型不讲,感兴趣的同学可自学13.3进度计划一个有效的软件过程应该定义一个适用于当前项目的任务集合。一个任务集合包括一组软件工程工作任务,里程碑和可交付的产品。为一个项目所定义的任务集合,必须包括为获得高质量的软件产品而应该完成的所有任务,但是同时又不能让项目组承担不必要的工作。项目管理者的目标是定义全部项目任务,识别出关键任务,跟踪关键任务的进展状况,以保证能及时发现拖延进度的情况。为达到上述目标,管理者必须制定一个足够详细的进度表,以便监督项目进度并控制整个项目。软件项目的进度安排是这样一种活动。它通过把工作量分配给特定的软件工程任务并规定完成各项任务的起止日期,从而将估算出的项目工作量分布于计划好的项目持续期内。13.3.1估算开发时间请自行学习,并注意开发时间与从事开发工作的人数并不成反比关系。存在一个最佳项目组规模使得项目组总生产率最高13.3.2Gantt图Gantt(甘特)图是历史悠久,应用广泛的制定进度计划的工具,下面通过一个非常简单的例子介绍这种工具。假设有一座陈旧的矩形木板房需要重新油漆。这项工作必须分3步完成:首先刮掉旧漆,然后刷上新漆,最后清除溅在窗户上的油漆。假设一共分配了15名工人去完成这项工作,然而工具却很有限:只有5把刮旧漆用的刮板,5把刷漆用的刷子,5把清除溅在窗户上的油漆用的小刮刀。怎样安排才能使工作进行的更有效呢?假设木板房的第2、4两面墙的长度比第1、3两面墙的长度长一倍,此外,不同工作需要用的时间也不同,刷新漆最费时间,其次是刮旧漆,清理(即清理溅在窗户上的油漆)需要的时间最少。工序墙壁刮旧漆刷新漆清理1或32或4231462表13.5各道工序估计需用的时间(小时)表13.5列出了估计每道工序需要用的时间。可以使用图13.1中的Gantt图描绘上述流水作业过程:在时间为零时开始刮第一面墙上的油漆,两小时后刮旧漆的工人转去刮第二面墙,同时另5名工人开始给第一面墙刷新漆,每当给一面墙刷完新漆之后,第三组的5名工人立即清除溅在这面墙窗户上的漆。从图13.1可以看出12小时后刮完所有旧漆,20小时后完成所有墙壁的刷漆工作,再过2小时后清理工作结束。因此全部工程在22小时后结束,如果用前述的第一种做法,则须要36小时。246810121416182022时间(小时)作业刮旧漆刷新漆清理图13.1旧木板房刷漆工程的Gantt图13.3.3工程网络上一小节介绍的Gantt图能很形象地描绘任务分解情况,以及每个子任务(作业)的开始时间和结束时间,因此是进度计划和进度管理的有利工具。它具有直观简明和容易掌握,容易绘制的优点,但是Gantt图也有3个缺点:(1)不能显示地描绘各项作业彼此间的依赖关系;(2)进度计划的关键部分不明确,难于判定哪些部分应当是主攻和主控的对象;(3)计划中有潜力的部分及潜力的大小不明确,往往造成潜力的浪费。当把一个工程项目分解成许多子任务,并且它们彼此间的依赖关系又比较复杂时,仅仅用Gantt图作为安排进度的工作是不够的,不仅难于做出即节省资源又保证进度的计划,而且还容易发生差错。工程网络是制定进度计划时另一种常用的工具,它同样能描绘任务分解情况以及每项作业的开始时间和结束时间,此外,它还显示地描绘各个作业彼此间的依赖关系。因此,工程网络是系统分析和系统设计的强有力的工具。在工程网络中用箭头表示作业(例如,刮旧漆,刷新漆,清理等),用圆圈表示事件(一项作业开始或结束)。注意,事件仅仅是可以明确定义的时间点,它并不消耗时间和资源。图13.2是旧木板房刷漆工程的工程网络。在图13.2中还有一些虚线箭头,它们表示虚拟作业,引入虚拟作业是为了显式地表示作业之间的依赖关系。图13.2旧木板房刷漆工程的工程网络图中:1-2刮第1面墙上的旧漆;2-3刮第2面墙上的旧漆;2-4给第1面墙刷新漆;3-5刮第3面墙上的旧漆;4-6给第2面墙刷新漆;4-7清理第1面墙窗户;5-8刮第4面墙上的旧漆;6-8给第3面墙刷新漆;7-9清理第2面墙窗户;8-10给第4面墙刷新漆;9-10清理第3面墙窗户;10-11清理第4面墙窗户;虚拟作业:3-4;5-6;6-7;8-9。123410987561113.3.4估算工程进度首先,把每个作业估计需要使用的时间写在表示该项作业的箭头上方。注意,箭头长度和它代表的作业持续时间没有关系,箭头仅表示依赖关系,它上方的数字才表示作业的持续时间。其次,为每个事件计算下述两个统计数字:最早时刻EET和最迟时刻LET。这两个数字将分别写在表示事件的圆圈的右上角和右下角,如图13.3左下角的符号所示。事件的最早时刻是该事件可以发生的最早时间。通常工程网络中第一个事件的最早时刻定义为零,其他事件的最早时刻在工程网络上从左至右按事件发生顺序计算。计算最早时刻EET使用下述3条简单规则:(1)考虑进入该事件的所有作业;(2)对于每个作业都计算它的持续时间与起始事件的EET之和;(3)选取上述和数中的最大值作为该事件的最早时刻EET。事件的最迟时刻是在不影响工程竣工时间的前提下,该事件最晚可以发生的时刻。按惯例,最后一个事件(工程结束)的最迟时刻就是它的最早时刻。其他事件的最迟时刻在工程网络上从右至左按逆作业流的方向计算。计算最迟时刻LET使用下述3条规则:(1)考虑离开该事件的所有作业;(2)从每个作业的结束事件的