软件工程复习笔记

第一章

软件工程的特性

⚫ 软件工程关注于大型程序的构造

⚫ 软件工程的中心课题是控制复杂性

⚫ 软件经常变化

⚫ 开发软件的效率非常重要

⚫ 和谐地合作是开发软件的关键

⚫ 软件必须有效地支持它的用户

⚫ 在软件工程领域中是由具有一种文化背景的人替具有另一种文化背景的人创造产品

基本原理

⚫用分阶段的生命周期计划严格管理

⚫坚持进行阶段评审

⚫实行严格的产品控制

⚫采用现代程序设计技术

⚫结果应能清楚地审查

⚫开发小组的人员应该少而精

⚫承认不断改进软件工程实践的必要性

三要素

软件工程三个要素:方法、工具、过程

软件过程的定义

为了获得高质量软件所需要完成的一系列任务框架,它规定了完成各项任务的工作步骤

四种模型

瀑布模型,每个阶段都经过仔细验证,应付需求变化能力较弱

快速原型模型,不带反馈环,开发快,过多修改容易带来版本管理的问题

增量模型,把软件分成一系列增量构件,当新构件集成到现有软件时,所形成的产品必须可测试。要求软件结构必须是开放的

螺旋模型,每个阶段都增加了风险分析,风险更小

喷泉模型,迭代重复演进,各阶段无明显界限。

第二章,可行性分析

题型:画数据流图,数据字典,成本效益分析

可行性研究的目的和内容

可行性研究的目的是用最小的代价,在尽可能短的时间内确定问题是否可以解决,以及是否值得解决

可行性:技术可行性,经济可行性,操作可行性

数据流图的概念(必考画图)

数据流图(DFD)是一种图形化技术,它描绘信息流和数据从输入移动到输出的过程中所经受的变换

数据流图大题讲解

数据字典的概念,和数据流图的关系,表示方法

软件工程速成之数据字典例题讲解

概念:数据的信息的集合,也就是对数据流图中所包含的所有元素的定义的集合通常采用半形式化方法表达。

数据字典与数据流图配合,能清楚地表达数据处理的要求

成本/效益分析

第三章,需求分析

相关题型:简答题,画ER图,画状态转换图,其余简答题

需求分析是生命周期模型中定义阶段的最后一个步骤的工作

结构化分析方法SA:分析系统数据流

SA的描述工具:

1.分层的数据流图

2.数据词典

3.描述加工逻辑的结构化语言,判定图或判定树

需求分析阶段任务

确定对系统的综合要求

功能需求,性能需求,可靠性和可用性需求,出错处理需求,接口需求,约束(精度;工具和语言约束;设计约束;应该使用的标准;应该使用的硬件平台。),逆向需求,未来可能的扩充要求

分析系统的数据要求

建立概念性的数据模型(ER图),形象描绘数据结构(层次方框图,Warnier图,IPO图),数据结构规范化

导出系统的逻辑模型

导出系统的逻辑模型(DFD+DD+IPO)

修正系统开发计划

修正系统开发计划(重估成本,进度)

与用户沟通获取需求的方法

访谈,面向数据流自顶向下求精(沿数据流图(DFD)回溯,用户复查, 细化数据流图(DFD)),简易的应用规格说明技术,快速建立软件原型

面向过程的分析方法主要是建立三类模型

模型核心:数据字典

数据模型:E-R图表达

功能模型:DFD表达

行为模型:状态转换图

需求分析的产品是什么

编制需求分析阶段的文档

⚫ 需求规格说明书,作为分析阶段最终成果,是需求分析阶段得出的最主要的文档

⚫ 数据要求说明书

⚫ 初步的用户手册

⚫ 修改、完善与确定软件开发实施计划

软件需求规格说明书的内容

通常用自然语言完整、准确、具体地描述系统的数据要求、功能需求、性能需求、可靠性和可用性要求、出错处理需求、接口需求、约束、逆向需求以及将来可能提出的要求。

