系统性谈谈软件可靠性——第1讲:软件可靠性基础概念

目录

一、软件的基本概念

二、软件的质量特性

三、软件可靠性定义

四、软件失效的原因

五、软件缺陷的形成

六、软件可靠性与硬件可靠性的区别

在《可靠性工程师手册》一书中,软件可靠性的内容讲得很少,对于没有基础的人可能不好理解,因此我写了一个系列的文章,希望能帮助理解。

一、软件的基本概念

软件(software):指一系列按照特定顺序组织的计算机数据和指令的集合。

软件工程:指软件开发、运行、维护和引退的系统方法。

软件工程一直以来都缺乏一个统一的定义,很多学者、组织机构都分别给出了自己的定义。

一种比较好理解的定义认为:软件工程是研究和应用如何以系统性的、规范化的、可定量的过程化方法去开发和维护软件,以及如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来。

软件工程化:用系统工程方法处理软件生存期的全部过程。本质是软件过程工程化,将软件的生存期过程分阶段的划分规范化,使其有较好的可视性,以便管理和控制,并能不断改进。

系统工程是为了最好地实现系统的目的,对系统的组成要素、组织结构、信息流、控制机构等进行分析研究的科学方法。

实现软件工程化之前,开发模式基本是作坊式开发。开发者自编、自导、自演,整个过程别人不了解也无法介入,缺乏技术标准或规范,很少形成文档。比如我经常写一些软件就是这样。

而软件工程化,设计、编程和测试分开,遵循有关标准和规范进行,整个过程透明、可控。

二、软件的质量特性


书上并没有这部分内容,但我们要做好软件,还是得了解软件的质量特性。

ISO/IEC 25010:2011标准中,表述的软件质量特性模型如下,一共包含了8个特性,分别是功能适应性、性能效率、兼容性、易用性、可靠性、安全性、维护性、可移植性。每个特性下,又有一些子特性,一共31个子特性。

篇幅原因,每个子特性的具体定义我这里不罗列。我举一些例子,来理解下大的层面:

功能适用性:软件能够正确、完整地实现用户的需求,提供了相应的功能。

性能效率:在指定条件下,软件对操作所表现出的时间特性(如响应速度)以及实现某种功能有效利用计算机资源(包括内存大小、CPU占用时间等)的程度。包括软件执行的快慢,比如Excel,数据量一大就很慢。对资源需求多少,吃多少内存等等。容量,指最大极限的满足要求的程度,比如说12306网站在一秒内处理的最大请求。

兼容性:涉及共存和互操作性,共存要求软件能给与系统平台、子系统、第三方软件等兼容,同时针对国际化和本地化进行了合适的处理。 互操作性要求系统功能之间的有效对接,涉及API和文件格式等。

两个及两个以上软件进行信息交换,这个叫互操作性,比如我们使用的研发系统和测试系统,它们之间的信息交换。共存性,软件不能对其他产品有害,比如3Q大战时,人为的制造不共存,有你没我,有我没你。

易用性:对于一个软件,用户学习、操作、准备输入和理解输出所作努力的程度。主要包括易用好理解,能识别、易学习、好操作、对用户错误进行保护、美观、可访问(例如说你有没有考虑残疾人怎么使用这个软件)。说到易用,我就经常吐槽Creo软件的界面实在是难看至极,相比之下,UG就好看很多。

可靠性:不出故障地完成任务,有一定的容错能力,出故障时易于恢复。本文第三章节会讲到它的定义,这里先不讲。

安全性:要求其数据传输和存储等方面能确保其安全,包括对用户身份的认证、对数据进行加密和完整性校验,所有关键性的操作都有记录(log),能够审查不同用户角色所做的操作。

软件安全包括如下:保密,数据只能由授权人员访问;完整,防止未经授权就被修改或访问;不可抵赖,指能够证明已经发生过的事情,日后不可抵赖;可审查,另一翻译为责任,指的是谁的操作,能够追溯到,比如说网上发帖,能够通过IP追踪到背后的人;真实性,比如你说你是个普通应用软件,通过备案等等确实说明了你不是病毒。

这里我特意提一下,这个定义里的安全,指的是软件本身的安全。由于软件出bug,导致的整机产品出安全问题,是整机方面的安全,要区别一下。

维护性:当一个软件投入运行应用后,需求发生变化、环境改变或软件发生错误时,进行相应修改所做努力的程度。

