• 系统架构设计师-第9章-软件可靠性基础知识-学习笔记


    软件可靠性基本概念

    软件可靠性定义

    软件可可靠性: (Software Reliability) 是软件产品在规定的条件下和规定的时间区间完成规定功能的能力。

    软件与硬件主要有4 个不同点。
    (1) 复杂性。
    (2) 物理退。
    (3) 唯一性.软件是唯一的, 软件复制不改变软件本身,而任何两个硬件不可能绝对相同。
    (4) 版本更新较快。

    软件可靠性的框架性定义

    规定的时间

    规定的条件

    所要求的功能

    "软件可靠"起义具有以下特点。

    ①用内在的"缺陷"和外在的" 失效"关系来描述可靠性,更能深刻地体驯软件的本质特点。
    ②定义使人们对软件可摇性进行量化评估成为可能。对于软件的可括性这样一个质盘特性,很难用一个明确直观的数值去体现。而依据这个定义, 人们有可能通过分析影响可靠性的因素,用函数的形式,按照不同的目的建立各种数学模型去分析软件可靠性。
    ③用概率的方法去描述可靠性是比较科学的。前面讲到,软件失效是随机的外部表现,完全是一个随机事件,而软件缺陷是软件固有的没有损耗的内在特点.

    软件可靠性的定最描述

    软件的可靠性可以基于使用条件、规定时间、系统输入、系统使用和软件缺陆等变量构建的数学表达式。

    规定时间

    失效概率

    可靠度

    失效强度

    平均失效时间

    平均恢复前时间

    平均故障间隔时间

    软件可靠性的度量指标作下列补充说明。
    (1)描述的软件对象必须明确, 即需指明它与其他软件的界限。
    (2) 软件失效必须明确定义。
    (3)必须假设硬件无故障(失效〉和软件有关变量的输入值正确。
    (4) 运行环境包括创件环境、软件支持环境和确定的软件,输入域。
    (5) 规定的时间必须指明时间基准,可以是自然时间( I:U到时间〉、运行时间、执行时间( CPU 时间)或其他时间基准。
    (6) 软件无失效运行的机会通常以概率度量
    (7) 上述定义是在时间域上进行的,这时软件可靠度是一种动态度量。
    (8) 有时将软件运行环境简单地理解为软件运行剖面( Operational Profile) .

    可靠性目标

    失效严重程度类就是对用户具有相同程度影响的失效集合。

    可靠性测试的意义

    软件可靠性问题已被越来越多的软件工程专家所重视,可靠性问题对软件工程实践、生产活动和社会活动有深远影响:

    1、软件失效可能造成灾难性后果

    2、软件失效在整个计算机系统失效中的比例较高

    3、相比硬件可靠性技术、软件可靠性技术很不成熟

    4、与硬件元器件成本急剧下降形成鲜明对比的是软件费用呈有增无减的势头,而软件可靠性问题是造成费用增长的主要原因之一

    5、计算机技术获得日益广泛的应用,系统对软件的依赖性越来越强,软件对生产和社会活动影响越来越大,从而增加了软件可靠性问题在软件工程领域乃至整个计算机工程领域的重要性

    软件可靠性问题的重要性凸显了发展以发现软件可靠性缺陷为目的的可靠性设计与测试技术的迫切性。

    广义的可靠性测试与狭义的可靠性测试

    广义的软件可靠性测试是指为了最终评价软件系统的可靠性而运用建模、统计、试验、分析和评价等一系列手段对软件系统实施的一种测试。

    狭义的软件可靠性测试是指为了获取可靠性数据,按预先确定的测试用例,在软件的预期使用环境中,对软件实施的一种测试。

    可靠性测试的目的可归纳为以下3 个方面。
    ( 1 )发现软件系统在需求、设计、编码、测试和实施等方面的各种缺陷。
    (2) 为软件的使用和维护提供可靠性数据。
    (3) 确认软件是否达到可靠性的定量要求。

    软件可靠性建模

    影响软件可靠性的因素

    软件可靠性模型(Software Rcliability Model ) 是指为预计或估算软件的可靠性所建立的可靠性框图和数学模型。

    影响软件可靠性的主要因素如下。
    (1)运行剖而(坏境〉。软件可靠性的定义是相对运行环境而言的,样的软件作,不同的运行剖面下,其l可靠性的表现是不一样的。
    (2) 软件规愤。软件规模也就是软件的大小, 一个只有数卡行代码的软件和儿子、几万行代码的软件是不能相提并论的。
    (3)软件内部结构。结构对软件可靠性的影响主要取决于软件结构的复杂程度,般来说,内部结构越复杂的软件,所包含的软件缺陷数就可能越多。
    (4) 软件的开发方法和开发环境。软件工程表明,软件的开发方法对软件的可靠性奋显著影响。例如,与作结构方法相比,结构化方法可以明显减少软件的缺陆数.
    (5) 软件的可和性投入.

    软件可靠性的建模方法

    软件可靠性组成:

    模型假设

    性能度量

    参数估计方法

    数据要求

    大多数模型的3个共同假设:代表性假设、独立性假设、相同性假设

    大多数模型都会对如下的内容进行解析表达。
    (1) 任何时间点所经历的平均失效数。
    (2) 一段时间间隔内的平均失效数。
    ( 3) 任何时间点的失效强度。
    ( 4 ) 失效区间的概率分布。

    好的软件可靠性模型的重要特性:

    1、基于可靠的假设

    2、简单

    3、计算一些有用的量

    4、给出未来失效行为的好的映射

    5、可广泛应用

    软件的可靠性模型分类

    10类:

    种子法模型

    失效率模型

    曲线拟合模型

    可靠性增长模型

    程序结构分析模型

    输入域分类模型

    执行路径分析方法模型

    非齐次泊松分布模型

    马尔可夫过程模型

    贝叶斯分析模型

    软件的可靠性管理

    1 . 需求分析阶段
            (1)确定软件的可靠性目标。
            (2) 分析可能影响可靠性的因素。
            (3)确定可靠性的验收标准。
            (4) 制定可靠性管理框架。
            (5) 制定可靠性文档编写规范。
            ( 6) 制订可靠性活动初步计划。
            (7)确定可靠性数据收集规范。
    2 . 概要设计阶段
            (1 )确定可靠性度量。
            (2) 制定详细的可靠性验收方案。
            (3) 可靠性设计。
            (4) 收集可靠性数据。
            ( 5) 调整可靠性活动计划。
            (6) 明确后续阶段的可靠性活动的详细计划。
            (7)编制可靠性文档。
    3. 详细设计阶段
            (1)可靠性设计。
            (2) 可靠性预测(确定可靠性度量估计值〉。
            (3)调整可靠性活动计划。
            ( 4 ) 收集可靠性数据。
            (5) 明确后续阶段的可靠性活动的详细计划。
            (6) 编制可靠性文挡。
    4 . 编码阶段
            (1) 可靠性测试(含于单元测试) 。
            (2) 排错。
            (3) 调整可靠性活动计划。
            ( 4 ) 收集可靠性数据。
            (5) 明确后续阶段的可靠性活动的详细计划。
            ( 6) 编制司靠性文挡。
    5 . 测试阶段
            (1)可靠性测试( 含于集成测试、系统测试) 。
            ( 2) 排铺.
            (3 )可靠性建模.
            ( 4 ) 可靠性评价.
            ( 5) 调整可靠性活动计划.
            ( 6 ) 收集可靠性数据.
            (7)明确后续阶段的可靠性活动的详细计划。
            ( 8) 编制可靠性文挡。
    6 . 实施阶段
            (1) 可靠性测试( 含于验收测试) 。
            (2) 排错。
            (3) 收集可靠性数据.
            (4) 调整可靠性模型.
            (5) 可靠性评价.
            (6) 编制可靠性文档.

    软件可靠性设计

    可靠性设计其实就是在常规的软件设计中,应用各种方法和技术, 使程序设计在兼顾用户的功能和性能需求的同时,全面满足软件的可靠性要求, 即采用一些技术手段,把可靠性"设计"到软件中去。

    软件可靠性设计的原则:

    (1)软件可靠性设计是软件设计的一部分,必须在软件的总体设计框架中使用,井且不能与其他设计原则相冲突。
    (2) 软件可靠性设计在满足提高软件质量要求的前提下,以提高和保障软件可靠性为最终目标。
    (3)软件可靠性设计应确定软件的可靠性目标,不能无限扩大化,并且排在功能度、用户需和开发费用之后考虑。

    容错设计技术

    软件容错技术主要有恢复块设计、N 版本程序设计和冗余设计3 种方法。

    N 版本程序的核心是通过设计山多个模块或不同版本,对于相同初始条件和相同输入的操作结果, 实行多数表决,防止其中某一软件模块/ 版本的故障提供错误的服务,以实现软件容错。

    检错技术

    采用检错设计技术要着重考虑几个要素: 检测对象、检测延时、实现方式和处理方式。

    降低复杂度设计

    系统配置技术

    双击热备技术

    双机热备模式、双机互各模式和双机双工模式。

    服务器集群技术

    集群技术是指一组相E独立的服务器在网络中组合成为单一的系统工作,井以单-系统的模式加以管理。

    软件可靠性测试

    软件可靠性测试概述

    软件可路性测试由可靠性目标的确定、运行剖面的开发、测试用例的设计、测试实施、测试结果的分析等主要活动组成。

    定义软件运行剖面

    可靠性测试用例设计

    一个典型的测试用例向该包括下列组成部分。
    (1) 测试用例标识。
    (2) 被测对象。
    (3) 测试环境及条件。
    (4) 测试输入。
    (5) 操作步骤。
    (6) 预期输出。
    (7) 判断输出结果是否符合标准。
    (8) 测试对象的特殊需求。

    可靠性测试的实施

    应用软件的时靠性测试前有必要检查软件荷求与设计文挡是否一致,检查软件开发过归中形成的艾挡的准确性、元将性以及与程序的一致性,检查所交付程序和数据以及相应的软件支持环境是否符合要求。

    用时间定义的软件可靠性数据可以分为4 类

    (1) 失效时间数据:记录发生一次失效所累积经历的时间。
    (2) 失效间隔时间数据:记录本次失效与t一次失效间的间隔时间。
    (3)分组时间内的失效数:记录某个时间区内发生了多少次失效。
    (4) 分组时间的累积失效数:记录到某个区间的累积失效数。

    在测试过程中必须真实地进行记录,每个测试记录必须包含如下信息。
    (1) 测试时间。
    (2) 含有测试用例的测试说明或标识。
    (3)所有与测试有关的测试结果,包括失效数据。
    (4) 测试人员。

    GJB 438A-97 中提供的《软件测试报告》格式

    测试报告应具备如下内容。
    (1) 软件产品标识。
    (2) 测试环境配置(硬件和软件〉。
    (3) 测试依据。
    (4) 测试结果。
    (5) 测试问题。
    (6) 测试时间。

    软件可靠性评价

    软件可靠性评价概述

    软件可靠性评价是软件可靠性活动的重要组成部分, 既适用于软件开发过程,也可针对最终软件系统

    评估和预测软件可靠性的过程包含如下3 个方面。
    (1)选择可靠性模型。
    (2)收集可靠性数据。
    (3)可靠性评估和预测。

    怎样选择可靠性模型

    怎样来为可靠性评价选用不同的模型:

    1、模型假设的适用性

    2、预测的能力与质量

    3、模型输出值能否满足可靠性评价需求

    最重要的几个商要精确估计的日J靠性定量指标

    (1)当前的可靠度。
    (2) 平均无失效时间。
    (3) 故障密度。
    (4) 期望达到规定可靠性目标的日期。
    (5) 达到规定的可靠性目标的成本要求。

    4、模型使用的简便性

    3 层含义。
    (1)模型需要的数据在软件,系统中应该易于收集,而且收集需要投入的成本不能超过可靠性计划的预算。
    (2) 模型应该简单易懂,进行行可靠性分析的软件测试人员不会花费太多的时间去研究专业的数学理论,他们只需要知道哪些假设适用,需要收集哪些数据, 能够得到哪些分析结果就可以了。
    (3)模型应该便于使用, 最好能用工具实现数据的输入。

    可靠性数据的收集

    亟待解决的问题:

    (1)可靠性数据的规范不统一
    (2) 数据收集工作的连续性不能保证。
    (3)缺乏有效的数据收集于段。
    ( 4 ) 数据的元朝性不能保证。
    (5) 数据质量和准确性不能保证

    解决问题可行的办法:

    (1)及早确定所采用的可靠性模型,以确定需要收集的可靠性数据,并明确定义可靠性数据规范中的一些术语和记录方法
    (2) 制订可实施性较强的可靠性数据收集计划,指定专人负责,抽取部分开发人员、质量保证人员、测试人员、用户业务人员参加,按照统一的规范收集记录可司在性数据。
    (3)重视软件测试特别娃可靠性测试产生的测试数据的整理和分析,肉为这部分数据是用模拟软件实际运行环境的方法、模拟用户实际操作的测试用例测试软件系统产生的数据,对软件可靠性评价和脱测有较高的实周价值。
    ( 4 ) 充分利用数据库来完成可靠性数据的存储和统计分析。

    软件可靠性的评估和预测

    软件可靠性的评估和预测的主要目的,是为了评估软件系统的可靠性状况和预测将来一段时间的可靠性水平

    需要利用软件可靠性评价进行解答的问题:

    (1) 判断是否达到了可靠性目标,是否达到了软件付诸使用的条件,是面达到了中止测试的条件。
    (2) 如未能达到,要再投入多少时间、人力和资金才能达到可靠性目标或投入使用。
    (3)在软件系统投入实际运行一年或若干时间后,经过维护、升级和修改,软件能否达到交付或部分交付用户使用的可靠性水平。

    可靠性模型的补充、完善和修正的辅助方法:

    (1)失效数据的图形分析法。运行图形处理软件失效数据,可以南观地帮助人们进行分析,图形指标如下。
            ①累积失效个数图形
            ②单位时间段内的失效数的图形。
            ③失效间隔时间图形。
    (2) 试探性数据分析技术(Exploratory Data Analysis, EDA) 。对于失效数据图形进行一定的数字化分析,能发现和揭示出数据中的异常。对可靠性分析有用的信息如下。
            ①循环相关。
            ②短期内失效数的急剧上升。
            ③失效数集中的时间段。

    #####################################################

    软件可靠性是指软件在特定条件下能够按照要求正常运行的能力。软件可靠性的基础知识包括以下几个方面:

    1. 软件测试:软件测试是评估软件可靠性的重要手段。通过对软件进行不同的测试,如单元测试、集成测试、系统测试等,可以发现软件中的缺陷并及时进行修复。

    2. 质量保证:质量保证是确保软件可靠性的一个关键环节,包括软件开发过程中的各个环节,如需求分析、设计、编码、测试等。

    3. 风险管理:软件开发中存在着各种风险,如需求变更、人员变更、技术限制等,这些风险会对软件的可靠性产生影响。因此,需要对风险进行评估和管理,并制定相应的风险应对策略。

    4. 版本控制:版本控制是软件开发过程中的一个重要环节,可以确保软件的稳定性和可靠性。通过版本控制工具,可以控制软件的变更、回溯历史版本等操作。

    5. 编程规范:编程规范是指编程时需要遵循的一些约定和标准,如命名规范、代码风格规范等。遵循编程规范可以提高代码的可读性和可维护性,降低软件出错的概率。

    6. 过程改进:软件开发是一个不断迭代和改进的过程,需要不断地反思和改进。通过对软件开发过程中存在的问题进行分析和总结,可以找到问题的根源并制定相应的改进措施,提高软件的可靠性和可维护性。

    软件测试是指对软件进行全面、系统、严格的检查和评测,以确定软件是否符合设计需求和用户需求,是否具有高可靠性、高效性和高质量。软件测试通常包括以下几个阶段:

    1. 需求分析和测试计划制定:测试计划是软件测试的基础,它包括测试的目标、测试用例、测试环境、测试进度等内容。

    2. 静态测试:静态测试主要是对软件的设计、代码等文档进行检查,找出潜在的缺陷和错误。

    3. 动态测试:动态测试是指对软件进行实际执行的测试,包括黑盒测试和白盒测试。

    4. 回归测试:回归测试主要是在软件发生变化后重新进行测试,以确保修改后的软件仍然符合原有的功能和要求。

    5. 性能测试:性能测试主要是对软件的负载、压力等进行测试,以测试软件的性能指标。

    6. 安全测试:安全测试主要是对软件的安全性进行测试,发现软件的漏洞和安全风险。

    7. 用户验收测试:用户验收测试是在软件开发完成后,客户进行的最后一次测试,以验证软件是否能够满足客户的需求和期望。

    总之,软件测试是确保软件质量和可靠性的重要手段,在软件开发的整个过程中都需要进行测试,以确保软件能够符合用户的要求和期望。

    软件质量保证(Software Quality Assurance,SQA)是指在软件开发的各个阶段上负责制定、实施和监督软件开发过程和方法以确保软件产品的质量的一种活动。其主要目的是确保软件产品能够满足用户需求,并且在生产过程中遵循最佳实践和标准。

    软件质量保证包括以下几个方面:

    1. 规范化管理:通过文档管理、版本管理、变更管理等等一系列管理手段来规范软件开发过程,以确保软件符合规范和标准。

    2. 质量控制:在软件开发过程中对软件进行各种测试,以确保软件的质量符合标准要求。

    3. 质量评估:以用户需求为出发点,对软件进行评估,以确定软件是否符合用户需求,是否具有足够的可用性和可靠性。

    4. 质量改进:在发现缺陷和问题后,及时对软件进行改进,以确保软件质量的持续提升。

    通过软件质量保证,可以有效地控制软件开发过程中出现的各种问题,降低软件错误率和维护成本,提高软件质量和软件开发效率,从而提高用户满意度。

    软件风险管理是指对软件开发过程中可能出现的各种风险进行全面的分析、评估、控制和监测,以确保软件项目的成功实施和可持续发展。软件风险管理包括以下几个方面:

    1. 软件风险评估:通过对软件开发中可能出现的各种风险进行评估,确定其可能产生的影响和概率,以便为软件开发过程中的决策提供依据。

    2. 软件风险控制:制定并实施相应的风险控制措施,以降低或消除软件风险对软件项目的影响。

    3. 软件风险监测和追踪:定期对软件项目的风险进行监测和追踪,以及时做出相应的决策和调整。

    4. 软件风险管理计划:制定软件风险管理计划,明确软件风险管理的目标、策略和措施,以便为软件项目提供全面的风险管理支持。

    软件风险管理的目的是为了确保软件项目的成功实施和可持续发展,并最大程度地降低软件开发中的风险。通过有效的软件风险管理,可以提高软件项目的质量、可靠性和可维护性,从而为软件开发人员和最终用户带来更多的好处。

    软件版本控制是指管理软件开发过程中不断变化的代码、文档等内容的过程。

    软件版本控制的作用主要有以下几点:

    1.协同开发:多个开发者可以同时对同一个项目进行开发,版本控制可以确保他们对同一个代码版本进行工作。

    2.版本追踪:版本控制能够确保所有版本的代码都得到记录,可以快速恢复到之前的某个版本。

    3.错误恢复:如果某个版本有错误,版本控制可以快速回滚到之前的版本,并查找错误的原因。

    常见的版本控制工具主要有以下几种:

    1.Git:分布式版本控制工具。广泛应用于开源项目中,也被很多公司采用。

    2.SVN:中央式版本控制工具。虽然不是最新的工具,但是在某些企业中仍然被广泛使用。

    3.TFS:微软公司的团队基础服务,可以用于代码管理、构建、测试等团队基础工作。

    无论是哪种版本控制工具,都需要遵循一些基本的使用规则。例如,每个变更都需要记录日志,每个变更都需要有一个唯一的版本号等等。这些规则可以确保版本控制的正确使用,并使开发人员更加高效地开发代码。

    软件编程规范是指为了保证软件开发的质量和可维护性,对软件开发过程中的代码管理、编写风格、命名规则、注释等方面所制定的一系列统一规则和标准。以下是软件编程规范的详细介绍:

    1.代码管理:规定代码排版、文件组织方式、代码库的维护方式,如使用版本控制工具管理代码等。

    2.编写风格:规定代码的书写风格,主要包括代码缩进、代码对齐、代码注释、代码排版等。

    3.命名规则:规定命名方式,命名要明确易懂、规范化、有意义。包括变量名、函数名、类名、文件名、常量名等。

    4.注释:规定注释的写法,注释要清晰、精简、不冗长,注释的语言应当简洁明了。

    5.异常处理:规定处理程序异常的方式,程序出现异常时应当有清晰明确的处理方式,要有清晰简洁的错误提示。

    6.代码复用:规定代码复用的方式和原则,如封装类库和代码模块,以实现代码复用,在提高开发效率的同时提高代码重用性。

    7.编码要求:规定编码的标准,如使用UTF-8编码,规范化空格和换行的使用等。

    总之,软件编程规范是为了保证软件的开发效率和质量,使程序员们在开发过程中能够遵循一定的标准和规范,从而提高软件的可维护性、易读性、可扩展性和稳定性。

    软件过程改进是指对软件开发过程中的各种活动、方法和工具进行有计划、有组织、有重点的改进,以提高软件生产的质量、效率和成本效益。

    软件过程改进可以分为以下几个方面:

    1. 定义过程评估模型
    首先要定义评估模型,比如CMMI、ISO/IEC 12207等模型,来评估现有的软件过程的成熟度。

    2. 进行现状评估
    通过对软件开发过程的评估,了解当前软件开发过程的优势和不足,为后续的改进提供依据。

    3. 制定改进计划
    在现状评估的基础上,制定可行的改进计划。改进计划应该包括改进目标、改进策略、改进措施、资源需求和实施时间等。

    4. 实施改进
    在制定好的改进计划的指导下,实施软件开发过程的改进,包括改进流程、改进方法和改进工具等。

    5. 监督和控制改进
    在实施改进的过程中,需要不断监督和控制改进的效果,以确保改进达到预期目标。

    6. 持续改进
    软件开发过程是一个动态的过程,需要持续改进。通过对软件开发过程进行持续改进,可以不断提高软件生产的质量和效率。

    总的来说,软件过程改进是一项复杂的工作,需要全面的计划、实施和监督,也需要不断地持续改进来保持软件开发过程的竞争力和适应性。

  • 相关阅读:
    Spring Cloud Gateway快速入门(一)——网关简介
    ASP.NET Core自定义中间件的方式
    创建对象内存分析
    如何使用java代码获取给定月份“所有周末日期”呢?
    JSTL(jsp标准标签库)
    界面中局部(部分)区域嵌套滑动
    51单片机计算定时器初值
    SSL发送邮件时如何配置客户端确保安全性?
    面经积累---持续更新
    c++ 基础知识(一)
  • 原文地址:https://blog.csdn.net/zrc_xiaoguo/article/details/134008552