第9章软件质量管理............................................................................................................29.1软件的质量属性和质量要素...........................................................................................29.2商业目标决定质量目标...................................................................................................39.3质量保证能够保证质量吗...............................................................................................49.4质量人员的状况...............................................................................................................69.4.1郁闷的质量人员....................................................................................................69.4.2路在何方................................................................................................................79.4.3赞美诗....................................................................................................................89.5全面软件质量管理...........................................................................................................99.5.1模型........................................................................................................................99.5.2质量人员的职责..................................................................................................109.5.3制定质量计划......................................................................................................119.5.4技术评审..............................................................................................................139.5.5软件测试..............................................................................................................169.5.6过程检查..............................................................................................................169.5.7缺陷跟踪工具......................................................................................................179.6小结................................................................................................................................19第9章软件质量管理软件质量管理是充满争论的话题。被人们奉为软件质量管理圣经的CMM和ISO9001似乎并不奏效,现实和理想之间的差距太大。本章树立一个重要的理念:商业目标决定质量目标。提高软件质量的最终目的是为了赢利,而不是创造完美无缺的产品。因此对于普通商业软件而言,并不是“质量越高越好”,而是恰好让广大用户满意,并且将提高质量所付出的代价控制在预算之内。经典软件工程教科书以及CMM和ISO9001总是抛开商业目标谈质量管理,本末倒置,纸上谈兵,误导了大量读者,所以质量管理才变得那么艰辛。本章给出了一套实用主义的“全面软件质量管理”方法。质量人员在全面软件质量管理中发挥重要作用,本章探讨了质量人员的工作状况,给他们一些声援,并提出了改善工作状况的建议。9.1软件的质量属性和质量要素在讲述软件质量管理方法之前,我们首先要搞清楚什么是软件质量。词典对质量的定义是:①典型的或本质的特征;②事物固有的或区别于其他事物的特征或本质;③优良或出色的程度。CMM对质量的定义是:①一个系统、组件或过程符合特定需求的程度;②一个系统、组件或过程符合客户或用户的要求或期望的程度。上述定义很抽象,人们看了准会一脸迷惘。就让我们用“人的健康”来类比解释软件质量吧。古时候人们以为长得结实、饭量大就是健康,这显然是不科学的。现代人总是通过考察多方面的生理因素来判断是否健康,如测量身高、体重、心跳、血压、血液、体温等。如果上述因素都合格,那么表明这人是健康的。如果某个因素不合格,则表明此人在某个方面不健康,医生会对症下药。通过类比,我们这样理解软件质量:软件质量是许多质量属性的综合体现,各种质量属性反映了软件质量的方方面面。人们通过改善软件的各种质量属性,从而提高软件的整体质量(否则无从下手)。软件的质量属性很多,如正确性、精确性,健壮性、可靠性、容错性、性能、易用性、安全性、可扩展性、可复用性、兼容性、可移植性、可测试性、可维护性、灵活性等。表9-1是常见质量属性的描述,先让读者对软件质量属性有个初步的了解。质量属性描述正确性正确性是指软件按照需求正确执行任务的能力。“正确性”的语义涵盖了“精确性”。正确性无疑是第一重要的软件质量属性。健壮性健壮性是指在异常情况下,软件能够正常运行的能力。正确性与健壮性的区别是:前者描述软件在需求范围之内的行为,而后者描述软件在需求范围之外的行为。健壮性有两层含义:一是容错能力,二是恢复能力。可靠性可靠性是一个与时间相关的属性,指的是在一定环境下,在一定的时间段内,程序不出现故障的概率,因此是一个统计量,通常用平均无故障时间来衡量。软件可靠性问题通常是由于设计中没有料到的异常和测试中没有暴露的代码缺陷引起的。性能性能通常是指软件的“时间—空间”效率,而不仅是指软件的运行速度。人们总希望软件的运行速度高些,并且占用资源少些。易用性易用性是指用户使用软件的容易程度。软件的易用性要让用户来评价。清晰性清晰意味着工作成果易读、易理解,开发人员只有在自己思路清晰的时候才可能写出让别人易读、易理解的程序和文档。安全性安全性是指防止系统被非法入侵的能力,既属于技术问题又属于管理问题。一般地,如果黑客为非法入侵花费的代价(考虑时间、费用、风险等因素)高于得到的好处,那么这样的系统就可以认为是安全的。可扩展性可扩展性反映了软件适应“变化”的能力。在软件开发过程中,“变化”是司空见惯的事情,如需求、设计的变化,算法的改进、程序的变化等。可扩展性是系统设计阶段重点考虑的质量属性。兼容性兼容性是指两个或两个以上的软件相互交换信息的能力。兼容性的商业规则是:弱者设法与强者兼容,否则无容身之地;强者应当避免被兼容,否则市场将被瓜分。可移植性软件的可移植性指的是软件不经修改或稍加修改就可以运行于不同软硬件环境(CPU、OS和编译器)的能力,主要体现为代码的可移植性。表9-1常见质量属性的描述什么是软件质量要素?它是指:(1)从技术角度讲,对软件整体质量影响最大的那些质量属性才是质量要素;(2)从商业角度讲,客户最关心的、能成为卖点的质量属性才是质量要素。对于一个特定的软件而言,我们首先判断什么是质量要素,才能给出提高质量的具体措施,而不是一股脑地想把所有的质量属性都做好,否则不仅做不好,还可能得不偿失。如果某些质量属性并不能产生显著的经济效益,我们可以忽略它们,把精力用在对经济效益贡献最大的质量要素上。简而言之,只有质量要素才值得开发人员下功夫去改善。9.2商业目标决定质量目标大凡软件工程教科书为了强调质量的重要性,总是要举一些历史上发生过的重大软件质量事故,例如航天飞机爆炸、核电站失事、爱国者导弹发生故障等等。这些事故的确不是危言耸听,给人们敲响了质量的警钟。学术界总是喜欢宣扬质量至上的理念,而忽视企业的商业利益,将质量目标凌驾于商业目标之上。我不能评判这种现象是好还是坏,但是的确误导了大量读者。许多软件人员都有“质量越高越好”的观念,这是被教科书灌输的,而不是他自己领悟出来的。质量的最高境界是什么?是尽善尽美,即“零缺陷”。我曾在著作《高质量程序设计指南——C++/C语言》中大肆宣扬了高质量程序设计的理念,力求使C++程序达到“零缺陷”的质量目标。尽管此书得到了许多程序员的赞同,但是我经过反思之后改变了质量观念,我要着重指出的是:重视软件质量是应该的,但是“质量越高越好”并不是普适的真理。只有极少数软件应该追求“零缺陷”,对绝大多数软件而言,商业目标决定了质量目标,而不该把质量目标凌驾于商业目标之上。航空航天等系统对质量要求极高,任何缺陷都有可能导致机毁人亡,所以人们不惜一切代价去消除缺陷。在发射航天器之前,只要发现任何异常,就会立即取消发射指令,直到异常被消除为止。前苏联做得最过分,许多重大武器系统的负责人都签了生死状,系统研制成功则获得英雄勋章,失败则被枪毙。在这种压力下没有人敢对质量有一丝松懈。上述严格系统毕竟是少数,绝大多数普通软件的缺陷并不会造成机毁人亡这样的重大损失,否则没有人敢从事软件开发了。在日常工作中,我们接触过的软件几乎都是有缺陷的,即便是软件业老大Microsoft,它的软件产品也经常出错甚至导致死机,人们骂几句后还会照样使用有缺陷的软件。企业的根本目标是为了获取尽可能多的利润,而不是生产完美无缺的产品。如果企业销售出去的软件的质量比较差,轻则挨骂,重则被退货甚至被索赔,因此为了提高用户对产品的满意度,企业必须提高产品的质量。但是企业不可能为了追求完美的质量而不惜一切代价,当企业为提高质量所付出的代价超过销售收益时,这个产品已经没有商业价值了,还不如不开发。企业必须权衡质量、效率和成本,产品质量太低了或者太高了,都不利于企业获取利润。企业理想的质量目标不是“零缺陷”,而是恰好让广大用户满意,并且将提高质量所付出的代价控制在预算之内。9.3质量保证能够保证质量吗质量保证(QualityAssurance,QA)是CMM和ISO9001最为推崇的改善软件质量的方法。基于我亲身实践和调查研究,我敢冒天下之大不讳说一句:质量保证并不能保证质量,它是个美丽的谎言。CMM对软件质量保证是这样描述的:软件质量保证的目的是为管理者提供有关软件过程和产品的适当的可视性