如何提高软件的质量已经不是一个纯粹的技术问题,而是一个工程的问题。自从计算机诞生以来,相应的软件开发存在了。由于早期的计算机运行性能较低,软件的可编程范围也较狭窄,因此质量问题没有那么突出。50年代后期到60年代,高级语言的相继诞生并得到了广泛的应用,随之而来的是软件规模也越来越庞大,越来越复杂。伴随着软件应用的越来越广泛,软件的质量问题变得越来越突出。根据美国宇航局NASA的统计,在80年代初,软件引起的故障与硬件引起的故障,其比率约为1.1:1.0,到了80年代末,这一比率已达到2.5:1.0。因此如何提高软件的质量成为软件工程研究的一个重点。自从软件危机产生以来,出现了很多提高产品质量的理论和方法,有的从技术角度出发,例如:面向对象技术的产生和推广,第四代语言的诞生等等;有的从自动化工具入手,例如:CASE工具、过程控制软件、自动化管理平台等;有的从过程模型角度出发,例如:迭代模型、螺旋模型、RUP、IPD、净室软件工程等;也有从管理角度出发的,例如:团队管理、绩效管理、PSP、TSP等;也有从测试角度出发的,例如:加强全流程的测试等;一些相应的规范和标准也孕育而生,例如:ISO9000系列、CMM、QMS等。然而每一种技术都不是的,软件质量的提高应该是一个综合的因素,需要从每个方面进行改进,同时还需要兼顾成本和进度。
  一、什么是质量?
  作为软件产品的销售人员,市场人员或维护人员经常会受到客户这样那样的指责或抱怨,客户说:你们产品的质量太差,不稳定等等。那么什么是质量呢?我们该如何来衡量质量呢?
  质量具有三个维度:
  符合目标。目标是客户所定义的,符合目标即判断我们是不是在做需要做的事情。
  符合需求。即产品是不是在做让它做的事情。
  符合实际需求。实际的需求包括用户明确说明的和隐含的需求。
  ISO关于质量的定义表示如下:
  “一个实体(产品或服务)的所有特性,基于这些特性可以满足明显的或隐含的需要。”
  注意,在这个定义中包含明显的需求和隐含的需求。而往往我们会忽略隐含的需求。因此在控制一个产品的质量的过程中必须关注这些隐含的需求,并给予应有的验证。
  另一方面因为我们的产品是为客户提供服务的,因此凡是不满足客户需求的,我们都认为是一个失效(failure)。所以我们的产品必须始终围绕着客户的需求进行开发和验证。
  这里我们谈到客户,其实在一个软件的需求收集过程中需要关注客户和用户。而我们经常会忽略客户与用户之间的区别。那么谁是客户?谁是用户呢?简单的来说,客户是真正能够决定是否购买你软件的人,而用户是实际使用软件的人。了解了这个区别,对于你在分析需求的重要性的时候可以进行参考。同时在产品质量验证的时候也可以做出不同的权衡。另一方面我们在考虑我们用户需求的时候,往往只考虑了实际使用软件的人员,而忽略了其它一些人员对软件的要求或对软件造成的潜在竞争,这包括维护人员的要求、系统管理人员的要求、软件上下游人员的要求、先前版本的情况、市场上竞争对手的软件情况等。
  每个人提到质量的时候,经常会遇到下列矛盾,在这些矛盾中隐含着对质量的承诺:
  质量需要一个承诺,尤其是高层管理者的承诺。但为了得到质量,高层管理者必须和其雇用的员工进行紧密合作;
  许多人相信没有缺陷的产品和服务是不可能的。但是控制在一定级别的缺陷数是正常并可接受的;
  质量经常是和成本紧密联系在一起,一个高质量的产品同时也意味着高投入。这是设计的质量和一致性质量的一个矛盾;
  一个高的质量要求需求规格说明书足够详细,以便产品可以根据这些规格说明书进行定量的分析。然而许多组织没有能力或者不愿意产生如此详细程度的规格说明书;
  技术人员经常相信规范和标准会束缚他们的创造力,因此不遵照标准做事。然而如果要得到高质量的产品,必须遵循良好定义的标准和过程。
  二、流程对质量的贡献
  好了,既然已经了解了什么是质量,那么怎么才能改进软件产品的质量呢?从一个企业的长远发展来看,首先应当从流程抓起,规范软件产品的开发过程。这是一个软件企业从小作坊的生产方式向集成化、规范化的大公司迈进的必经之路,也是从根本上解决质量问题,提高工作效率的一个关键手段。
  软件产品的开发同其它产品(如汽车)的生产有着共同特性,即需要按一定的过程来进行生产。在工业界,流水线生产方式被证明是一种高效且能够比较稳定地保证产品质量的一种方式。通过这种方式,不同的人员被安排在流程的不同位置,终为着一个目标共同努力,这样可以防止人员工作间的内耗,极大的提高工作效率。并且由于其过程来源于成功的实例,因此其终的产品质量能够满足过程所设定的范围要求。软件工程在软件的发展过程中吸取了这个经验并把它应用到了软件开发中,这形成了软件工程过程,简单的说是开发流程。
  无论做什么事情,都有一个循序渐进的过程,从计划到策略再到实现。软件流程是按照这种思维来定义开发过程,它根据不同的产品特点和以往的成功经验,定义了从需求到终产品交付的一整套流程。流程告诉我们该怎么一步一步去实现产品,可能会有那些风险,如何去避免风险等等。由于流程来源于成功的经验,因此,按照流程进行开发可以使得我们少走弯路,并有效的提高产品质量,提高用户的满意度。
  目前流行的流程方法有很多种,不同的过程模型适合于不同类型的项目。瀑布模型是应用的为广泛的一种模型,也是容易理解和掌握的模型,然而它的缺陷也是显而易见的。遗漏的需求或者不断变更的需求会使得该模型无所适从。然而,对于那些容易理解但很复杂的项目,采用瀑布模型会是比较适合的,因为你可以按部班的去处理复杂的问题。在质量要求高于成本和进度要求的时候,该模型表现的尤其突出。
  螺旋模型是也是一个经典模型,它关注于发现和降低项目的风险。螺旋型项目从小的规模开始,然后探测风险,制定风险控制计划,接着确定下一步项目是否还要继续,然后进行下一个螺旋的反复。该模型的大优点是随着成本的增加,风险程度随之降低。然而螺旋模型的缺点是比较复杂,且需要管理人员有责任心,专注以及有管理方面经验。