简单来说就是好维护,比如有模块;可以复用,多个系统可以用;好分析、定位问题,问题找到了好更换。我举个最简单的例子,跟圆周率相关的代码,我们常见的做法是前面先定义圆周率:
#define PI 3.14
后面的计算使用,就直接用PI,当想改变PI值时,只需要修改这里即可,而不是直接写3.14,导致要修改时后面都得改一遍。这就是一个简单的体现维护性的例子。

可移植性:把程序从一种硬件配置和(或)软件系统环境转移到另一种配置和环境时,需要的工作量多少。有一种定量度量的方法是:用原来程序设计和调试的成本除移植时需用的费用。比如说游戏《仙剑奇侠传》,一开始只在电脑上,后来被移植到了手机上。

三、软件可靠性定义

软件可靠性是指软件在规定条件下和规定时间内,不引起系统失效的能力。

书上并没有做出多少解释,这里我细化一些表述。

规定条件,包含的主要是使用者和使用方式。使用者包含了人、软硬件环境。使用方式指使用的任务和功能,以及使用的频度,我在括号里写了软件操作剖面。你可以理解为不同角色使用不同功能的频率,在后面的软件可靠性测试文章中,我会举一个例子,使得大家明白软件操作剖面是个什么意思,这篇文章不讲。

时间一般有三种,分别是执行时间、日历时间和时钟时间。都什么意思?

执行时间:运行软件时,计算机系统实际用于执行程序指令的时间。

日历时间:以年月日计算的编年时间,软件可能处于工作状态,也可能不在工作状态。

时钟时间:从程序执行开始到程序执行结束完毕所经过的时钟时间,包括等待时间,其它程序执行的时间,但计算机的停机时间不算在内。

接下来,我们理解几个概念:

软件可靠性中常用失误、缺陷、故障和失效来描述故障的因果关系。那我们首先得搞懂这几个概念。

失误(mistake):指可能产生非期望结果的个人行为。一些典型失误:误解或遗漏了用户的需求;软件设计错误,没有完整的实现软件需求;程序设计错误。

缺陷(defect):指代码中引起一个或者一个以上故障或失效的错误编码,软件缺陷是程序所固有的 。一些典型缺陷:数组越界使用;缓冲区溢出;算法实现不正确。

讲到缓冲区溢出,多说几句。缓冲区溢出是一种非常普遍、非常危险的漏洞,在各种操作系统、应用软件中广泛存在。利用缓冲区溢出攻击,可以导致程序运行失败、系统宕机、重新启动等后果。更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。

故障(fault):指在软件运行过程中,缺陷在一定条件下导致软件出现错误状态,这种错误的状态如果未被屏蔽,则会发生软件失效。一些典型故障:资源泄露;无限递归调用(死循环);操作者意外输入未知命令;在以前没有考虑的条件下采取的意外路径等。

失效(failure):指程序操作背离了程序的要求。

软件故障的因果关系如下:

四、软件失效的原因

软件失效,是因为在运行过程中遇到了故障,这些故障的产生有内在和外在原因,可以用下面这个图帮助理清。


我在上图已经举了一些例子。这里再讲下一些案例:

 例如偶然失误,在一些需要计时的软件中,如果我们选用了错误的计时,则随着时间往后,累积误差会越来越大。


比如我以前想做个水压监测软件,需要用到计时,我们对比几个计时:

Timer控件,控件不能做精确计时,只能用于粗略计时,而且最小周期不能小于80MS。

GetTickCount()计时,返回从操作系统启动所经过的毫秒数,返回的是DWORD类型,返回的值代表程序从启动到如今走过的时间。只精确到55ms。DWORD类型的最大值为4294967295,折算成天是49.7。也就是说当服务程序连续跑了50天之后,再调用GetTickCount()的时候就会发生溢出。

imeGetTime:函数以毫秒计的系统时间。该时间为从系统开启算起所经过的时间。

QueryPerformanceCounter,Windows 内部有一个精度非常高的定时器, 精度在微秒级。

RDTSC(Read Time Stamp Counter),直接利用Pentium CPU内部时间戳进行计时的高精度计时手段。由于目前的CPU主频都非常高,因此这个部件可以达到纳秒级的计时精度。(使用起来比较麻烦,且结果返回差值较大)

黑客攻击案例:CSDN密码外泄门

这个案例我记得特别清,亲身经历过。2011年12月,CSDN的安全系统遭到黑客攻击,600万用户的登录名、密码及邮箱遭到泄漏。随后,CSDN“密码外泄门”持续发酵,天涯、世纪佳缘等网站相继被曝用户数据遭泄密。天涯网于12月25日发布致歉信,称天涯4000万用户隐私遭到黑客泄露。

环境异常导致的失效:医院X射线影响内存丢失

