第二章软件计划与可行性研究2有这样一个笑话:一个旅客走进硅谷的一家宠物店,浏览展示的宠物。这时,走进一个顾客,对店主说:我要买一只C猴。店主点了点头,走到商店一头的兽笼边,抓出一只猴,递给顾客说:总共5000美元。顾客付完款,然后带走了他的猴子。这位旅客非常惊讶,走到店主跟前说:那只猴子也太贵了!店主说:那只猴子能用C编程,非常快,代码紧凑高效,所以值那么多钱。这时,旅客看到了笼子中的另一只猴子,它标价10000美元。于是又问:那只更贵了!它能做什么?店主回答:哦,那是一只C++猴;它会面向对象的编程,会用VisualC++,还懂得一点Java,是非常有用的。旅客又逛了一会儿,发现了第三只猴子,它独占一个笼子,脖子上的标价是50000美元。旅客倒抽一口气,问道:那只猴子比其他所有猴子加起来都贵!它究竟能做什么?店主说:我们也不知道它究竟能做什么,不过它是做项目顾问出身的。34第二章软件计划与可行性研究在组织管理工作中,为了掌握工作的主动权,人们针对不同的工作目的要制定不同的工作计划。同样,为了成功的开发软件,也要制定软件开发计划。经验告诉我们,在项目开始以前,要精确地估计软件的工作量是很困难的,一些大型软件项目在总结经验教训时,常常提到计划不周造成的不良影响。例如,对项目所需投入的人力、资金、设备作出错误的估计,而在工程期限临近时不得不仓促增加,造成系统的一致性差或培训费用的增加,甚至在完工后才发现系统功能上存在着重大问题,软件计划中的错误可能导致软件开发后期问题的急剧膨胀。因此,要对软件项目有一个初步计划,对要解决的主要问题有相应的对策,是软件开发工作必不可少的一步。5第一节软件计划与系统目标的描述1.软件计划作为软件开发阶段的第一步,就是要明确软件项目的性质、目标、开发软件涉及的工作范围、所需资源、经费和应完成的时间进度等内容,以此来制定软件项目的开发计划。即首先经过系统目标的描述、进行可行性研究、然后进入项目的实施开发阶段。61.1软件计划的任务:软件计划阶段有以下任务:(1)确定要开发软件的总体要求与适用范围;(2)描述所开发的软件与外部资源、人员操作与数据的工作关系;(3)确定所需的软硬件支持;(4)对开发的进度、风险、效益与成本作初步估计;(5)进行系统的可行性分析;(6)确定所开发软件的性能,与原有软硬件的关系及其它关系;(7)列出资源的初步分配计划和系统构成;以上各项常常要考虑多种可能的方案,并从中进行权衡与选择。71.2软件计划的内容:软件计划确定软件开发的工作范围、使用的资源、花费的工作量以及应遵循的进度。软件计划以可行性研究报告为基础,由软件人员和用户共同确立软件的功能与限制,提出软件计划任务书。它是一份简洁的文档资料,是用管理人员、技术人员、用户都能理解的术语来描述的,典型的软件计划任务书应包括如下四个方面:81.2软件计划的内容:软件范围:包括软件的功能、性能、可靠性和与其它系统的接口等问题的描述;功能说明给出整个软件的功能的简短描述,在可能的情况下作进一步分解,提供更多的子功能描述;性能描述包括处理时间的限制,存储容量及与物理特性相关的特点描述;对功能和性能要同时考虑才能做出正确的估计;不同的性质的软件对可靠性有不同的要求,有些要求采取特殊的技术措施才可能实现;软件要与计算机系统的其他部分进行交互作用,有可能是更大系统的一部分,软件计划应该考虑每一接口界面的性质和复杂程度,确定对开发资源、成本及进度表的影响;91.2软件计划的内容:环境资源:包括软件、硬件和人,每种资源均应从资源的描述、对资源的要求的日程、时间,以及使用资源的持续时间三方面来说明。硬件资源包括开发系统、目标机器和新系统的其他部件。软件资源包括系统软件、支撑软件工具和实用软件,系统软件是必不可少的,支撑软件工具在软件开发中起辅助作用,实用软件有时可成为新软件系统的一部分。人是主要的软件开发资源,对于相当小的软件项目,一个人就可以完成。而对于大型软件工程项目,在软件的整个生命周期中,人员的组成情况是变动的,一个典型的软件项目,在软件生命周期的开发阶段对各类人员有不同的要求,如图2-1所示:10软件生命期各个阶段人员分配软件计划需求分析总体设计详细设计软件编码模块测试整体测试验收确认维护使用阶段人数初级技术人员高级技术人员管理人员图2-1软件生命周期各阶段对人员数量的要求111.2软件计划的内容:制定进度表:软件交付日期常常预先确定,关键是软件开发组织如何在指定的期限内分配资源和力量。分析员要协调可用资源与项目的工作量,考虑各项任务之间的相互依赖,在可能的情况下并行地安排工作,预见潜在的瓶口问题,提供意外事故的处理等;复审也要作为一个实施任务考虑在计划内;121.2软件计划的内容:软件成本:现在软件价格已是构成计算机系统价格的重要组成部分,开发软件的价格不可能精确计算,许多可变的因素都可能影响软件的最终价格,我们可以采取一些方法,使得软件价格的估算结果基本上是可以接受的。如:源程序代码行估算法、任务工作量分解法、模型分析法等。13软件成本估算方法:源程序代码行估算法是比较简单的估算方法,它把开发软件的每个功能的成本与实现这个功能所需的源程序代码行联系起来,根据经验和历史数据去估计一个功能需要的源程序行数,将每行代码的平均成本乘以行数就可以确定软件的成本,每行代码的平均成本主要取决于软件的复杂程度和平均工资水平,当以往有开发类似工程的历史数据可供参考时,这种方法非常有效;14软件成本估算方法:任务工作量分解法是将开发的软件项目分解为若干个相对独立的任务,可将软件项目分解为若干个子系统,再将子系统按开发阶段划分成更小的任务,分别估计单独开发每个任务的成本,最后累加起来得到软件开发项目的总成本。估计每个任务的成本时,通常先估计完成该项任务所需的人力时间(以人月为单位),再乘以每人每月的平均工资而得出每个任务的成本,最终得到整个系统的成本;15软件成本估算方法:模型分析法是以长期收集的大量历史数据为基础,建立各种性质的开发软件的成本估算模型和提供相应的数据库支持,利用软件计算工具输入相关的估算参数,估算软件的开发成本,这种自动估计软件成本的方法可以减轻脑力劳动,使估计的结果更加客观,但并不容易得到准确的软件成本估算模型。162.系统目标描述与步骤2.1系统目标描述:进行系统目标的描述,就是描述项目的背景,了解开发系统的现状、开发的理由与条件、存在的主要问题、要解决的主要问题,确定开发系统的要求与总体目标、总体规模、实现目标的初步方案、环境要求,写出系统目标与问题的描述报告,供可行性分析使用。应该请应用项目的用户负责人、用户方的技术人员与开发项目的系统分析员、甚至软、硬件技术专家一道,共同讨论与项目有关的问题。用户根据实际工作的情况,提出希望解决的主要问题,并以项目任务书的形式对问题的性质、目标和规模进行描述。17例如:某企业提出开发一套仓库管理系统的要求,经过系统分析员与企业技术人员的调查,写出初步的系统目标的描述,说明系统的目标范围和开发限制的时间。(1)项目:仓库管理系统;(2)背景:人工管理效率低,物品种类繁多,易出差错;(3)项目目标:建立一个高效率、无差错的仓库管理系统;(4)项目范围:硬件利用现有微机系统,软件委托开发,费用≤5000元;(5)初步设想:建议增加缺货统计报告与库存月报功能,并可随时查询;(6)可行性研究:建议进行一周分析,费用≤450元;(一般为5%-10%)(7)项目开发时间:四个月内完成。181.2系统目标描述的工作步骤:进行系统目标的描述(初步定义)的工作步骤如下:(1)了解项目中实际问题的建议和要求;(2)了解现场状况,调查开发项目的原因与背景;(3)查阅用户的书面报告,用较短的时间加工整理;(4)反复讨论,澄清对有关问题的模糊认识,确定软硬件功能的范围;(5)写出实现目标的系统描述文档;(6)进一步确定双方是否可进行深入的的可行性研究意向。19第二节可行性研究可行性研究的重要内容是以尽量少的投入,在最短的时间内,对将要开发的系统进行技术可行性、经济可行性、社会(法律)可行性、人员、操作、资源的可行性研究,并得出项目是否现实可行和值得开发的结论,如果可行,确定实施方案和计划,否则,可能取消一个所建议的不合适的项目。201.可行性研究的目的一般的项目开发,都要进行可行性研究,可行性研究的目的不是研究如何解决问题,而是确定问题是否能够解决和是否值得解决。如果软件项目不值得开发,则终止进行。不值得开发的项目,做任何时间上、人力上、经费上的开发活动都是无谓的浪费。有些项目值得开发是不言而喻的,有些项目需要经过可行性论证才能知道是否值得开发。如果仅仅根据系统目标的初步描述就开始寻找项目的承包单位去签定合同,这是很冒险的。因为并不是所有问题都能在规定的时间和经费内得到解决。中途终止项目的开发,对于双方都是很大的损失,因此,进行可行性分析研究是不可忽视的。212.可行性研究的内容(1)项目背景:问题描述;实现环境;限制条件;(2)管理概要与劝告:重要的研究结果;说明;劝告;影响;(3)候选方案:候选系统的配置;选择最终方案的准则;(4)系统描述:简略的系统范围的描述;分配系统元素的可行性;(5)经济可行性:(成本—效益分析)经费概算;预期的经济效益;运行成本;(6)技术可行性:(技术风险评价评价)技术实力;已有工作基础、设备条件;(7)法律可行性:系统开发应避免侵权、违法和责任;(8)用户使用可行性:用户单位的行政管理、工作制度;使用人员素质;(9)其他与项目有关的问题,未来可能的变化;223.可行性研究的主要方面可行性研究与风险分析密切相关,如果项目的风险很大,就会降低产生高质量软件的可行性,因此,可行性研究主要集中于与风险相关的因素上,体现在以下四个方面:经济、社会效益可行性:技术可行性:法律可行性;用户操作可行性:技术可行性常常最难决断,因为系统的目标、功能、性能比较模糊,一般与系统评估、分析和定义过程并行进行,应考虑如下因素:开发的风险、资源的有效性、技术方面234.可行性研究的步骤可行性研究典型的研究步骤如下:复查系统规模和目标研究目前正在使用的系统导出新系统的高层逻辑模型重新定义系统的问题和目标导出和评价供选择的多个高层解决方案做出可行性研究判断草拟开发计划书写文档、提交检查24第三节成本/效益分析一般来说,人们投资于一项事业的目的是为了在将来获得更大的好处。开发一个新系统也是一种投资,期望将来获得更大的经济效益。经济效益通常表现为减少运行费用或增加收入。但是,投资开发新系统往往要冒一定风险,系统的开发成本有可能比预计的高,运行效益有可能比预计的差。那么,在什么情况下投资开发新系统更划算?成本/效益分析的目的正是从经济的角度分析开发一个特定的新系统是否划算,是否值得投资。是可行性分析中的经济可行性分析的重要组成部分。251、成本估计一般来说,基于计算机系统的成本由四个部分组成:1、购置并安装软硬件及有关设备的费用2、系统开发费用3、系统安装、运行和维护费用4、人员培训费用对于我们来讲,最关心的是第二项:开发费用。软件开发成本主要表现为人力的消耗(乘以平均工资则得到开发费用),但是人力又分等级,工作也难于准确衡量,因此,成本估算一般不是很准确,只是粗略估算。261、成本估计一、成本估计有两种基本的估算方法(estimation):自顶向下和自底向上(1)自顶向下成本估计估计总的开发成本----内部成本分配----专家判断缺点:对于某些局部的问题和特殊困难容易低估,全凭经验来衡量,否则,误差很大。(2)自底向上成本估计各个任务单元成本---汇总---总体成本缺点:工作人员只注意自己的工作,容易忽视对综合测试、质量管理、项目管理等花费,因此估计量偏低。(3)算法模型估计算法模型就是资源模型,由于资源模型是根据历史数据导出的,故可重复性好,关键在于选择好的模型。27二、费用估计(1)代码行技术代码行技术是比较简单的定量估算方法,也是一种自底向上的估算方法。它把开发每