由于软件越来越重要人们对其质量的要求也越来越高,人们都希望开发高质量的软件,但由于受到市场因素的牵制,不可能达到“完美”这个标准,因此,软件工程的目标不是实现“完美”而是达到“足够好”,那么,什么是好的软件呢?

什么是好的软件

质量是一个复杂多面的概念,不同的人从各自的视角会有不同的理解和要求。

对于用户来说他们更关心的是系统的功能质量,比如:

  • 软件符合指定需求
  • 软件几乎没有缺陷
  • 软件性能正常
  • 软件容易上手,操作方便

对于开发人员更多关心的是系统的结构质量,主要包括:

  • 代码可读性
  • 代码可测试性
  • 代码可维护性
  • 代码效率:高效管理资源
  • 代码安全:可预防常见威胁

对于投资者而言,软件开发的过程质量更为重要,主要关心:

  • 软件按时交付
  • 软件满足预算
  • 可复用的开发过程,确保交付质量

通常来讲,软件质量应该涵盖软件过程、软件产品和产品效用三个方面:

  • 软件过程用过程质量来衡量;
  • 软件产品则包括内在质量和外在质量两部分;
  • 产品的效用用使用质量来衡量;

过程的质量会影响到软件产品内在的代码质量,而代码质量的好坏决定了产品的外在质量,外在质量最终影响到用户的使用质量,因此我们必须用有效的方法来检验整个开发过程、程序代码和最终产品,并对用户的使用质量进行监测。
image.png

质量大师温伯格认为质量就是软件产品对于某个(或某些)人的价值。这里的某个(或某些)人通常指的就是用户。这句话包含两个层次的质量含义,即“正确的软件”和“软件运行正确”。
image.png
我们开发的软件既要是正确的,也要是运行正确的。这两者是相辅相成的。前者关系到软件的成败,后者关系到软件的好坏,对于开发团队来说,尤其是偏重技术的开发团队往往过分注重后者即“运行正确”,经常会陷入到在软件开发过程中的技术细节中,而忽略了前者,也就是软件需要符合用户的需求,这样开发出的软件经常是能用但不是用户满意的产品,

Windows Vista系统是典型的运行不正确软件,由于莫名其妙的死机、很差的运行效率、兼容性等等问题和缺陷,最终导致许多用户弃用,甚至退回Windows XP,最终微软不得不在两年之后用 Win7 取代了 Vista。

从软件产品的角度来看,高质量意味着:

  • 做了用户想要它做的事情
  • 正确有效地使用计算机资源
  • 易于用户学习和使用
  • 设计良好、代码良好且代码编写规范易于测试和维护

产品质量维度

在理解了质量的基本含义之后应该如何评价质量。产品的质量可从多个维度来进行评价。David Garvin 提出了一种多维度的质量评价模型:
image.png
具体包括:性能质量、产品特色、可靠性、符合性、耐久性、可服务性以及外观性和感知性等8个维度,不同属性反映产品质量的不同方面,我们通过改善产品的各个质量属性,来提高整个产品的质量。

以汽车为例:
汽车首先是要满足人们出行的驾驶需要,所以在功能和性能上符合要求(性能质量),为最终用户提供价值。除了主要的产品特性之外,如果还有一些诸如自动泊车、未关门报警、在遥控器锁车的时候自动检测并关闭敞开的车窗等特性(产品特色),这些特性会给用户带来意外的惊喜。当然汽车要可靠安全(可靠性),要符合国家或行业的相关标准(符合性),日常维修不能损坏和降低车辆的性能(耐久性),维修时间是在可接受的范围之内(可服务性),除了这些主要的产品特性之外人们对产品的审美也是必不可少的(外观性审美),当然这个审美是各有不同是非常主观的,有的人欣赏某种优雅稳重的外形,有人则喜欢醒目动感的外在,但是对于产品来说审美这个性质是非常重要的,有时候一些偏见也会影响人们对质量的感知(感知性),例如企业或者品牌的声誉会让人对产品质量产生相应的感觉。

David Garvin的质量维度是一个通用的产品评价体系,并不是专门为软件制定的,但是它也同样适用于软件产品。ISO9126 质量模型是一种评价软件质量的通用模型,它定义了软件的 6 个质量属性,即功能性、可靠性、易用性、效率/性能以及可维护性和可移植性,每一个属性又细分成一系列子属性:
image.png

功能性

功能性包括适合性、准确性、互操作性和安全性四个子属性。

  • 适合性:软件在指定条件下使用,满足用户明确和隐含要求功能的能力。
  • 准确性:软件提供给用户功能的精确度是否符合目标,比如说运算结果的准确,数字没有偏差等等。
  • 互操作性:软件与其它系统进行交互的能力。
  • 安全性:软件保护信息和数据的安全能力。

比如你在电商网站购买商品,像关键字搜索、商品质量浏览、选购商品、生成产品订单等都是用户需要的主要功能,订单费用的结算也必须是运行准确的,同时这个系统还会和银行卡支付系统进行交互,系统也要保证用户账号的安全。