常使用的图形工具

实体-联系图(和数据库里的一样)

状态转换图

通过描绘系统的状态及引起系统状态转换的事件,来表示系统的行为

软件工程数据流图,状态转换图速通教程

第五章,总体设计

题型:给数据流图画结构图

总体设计的任务

将系统划分成模块结构形式,决定每个模块要完成的功能,每个模块之间的调用关系,决定模块接口。

1.设想供选择的方案

2.选取合理的方案

⚫ 数据流程图

⚫ 组成系统的物理元素清单

⚫ 成本/效益分析

⚫ 进度计划

3.确定最佳方案

4.功能分解

5.设计软件结构(模块化思想)

6.数据库设计

7.制定测试计划

8.书写文档

⚫ 系统说明

⚫ 用户手册

⚫ 测试计划

⚫ 详细的实施计划

⚫ 数据库设计结果

9.审查和复查

模块化思想

自顶向下,逐步细化,抽象,逐步求精,信息隐藏和局部化,模块独立

模块化就是把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户的需求。

衡量模块独立的标准(内聚和耦合的含义,种类)(问答,选择)

耦合

是模块之间的互相连接的紧密程度的度量。

种类:(从低到高)非直接耦合,数据耦合,标记耦合,控制耦合,外部耦合,公共耦合,内容耦合

原则:尽可能使用数据耦合,少用控制耦合和特征耦合限制公共环境耦合的范围,完全不用内容耦合

内聚

是模块强度(一个模块内部各个元素彼此结合的紧密程度)的度量。

种类:(按紧密程度从高到底排列)功能内聚,顺序内聚,通信内聚,过程内聚,时间内聚,逻辑内聚,巧合内聚。

模块独立性比较强的模块应是高内聚低耦合的模块。

启发式规则

1.改进软件结构提高模块独立性

2.模块规模适中

3.适当控制深度,宽度,扇出(一个模块直接调用控制的模块数),扇入(直接调用该模块的模块数,不破坏独立性的前提下,越大越好)

4.模块的作用域应该在控制域之内

5.降低模块接口的复杂程度

6.单出单入,避免内容耦合

7.设计功能可预测的模块,但要避免过分受限制的模块

掌握面向数据流图的设计方法

解决的任务,就是将软件需求分析阶段生成的逻辑模型数据流图映射(Mapping)成表达软件系统结构的软件结构图

image-20241129164607279

image-20241129164619780

第六章,详细设计

考简答,画NS图,PAD图判定树,判定表计算复杂度,jackson方法

详细设计的基本任务

结构程序设计,人机界面程序设计

程序的五种控制结构

五种控制结构:顺序结构,选择结构,先判断循环结构,后判断循环结构,多选择结构

详细设计的工具,之间的转换

图形工具:程序流程图盒图(N-S图)、PAD图

NS图例题

表格工具:判定表、判定树

Jackson方法

McCabe方法计算复杂度

程序环形复杂性计算方法(三种):

(1)流图中区域的数量对应于环形复杂度

(2)给定流图G的环形复杂度V(G),定义为V(G)=E-N+2,E是流图中边的数量,N是流图中结点的数量。

(3)V(G)=P+1,P是流图G中的判定结点数。

第七章,实现

题型:设计测试样例

选择程序设计语言应该考虑哪些因素


一般情况下高级语言优于汇编语言

• 系统用户的要求

• 可以使用的编译程序

• 可以得到的软件工具

• 工程规模

• 程序员的知识

• 软件可移植性要求

• 软件的应用领域

良好的编程风格应该包括哪些方面


程序实际上也是一种供人阅读的文章,有一个文章的风格问题。应该使程序具有良好的风格

⚫ 源程序文档化(标识符、注解、视觉效果等)

⚫ 数据说明

⚫ 语句结构(简单、直接)

⚫ 输入/输出方法

⚫ 效率(程序运行时间、存储器效率、输入/输出效率)

