一般说来,人们投资于一项事业的目的是为了在将来得到更大好处。开发一个软件系统也是一种投资,期望将来获得更大的经济效益。经济效益通常表现为减少运行费用或(和)增加收入。但是,投资开发新系统往往要冒一定风险,系统的开发成本可能比预计的高,效益可能比预期的低。把钱存到银行或贷给其他企业也有明显的经济效益(利息),而且不冒任何风险。那么,在什么情况下投资开发新系统更划算呢?成本/效益分析的目的正是要从经济角度分析开发一个特定的新系统是否划算,从而帮助客户组织的负责人正确地作出是否投资于这项开发工程的决定。
为了对比成本和效益,首先需要估计它们的数量。
软件开发成本主要表现为人力消耗(乘以平均工资则得到开发费用)。成本估计不是精确的科学,因此应该使用几种不同的估计技术以便相互校验。下面简单介绍3种估算技术。
1.代码行技术
代码行技术是比较简单的定量估算方法,它把开发每个软件功能的成本和实现这个功能需要用的源代码行数联系起来。通常根据经验和历史数据估计实现一个功能需要的源程序行数。当有以往开发类似工程的历史数据可供参考时,这个方法是非常有效的。
一旦估计出源代码行数以后,用每行代码的平均成本乘以行数就可以确定软件的成本。每行代码的平均成本主要取决于软件的复杂程度和工资水平。
2.任务分解技术
这种方法首先把软件开发工程分解为若干个相对独立的任务。再分别估计每个单独的开发任务的成本,最后累加起来得出软件开发工程的总成本。估计每个任务的成本时,通常先估计完成该项任务需要用的人力(以人月为单位),再乘以每人每月的平均工资而得出每个任务的成本。
最常用的办法是按开发阶段划分任务。如果软件系统很复杂,由若干个子系统组成,则可以把每个子系统再按开发阶段进一步划分成更小的任务。
典型环境下各个开发阶段需要使用的人力的百分比大致如表5.2所示。当然,应该针对每个开发工程的具体特点,并且参照以往的经脸尽可能准确地估计每个阶段实际需要使用的人力(包括书写文档需要的人力)。
3.自动估计成本技术
采用自动估计成本的软件工具可以减轻人的劳动,并且使得估计的结果更客观。
成本/效益分析的第一步是估计开发成本、运行费用和新系统将带来的经济效益。上面己经简单介绍了估计开发成本的基本方法,运行费用取决于系统的操作费用(操作员人数,工作时间,消耗的物资等等)和维护费用。系统的经济效益等于因使用新系统而增加的收入加上使用新系统可以节省的运行费用。因为运行费用和经济效益两者在软件的整个生命周期内都存在,总的效益和生命周期的长度有关,所以应该合理地估计软件的寿命。虽然许多系统在开发时预期生命周期长达10 年以上,但是时间越长系统被废弃的可能性也越大,为了保险起见,以后在进行成本/效益分析时一律假设生命周期为5年。
应该比较新系统的开发成本和经济效益,以便从经济角度判断这个系统是否值得投资,但是,投资是现在进行的、效益是将来获得的,不能简单地比较成本和效益,应该考虑货币的时间价值。
1.货币的时间价值
通常用利率的形式表示货币的时间价值。假设年利率为i,如果现在存入P元,则n年后可以得到的钱数为:
这也就是P元钱在n年后的价值。反之,如果n年后能收入F元钱,那么这些钱的现在价值是
例如,修改一个已有的库存清单系统,使它能在每天送给采购员一份定货报表。修改已有的库存清单程序并且编写产生报表的程序,估计共需5000元;系统修改后能及时定货将消除零件短缺问题,估计因此句年可以节省2500元,5年共可节省12500元。但是,不能简单地把5000元和12500元相比较,因为前者是现在投资的钱,后者是若干年以后节省的钱。
2.投资回收期
通常用投资回收期衡量一项开发工程的价值。所谓投资回收期就是使累计的经济效益等于最初投资所需要的时间。显然,投资回收期越短就能越快获得利润,因此这项工程也就越值得投资。
例如,修改库存清单系统两年以后可以节省4225.12元,比最初的投资(5000元)还少774.88元,第三年以后将再节省1779.45元。774.88/1779.45=0.44,因此,投资回收期是2.44年。
投资回收期仅仅是一项经济指标,为了衡量一项开发工程的价值,还应该考虑其他经济指标。
3.纯收入
衡量工程价值的另一项经济指标是工程的纯收入,也就是在整个生命周期之内系统的累计经济效益(折合成现在值)与投资之差。这相当于比较投资开发一个软件系统和把钱存在银行中(或贷给其他企业)这两种方案的优劣。如果纯收入为零,则工程的预期效益和在银行存款一样,但是开发一个系统要冒风险,因此从经济观点看这项工程可能是不值得投资的。如果纯收入小于零,那么这项工程显然不值得投资。
例如,上述修改库存清单系统,工程的纯收入预计是 9011.94-5000=4011.94(元)
4.投资回收率
把资金存入银行或贷给其他企业能够获得利息,通常用年利率衡量利息多少。类似地也可以计算投资回收率,用它衡量投资效益的大小,并且可以把它和年利率相比较,在衡量工程的经济效益时,它是最重要的参考数据。
已知现在的投资额,并且已经估计出将来每年可以获得的经济效益,那么,给定软件的使用寿命之后,怎样计算投资回收率呢?设想把数量等于投资额的资金存入银行,每年年底从银行取回的钱等于系统每年预期可以获得的效益,在时间等于系统寿命时,正好把在银行中的存款全部取光,那么,年利率等于多少呢?这个假想的年利率就等于投资回收率。根据上述条件不难列出下面的方程式:
其中:P是现在的投资额;Fi是第i年年底的效益(i=1,2,……,n);n是系统的使用寿命;j是投资回收率。
解出这个高价代数方程即可求出投资回收率(假设系统寿命n=5)。
例如,上述修改库存清单系统,工程的投资回收率是41%-42%。
怎样进行可行性研究呢?典型的可行性研究过程有下述一些步骤。
1.复查系统规模和目标 分析员访问关键人员,仔细阅读和分析有关的材料,以便对问题定义阶段书写 的关于规模和目标的报告书进一步复查确认,改正含糊或不确切的叙述,清晰地描述对目标系统的一切限制和约束。这个步骤的工作,实质上是为了确保分析员正在解决的问题确实是要求他解决的问题。
2.研究目前正在使用的系统 现有的系统是信息的重要来源。显然,如果目前有一个系统正被人使用,那么这个系统必定能完成某些有用的工作,因此,新的目标系统必须也能完成它的基本功能;另一方面,如果现有的系统是完美无缺的,用户自然不会提出开发新系统的要求,因此,现有的系统必然有某些缺点,新系统必须能解决旧系统中存在的问题。此外,运行使用旧系统所需要的费用是一个重要的经济指标,如果新系统不能增加收入或减少使用费用,那么从经济角度看新系统就不如旧系统。
应该仔细阅读分析现有系统的文档资料和使用手册,也要实地考察现有的系统。应该注意了解这个系统可以做什么,为什么这样做,还要了解使用这个系统的代价。在了解上述这些信息的时候显然必须访问有关的人员。
常见的错误做法是花费过多时间去分析现有的系统。这个步骤的目的是了解现有系统能做什么,而不是了解它怎样做这些工作。分析员应该画出描绘现有系统的高层系统流程图,并请有关人员检验他对现有系统的认识是否正确。千万不要花费太多时间去了解和描绘现有系统的实现细节。
没有一个系统是在“真空”中运行的,绝大多数系统都和其他系统有联系。应该注意了解并记录现有系统和其他系统之间的接口情况,这是设计新系统时的重要约束条件。
3.导出新系统的高层逻辑模型 优秀的设计过程通常总是从现有的物理系统出发,导出现有系统的逻辑模型,再参考现有系统的逻辑模型,设想目标系统的逻辑模型,最后根据目标系统的逻辑模型建造新的物理系统。
通过前一步的工作,分析员对目标系统应该具有的基本功能和所受的约束已有一定了解,能够使用数据流图,描绘数据在系统中流动和处理的情况,从而概括地表达出他对新系统的设想。通常为了把新系统描绘得更清晰准确,还应该有一个初步的数据字典,定义系统汇中使用的数据。数据流图和数据字典共同定义新系统的逻辑模型,以后可以从这个逻辑模型出发设计新系统。
4.进一步定义问题 新系统的逻辑模型实质上表达了分析员对新系统必须做什么的看法。用户是否也有同样的看法呢?分析员应该和用户一起再次复查问题定义、工程规模和目标,这次复查应该把数据流图和数据字典作为讨论的基础。如果分析员对问题有误解或者用户曾经遗漏了某些要求,那么现在是发现和改正这些错误的时候了。
可行性研究的前4个步骤实质上构成一个循环。分析员定义问题,分析这个问题,导出一个试探性的解;在此基础上再次定义问题,再一次分析这个问题,修改这个解;继续这个循环过程,直到提出的逻辑模型完全符合系统目标。
5.导出和评价供选择的解法 分析员应该从他建议的系统逻辑模型出发,导出若干个较高层次的(较抽象的)物理解法供比较和选择。导出供选择的解法的最简单的途径,是从技术角度出发考虑解决何题的不同方案。分析员可以确定几组不同的自动化边界,然后针对每一组边界考虑如何实现要求的系统。还可以使用组合的方法导出若干种可能的物理系统,例如,在每一类计算机上可能有几种不同类型的系统,组合各种可能将有做处理机上的批处理系统、微处理机上的交互式系统、小型机上的批处理系统等方案,此外还应该把现有系统和人工系统作为两个可能的方案一起考虑进去。
当从技术角度提出了一些可能的物理系统之后,应该根据技术可行性的考虑初步排除一些不现实的系统。例如,如果要求系统的响应时间不超过几秒钟,显然应该排除任何批处理方案。把技术上行不通的解法去掉之后,就剩下了一组技术上可行的方案。
其次可以考虑操作方面的可行性。分析员应该根据使用部门处理事务的原则和习惯检查技术上可行的那些方案,去掉其中从操作方式或操作过程的角度看用户不能接受的方案。
接下来应该考虑经济方面的可行性。分析员应该估计余下的每个可能的系统的开发成本和运行费用,并且估计相对于现有的系统而言这个系统可以节省的开支或可以增加的收入。在这些估计数字的基础上,对每个可能的系统进行成本/效益分析。一般说来,只有投资预计能带来利润的系统才值得进一步考虑。
最后为每个在技术、操作和经济等方面都可行的系统制定实现进度表,这个进度表不需要(也不可能)制定得很详细,通常只需要估计生命周期每个阶段的工作量。
6.推荐行动方针 根据可行性研究结果应该做出的一个关键性决定是,是否继续进行这项开发工程。分析员必须清楚地表明他对这个关键性决定的建议。如果分析员认为值得继续进行这项开发工程,那么他应该选择一种最好的解法,并且说明选择这个解决方案的理由。通常使用部门的负责人主要根据经济上是否划算决定是否投资于一项开发工程,因此分析员对于所推荐的系统必须进行比较仔细的成本/效益分析。
7.草拟开发计划 分析员应该为所推荐的方案草拟一份开发计划,除了制定工程进度表之外还应该估计对各类开发人员(例如,系统分析员、程序员)和各种资源(计算机硬件、软件工具等)的需要情况,应该指明什么时候使用以及使用多长时间。此外还应该估计系统生命周期每个阶段的成本。最后应该给出下一个阶段(需求分析)的详细进度表和成本估计。
8.书写文档提交审查 应该把上述可行性研究各个步骤的工作结果写成清晰的文档,请用户、客户组织的负责人及评审组审查,以决定是否继续这项工程及是否接受分析员推荐的方案。