软件质量浅谈
转载自共创软件联盟
随着社会生产力的发展和科学技术的进步,全球性贸易竞争日益加剧,用户对质量提出了越来越严格的要求。如果企业想在竞争中生存,更不用说获利了,那么除了接受质量观念外就别无选择。软件行业作为一个知识和智力密集型的产业,相对传统产业而言具有某些独特性,比如软件产品的无形性、软件开发的高科技含量等,处处体现出“人脑”工程的特点,给质量工作的开展蒙上了一层神秘色彩。为此,本文试图从软件质量的内涵、软件质量保证、软件工程标准及应用、软件质量不断改进、开放源码思想对软件质量工作的深远影响等几方面对软件质量工作进行初步讨论,为读者进一步深入理解软件质量工作提供帮助。
一、软件质量的内涵
软件质量是一个软件企业成功的必要条件,其重要性无论怎样强调都不过分。对于稍具软件工程基础知识的人士而言,“软件危机”这一概念并不陌生,其典型表现是软件交付延期、费用超支、质量无法保证,著名案例是IBM/360机操作系统的开发失败,在花费了上千人年的开发成本以及不断修正后,该操作系统终因错误过多、性能不稳定而被放弃。这种现象在20世纪60年代引起了业内人士高度重视,导致软件工程研究的诞生,成为软件质量工作历程中的重要里程碑。
那么,究竟什么是软件质量呢?事实上,软件质量与传统意义上的质量概念并无本质差别,只是针对软件的某些特性进行了调整。从最狭义上讲,质量可被定义为“无缺陷”。但是,绝大多数以顾客为中心的企业对质量的定义远不止这些,他们是根据顾客满意来定义质量的。例如,以高质量闻名于世的摩托罗拉公司对缺陷的定义是:“如果顾客不喜欢,那该产品就是有缺陷。”同样,美国质量管理协会把质量定义为与一种产品或服务满足顾客需要的能力有关的各种特色和特征的总和。这些以顾客为中心的定义说明质量以顾客的需要为开始,以顾客满意为结束。
软件质量天生符合上述含义,最初的定制式软件系统首先要求必须满足用户的需求。为满足软件的各项精确定义的功能、性能需求,符合文档化的开发标准,需要相应地给出或设计一些质量特性及其组合,作为在软件开发与维护中的主要考虑因素。如果这些质量特性及其组合都能在产品中得到满足,则这个软件产品质量就是高的。软件质量反映了以下三方面的问题:
1、软件需求是度量软件质量的基础。
2、在各种标准中定义了一些开发准则,用来指导软件人员用工程化的方法来开发软件。如果不遵守这些开发准则,软件质量就得不到保证。
3、往往会有一些隐含的需求没有明确提出来。如果软件只满足那些精确定义了的需求而没有满足这些隐含的需求, 软件质量也得不到保证。
值得指出的是,风靡于20世纪80年代的全面质量管理思想正以新的形式应用于创造顾客满意的领域内,当今全面质量行动的基本宗旨已变成使顾客完全满意,尽管许多企业已不再使用“全面质量管理”的说法,但是对绝大多数成功的企业来说,顾客驱动型质量已成为企业经营理念,要求企业从战略高度来看待质量问题,可从如下9个方面来理解:
1、质量要从顾客的角度来看——质量始于顾客的需要,终于顾客的理解。
2、质量不仅要反映在企业的产品上,而且要反映在企业的每一个行为上。
3、质量需要全体员工同心协力——应使外部顾客和内部顾客都感到满意。
4、质量要求高质量的合作伙伴——包括高质量的供应商和销售商。
5、质量方案不能够挽救劣质产品——一个质量运动并不能够补救产品缺陷。
6、质量是可以得到改进的——要靠每一个人去不断地改进每一件事。
7、质量改进有时需要数量上的飞跃——较大的改进必须有新的解决办法和更精明的工作的方式。
8、质量并不导致成本上升——改进质量要求“一次性做好”,以减少补救、修正和重新设计的成本,更不 必说在顾客满意度方面有什么损失了。
9、质量是必须的但可能还不够——尤其当所有的竞争者都将其质量提高到大致同一水平时。
显然,上述观点对于软件企业而言极为重要,软件质量不仅仅是缺陷率,还包括不断改进、提高内部顾客和外部顾客满意度、缩短产品开发周期与投放市场时间、降低质量成本等,是全面质量概念。面对日新月异的技术发展,如何不断创新以满足顾客快速变化的需求,是每个软件企业必须解决的重要课题。
二、软件质量保证
为了克服软件危机和提高软件质量,人们进行了大量的研究和实践。最初的重点是着眼于技术革新,从各种软件工具(如编辑、编译、调试工具等等)研制开始,发展成为对开发各阶段进行全面支持的计算机辅助软件工程(CASE)环境。同时,注重软件开发“模型”研究,也就是如何划分软件开发过程的不同阶段,并针对不同阶段开展了有关技术和方法的研究如需求工程、设计工程、程序设计方法学、软件测试等等。通过长期的实践发现,仅仅依靠这些工具环境、模型及方法学来提高效率和质量,并未达到预期的目标。但是,人们逐渐认识到,如果能够同时对软件开发过程的质量加以控制,则可以大幅度的提高软件质量。只有从一开始就在开发过程中严格贯彻质量管理,软件产品的质量才有保证。否则,开发工作一旦进行到后期,无论怎样通过测试和补漏洞,都会无济于事。这就是近年来国际上十分重视的“软件过程管理”思想。这种思想并非凭空想象,而是借鉴了在硬件领域成功实施全面质量管理的经验,对软件开发实行相应的质量保证工作,并已取得了成功的经验。
在实际工作中,可以从两个方面来理解软件质量保证工作。一方面,从顾客驱动观点看,注重于复审和校核方法并保证一致性,其关键是需要一种客观的标准来确定并报告软件开发过程及其工作成果的质量,一般由某个独立的小组(一般称为“软件质量保证小组”)完成,关键步骤包括:
选择项目应遵循的标准。制定项目开发计划,评价其完整性并选择项目将采用的标准。
对软件工程活动进行复审。根据事先制定的计划和选择的标准来复审软件工程活动。
校核工作成果。根据选择的标准来校核软件工作成果。
报告结果。将上述活动的结果(尤其是偏离)汇报给适当的管理层人员。
处理偏离。各种偏离将在适当的管理层次加以处理,若需要则交给上一级管理人员做进一步处理,直至得到解决。
另一方面,从管理者驱动观点看,注重于确定为了产品质量必须做些什么,并且建立管理和控制机制来确保这些活动能够得到执行。它包括确定项目产品必需的质量特性,努力工作以期达到质量要求,并显示已经达到质量要求。关键步骤如下:
建立质量目标 。以客户对于质量的需求为基础,对项目开发周期的各个检查点(如每个阶段结束时)建立质量目标。
定义质量度量(metrics)。定义各种质量度量来衡量项目活动的结果以协助评价有关的质量目标是否达到。
确定质量活动。对于每一个质量目标,确定那些能够帮助实现该质量目标的活动,并将这些活动集成到软件生命周期模型中去。
执行质量活动。执行已经确定的质量活动。
评价质量。在项目开发周期的确定检查点上,利用已经定义好的质量度量来评价有关的质量目标是否达到。
采取修正行动。若质量目标没有达到,采取修正行动。
事实上,以上两种含义的软件质量保证在实际工作均有体现,后者表现为从公司范围建立质量方针和质量保证体系并贯彻实施,前者则依靠某些没有直接执行责任的监督人员来保证质量体系得到有效落实,二者相辅相成。最终理想是每个人都能够自觉遵守有关规范,以主人翁的态度来展开各项质量工作,这也是近年来日益提倡的做法,许多软件企业正在努力营造一种全员参与的文化氛围,最大限度地调动人员的积极性,而这对软件开发的质量以至企业的生存发展都是至关重要的。
值得一提的是,对于软件质量保证工作的开展还存在着许多误解,比如:
只要开发人员写出尽可能多的文档,软件质量就会得到保证。
只要制定出严格的开发过程规范,软件质量问题就可得到彻底解决。
软件质量问题可通过软件测试得到彻底解决。
软件质量就意味着软件质量保证--只是在售出产品必须的认可过程中的另一步骤,是软件质量保证小组的工作。
这些错误观点都对软件质量工作的开展产生负面影响,必须认真对待。
三、软件质量经济性和质量不断改进
尽管前面一再强调质量的重要性,但如果对软件质量的重要经济意义没有清醒认识,一个组织是不可能在软件质量方面取得实质性进展的。
显然,获取高利润对每一个渴望生存和发展的公司来说都是至关重要的。一般采取如下手段来获取更好的利润:(1)扩大营销,增加销售量;(2)通过合理安排活动降低成本;(3)通过合理投资程序减少投资数额。但是通过提高产品质量来提高利润的方法通常被忽视。
对许多软件公司来说,不良质量的成本非常可观,这种成本不仅包括测试、维护和投诉等明确应计入的成本,而且还包括发生在经理、开发人员、质量保证人员、采购人员、销售人员等身上未能够明确计入的成本,因质量的失败他们不得不耗费大量的时间,如重新计划、同顾客磋商、改变设计、召开会议等等。研究表明,在现场修改错误的费用比缺陷预防工作(如代码审查、测试等)的总费用多出近18倍,在设计或需求等早期开发阶段的投资将会为今后节省30到50倍的费用。而且,对产品特性的错误编码将导致销售上的损失,或导致顾客转向竞争对手的产品。经验表明,系统地采取提高质量的措施,在无需进一步投资的情况下,每两年可以使质量缺陷成本减少一半,达到利润翻番的目标。
诸如此类的经济上的论据足以说明,作为一个软件企业来讲,必须制定一个有效的质量改进计划,而且它不能只解决代码缺陷,还应能够解决设计和需求阶段的问题。最重要的是,它必须能够提高顾客可以看到的质量,也就是说,单有较好质量的产品和更有效的开发进程是不够的,假如这些东西没有转化成更高的顾客满意度和增加的收入的话。
一个质量改进计划最重要的东西是它切实可行,它必须同时致力于减少缺陷率、削减服务费用、提高顾客满意度以及提高生产率和收入。质量改进计划失败的最大原因是缺乏信念,如果一个软件企业真地要提高质量,唯一的方法就是必须去长期奋斗。如果对质量提高的经济意义没有清晰的认识,公司的高层领导们是不可能在这个计划举步维艰的头几年坚持住的。
经验表明,实在的质量提高必须同时建立在三个领域之上--技术革新、过程革新和领导革新。领导革新包括对质量提高起催化剂作用的活动,过程革新注重于改变开发过程本身,技术革新包括帮助提高质量的新工具和新创造。每种革新都是建立在另一个革新基础上并且协同作用的。一般的,领导、过程和技术革新处于平衡状态,一个质量策略才会工作的最好。而一个把全部开支都投入某一类革新的计划会产生失调的结果。例如,太多的领导会导致一个发号施令的群体,太强调过程可能导致官僚主义,太多的技术可能导向缺乏一致方向的技术技巧。过程和技术革新必须得到领导的支持。这里说领导,而不是管理,是因为提供资金购买新的工具和支持过程改进方法只是事情的一部分。对质量的领导发生于机构各级别并且要求个人信奉质量。这意味着人们要自愿站在质量的立场上,即使原计划安排延误、预算不平衡或者被广泛接受的传统做法被推翻。在高层次上,领导意味着愿意承担变革的任务,也就是说要保证做到质量意识深入到每个人的思想和日常工作环境中,整个机构需要不断地考虑如何提高过程和产品的质量。如果人们对听到“质量”二字不是怕得要死,就说明宣传得不够,而且质量领导有问题。可以认为,一个机构不可能生产出世界级的软件,除非支持软件开发的技术、过程和领导也是世界级的。
质量的提高就象一次旅行,它需要一个质量路线图和一个在任何时候告诉你所处位置的指南针,如果没有一定类型的地图,人们很容易失去勇气,并且只能在混乱中徘徊,从而不可能取得长久的进步。幸运的是,通过多年不断的研究和实践,人们已经总结出一些成功的经验和规律,并形成许多标准如ISO9000、SW-CMM、SPICE、IEEE/EIA 12207、MIL-STD-498、Baldrige等等,这些标准是被设计用来指导机构进行质量改进工作的。尽管存在着许多衡量标准,但决定使用哪种标准不是很重要,重要的是下决心严格测量你的质量进步。而且,没有什么规则要求只使用一种衡量尺度,除非受到资源限制。以下将对目前形形色色的标准做一概述。
四、软件工程标准及应用
目前在软件行业广泛应用的标准比较繁多,各自有其特点,大致可通过两种方式加以分类。
从标准的应用范围上看可分为两类:一类是面向所有行业的,如ISO9000、Baldrige等,为了适应更广范围的行业应用,一般仅给出一些指导性原则,相对要抽象些;另一类则专门针对软件行业的,如SW-CMM、SPICE、IEEE/EIA 12207、MIL-STD-498等,它们针对软件行业及软件开发的特点进行较为详细的定义,相对要具体些。
从标准的定义模式上看也可分为两类:一类是明确定义了质量管理从初级到高级的发展阶段及要素框架,如SW-CMM、SPICE等,在具体操作时更适合于企业安排质量改进的日程表;另一类则笼统地给出成功质量管理的基本框架定义,如ISO9000、Baldrige、IEEE/EIA 12207、MIL-STD-498等,需要企业自己确定质量改进的步骤和路线图。
无论其归属哪一类,这些标准基本都是源于关键的国防产品的需求,然后扩展到民用,经历了一系列的补充和改进,因此相互之间的关系也错综复杂。需要强调的是,企业不应陷于这些标准的迷宫之中,应以完成企业目标为准则来适当选择、调整有关标准。
这些标准大多提供了对于软件生命周期过程的管理框架,并给出一些具有良好定义的、可供软件行业参考的术语定义。参照这些标准,可以建立统一的开发过程及文档需求,澄清各种角色及其接口关系,定义文档的类型和内容要求,确定所需要的任务、阶段、基线、评审等,借鉴业界的已有经验教训,避免以往曾经出现的问题和缺陷,这些都为软件管理的不断改进提供了可能性,并为软件的国际贸易提供了便利。
由于没有两个项目是一致的,因此不能够对标准照搬套用,而应进行适当裁剪。通常裁剪按照以下步骤进行:
(1) 确定项目环境——策略、活动和需求;
(2) 收集输入——来自用户、支持队伍 、潜在投标人;
(3) 选择过程、活动、文档和责任;
(4) 将裁剪决定和理由记录在文档中。
裁剪的基本原则是,目标和意图是不能够被裁剪的,可以被裁剪的是阶段/活动的数量、角色、责任、文档格式、报告或评审的正式程度/频率等内容。
质量方面的成功已经成为任何企业成功的必要条件,软件企业也不例外。幸运的是,在其他行业中所积累的丰富的全面质量思想及管理经验对于软件企业而言具有相当的借鉴意义,在此给出在全面质量管理工作中公认的成功企业与离成功还有很远距离的企业进行对比,以供软件企业参考:
公认的成功企业 离成功还有很远距离的企业
顾客为中心 开发/生产为中心
以事实为依据的决策 根据不同意见采取措施
以结果为中心的行动 以方法和工具为中心的活动
采取行动 只说不做
专业化的领导 业余领导
包括所有职能部门和层次的工作 工作集中于组织的一部分
所有人都接受质量培训 只有质量部门人员接受质量教育
向预定目标坚持不懈的、系统的工作 只采取不需要任何努力的简单措施
长远眼光 只看眼前
系统解决长期问题 只解决偶然问题,类似“救火”
采取预防措施避免问题发生 只有当问题发生时才想办法
协作和参与 每个人都孤立地工作
五、开放源码思想与软件质量提高
近年来,一种新的思潮在国际上受到越来越多的关注,已经取得丰硕成果,而且将整个软件产业格局产生重大深远影响,这就是所谓开放源码思想。
开放源码的基本思想很简单,最初由于计算机硬件造价昂贵,许多公司认为计算机软件不值钱,将其仅看作是整个计算机的附属产品。因此,当时网络上的程序员可以任意阅读、重新分布和修改软件的源码,也正因为此才使得软件业得到了飞速发展。人们可以任意改进软件的源码、改编源码以及修正源码中的错误,这在今天多数情况下是不可能的事情。各个公司为了在软件技术上保持自己的优势,都处于封闭的开发模式。
然而,随着计算机硬件成本的不断下降,软件在整个计算机系统的成本中占有越来越高的比例,如何提高软件开发生产率、降低成本、提高质量是整个计算机软件行业的重大课题。按照传统封闭的开发模式,只有很少一部分程序员能够看到源代码,其他任何人只能使用不透明的二进制软件,这使得程序源码中的大量潜在错误难以被及时发现和消除,造成巨大的维护费用。
与此相对,在开放源码社区中则通过源码开放与共享原则,使得任何程序员都有机会对软件进行深入的评审和测试,从而大大提高了软件质量,获得比传统封闭的软件开发模式更好的快速开发软件的方法。换句话说,开放源码主要目标就是提高软件质量,其方法就是通过开放源代码以获得广泛的对等评审及用户测试效应。与传统的封闭开发模式相对,传统模式采取严密组织的开发队伍(如同构筑大教堂的组织模式),开放源码则是由分散的发烧友通过Internet组成的开发队伍进行组织(如同市集的组织模式),这就是开放源码社区领袖Eric Raymond在其著名的《大教堂与市集》一文中提出的论点,Linux的开发就是“市集模式”的成功典范,也从实践上说明“市集模式”能够开发出可用性优于“大教堂模式”的软件。
然而,“市集模式”也并非万能,Eric Raymond指出了市集模式成功运用的先决条件,包括包括开放源码项目工程领导人的资格问题和在把项目公开和开始建造一个协作开发人员的社团的时候代码的状态。可以认为,不能以一个市集模式从头开发一个软件,可以通过市集模式进行测试、调试和改进,但是以市集模式从头开始一个项目将是非常困难的,初期的开发人员的社团应该有一个可以运行和测试的东西来玩,尽管它可以很粗糙、很笨拙、不完整和缺少文档,但不能忽略的东西是要吸引哪些人卷入一个整洁的项目。同时,“市集模式”的成功依赖Internet和控制版本进化的领导者(例如Richard Stallman,Linus Torvalds)。作为项目领导者而言,能够提出卓越的原始设计思想不是最关键的,最关键的是要能把从他人那里得到的好的设计重新组织起来,同时必须有良好的人际和交流能力,必须能够吸引他人共同建造一个开发社团。
与开放源码紧密相关的是所谓自由软件运动,后者的主要目标是使得开发的软件是FREE(是自由,freedom,不是免费的意思)的,它们之间最简单的区别是各自的优先权不同,在此不对二者区别进行更深入的哲学讨论。在开放源码/自由软件思想下已经积累了相当一批财富,包括操作系统级、平台软件级、甚至应用级的源程序已经被放在网站上,供软件爱好者自由使用。尽管目前软件业的主要商业模式是以出售拷贝为基本商业基点的,但这种商用软件的思路目前正逐渐被开放源码、以服务和培训为商业获取利润的思想所取代。而且,开放源码软件可以把很多人的智力集聚到一起,尤其既有利于基础软件教育事业,又可以加快高质量的共性软件发展。因此,开放源码思想已经受到来自政府、企业、科研教育机构的高度关注,随着大量人力物力的不断投入,开放源码软件正在逐步走向工业化。
但是,开放源码也带来了一些新的问题,由于完全本着自愿的原则,任何人都可以自由参与开源软件的开发,也可以将自己编制的软件放到网上让别人共享,因而软件版本如何管理、质量如何保证、软件错误如何跟踪和修正等都摆在人们的面前。同时,开放源码的测试、整理与推广也是一个比较重要的任务。可以认为,将开放源码思想与传统的软件工程进行有机结合将对未来软件业的发展产生深远影响,也将为软件质量提高工作探索新的途径。