作者为医院急救设计了一个相关程序,在实验室运行良好,但是每次在医院调试都出bug,作者只好到医院去调试,而且是当着急救病人!!!经过漫长的测试终于发现,是由于医院使用的X射线导致电脑内存总是丢失几个 bit 的信息,而导致程序出问题,最终通过把电脑的内存用铅板隔起来解决! 

五、软件缺陷的形成

软件缺陷的形成与软件开发过程各个阶段活动都相关,可以简述如下。


我举一些实际的例子帮助大家理解:

用户需求环节出错:某出口机器,程序写以50Hz去设计,实际当地使用为60Hz。规格书未明确60Hz要求。

软件需求分析环节出错:某需求描述,统计每次出水时间,当累计出水达到10分钟后,停止出水。此时常温水、冷水灯保持熄灭状态,同时此三个按键无响应,其他触摸按键可操作。需求不明确,程序员不好理解,理解错误。

软件设计环节出错:某设备按键开机10s后4s无反应,原因是软件增加开机动画4s内不允许操作按键,但是计数器放到了开机10s后开始计数。

编码环节出错:某机器每周星期循环运行时,星期一不显示,无法正常自动运行。原因:使用数组时,下标越界,定义了数组tab[7],但实际用到了tab[7];

软件测试环节出错:某机器电源键关闭电源后制冷功能无法关闭,测试时只关注了电源键关闭,显示已关闭,未关注负载输出未关闭的问题。

关于软件测试环节出错,我认为很大一个原因在测试用例的设计上存在不足。后面我单独讲讲测试用例的设计。

开发高可靠的软件,那就是要在这些环节中都控制好。

六、软件可靠性与硬件可靠性的区别

软件具有如下特点:
(1)无形性。产品没有一定的形状,其制作过程的可视性差。
(2)一致性。产品一旦成型后,无论复制多少份,均完全一致,无散差。
(3)不变性。软件产品形成后,无论存放和使用多久,只要未经人为改动,就不会变化,不存在老化和损耗问题。
(4)易改进性。软件产品通常比硬件产品容易改进。
(5)复杂性。软件的运行路径通常很多,特别是大型软件,逻辑组合变化复杂,功能也相对复杂。

软件可靠性和硬件可靠性的区别如下,非常清晰:

硬件产品

软件产品

是物理实体,有散差,会自然老化,且存在使用耗损

是思维逻辑的表示,无散差,不会自动变化,只是其载体硬件可变

研制和生产过程的可见性好,便于控制

设计和编码过程的可见性差,难控制

产品故障不只是设计故障,生产过程、使用过程和物料变化均能造成内部故障

产品缺陷均为开发过程中的设计缺陷,复制过程不会直接而只能通过载体或环境造成内部缺陷

若产品的零部件及其结合部均无故障,且各组成部分之间是协调配合的,则产品无故障;若有故障,就会在运行中暴露

程序是指令序列,即使每条指令本身都是正确的,程序运行状态通常很多,也很难保证指令的动态组合完全正确,故通常存在缺陷; 仅当具备一定的系统状态和输入条件时,缺陷才暴露出来

系统行为通常可用连续函数描述,故障有物理原因,有前兆

程序运行状态的数学模型是离散型的,缺陷的形成无物理原因,失效无前兆

研制、生产、使用、备料和管理过程都会产生缺陷,均需加强控制

一般应在开发过程中采取技术和管理措施来确保可靠性

同一品种规格的不同零部件的适当冗余可提高可靠性

容错设计中冗余设计不能相同,必须保证其设计相异性;否则,将严重影响容错效果

可靠性参数估计有物理基础

可靠性参数估计无物理基础

使用中出现故障后产品维修通常是修复失效的零部件状态,可靠性只能尽量保持,但不能提高

使用中发生失效后软件维护通常要修改软件,产生新版本;只要维护过程合理,可以提高可靠性

维修性设计适当时,维修某个零部件一般不会波及他处,或受影响部位较明显、易确定

维护时修改一处常常会影响他处,波及面不易分析;如果分析不清楚,就不能保证修改结果完整、正确

维修分级,其中基层级快速维修是维修性要求所必需的

维护过程复杂,一般需由专业软件人员进行

产品本身可能有危险;安全关键产品的安全性可单独加以分析评估,一般也必须单独加以分析评估

产品本身无危险,但对于系统安全性可能有影响,因而可能是安全关键的;不能孤立地单独分析评估软件安全性

本文为《软件可靠性简介》培训课程中摘录的公开内容,关注微信公众号“永恒之地”,后台回复“软件可靠性”,下载培训课件。

 

  • 0
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值