软件幵发方法是指软件开发过程所遵循的办法和步骤,从不同的角度可以对软件开发方法进行不同的分类。
提高软件可靠性的一种重要技术是使用形式化方法。形式化方法是建立在严格数学基础上、具有精确数学语义的开发方法。广义的形式化方法是指软件开发过程中分析、设计和实现的系统工程方法,狭义的形式化方法是指软件规格和验证的方法。
1. 形式化方法概述
近年来,形式化方法己不再只是一种研究所里的学术研究工作,而是己经开始被工业界接受并应用于开发实际的系统。例如,在需求分析中,形式化方法的思想是利用形式化规格语言,严格定义用户需求,并采用数学推演的方法证明需求定义的性质,对于复杂的应用问题,尽管无法验证整个需求定义的完整性,仴仍有可能为避免某些要点的疏漏而建立数学断言,然后予以形式证明或反驳。形式化规格说明语言包括严格的语法定义和语义定义,以及一系列的数学推演规则。这些规则不仅说明了某些数学性质在软件规格说明中是否成立,也说明了软件实现与软件规格说明之间的满足关系。
形式化方法的主要优越性在于它能够数学地表述和研究应用问题及其软件实现。但是,它要求开发人员具备良好的数学基础。用形式化语言书写的大型应用问题的软件规格说明往往过于细节化,并且难于为用户和软件设计人员所理解。由于这些缺陷,形式化方法在目前的软件开发实践中并未得到普遍应用。但是,近年来,形式化方法在以下两个方面的发展大大改善了其实用性:
(1) 形式化方法与图形语言机制相结合。为图形语言机制赋予形式化的语法和语义,从而兼具了图形表示的直观、简洁,以及形式化方法的严谨、精确等优点。
(2) 用 C A S E (Computer Aided Software Engineering ,计算机辅助软件工程)工具支持形式化软件开发。 C A S E 工具不仅可以简化描述工作,时且还可以利用自动证明技术,帮助开发人员验证软件的数学性质。实践证明,上述技术途径对于克服形式化方法的主要缺陷是行之有效的,因此,它们将在形式化方法的未来发展中发挥電要作用。
2.净室软件工程
净室软件工程 (Cleanroom Software Engineering , C S E ) 是软件幵发的一种形式化方法,可以开发较高质量的软件。它使用盒结构归约进行分析和建模,并且将正确性验证作为发现和排除错误的主要机制,使用统计测试来获取认证软件可靠性所需要的信息。
C S E 强调在规约和设计上的严格性,以及使用基于数学的正确性证明来对设计模型的每个元素进行形式化验证。作为对形式化方法中的扩展, C S E 还强调统计质量控制技术,包括基于客户对软件的预期使用的测试。
C S E 的理论基础是函数理论和抽样理论,所采用的技术手段主要有以下4 个方面:
(1) 统计过程控制下的增量式幵发。
(2) 基于函数的规范、设计。 C S E 按照函数理论定义了三种抽象层次,分别是行为
视图、有限状态机视图和过程视图。规范从一个外部行为视阁(称为黑盒)幵始,然后
被转化为一个状态机视图(称为状态盒),最后由一个过程视图(明盒)来实现。盒结构
是基于对象的,并支持软件工程的关键原则,即信息隐藏、接 U 与实现分离。
(3) 正确性验证。正确性验证是 C S E 的核心,正是由于采用了这一技术,软件质蜇
才冇了极大的提高。
(4) 统计测试和软件认证。 C S E 在测试方面采用统计学的基本原理,即当总体太大
时必须采取抽样的方法。首先,确定•个使用模型来代表系统所有可能使用的(一般是
无限的)总体;然后,由使用模型产生测试用例。因为测试用例是总体的一个随机样本,
所以可得到系统预期操作性能的有效的统计推导。
C S E 的主要缺点体现在以下三个方面:
(1) 对幵发人员的要求比较高。 C S E 要求采用增量式开发、盒结构和统计测试方法,
幵发人员必须经过强化训练才能掌握。
( 2 ) 正确性验证的步骤比较困难,且比较耗时。
(3) 开发小组不进行传统的模块测试,这是不现实的。程序员可能对编程语言和幵发环境还不熟悉,而且编译器或操作系统的缺陷也可能导致未预期的错误。
逆向工程( ReverseEngineering ) 术语源于硬件制造业,相互竞争的公司为了了解对方设计和制造工艺的机密,在得不到设计和制造说明书的情况下,通过拆卸实物获得信息。
软件的逆向工程也基本类似,不过,通 常 “解剖”的不仅是竞争对手的程序,而且还包括本公司多年前的产品。软件的逆向工程是分析程序,力图在比源代码更高抽象层次上建立程序的表示过程,逆向工程是设计的恢复过程。
1 . 相 关 概 念
与逆向工程相关的概念有重构、设计恢复、再工程和正向工程。
(1) 重 构 ( restructuring )。重构是指在同一抽象级别上转换系统描述形式。
(2) 设计恢复 (design recovery )。设计恢复是指借助工具从已有程序中抽象出有关
数据设计、总体结构设计和过程设计等方面的信息。
(3) 再工程( re - engineering )。再工程是指在逆向工程所获得信息的基础上,修改或
重构已有的系统,产生系统的一个新版本。再工程是对现有系统的重新开发过程,包括
逆向工程、新需求的考虑过程和正向工程三个步骤。它不仅能从已存在的程序中重新获
得设计信息,而且还能使用这些信息来重构现有系统,•以改进它的综合质量。在利用再
工程重构现有系统的同时,一般会增加新的需求,包括增加新的功能和改善系统的性能。
(4) 正向工程 (Forward Engineering )。正向工程是指不仅从现有系统中恢复设计信
息,而且使用该信息去改变或重构现有系统,以改善其整体质量。
2 . 完 备 性
一般认为,凡是在软件生命周期内将软件某种形式的描述转换成更为抽象形式的活动都可称为逆向 工程。
逆向工程的完备性可以用在某一个抽象层次上提供信息的详细程度来描述。逆向工程过程应该能够导出过程的设计模型(实现级,一种底层的抽象)、程序和数据结构信息(结构级,稍高层次的抽象)、对象模型、数据和控制流模型(功能级,相对高层的抽象)和 U M L 状态图和部署图(领域级,高层抽象)。
随着抽象层次增离,完备性就会降低。抽象层次越高,它与代码的距离就越远,通过逆向工程恢复的难度就越大,而自动工具支持的可能性相对变小,要求人参与判断和推理的工作增多。
逆向工程不仅应用于软件开发,也应用于软件维护。对于一项具体的维护任务,一般不必导出所有抽象级别上的信息,例如,如果只是希望完成代码重构任务,则只需获得实现级信息即可。当然,若能进行深入分析,产生的代码质量会更好些。