软件设计师考试备考之软件工程


软件工程

这里只记录了一些我自己觉得比较重要的知识点

开发模型

瀑布模型

将软件生存周期中的各个活动规定为依线性顺序连接的若干阶段的模型,包括需求分析、设计、编码、运行与维护。严格遵循软件生命周期各阶段的固定顺序,一个阶段完成再进入另一个阶段
特点:容易理解,管理成本低,每个阶段都有对应的成果产物,各个阶段有明显的界限划分顺序要求,一旦发生错误,整个项目推倒重新开始。
适用于:需求明确、或二次开发,或者对于数据处理类型的项目

原型模型

采用了一种动态定义需求的方法,通过快速地建立一个能够反映用户主要需求的软件原型,让用户在计算机上使用它,了解其概要,再根据反馈的结果进行修改,因此能够充分体现用户的参与和决策。
特点:能够充分体现用户的参与和决策,可以帮助用户明确需求获得真实需求后,就将抛弃原型
适用于需求不明确的场景,帮助客户明确需求

演化模型

是一种原型化开发,但与原型不同的是,它将从初始的模型中逐渐演化为最终软件产品,是一种“渐进式”原型法。
特点:以能满足用户核心需求的核心系统上,增加用户反馈的其他全部功能
适用于:需求不明确的项目

增量模型

它采用的是一种“递增式”模型,它将软件产品划分成为一系列的增量构件,分别进行设计、编码、集成和测试。系统的功能模块不是一次完成的,而是一块一块开发,以增加的方式进行的
特点:融合了瀑布模型的基本成分和原型实现的迭代特征,可以有多个可用版本的发布,核心功能往往最先完成。
适用于:需求不明确的项目

螺旋模型

结合了瀑布模型和演化模型的优点,加入了风险分析,它是由制定计划、风险分析、实施工程、客户评估这一循环组成的,它最初从概念项目开始第一个螺旋
特点:属于面向对象开发模型,强调风险引入
适用于:大规模软件项目,内部的大规模软件开发

喷泉模型

主要用于描述面向对象的开发过程,最核心的特点是迭代。
特点:所有的开发活动没有明显的边界,允许各种开发活动交叉进行。开发人员可以同步进行开发
适应于:面向对象的软件

统一过程(UP、RUP)

既是一个统一的软件开发过程,又是一个通用过程框架,统一过程是基于构件的,这意味着利用它开发的软件系统是由构件构成的,构件之间通过定义良好的接口相互联系
特点:用例驱动、以架构为中心、迭代和增量
分为四个不同的阶段:
构思阶段 :包括用户沟通和计划活动两个方面,强调定义和细化用例,并将其作为主要模型。
细化阶段 :包括用户沟通和建模活动,重点是创建分析和设计模型,强调类的定义和体系结构的表示。
构建阶段 :将设计转化为实现,并进行集成和测试。
移交阶段 :将产品发布给用户进行测试评价,并收集用户的意见,之后再次进行迭代修改产品使之完善
适用于:大型软件的开发。

敏捷开发

一种轻量级的开发方法
特点:是一种以人为核心、迭代、循序渐进的开发方法
敏捷方法包括:
极限编程(XP)
四大价值观:沟通、简单、反馈、勇气
五大原则:快速反馈、简单性假设、逐步修改、提倡更改、优质工作。
十二个最佳实践:计划游戏、小型发布、隐喻、简单设计、测试先行、重构、结对编程、集体代码所有制、持续集成、每周工作40小时、现场客户、编码标准。
水晶法(Crystal)强调经常交付,认为每一种不同的项目都需要一套不同的策略、约定和方法论。
并列争球法(Scrum)的核心是迭代、增量交付,按照 30 天进行迭代开发交付可实际运行的软件。
自适应软件开发(ASD)的核心是三个非线性的, 重叠的开发阶段:猜测、合作、学习。
适用于:小团队小项目

软件开发方法

  1. 结构化开发方法:用户至上,严格区分工作阶段,每阶段有任务和结果,强调系统开发过程的整体性和全局性,系统开发过程工程化,文档资料标准化,自顶向下逐步分解(求精)
  2. 原型开发方法:适用于需求不明确的情况
  3. 面向对象开发方法:更好的复用性,关键在于建立一个全面、合理、统一的模型,分析、设计、实现三个阶段,界限不明确
  4. 面向服务开发方法:面向对象更高标准的抽象。

需求分析

需求分析的任务、成果产物、工具。
任务:是解决做什么的问题
工具:判定表、判定树、数据流图数据字典
产物:需求规格说明书 SRS(Software Requirements Specification)。

软件设计

软件设计的原则

高内聚低耦合

内聚性

