哈尔滨工业大学计算机学院唐好选Email:tanghx@hit.edu.cn净室软件工程(CSE)“净室”(Cleanroom)一词源自半导体工业中硬件生产车间,通过严格、洁净的生产过程预防了缺陷的产生,而不是在事后再去排除故障。借用这个词,充分显示了净室技术“防患于未然”的主导思想净室基本概念净室软件工程(CSE)是一种应用数学和统计学理论生产软件的工程技术。力图通过严格的工程化的软件过程达到开发中的零缺陷或接近零缺陷通过在第一次正确的书写代码增量,并在测试前验证其正确性来避免成本过高的缺陷消除过程。它的过程模型是在代码增量集成到系统的同时,进行代码增量的统计质量验证。净室方法的观点强调规格说明和设计上严格性,使用基于数学的正确性证明对结果设计模型的每个元素进行形式化验证,在规格说明和设计中消除错误,以“干净”的方式进行制造。20世纪70年代末80年代初,资深数学家和IBM客座科学家HarlanMills阐述了将数学、统计学及工程学上的基本概念应用到软件的设想净室软件工程的发展Mills的观点:程序中出现错误的唯一方式是作者将错误引入进去的。没有其他的方式……正确实践的目标是:设法避免引入错误,通过测试或其它任何运行程序的方式来消除错误。净室软件工程的发展两大基本观点促进了Mills的工作:首先,程序是数学函数规则,其次,潜在的程序执行是无穷的,质量认证必须进行统计采样第一个观点使所有函数理论向软件开发敞开大门,导致以下技术的产生:盒式结构规范及设计、函数理论正确性检验及增量开发第二个观点使所有统计理论在软件测试方面得到应用,导致了统计使用测试和质量认证致力于通过防止软件缺陷来提高软件质量立足于严格的科学理论基础强调净室小组:制定系统规范、开发和认证;基本目标是:开发过程的可管理性和使用时的无失效性净室软件工程的基本特点函数理论和抽样理论函数理论一个函数定义了从定义域到值域的映射。一个特定的程序好似定义了一个从定义域(所有可能的输入序列的集合)到值域(所有对应于输入的输出集合)的映射。这样,一个程序的规范就是一个函数的规范抽样理论不可能对软件的所有可能应用都进行测试。把软件的所有可能的使用情况看作总体,通过统计学手段对其进行抽样,并对样本进行测试,根据测试结果分析软件的性能和可靠性净室软件工程的理论基础统计过程控制下的增量式开发(IncrementalDevelopment):增量是最终软件产品的功能子集,系统功能随时间增加基于函数的规范、设计:盒子结构方法按照函数理论定义了三种抽象层次:行为视图、有限状态机视图和过程视图。规范从一个外部行为视图(称为黑盒)开始然后被转化为一个状态机视图(称为状态盒)最后由一个过程视图(明盒)来实现盒子结构是基于对象的净室软件工程的技术手段正确性验证:是CSE的核心,正是由于采用了这一技术,净室项目的软件质量才有了极大的提高统计测试(StatisticallyBasedTesting)和软件认证:净室测试方法采用统计学的基本原理,即当总体太大时必须采取抽样的方法。首先确定一个使用模型(usagemodel)来代表系统所有可能使用的(一般是无限的)总体。然后由使用模型产生测试用例。因为测试用例是总体的一个随机样本,所以可得到系统预期操作性能的有效统计推导净室软件工程的技术手段净室软件工程的基本模型净室的组成项目规划、项目管理、性能改善、工程变化结构规范(概念、模块、执行)需求分析使用规范增量设计、正确性验证统计测试、认证使用模型、测试规划增量规划用户用户评价的累计规范用户评价的累计认证增量系统工程需求收集盒结构规格形式化设计正确性验证代码检查测试计划统计性使用测试认证需求收集盒结构规格形式化设计正确性验证代码检查测试计划统计性使用测试认证净室技术-增量开发技术…增量开发的理论基础引用透明性原理:一个表达式可用与其等值的任意子表达式代替,一个给定函数(规范)f能改进为如下任何一种形式dof1,f2enddoifpthenf1elsef2endifwhilepdof1enddo函数的合并对原函数f在数值影响上必须等价软件增量开发的基础在于为程序制定数学函数规则因此程序开发作为一种自顶向下的控制结构或子函数(子规范)的函数改进(规范)过程,将导致对象或函数的分解或结合功能规范增量规划增量设计/验证增量1设计/验证使用规范增量测试与认证增量2设计/验证增量n设计/验证产品评估与过程改进增量1统计增量1-2统计增量1-n统计增量开发的进度分配增量1:定义顶层结构及桩组件增量2:根据用户反馈,用新的可重用桩组件代替桩组件增量3:用新的可重用桩组件部件代替桩组件净室技术-基于函数规范的设计和验证规范:从一个外部视图(黑盒)开始转化为一个状态视图(状态盒),由一个过程视图(明盒)来实现三个盒形式不同,但行为等价,称为盒结构将数学函数逐步扩展为逻辑连接词(如if-then-else)和子函数构成的结构,这种扩展一直进行下去,直到所有标识出来的子函数可以用程序设计语言直接表达设计求精和验证每个明盒规格说明代表了一个完成状态盒转换所需的过程(子函数)的设计,使用结构化程序设计结构和逐步求精在每个求精层次上,净室团队执行一次形式化正确性验证。为此,将一类正确性条件集合附加到结构化程序设计结构上如果函数f被扩展为序列g和h,则f所有输入的正确性条件是:执行g之后再执行h能完成f的功能吗?如果一个函数p被精化为ifcthenqelser的条件形式,则对p的所有输入的正确性条件是(1)只要条件c为真,q能完成p的功能吗?(2)只要条件c为假,r能完成p的功能吗?如果……状态变换状态盒输入S输出R精化过程验证过程状态BB1BB2明盒SR盒结构精化和验证F=s*RRSH黑盒(所需行为)历史激励响应黑盒规范的原则对系统拥有者和用户:黑盒定义了他们分析和协商所需的行为对系统开发者:黑盒定义待设计和实现所需的行为对系统测试者:黑盒定义了在测试过程中待确认所需的行为黑盒的组成(例)基于12个月平均销售额的预测部分情况规则号1激励历史条件产品历史记录包含小于11个月的销售额产品历史记录至少有11个月的销售额响应接收产品的销售额不求平均当前激励2销售额产品销售额产品产品的最近销售额加上当前的销售额后求平均状态盒对系统或其组件进行初步细化;定义状态空间状态信息来自黑盒中需要保存的激励元素变换当前的激励S(Stimulus)映射响应R(Response)旧状态OS(oldState)映射到新状态NS(newState)即(OS,S)(NS,R)状态盒组成(例)销售额情况表规则号旧状态激励新状态响应黑盒规则号销售文件不含产品记录销售额产品1在销售文件中为产品增加记录出现最新销售额值收到产品的销售额值但不能求平均值121销售文件中产品包含的销售额值记录少于11个月销售额产品产品记录己在销售文件中,把销售额作为最新销售额值收到产品的销售额值但不能求平均值明盒(清晰盒)是一个计算机程序或程序集将(OS,S)(NS,R),借助过程实现明盒的过程可以重用己有的黑盒或在求精过程中引入新的黑盒明盒的正确性验证是基于数学方法,证实一个过程与其规范相符盒子的层次结构黑盒状态盒白盒黑盒状态盒明盒黑盒状态盒明盒黑盒状态盒明盒……盒子结构原则引用透明性(ReferentialTransparency)明确组件所有需求,在逻辑上不需进一步规范事务闭包(TransactionClosure)事务是充分、足够的、可获得及保留所有状态数据状态迁移(StateMigration)系统数据应该迁移和封装到最小的系统部分,不必复制更新共享服务(CommonServices)对于多次用到的系统部分可定义共享服务,创建重用机会净室技术-统计测试和软件认证当测试的规模太大时,要采取抽样方法,选择一个模型(马尔可夫模型、形式化语言等)代替使用的规模,然后用模型产生测试用例(测试用例是规模的一个随机样本),可以得到系统预期操作性能的有效统计推导统计使用测试等同于“以用户试图使用软件的方式来测试软件”。为了完成测试工作,净室测试团队必须确定软件的使用概率分布,按照使用概率为每个触发集合生成测试用例盒子结构开发过程(1)定义系统需求(2)确定和确认黑盒(激励)(响应)(3)确定和验证状态盒(状态,激励)(新状态,响应)(4)设计和验证明盒(5)对新黑盒重复上述过程净室实例设计并验证一个小的程序,该程序对某给定的整数x,找出其平方根的整数部分y净室实例-设计求精与验证定义入口和出口条件。为了证明设计的正确性,需要证明图中表示的条件init、loop、cont、yes和exit在所有情形下都是正确的净室实例-设计求精与验证条件init:假定入口条件是正确的,因此,init条件的第一部分x≥0是满足的,在流程图中,init条件前的语句设置为y=0,因此,init条件的第二部分也是满足的,因此,init为真条件loop可能以两种方式之一出现(1)直接从init(满足)或(2)通过穿过cont的控制流,因为条件cont与loop相同。无论从哪条路径到达,条件loop都为真条件cont:如果(y+1)2≤x,则y2≤x,条件成立条件yes在条件逻辑中被测试,一定为真x为被赋值或修改,保持不变,测试条件(y+1)2≤x不成立时才能到达exit,因此(y+1)2x,loop条件必须为真,因此exit满足y递增而x不变,循环一定终止CMM是软件组织进行软件过程改进以及评估和评价软件能力的基准。但在具体的过程改进实施中,需要有效的软件工程方法支持净室软件工程正是为过程改进提供了具体实施方法,它能够及早发现并消除缺陷,显著提高软件的正确性、可靠性和可理解性,降低项目的成本,提高软件质量,延长软件的生命周期净室与CMM可将净室软件工程应用到CMM的实践中,从组织管理和技术工程实践两个方面改进软件过程,从而更加经济有效地提升软件质量在CMM中,关键实践仅仅描述了应该“做什么”,并没有给出更没有规定“如何”去具体操作,操作的方法和步骤必须由软件组织自己去解决CMM只是对软件组织过程改进的指导,而非解决一切软件开发过程中的问题的法宝。在实施CMM的过程中,仍然需要有效的软件工程技术和方法,如“净室软件工程”方法的支持净室与CMM基于CMM的净室裁剪由于净室过程和技术的优点以及在软件企业中实施所遇到的困难,有必要对净室进行基于CMM的裁剪基于CMM的裁剪原则裁剪必须符合净室的基本原则(是净室区别于传统软件工程方法的关键)设计原则:开发人员应该并且能够生产出在被测试前就已经达到趋于零缺陷的产品测试原则:净室测试的目的不是寻找缺陷,而是度量软件产品的质量和性能,为软件过程的改进提供统计数据必须结合软件组织自身的能力成熟度现状。自身软件能力不同,过程改进的主要目标也不相同必须结合所开发软件的类型基于净室的裁剪方法引入净室的三个阶段初始阶段:首先要引入净室小组开发的组织模式和质量控制下的增量式生命周期模型,将开发与测试分离,建立起基本项目过程。结合自身能力,引入形式化程度较低的黑盒规范与验证方法中级阶段:加入更多必须的管理规范,明确定义自身的软件过程。同时引入比较形式化的净室规范和验证技术,进一步降低开发阶段的缺陷率,提高软件生产率。并根据需要进行有限的统计测试高级阶段:引入净室统计测试技术,很好地实现对质量和性能的量化,为高层的决策提供可靠的数据依据针对净室技术形式化程度的裁剪(1)对盒式规范技术的裁剪:黑盒规范对系统的外部可见行为做一个完整的定义,隐藏了软件设计和实现的所有细节,适用于软件开发的任何粒度中。规范的描述形式可以不同:自然语言、半形式化的规范语言、而严格的函数表达方法状态盒规范是对系统内部数据的描述,它的实