软件可靠性设计方法研究
2021-04-01何凤军蔡玮王宇
何凤军 蔡玮 王宇
摘要:研究了软件可靠性设计方法,软件需求分析是研制高可靠性软件的前提和基础,软件可靠性设计包括软件体系架构设计、冗余设计、健壮性设计、容错设计、避错设计、错误恢复设计及重用设计等。通过专业复杂网管软件的研制实例,初样评审测试、正样评审测试及软件测评的千行代码缺陷密度证明了在软件开发过程中运用可靠性设计方法,可以提高软件的质量和可靠性。
关键词:体系架构设计;冗余设计;容错设计;健壮性设计;重用设计
中图分类号:TP393文献标志码:A文章编号:1008-1739(2021)01-64-4
0引言
随着计算机技术迅猛发展,软件在系统中的地位越来越重要[1],其规模和复杂性急剧提高,能否可靠运行已经成为决定整个系统可靠性的关键部分。软件的上述重要性使得其可靠性越来越被关注,因此每年都有大量经费投入其可靠性相关研究,且取得了初步成效。但迄今为止,尚未形成标准的、公认的软件可靠性设计思想和方法。
软件可靠性是指软件在规定的条件下和规定的时间内完成规定功能的能力。需求分析和可靠性设计是研制可靠性软件的2个重要阶段。需求分析[2]是进行软件设计的前提和基础,在需求分析基础之上,进行体系架构设计、冗余设计、容错设计及重用设计等。
1软件需求分析
详尽的软件需求分析[3]是研制高可靠性软件的前提和基础,软件需求分析包括功能需求、性能指标需求、内外部接口需求、可扩展性需求、软件开发和运行环境需求及安全需求和部署需求。在充分了解软件需求的基础上,进行软件概要设计和详细设计,是确保软件可靠性的重要手段。
1.1软件体系架构设计
对于软件而言,规模[4]越大,复杂度越高,可靠性越低。对于相同规模的软件,软件越复杂其可靠性越低,因此软件可靠性总的设计原则是控制和减少软件结构和程序的复杂性,在网络管理系统软件开发中,结构复杂度控制进行如下设计:
(1)层次结构设计,复杂度控制
软件的整体结构采用层次结构[5],将系统的总需求进行分级和分解,如功能需求模块、性能需求模块、内外部接口需求模块及扩展需求模块等,把这些需求模块划分成若干层,层与层之间只存在单向的依赖关系,这样可以很大程度减少程序的复杂性,软件的可靠性与软件的复杂性成正比。
(2)模块化设计
采用层次结构与模块化设计相结合的方法,在分层的基础上,将每一个层次结构分解为若干个模块。模块划分合适,可减少开发工作量,降低程序复杂度。模块化设计思想,将功能细化到每个模块进行独立实现,模块之间通过消息中间件进行交互,这样的设计理念既可以将软件模块故障缩小在各个模块内部,防止软件模块故障影响整个系统,同时也减少故障影响范围,又可以利用可靠的软件模块形成新的系统,提高效率和系统的可靠性。模块设计思想是高内聚低耦合,模块间的消息交互仅通过消息参数,各个软件模块内部功能紧耦合且独立实现特定功能,从而大大提高软件模块的可靠性。
(3)服务化设计
将具有独立功能的软件模块封装为服务,通过消息中间件进行服务间通信,既可以将错误局限在各个服务内部[6],防止服务化的软件模块故障影响整个系统,同时也减少故障影响范围,又可以利用可靠的软件服务形成新的系统,提高工作效率和系统的可靠性。采用服务化技术,服务注册发布之后,可以被调用,可靠性增高。
每一个服务都必须是Web Services的服务,都需要提供WSDL接口。为了标准化每一个服务,需要在定义每个服务的WSDL接口时,均遵循标准化模式和格式。
同时,在定义每个服务的WSDL方法中,需要定义启动和停止操作:
①startService操作:函数表示服务处于正常工作状态。启动服务操作是无参数函数,返回值为布尔型。如返回true则表示服务正常启动,否则表示启动失败。
②stopService操作:函数表示让处于正常工作状态的服务停止工作。停止服务操作是无参数函数,返回值为布尔型。如返回true则表示服务停止成功,否则表示停止失败。
(4)可扩展设计
mib库表和配置参数基于配置文件进行设计,能够在管理对象扩展或功能设计变更时灵活扩展。
1.2冗余设计
冗余是指为改善系统运行可靠性而引入重复或代替的系统元素,以确保该特定元素失效时,系统能继续运行。在软件冗余设计方面主要包括如下几方面设计思路:
①主备热备:网络管理系统软件采用主备管理方式,因此总部级网管中心采用主备、热备双机工作方式,当主用网管出现故障时,备用网管立即切换为主用网管。采用操作系统和数据库管理系统热备份及共享存储资源的方式;对数据库数据,提供包括物理和逻辑2种方式的备份/恢复策略保证数据安全;在数据库冗余设计方面,主要针对数据访问进行冗余设计,采用本地缓存策略设计,防止批量并发操作访问数据库系统时导致的数据库崩溃而无法进行数据读取,保证系统对关键数据的可靠访问控制。
②重要模块备份:网络管理系统功能强大且复杂,软件模块众多,如果所有的模块都进行备份,不仅降低运行效率,而且造成系统资源的极大浪费;如果都不备份,软件的可靠性无法保证。因此选择重要的软件模块,如拓扑管理模块、故障管理模块及通信机模块等进行备份。
③信息冗余:数据库是网管系统重要的信息存储方式,在数据库的选型方面选择可靠性较高的数据库,而且进行数据库的实时自动备份。
1.3软件健壮性设计
软件健壮性是指软件在所运行的硬件环境如计算机或显示器发生故障,或在使用软件时出现输入数据不合理或非正常操作时,或输入数据越限等非软件所能承受的非正常情况发生时,软件仍能正常运行而不出现故障的能力,即软件不仅要在正确的操作使用和运行环境下正常运行,而且要对非正常运行环境和非法输入具有免疫能力。软件的健壮性设计包括环境冗余设计、非法输入提示、非正常运行环境检测和提示等设计。
1.4软件避错设计
在网络管理系统软件开发过程中,主要采用如下避错设计方法:
①需求分析阶段,多与用户沟通交流,充分了解用户的需求,在需求阶段引入的错误的修正代价是其他阶段错误的千百倍甚至更多,因此做好需求分析是软件避错设计的重要环节。
②软件架构设计阶段,采用模块化设计,一个功能采用一个软件模块实现,模块之间基于消息进行交互,采用松耦合高内聚的方式。
③界面设计中,对于需要用户输入的地方,尽量采用下拉列表框设计控件,这样可以避免用户的直接输入,减少出错机会。如果必须要使用编辑框,首先要设置编辑框的属性,如只允许输入数字、输入字符的长度限制等,对输入数据的有效性及合理性、数据输入范围等采用自动避错,当出现非法操作时,程序以文字方式提示操作员,同时高亮显示错误输入的编辑框,允许用户重新输入。
④加强软件测试,在软件进行需求分析、架構设计、概要设计和详细设计之后,通过加强各阶段的软件测试可进一步提高软件可靠性。为最大限度发现软件缺陷、提高软件的可靠性,就要对软件进行尽可能完备的测试。每个阶段的测试都要制定测试大纲、测试细则、测试标准和测试规范,涵盖软件功能、软件性能、内外部接口、软件安装、软件运行环境及软件的扩展性等,测试要尽可能详尽,要强化输入测试,针对每个界面输入要包括设计输入正常值、边界值、异常值测试用例,要进行充分的边界测试。
1.5软件容错设计
软件系统的一些缺陷是不可避免的,不同的使用模式和不同的操作方式导致有些软件错误是不易被发现的。软件容错技术就是软件在缺陷存在的情况下能够正确运行的设计思想。在软件测试阶段和调试阶段能够发现和排除90%的软件错误和缺陷,但是由于软件的缺陷与软件的使用方式息息相关,不同的使用模式会有不同的运行剖面,不同的运行剖面会挖掘出不同的软件缺陷。如果有些运行剖面没有运行,则软件缺陷是不可能被发现的,避错技术和排错技术不可能使软件完全正确。因此,软件容错技术也是提高软件可靠性的一种很重要的实际理念。容错的本质是在软件运行环境或操作使用发生错误时,软件系统仍然具有正常运行能力的一种设计方法。
在网络管理系统软件设计中,主要采用了如下容错设计方法:
①软件容错:采用模块化设计,界面采用下拉框,减少输入,边界值和有效值进行输入控制。
②环境容错:在软件安装过程中,如果检测到内存小于软件正常运行所需的内存,则提示操作员,停止安装。所处的环境发生变化时(如出现内存溢出、断电及硬件故障等异常现象时),软件都能按预定方式进行处理(如数据自动备份等),使重要信息不丢失,避免发生灾难性的后果。
③设计容错:在软件开发过程中,采用版本管理控制工具,详细记录不同开发人员开发相同或不同软件模块的开发轨迹,如果新修改的程序出现问题,可以通过对比或者恢复原来的程序版本进行差错处理,大大提高软件开发效率。
1.6软件错误恢复设计
网络管理系统软件在运行过程中会由于软件运行环境故障、人员操作异常、软件自身错误等原因造成软件出错故障。在软件发生错误后尽快恢复、继续正常运行是软件可靠性设计考虑的重点,有如下3种机制:
①日志机制:网络管理系统软件设计采用日志管理设计,提供安全日志、操作日志、登录日志等各种日志的实时记录和存储备份功能,在软件发生故障后,可以查看日志记录查找故障原因,快速恢复软件。
②状态恢复机制:网络管理系统总部级网管中心软件采用双机热备份,在主用发生故障后,备用能迅速启用,状态转化为主用。
③数据恢复机制:网络管理系统软件采取自动保存、数据备份等手段,确保软件发生故障后,通过网络管理数据的可恢复性来提高软件的可靠性。
1.7软件重用设计
软件重用就是直接使用已有的成熟可靠的软件模块,能够减小工作量进而缩短开发周期,同时也能提高软件的可维护性和可靠性。因为可重用的软件模块已经过多轮测试和筛选,很多错误已在开发、运行和测试过程中被发现和排除,可靠性比较高。
软件重用的过程如下:候选、选择、资格、分类和存储、查找和检索。在选择可重用构件时,一定要有严格的选择标准,可重用的构件必须是经过严格测试的、可靠性高、正确性好、高度可扩展可使用构件,应模块化、结构清晰,且有高度可适应性。
重用模块应有相当的继承性,能在构建各种系统时方便地重复使用,主要功能如下:
①模块具有独立功能:功能独立单一完整,且经过多轮测试,内部功能紧耦合高内聚,对外部有明确的接口。
②具有高度可扩展性:能够根据具体的使用需求或者功能升级,提供可扩展接口以便进行二次开发或者集成。
③接口清晰、简明、可靠,软件模块松耦合,模块之间均基于标准的接口进行消息交互。
构件涵盖了开发工具、开发思想、程序代码等领域,而且均经过详尽的测试和反复的试用,附加详尽的操作使用说明文档,这些构件有的可以直接使用,有的根据实际使用需求进行改进完善后即可使用,大大节省软件开发周期,提高软件可靠性。
2实例验证
以一个规模较大、复杂性较高、专业性极强的软件项目为例进行软件可靠性设计说明,从项目的需求分析、软件概要设计、软件详细设计、软件研制编码、软件测试、软件联试开发的各个阶段,严格进行软件可靠性设计。最终开发的软件相对于原软件而言,具有更高的可靠性和更好的软件质量,得到了用户的高度认可。
①需求分析,通过原型系统与用户充分沟通了解需求,包括功能(拓扑、配置、性能、故障、流量、安全管理)、性能(5个性能指标)、接口(北向接口及协议、南向接口及协议)、运行环境(操作系统和数据库)、可靠性和安全性需求。
②软件架构设计,由于部署套量非常多,因此选择B/S软件架构,便于安装部署。
③冗余设计:拓扑管理和数据库管理是重要的模块,因此进行模块冗余设计;采用数据库热备份,进行物理和逻辑备份;对重要数据进行基于Excel的备份恢复机制。
④健壮性和容错设计:安装时,软件自动检测所需内存是否够用,对于需要用户输入的地方,尽量采用下拉列表框,如果必须要使用编辑框,首先要设置编辑框的属性,只允许输入数字,输入字符的长度限制,输入范围(最大值、最小值、合理值、非法值)等。
⑤错误恢复设计:进行操作日志和安全日志记录,重要信息删除提示,删除信息存储在数据库中,以便于出现误操作时能恢复原始数据。
⑥软件重用:重用了用户管理、报表管理、消息处理等构件,大大缩短了开发周期。
经过可靠性设计后,网管系统软件的可靠性大大提高,实践证明在168可靠性考核中,软件一直正常运行。虽然该网管软件专业复杂度较高,但是在初样测试、正样测试中问题个数最少,在出所测试时,软件代码138万行,测试用例318个,首轮测试未通过测试用例为11个,千行代码缺陷密度为0.001 5%。
3结束语
随着通信与计算机技术的迅猛发展,软件在各个领域的应用越来越广泛,在大型系统中的占比越来越高,地位越来越重要,软件规模也越来越大,复杂性急剧提高。因软件故障而造成的重大事故屡有发生,因此软件可靠性研究和设计越来越受到重视,而软件可靠性设计是一个全生命周期过程,需要在需求分析、软件概要设计、软件详细设计、软件体系架构设计、软件测试等各个软件生命周期的每一个重要环节进行设计和研究,才能开发和设计高可靠性高质量的软件。
参考文献
[1] LENNSELIUS B,RYDSTROM L.Software Fault Content and Reliability Estimations for Telecommunications System[J]. IEEE Journal on.Selected Areas in Communications,1990,8(2):262-272.
[2] DOWNS T, SCOTT A.Evaluating the Performance of Software Reliability Models[J].IEEE Trans.onReliability, 2002,41(4):533-538.
[3]丁定浩.可靠性与维修性工程:系统与电路结构的分析和设计[M].北京:电子工业出版社,1986.
[4]张继旭,王琦.软件可靠性的模块分析方法[J].战术导弹技术,2002(2):64-69.
[5]文長康.浅谈软件可靠性的评估技术[J].通信技术,1997(2): 73-78.
[6]汤扣林,徐大勇,许锐锋.指挥信息系统软件可靠性设计[J].指挥信息系统与技术,2013,4(5):89-94.