软件测试的目的


目标:以尽可能小的代价,发现尽可能多的错误

尽可能多地发现并排除软件中潜藏的错误,最终把一个高质量的软件系统交给用户使用

初步 测试计划是在哪个阶段制定的


一旦完成了需求模型就可以着手制定测试计划,在建立了设计模型之后就可以立即开始设计详细的测试方案

黑盒测试和白盒测试的概念(问答题必考设计测试样例)


黑盒测试是把程序看成一个黑盒子,完全不考虑程序内部结构和处理过程的测试——功能测试

白盒测试是对程序的执行细节进行测试,通过设计测试数据,验证程序模块的每个路径的执行情况——结构测试

测试步骤(5个)以及与之相关的文档


软件测试的步骤

⚫ 模块测试(单元测试)——程序设计&代码bugs

⚫ 子系统测试——测试模块的接口

⚫ 系统测试——需求确认&系统设计

⚫ 验收测试——用户加入

⚫ 平行运行——新旧系统比较运行结果

单元测试的方法


代码审查,计算机测试

测试重点

1.模块接口测试

2.局部数据结构测试

3.路径测试

4.错误处理测试

5.边界测试

渐增式与非渐增式的区别


模块组装成系统的两种方式

非渐增式测试

首先对每个模块分别进行模块测试,然后再把所有模块组装在一起进行测试,最终得到要求的软件系统

渐增式测试

首先对一个个模块进行模块测试,然后将这些模块逐步组装成较大的系统。

在组装的过程中边连接边测试,以发现连接过程中产生的问题。通过渐增逐步组装成要求的软件系统。

分为自顶向下和自底向上两种方法

比较

渐增式测试可以较早发现模块间的接口错误,非渐增式测试最后才组装,因此错误发现得晚。

非渐增式测试中发现错误后难以诊断定位,渐增式测试中,出现的错误往往跟最新加入的模块有关

渐增式测试在不断集成的过程中使模块不断在新的条件下受到新的检测,测试更彻底

渐增式测试较非渐增式测试费时,非渐增式测试可以同时并行测试所有模块,能充分利用人力。

自顶向下,自下而上,以及混合策略的优缺点


1.自顶向下集成

优点:在早期即对主要控制及关键的抉择进行检验

问题:Stub只是对低层模块的模拟,测试时没有重要的数据自下往上流,许多重要的测试须推迟进行,而且在早期不能充分展开人力

2.自底向上集成(相反)

优点:模块自底向上组装,不需要桩模块,重要数据自下往上流动,可以提前完成重要测试,充分展开人力

缺点:不可以在早期就对主要控制进行检验

3.混合集成测试 兼具二者优点

改善的自顶向下测试,早期使用自底向上测试一些关键模块,其他一样

混合法:较下层采用自底向上,较上层采用自顶向下

确认测试


确认测试又称验收测试,任务是验证软件的功能和性能及其他特性是否与用户的要求一致。

对软件的功能和性能要求在软件需求规格说明。书中已经明确规定,它包含的信息就是软件确认测试的基础

确认测试应交付的文档有:

⚫ 确认测试分析报告⚫ 最终的用户手册和操作手册⚫ 项目开发总结报告

白盒测试技术(覆盖标准,基本路径)


每条路径对应表达式都写出来,表达式是给分关键

⚫语句覆盖(点覆盖):每个语句至少执行一次

⚫ 判定覆盖(边界覆盖):在语句覆盖的基础上,每个判定的每个分支至少执行一次

⚫ 条件覆盖:在语句覆盖的基础上,使每个判定表达式的每个条件都取到各种可能的结果

⚫ 判定/条件覆盖:即判定覆盖并条件覆盖

⚫ 条件组合覆盖:每个判定条件表达式中条件的各种可能组合都至少出现一次

⚫ 路径覆盖

黑盒测试技术(等级划分,边界值分析)

最好画个表

等价划分,错误推测