可靠性

可靠性指的是系统是否能够在一个稳定的状态下满足用户的使用:

  • 成熟性:软件产品避免因软件中错误发生而导致失效的能力。
  • 容错性:软件防止外部接口错误扩散而导致系统失效的能力。
  • 可恢复性:系统失效后,重新恢复原有的功能和性能的能力。

这就意味着软件要有代码出错的处理能力,对外部出现错误时软件依然能够保持正常的运行状态。当然软件业也不可能绝对不出现问题,但是在失效发生的情况下,系统应该能够重新恢复到正常的运行,同时恢复受直接影响的数据

易用性

易用性是指在规定的条件下使用时,软件产品被理解、学习、使用和吸引用户的能力。

  • 易理解性:软件显示的信息要清晰、准确且易懂,使用户能够快速理解软件。
  • 易学习性:软件使用户能学习其应用的能力。
  • 易操作性:软件产品使用户能易于操作和控制它的能力。
  • 吸引性:软件具有的某些独特的、能让用户眼前一亮的属性。

易用性是用户在使用软件过程中所实际感受到的系统质量,它会直接影响到用户对产品的满意度。

效率

性能也是影响产品质量的一个重要因素,通常从时间特性和资源使用两个方面来衡量系统的性能水平。包含:

  • 时间特性:在规定的条件下,软件产品执行其功能时能够提供适当的响应时间和处理时间以及吞吐率的能力。
  • 资源利用:软件系统在完成用户指定的业务请求所消耗的系统资源,诸如 CPU 占有率、内存占有率、网络带宽占有率等。

比如我们打开商品网页浏览商品时,希望系统对用户请求具有快速的响应和处理,同时消耗的系统资源和网络带宽比较低。

可维护性

对于开发人员来说,可维护性和可移植性是非常重要的。可维护性用于衡量软件产品被修改的时候需要花费多大的努力,包含:

  • 易分析性:软件提供辅助手段帮助开发人员定位缺陷原因并判断出修改之处。
  • 易改变性:软件产品使得指定的修改容易实现的能力。
  • 稳定性:软件产品避免由于软件修改而造成意外结果的能力。
  • 易测试性:软件提供辅助性手段帮助测试人员实现其测试意图。

可移植性

可移植性是指软件从一种环境迁移到另一种环境的难易程度,包含:

  • 适应性:软件产品无需做任何相应变动就能适应不同运行环境的能力。
  • 易安装性:在平台变化后,成功安装软件的难易程度。
  • 共存性:软件产品在公共环境与其共享资源的其他系统共存的能力。
  • 替换性:软件系统的升级能力,包括在线升级、打补丁升级等。

实现软件质量

软件质量是如何实现的,或者说如何才能有效地提高软件质量?
image.png
软件开发过程包括了分析、设计、实现、测试等一系列活动,测试是检验软件产品的一个重要的手段,但是质量是能够测出来的吗?实际上到测试的阶段,软件质量的问题如果发生,已经很难进行纠正,所以说:

  • 质量并不是测出来的,而是在开发过程中逐渐的构建起来的。
  • 虽然质量不是测出来的,但是未经测试也不可能开发出高质量的软件。
  • 质量是开发过程的问题,构建高质量代码是每一个软件工程师义不容辞的责任,当然,测试也是开发过程中不可缺少的一个重要环节

因此,对于软件开发来说,高质量的设计、规范的编码以及有效的测试是保证软件产品质量的三个重要方面,也是提高软件质量的必要手段:
image.png

商业环境下的软件质量

接下来的问题是软件质量的重要性是无容置疑的,那么是不是质量越高就越好?软件产品是否应该追求“零缺陷”?

对于航天软件来说,如果在发射时软件出现问题就会造成巨大的损失,所以说在发射之前只要发现任何异常,就会立即取消发射指令,直到异常被消除为止,在这种情况下软件的质量越高越好,软件产品追求的是“零缺陷。

像许多互联网软件,在产品还存在一定缺陷的情况下就发布上线,之后再不断地更新版本,修复已有的缺陷,以乎在这种情况下用户也是可以接受一个有缺陷的软件产品的。

为什么这种系统不像航天系统一样,需要在发布之前修复所发现的任何缺陷呢?显然我们不能抛开商业目标来谈论产品质量:
image.png
企业的根本目标是要获得尽可能多的利润,为了提高用户对产品的满意度,企业必须提高产品质量,但是也不可能为了追求完美的质量而不惜一切代价。质量是有成本的,当企业为提高质量所付出的代价超过了产品收益时,这个产品也就没有商业价值了。因此,企业必须权衡质量、效率和成本三个因素,产品质量太低或太高,都不利于企业的长远发展,理想的质量目标不是“零缺陷”,而是恰好让用户满意,并且将提高质量所付出的代价控制在预算之内。