软件质量的定义
  明确声明的功能和性能需求、明确文档化的开发标准、以及专业人员开发的软件所具有的所有隐含特征都得到满足。
  上述定义强调了以下三个重要的方面:
  (1) 软件需求是进行"质量"度量的基础,不符合需求就是质量不高。
  (2) 规范化的标准定义了一些开发准则以指导软件开发,如果不遵照这些准则,则极有可能导致质量不高。
  (3) 往往会有一些隐含的需求没有明确地提出来,如软件的可维护性等,忽略了这些隐含需求,软件的质量也难以保证。
  软件质量是一个多因素的复杂混合,这些因素随着不同的应用和用户而变化。在软件开发中,设计质量包括系统的需求、规格和设计,符合质量则主要关注实现问题。
软件的质量特性
  软件质量特性反映了软件的本质,通常用软件质量模型来描述影响软件质量的特性。在著名的McCall模型中,软件质量被描述为正确性、可靠性、效率、完整性、可用性、可维护性、灵活性、可测试性、可移植性、复用性、互操作性等11种特性,其质量模型如图2.1所示。

图2.1 McCall质量模型

  这些特性分别面向软件产品的运行、修订和变迁三个方面,通过定量化地度量软件属性便可以得知软件质量的水平。
  "运行正确"的程序就是高质量的程序吗?
  "运行正确"的程序不见得就是高质量的程序。这个程序也许运行速度很低并且浪费内存,也许代码写得一塌糊涂,除了开发者本人谁也看不懂也不会使用。应该说,正确性只是反映软件质量的一个因素而已。

* 正确性(Correctness)
  在特定环境下,软件满足设计规格说明和用户预期目标的程度。

  正确性是一个十分重要的软件质量因素,如果软件运行不正确或者不精确,就会给用户造成不便甚至造成损失。即使一个软件能100% 地按需求规格执行,但是如果需求分析错了,那么对客户而言这个软件也存在错误。即使需求分析完全符合客户的要求,但是如果软件没有100% 地按需求规格执行,那么这个软件也存在错误。

* 可靠性(Reliability)
  软件按照设计要求,在规定时间和条件下不出故障、持续运行的程度。

  可靠性是指在一定的环境下,在给定的时间内系统不发生故障的概率。可靠性本来是硬件领域的术语,例如,某个电子设备一开始工作很正常,但由于工作中器件的物理性质会发生变化(如发热),慢慢地系统就会失常。所以一个设计完全正确的硬件系统,在工作中未必就是可靠的。软件在运行时不会发生物理性质的变化,人们常以为如果软件的某个功能是正确的,那么它一辈子都是正确的。可是我们无法对软件进行彻底地测试,无法根除软件中潜在的错误。平时软件运行得好好的,说不准哪一天就不正常了,"2000年"问题。因此把可靠性引入软件领域是有意义的。

* 效率(Efficiency)
  为了完成预定功能,软件系统所需的计算机资源的多少。

  用户都希望软件的运行速度高些,并且占用资源少些。程序员可以通过优化算法、数据结构和代码组织来提高软件系统的性能与效率。

* 完整性(Integrity)
  对未授权人员访问软件或数据的可控制程度。
* 可用性(Usability)
  学习、操作、准备输入和解释程序输出所需的工作量。

  软件的可用性要让用户来评价,导致软件可用性差的根本原因是开发人员以为只要自己用起来方便,用户也一定会满意。

* 可维护性(Maintainability)
  定位和修复程序中的一个错误所需的工作量。
* 灵活性(Flexibility)
  修改或改进一个已投入运行的软件所需的工作量。
* 可测试性(Testability)
  测试软件以确保其能够执行预定功能所需的工作量。
* 可移植性(Portability)
  将一个软件系统从一个计算机系统或环境移植到另一个计算机系统或环境中运行所需的工作量。
* 复用性(Reusability)
  一个软件(或部件)可以用于其他应用的程度。
* 互操作性(Interoperability)
  连接一个系统和另一个系统所需的工作量。