边界值分析,对等价类划分的补充

软件调试技术有哪些

蛮干法:强行排错

回溯法:一旦发现了错误,人们先分析错误征兆,确定最先发现“征兆”的位置

原因排除法:

1.归纳法

2.演绎法调试

3.对分查找法

软件可靠性(可靠性和可用性的含义)

可靠性(Reliability)

• 程序在给定的时间间隔内,按照说明书的规定,成
功地运行的概率

可用性(Usability)

• 程序在给定的时间点,按照说明书的规定,成功地
运行的概率

第八章,维护

什么是维护

软件维护就是在软件已经交付使用之后,为了改正错误或满足新的需要而修改软件的过程

维护的类型

⚫ 改正性维护(Corrective Maintenance)

⚫ 预防性维护(Preventive Maintenance)

⚫ 适应性维护(Adaptive Maintenance)

⚫ 完善性维护(Perfective Maintenance)

决定软件可维护性的因素

可理解性: 是指由文档代码理解功能运行的容易程度

可测试性:是指论证程序正确性的容易程度。

可修改性:是指程序容易修改的程度

可靠性

可移植性:表明程序转移到一个新的计算环境的可能性的大小

可使用性:定义为程序方便、实用、及易于使用的程度

效率:是指程序能执行预定义功能,而又不浪费机器
资源的程度

文档

⚫ 影响可维护性的决定因素,比代码更重要

⚫ 用户文档

• 功能描述——说明系统能做什么

• 安装文档——说明安装系统的方法及适应特定的硬件配置的方法

• 使用手册——说明使用方法以及错误挽救方法

• 参考手册——详尽描述用户可使用的所有系统设施以及他们的使用方法,给出错误信息注解表

• 操作员指南(如果需要有系统操作员的话)——说明操作员处理使用中出现的各种情况的方法

⚫ 系统文档

• 即软件生产过程中每一步产生的文档

维护是软件生命周期中所花费用最多的阶段

软件维护活动所花费的工作占整个生存期工作量的70%以上,维护成本约为开发成本的4倍(满足8-2原则)

第九~十二章 面向对象软件工程(考察较少)

几个概念:类,对象,继承,消息,属性,实例,多态性,重载

面向对象的方法(4个要素)

OOM=对象+类+继承+消息

对象(object):客观世界由对象组成。

⚫ 类 (class) :对象可划分为类;单个对象可视为某一类的实例 (instance)。

⚫ 继承(inheritance):类可分层,下层子类与上层父类有相同特征,称为继承。

⚫ 消息(message):对象间只能通过发送消息进行联系,外界不能处理对象的内部数据,只能通过消息请求它进行处理(如果它提供相应消息的话)。

面向对象方法的优点

① 与人类习惯的思维方式一致

②面向对象软件稳定性好

③ 面向对象软件可重用性好

④ 较易开发大型软件产品

⑤ 面向对象软件可维护性好

面向对象建模的三个模型,以及之间的关系

面向对象分析模型由3个独立模型组成:

⚫ 对象模型:最重要,开发任何系统都需要,

• 描述静态结构,定义做事情实体,用类图和对象图表示

⚫ 动态模型:对于开发交互式系统(interactive system)很重要

• 描述交互过程,由状态图和顺序图表示

⚫ 功能模型:对于开发大运算量问题(如科学计算、编译系统等)很重要

• 指明系统应“做什么”,由用例图表示

面向对象设计时要设计哪些子系统,及各个子系统的作用

问题域子系统,人机交互子系统,任务管理子系统,数据管理子系统

问题域:直接负责实现客户需求子系统

人机交互:实现用户界面子系统包括可复用的GUI子系统

任务管理:确定各类任务,把任务分配给适当的硬件或软件去执行

数据管理:负责对象的存储和检索的子系统

CMM等级划分(了解,选择题)

(1)初始级

(2)可重复级

(3)已定义级

(4)已管理级

(5)优化级