(二)成本估算
为了使开发项目能够在规定的时间内完成,而且不超过预算,成本估算的管理控制是关键。计算机广泛使用有35年,而高级语言应用仅30年。费用估算大约开始于50年代的第一个大型程序设计,60年代估算过于乐观,结果费用大大超支,70年代以后,费用估算才引起人们的普遍重视。由于影响软件成本的因素太多(如人、技术、环境以及政治因素等),直到最近,软件成本估算仍是一门很不成熟的技术,国外已有的技术只能作为我们的借鉴。
1.成本估算方法
有两种基本的估算方法:自顶向下和自底向上。自顶向下的方法是对整个项目的总开发时间和总工作量做出估算,然后把它们按阶段、步骤和工作单元进行分配。自底向上的方法则正好相反,分别估算各工作单元所需的工作量和开发时间,然后相加,就得出总的工作量和总的开发时间。
两种方法都要求采用某种方法做出估算。有许多现成的方法可以利用,大致可分为三类:(1)专家估算法(2)类推估算法;(3)算式估算法。
(1)专家估算法
这种方法依靠一个或多个专家,对要求的项目做出估计,其精确性主要取决于两点,即专家对估算项目的定性参数的了解和他们的经验。后者类似于类推估算法。
(2)类推估算法
自顶向下的方法中,类推估算法是将估算项目的总体参数与类似项目进行直接相比得到结果。自底向上的方法中,类推是在两个具有相似条件的工作单元之间进行。
(3)算式估算法
专家估算法和类推估算法的缺点在于,它们依靠带有一定盲目性的和主观的猜测对项目进行估算。算式估算法则是企图避免主观因素的影响。用于估算的算式方法有两种基本类型:
(1)由理论导出;(2)由经验得出。
2.每项任务工作量的成本估算方法
开发过程中,最常用的是每项任务工作量的成本估算方法。工作量可以用人-日、人-月或人-年的数量来表示。知道单位工作量的成本,就可得到估算成本。下面仍以上节中的CAD软件包为例,估算步骤如下:
①确定任务 即每个功能都必须经过需求分析、设计、编码和测试工作②确定每项任务的工作量,对每项任务要估算它们所需要的人-月数。
③找出与各项任务的对应的劳务费数据 即每个单位工作量成本(元/人-月)。因为各阶段的劳务费用不同,需求分析和概要设计阶段需要较多的高级技术人员;而详细设计、编码和早期测试则要求较多的初级技术人员。而他们的工资是不相同的。
④计算 计算各个工作各个阶段的成本和工作量,然后计算总成本和总工作量。
⑤分析比较 在整个开发工作量中,需求分析和设计用去了75人-月,约占全部分任务工作量的50%,说明了这项工作的重要性。劳务费反映了劳动者的成本,其中包括管理费。需求分析的劳务费(5200元/人-月)比设计、编码和单元测试都高,这也说明了这项工作的重要性。
(三)进度安排
软件开发项目的进度安排可以有两种考虑方式。第一种,系统最终交付使用的日期已经确定,软件开发机构必须在合同规定的时间内安排;第二种,只确定了大致的年限,最后交付使用的日期由软件开发机构根据具体情况确定。后一种考虑能够对软件开发任务进行细致的分析;能够最好地利用资源,合理地分配工作量,但实际工作中常常遇到第一种情况,问题是软件管理人员如何在规定的期限内分配人力和安排进度。进度安排的好坏往往影响整个项目的按期完成和用户的使用,如不能按期完成,用户就会不满,而且需向用户赔偿损失。如作为商品,将会失去市场竞争力。
进度安排的精确性有时比成本估算更重要。在商品生产的社会中,某种商品的损失往往还可以通过其他商品或分期偿还来承担。而进度拖延的损失是无法弥补的。下面就软件开发项目进度安排中的几个问题进行讨论。
1.软件工作的特殊性
制定软件进度与其他工程没有很大的区别,因此使用一般的通用技术和工具即可。但重点要强调的是软件产品是逻辑产品,这与其他工程不同。因此当几个人共同完成某项任务时,人与人之间就有一个思想交流问题,称之为通信关系。通信是要付出代价的,不只是要花时间,同时由于通信中的疏忽常常会使错误增加。如一个组有4个软件工程师,两两之间进行通信联系,通信路径有6条;对6个软件工程师,则通信路径增加至14条。因此所付的代价就必然会增加,所以工作组的人员不宜太多,一般3—5人为好,目前国外一般采用主程序员组的制度。另一点要强调的是软件工作切忌中间临时加人,必须在安排进度时就考虑周到。
2.各阶段工作量的分配
估算出总的工作量以后,就需要一个可以进行各阶段工作量分配的模型。某一阶段工作量所占的百分比必须根据经验数据确定。这里要再一次强调,在开发过程中保存的记录将增加经验数据库存,而且将改善今后估算的准确性。
R.S.Pressman提出一种称作40-20-40的工作量分配规则,即前期工作(计划、需求分析、概要设计和详细设计阶段)和后期工作(测试阶段)各占40%,编码阶段占20%。
应该强调要重市馨期和后期工作。前期工作容易被忽视,主要原因是:管理人员认为不开始编码工作就算没有进行,他们不了解前期工作的重要性;技术人员往往也急于编码,认为写出代码任务就算完成了。后期工作也容易被忽视,认为编码出来就完事了,对测试工作要占这么大的工作量没有思想准备。所以要制定好进度计划,就要研究软件工作的规律,前期基础工作没做好,将会给后期工作带来很大困难,往往使工程进度一拖再拖,难以坚持,有的不得不中途夭折。
3.制定开发进度
需要涉及的下一个未知量是开发进度。进度安排是软件计划工作中一项最困难的任务,计划人员要把可用资源与项目工作量协调好;要考虑各项任务之间的相互依赖关系,并且尽可能地平行进行;预见可能出现问题和项目的“细脖子”,并提出处理意见;以及规定进度,评审和应交付的文档。
假设用作变量的开发时间TD接线性变化,而且已经得到了总的开发工作量估算值ED,要求在规定的时间TD内完成,在项目中最好有参加工作的人员平均值M,即M=ED/TD,这将是一个非常有用的数据。遗憾的是在上述算式中,项目的工作量和开发时间不能作为独立的变量。Brooks定律描述了这种现象的最极端情况:为误期的软件项目增加人员将会使其进度更慢。估算开发时间可以使用类似于工作量的估算法。一些研究人员指出,开发时间与开发工作量之间十分精确地满足下面关系 TD=a(ED) b
其中a和b为经验常数,若ED以人-月为单位,则TD的单位为月,a和b的大小分别为2到4和0.25到0.4。
算式TD=a(ED) b 给出了名义开发时间。某些其他模型能够表示出名义开发时间发生变化后,开发工作量将如何变化。如COCOMO模型,最多只能压缩到名义开发时间的75%。所增加的这一部分工作人员的工作量都消耗在保持项目人员通信开销中了。
4.软件开发组织
有多少个软件开发机构,几乎也就有多少人员的组织机构。不管这些组织机构是好或坏,一般是不可能轻易改变的。尽管组织机构的改变不属于软件计划人员的职责范围内的事。不过,在一个新的软件项目中直接涉及人员的组织问题却是可以,也应该在软件计划阶段加以认真考虑的。
对于一个需要n个人工作k年的软件项目,如何使用人员资源,可能有以下几种选择:
(1)把m项不同功能的软件分配给n个人去完成,他们之间无需多少合作,主要协调的任务由一位软件主管人员来负责。这样,软件主管可能同时需要管理多个不同项目;
(2)把m项不同功能的软件分配给n个人去完成(m≤n),这样可能就要建立一些非正式的小组,并指定小组负责人,而小组之间的协调工作则由软件主管负责;
(3)n个人被组成k个小组,每个小组分配一个或多个功能,并有具体组织,协调工作由小组和软件主管共同进行。
虽然对上述每一种方案都可能说出赞成或反对的理由。然而,有越来越多的证据表明,第三种方案,即正式的小组是最好最有效的。
正式的小组的方案来源于“主程序员小组”的概念。它是由Harlan Mills首先提出,并由Baker进一步阐述的。小组的核心由一位高级工程师(主程序员)、2至5位技术人员和一位后备工程师组成。主程序员负责小组的所有技术活动的计划、协调和评审工作;技术人员负责项目的具体分析和开发;后备工程师则支持主程序员工作,必要时能代替主程序员工作,以便使项目能继续进行,而使损失最小。
主程序员小组有一名或多名专家(如数据库设计或通信方面专家)、数名辅助人员(如秘书和打字员)和一名资料员参加工作。资料员同时为多个小组工作,具体完成下列工作:
(1)保存和管理所有软件配置(包括各种文档、源程序清单、数据和各种磁介质资料);
(2)协助收集和整理软件生产率数据;
(3)对可修改的模块分类及编写索引;
(4)协助小组进行调查、评价和准备文档等。主程序员小组的主要目标是发挥集体力量。因引,小组要培养从“全局”观点出发进行程序设计,把“我的”程序变为“我们的”程序;帮助消除软件的个人属性,小组可以鼓励更加彻底的评审,并在共同的工作中增加学习,从而改善软件质量。
在本章中,我们曾讨论过人们在工作中有一个需要交流的问题。当采用主程序员小组这种形式时,必须会增加交换意见所需的工作量,这似乎不利于提高软件开发的生产率。然而,不管怎样组织,在软件整个开发过程的总工作量的相当一部分总是要花费在交换意见方面(如计划、分析和评审等)。虽然,小组的形式增加了内部交换意见的工作量,但是这是有组织的评审,必将减少在设计和编码中引入的错误。结果是测试工作量减少了,从而使小组有更高的生产率。当然,小组中技术人员的数量不宜过多,一般建议2~5人为好。5.软件计划
软件开发过程的每一步都要生产出可交付的文档,这些文档可以用来进行评审和作为下一步工作的基础。
软件计划是一份比较简短精炼的文件。它应该发给有关部门,其中包括:
(1)把该项目所确定的工作范围和所需的资源告诉软件主管部门、技术人员和该项目的需求者;
(2)有关该项目的成本估算和进度安排,应告诉软件主管部门,以便他们进行评审;
(3)还要发给与该项目开发有关的所有人员,给他们提供有关该项目开发的总办法。软件计划应包含以下内容:
1.工作范围
1.1项目目标 1.2主要功能 1.3其他特性 1.4开发情况
2.资源
2.1人员资源 2.2硬件资源 2.3软件资源2.4可利用的窗口
3.成本估算
4.进度安排六、软件开发工具与环境