偶然聚合:模块完成的动作之间没有任何关系,或者仅仅是一种非常松散的关系。
逻辑聚合:模块内部的各个组成在逻辑上具有相似的处理动作,但功能用途上彼此无关
时间聚合:模块内部的各个组成部分所包含的处理动作必须在同一时间内执行
过程聚合:模块内部各个组成部分所要完成的动作虽然没有关系,但必须按特定的次序执行
通信聚合:模块的各个组成部分所完成的动作都使用了同一个数据或产生同一输出数据
顺序聚合:模块内部的各个部分,前一部分处理动作的最后输出是后一部分处理动作的输入
功能聚合:模块内部各个部分全部属于一个整体,并执行同一功能,且各部分对实现该功能都必不可少

耦合性

非直接耦合:两个模块之间没有直接关系,它们的联系完全是通过主模块的控制和调用来实现的。
数据耦合:两个模块彼此间通过数据参数交换信息。
标记耦合:一组模块通过参数表传递记录信息,这个记录是某一个数据结构的子结构,而不是简单变量
控制耦合:两个模块彼此间传递的信息中有控制信息。
外部耦合:一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息。
公共耦合:两个模块之间通过一个公共的数据区域传递信息。
内容耦合:一个模块需要涉及到另一个模块的内部信息

权衡适量

  • 模块大小适中
  • 适宜的系统深度和宽度比例
  • 尽可能减少调用的深度
  • 适度控制模块的扇入扇出
  • 模块的作用域应该在模块之内

软件测试

常见的软件测试方法分类

  • 静态测试:
    桌前检查、代码走查、代码审查
  • 动态测试:
    黑盒测试:等价类划分、边界值分析、错误推测、因果图。
    白盒测试:语句覆盖、判定覆盖、条件覆盖、条件/判定覆盖、路径覆盖。

常见的黑盒测试方法

等价类划分:确定无效与有效等价类, 设计用例尽可能多的覆盖有效类, 设计用例只覆盖一个无效类。
边界值分析:处理边界情况时最容易出错, 选取的测试数据应该恰好等于、稍小于或稍大于边界值。

常见的白盒测试方法:

语句覆盖:被测试程序中的每条语句至少执行一次
判定覆盖(分支覆盖):被测程序每个判定表达式至少获得一次“真”值和“假”值(或者程序中每一个判定取“真”分支和取“假”分支至少通过一次。)
条件覆盖:每一个判定语句中每个逻辑条件的各种可能的值至少满足一次
路径覆盖:覆盖被测试程序中所有可能的路径
循环覆盖:循环中每个条件都得到验证(注意数组参数可循环验证)

各测试阶段的任务:

(1)验收测试:有效性测试、软件配置审查、验收测试。
(2)系统测试:恢复测试、安全性测试、强度测试、性能测试、可靠性测试和安
装测试。
(3)集成测试:模块间的接口和通信。
(4)单元测试:模块接口、局部数据结构、边界条件、独立的路径、错误处理。
(5)其他测试:
回归测试:修改软件后进行的测试,防止引入新的错误。
负载测试:对软件负载能力的测试。
压力测试:对软件超负荷条件下运行情况的测试。

测试的基本原则

  • 尽早、不断地进行测试;
  • 程序员避免测试自己设计的程序;
  • 既要选择有效合理的数据,也要选择无效不合理的数据;
  • 修改后应进行回归测试
  • 尚未发现的错误数量与该程序已发现错误数成正比。

McCabe 复杂度计算

  1. McCabe 复杂度计算公式: V(G)=m-n+2,其中 m 是有向弧的条数, n 是结点数。

小技巧
可以数V(G)图的封闭区域数 V(G)= 封闭区域数

小技巧示例图:

软件维护类型

更正性维护:针对真实存在并且已发生的错误进行的维护行为
预防性维护:针对真实存在还未发生的错误进行的维护
适应性维护:指应用软件适应信息技术变化管理需求变化而进行的修改。企业的外部市场环境和管理需求的不断变化也使得各级管理人员不断提出新的信息需求。
完整性维护:扩充功能和改善性能而进行的修改。对已有的软甲系统增加一些在软件分析和软件设计阶段中没有的功能与性能特征。

软件质量保证

功能性:适合性、准确性、互操作性、安全保密性。
可靠性:成熟性、容错性、易恢复性。
易用性:易理解性、易学性、易操作性、吸引性。
效率:时间特性、资源利用性。
维护性:易分析性、稳定性、易测试性、易改变性。
可移植性:适应性、易安装性、共存性、易替换性。

风险管理

风险的特性:具有不确定性,可能会造成损失。即使可以预测,也无法避免
风险的类别:

  • 项目风险涉及到各种形式的预算、进度、人员、资源以及客户相关的问题,并且可能导致项目损失。
  • 技术风险涉及到技术相关的可能会导致项目损失的问题。
  • 商业风险与市场因素相关。
  • 社会风险涉及到政策、法规等因素。
    风险暴露又称风险曝光度,测量的是资产的整个安全性风险,它将表示实际损失的可能性与表示大量可能损失的资讯结合到单一数字评估中。在形式最简单的定量性风险分析中风险曝光度可透过将风险可能性及影响相乘算出。
    风险曝光度(RiskExposure) =错误出现率(风险出现率) × 错误造成损失(风险损失)。

相关