在我们大谈软件评估的同时,我们先来确定一个概念,什么是能力成熟度模型。

    能力成熟度模型(Capacity Maturity Mode1,CMM),是卡内基-梅隆大学软件工程研究院(SEI)为了满足美国联邦政府评估软件供应商能力的要求,于1986年开始研究的模型,并于1991年正式推出了CMM1.0版。CMM自问世以来备受关注,在一些发达国家和地区得到了广泛应用,成为衡量软件公司软件开发管理水平的重要参考因素和软件过程改进事实上的工业标准。我国制定了SJ/T 11234-2001《软件过程能力评估模型》和SJ/T 11235-2001《软件能力成熟度模型》两项软件标准,对各项软件工程活动给出了比较全面、细致的描述,以支撑软件产业的整体发展。
    软件特殊性的需要
    通常所说的软件包括计算机运行时所需要的各种程序,一般分为系统软件和应用软件。对于软件,一般有三个层次:
    a.个体层次:包括计算机系统中的程序及文档,程序是计算机任务处理的对象加规则的描述,文档是理解程序所需的阐述性资料。
    b.整体层次:在特定的计算机系统中,所有上述个体层次软件的总称。
    c.学科层次:研究、开发、维护和使用软件过程中所涉及的理论、方法、技术所构成的学科。

    随着软件需求量的快速增长,软件应用中出现的问题也越来越多。主要体现在以下五个方面。
    1.软件成本的提高:
    上世纪50年代,计算机系统应用于非常狭窄的领域,应用规模较小,其成本约占整个计算机系统的10%~20%,随着计算机技术的进步,生产规模的扩大,计算机硬件价格不断下降,而软件成本在计算机系统中所占的比例越来越大。到上世纪60年代中期软件费用占50%左右;上世纪70年代以后,软件费用进一步增加。例如:1980年美国政府的财政年度中,计算机软、硬件与服务费共耗资570亿美元,其中软件费用320亿美元,占56%。随着软件成本的不断增加,软件费用所占的比例呈现日益扩大的趋势。
    2.软件开发进度难于控制:
    软件是一种逻辑系统,设计软件所使用的逻辑量比设计硬件要多若干倍。为了完成一个复杂的软件系统,常常要考虑建立一个庞大的逻辑体系。另外,同样的软件算法在程序实现上的差别也非常大,加之在软件开发过程中可能遇到各种意想不到的问题,所以投入的资源能否出结果,事先很难预料。由于软件的这种特点,不仅给项目计划和论证工作带来很大困难,而且软件开发过程很难保证按预定计划实现。
    3.软件工作量的估计较困难:
    通常,要完成一项任务,需要根据其复杂性、工作量及进度要求安排人力,但软件的工作量是很难估计的。其原因有以下两点:a.软件开发实际上是逻辑思维过程,在编写出程序并在计算机上运行之前,软件开发的进展难于衡量,质量也难于评价,所以工作量很难估计。b.软件规模和复杂性呈指数巨增,开发一个大型软件系统,往往需要许多人的分工协作。由于软件系统的结构很复杂,各部分联系密切,大量的通信、后勤工作增大了工作量。因此,增加人员,往往不仅不能缩短开发时间,反而会延缓进度,这是与生产一般工业产品的区别。
    4.软件质量难于保证:
    软件的质量问题与其他商品的质量问题有很大不同,因为软件是属于计算机领域的产品,软件设计人员与用户计算机的了解和想法有很大的距离,程序人员通常以自己的想法去理解用户对软件的要求,而计算机用户对自己所想使用的软件功能和性能在事前也难以说清楚,这样在需求分析上就难免存在差距,在软件开发过程中,即使有多种文档,大量的素材仍在程序员的头脑中,软件也只有程序清单,这就使得不了解情况的人很难插上手,最终导致了软件的个性和维护十分困难。实际上对软件质量最有发言权的是用户,但用户无法也无力参加到软件的质量管理中,这就导致软件设计常有不少随意性,使软件的质量控制成为一个很难解决的问题,以至计算机产业普通存在投入了大额资金和大量人力,而得不到用户满意的产品。如何控制和管理软件产品的质量,是软件行业从一开始就面临的问题,这个问题之所以难以解决,在于软件的特殊性。
    5.软件的个性与维护比较困难:
    正式投入使用的商业软件,在不同的运行条件下,就会出现故障,需要维护。但软件的维护与硬件的维护不完全相同。这是因为:a.软件不是一种实物 ,而是逻辑元件,软件故障属逻辑故障,不是硬件的“用旧”、“损坏”之类的问题。维护软件不是更换某种备件,而是要纠正逻辑缺陷,使之改正错误,增加适应性和提高性能。b.当软件系统规模庞大,问题复杂时,经常会发生“纠正一个错误带来更多的错误”的问题。c.软件修改和扩充表现为改变程序中几条语句或几条指令,当系统投入运行后为适应新增加或变化的设备条件或为增添新功能,经常要提出要求进行维护。所以,软件的维护工作量较大。

    综合以上所述,软件是计算机系统中的逻辑部件而不是物理部件,软件开发是逻辑思维过程,软件的工作量很难估计,进度难于衡量,度量也难于评价,成本高,维护工作量繁重。同时软件的复杂度随规模按指数增加,这就需要许多人共同开发一个大型系统。团队开发软件虽然增加了开发力量,也增加了额外的工作量,组织不严密,管理不善,常常是造成软件开发失败多,费用高的重要原因。