导图社区 软件工程
这是一篇关于软件工程概述的思维导图,主要内容有1.软件工程与软件过程⒉结构化分析3.结构化设计4.结构化实现。
编辑于2022-08-30 17:44:19 吉林软件工程
1.软件工程与软件过程
1.1计算机软件
计算机软件
计算机软件指计算机系统中与计算机硬件相互依存的另一部分,包括程序、数据及相关文档
程序是按事先设计的功能和性能要求执行的指令序列
数据是使程序能正常操纵信息的数据结构
文档是与程序开发、维护和使用有关的图文资料
软件发展阶段
程序设计阶段(1950至60年代)
个体手工方式
批处理,没有任何其它形式文档资料保留
根本无法维护
程序系统阶段(60至70年代)
规模已经很大,需要多人分工协作
由个体生产变成软件作坊
沿用了个体化开发方法,软件的开发与维护费用快速增长,许多软件根本不能维护
导致软件危机
1.如何开发ruan'j软件,以满足社会对软件日益增长的需求
2.如何更有效地维护数量不断膨胀的已有软件
软件工程阶段(70年代以后)
概念源自软件危机
以工程化思想为指导
用工程化的原则、方法和标准来开发和维护软件
软件的特点
软件是一种逻辑试题,而不是有形的系统元件,其开发成本和进度难以准确估算
软件是被开发的或被设计的,没有明显的制造过程,一旦开发成功,只需复制即可,但其维护的工作量大
在软件运行和使用期间,没用硬件那样的机械磨损,老化问题
软件分类
按功能
系统软件
支撑软件
应用软件
按规模
微型
小型
中型
大型
甚大型
极大型
按软件工作方式
实时处理软件
分时软件
交互式软件
批处理软件
按软件服务对象的范围
项目软件
产品软件
按使用的频度进行划分
一次使用
频繁使用
按软件失效的影响进行划分
高可靠性软件
一般可靠性软件
软件语言
需求定义语言
功能性语言
设计性语言
实现性语言
文档语言
工业软件
工业领域里应用的软件,包括系统、应用、中间件
根据用途和表现形式,工业软件一般分为
研发设计类软件
信息管理类软件
生产控制类软件
嵌入式工业软件
1.2软件工程
软件工程三要素
过程
方法
工具
7条基本原理
用分阶段的生命周期计划严格管理
坚持进行分阶段审评
实行严格的产品控制
采用现代程序设计技术
结果应能清楚地审查
开发小组的人员应该少而精
软件生命周期
软件定义
问题定义
可行性研究
需求分析
软件开发
概要设计
详细设计
编码和单元测试
综合测试
运行维护
1.3软件过程
软件过程是生产一个最终满足需求并且达到工程目标的软件产品所需的步骤
软件生存周期过程
基本过程
支持过程
组织过程
能力成熟度模型CMM
成熟度等级
过程能力
关键过程域
目标
公共特征
关键实践
能力成熟度等级
初始级
可重复级
已定义级
已管理级
优化级
关键过程域
除第一级外,每一级成熟度对应的过程能力关键环节
1.4软件过程模型
软件开发的全部过程、活动和任务的结构框架
瀑布模型
演化模型
快速原型模型
螺旋模型
增量模型
喷泉模型
变换模型
SpaceX多周期迭代模型
1.5Rational统一开发模型(RUP)
核心元素
用于成功开发软件的一组基本观念和原则
一套关于可重用方法内容和过程构建的框架
基础的方法和过程定义语言;统一方法架构元模型
最佳软件开发实践
十大要素
前景、计划、风险、业务案例、架构、原型、评估、变更请求、用户支持、过程
2.结构化分析
2.1概述
需求分析
发现、求精、建模、规格说明和复审的过程
相当艰巨复杂的工作
结构化分析方法
主要思想:抽象与自顶向下的逐层分解
抽象与分解
抽象:从作为整体的软件系统开始,每一抽象层次上只关注于系统的输入输出
分解:将系统不断分解为子系统、模块
结构化分析方法准则
必须理解和表示问题的信息域,根据这条准则应该建立数据模型
必须定义软件应完成的功能,这条准则要求建立功能模型
必须表示作为外部事件结果的软件行为,这条准则要求建立行为模型
必须对描述信息、功能和行为的模型进行分解,用层次的方式展现细节
分析过程应该从要素信息移向实现细节
系统模型
三层
背景模型,逻辑模型,物理模型
三层集成在一起
系统建模
工程系统的研制过程,就是建立工程系统模型的过程
从工程系统研制工作不同种类,不同阶段来对建模工作进行划分
构建模型
推导模型
修改模型
实现模型
验证模型
选择模型
对研制工作的管理,就是对这些系统建模工作以及模型本身的管理
集成化计算机辅助制造定义IDEF
结构化分析方法
IDEF相关方法
基于结构化的设计与分析技术,以及相关活动模型的分析方法
根据用途分类
沟通系统集成人员之间的信息交流
IDEF0、1、3、5
系统开发过程中的设计部分
IDEF1X、4
2.2与用户沟通的方法
访谈是最早开始运用的获取用户需求的技术,也是迄今为止仍然广泛使用的主要的需求分析技术
两种基本形式
正式的访谈
非正式的访谈
简易的应用规格说明技术
提倡用户与开发者密切合作,共同标识问题,提出解决问题的要素,商讨不同的方法并指定基本的要求
软件原型
快速原型就是快速建立起来的旨在演示目标系统主要功能的程序
快速地构建和修改原型的方法和工具
第四代技术(4GT)
包括众多数据库查询和报表语言、程序和应用系统生成器以及其它非常高级的非过程语言
能快速生成可执行代码
是理想的快速原型工具
可重用的软件构件
使用一组已有的软件构件(或成为组件)来装配原型
可以是
结构构件(程序)
过程构件(模块)
形式化规格说明和原型环境
使得分析员能够交互地创造基于语言的规格说明
调用自动工具把基于语言的规格说明翻译成可执行的代码
使得用户能够使用可执行的原型代码去精化形式化的需求
2.3分析建模的目标
描述用户的需求
为软件设计工作奠定基础
定义一组需求,一旦开发出软件产品之后,就可以用这组需求为标准来验收
为了完成目标,在结构化分析过程中导出的分析模型的形式
数据字典
模型的核心
包含了软件使用和产生所用数据的描述
数据流图
用于功能建模
描述系统的输入数据如何经过一系列加工变换逐步变换成系统的输出数据流
实体—关系图
用于数据建模
描述数据字典中数据之间的关系
状态转换图
用于行为建模
描述系统接收哪些外部事件,以及在外部事件的作用下的状态迁移情况
数据对象
对软件必须理解的复合信息的表示
彼此之间有关联
只封装了数据而没有对作用于数据上的操作的引用
属性
定义了数据对象的性质
为数据对象的实例命名
描述该实例
引用另一个数据对象的实例
关系
数据对象彼此之间相互连接的方式
一对一联系
一对多联系
多对多联系
2.4实体—关系图的符号
ER图中包含了实体(即数据对象)、关系和属性3种基本成分
矩形框代表实体
菱形框代表关系
椭圆形或圆角矩形表示实体
2.5数据流图(DFD)
描述输入数据流到输出数据流的变换(即加工)过程
基本元素
数据流
加工
文件
源或宿
2.6状态转换图
通过描绘系统的状态及引起系统状态转换的事件,来表示系统的行为
状态
任何可被观察到的系统行为模式
一个状态代表系统的一种行为模式
状态规定了系统对事件的响应方式
状态图中定义的状态
初态
只能有一个
终态
0至多个
中间状态
事件
在某个特定时刻发生的事情,它是对引起系统做动作或从一个状态转换到另一个状态的外界事件的抽象
符号
初态
实心圆
终态
同心圆(内圆为实心圆)
中间状态
圆角矩形
三个部分
状态名称
必须有
状态变量名字和值
可选
活动表
可选
2.7数据字典
所有与系统相关的数据元素有组织的列表
包含了对这些数据元素的精确,严格的定义
描述数据的信息的集合
包含的列信息
名字
别名
使用地点与时间
内容描述
补充信息
描述符号
字典条目
2.8软件需求规格说明
分析阶段的最终成果
框架
引言
系统参考文献
整体描述
软件项目约束
信息描述
信息内容
信息流
数据流
控制流
功能描述
功能分解
功能描述
处理说明
限制
性能需求
设计约束
支撑图
控制描述
控制规格说明
设计约束
基于模型的系统工程(MBSE)
三个支柱
建模语言
建模思路
建模工具
SysML的特点
可视化
形式化
关联化
4.结构化实现
4.1编码
编程风格与编码标准
编程风格设计
源程序文档化
符号名的命名
程序的注释
序言性注释
给出程序整体说明
功能性注释
用以描述其后的语句或程序段是在做什么工作
空格、空行和移行
数据说明规范化
数据说明次序应当规范化
说明语句中变量安排有序化
使用注释说明复杂数据结构
程序代码结构化
在一行只能写一条语句
程序编写首先应当考虑清晰性
程序要直截了当地说明程序员的用意
除非对效率有特殊要求,程序编写时要做到清晰第一,效率第二
首先要保证程序正确,然后才要求提高速度
避免使用临时变量而使可读性下降
让编译程序做简单的优化
尽可能使用库函数
避免不必要的转移
尽量只采用三种基本控制结构来编写程序
避免使用空的else语句和if…then if…的语句
避免采用过于复杂的条件测试尽量减少使用否定条件的条件语句
数据结构要有利于程序的简化
尽可能用通俗易懂的伪码来小鼠程序的流程,然后再翻译成必须使用的语言
要模块化,使模块功能尽可能单一化,模块间的耦合能够清晰可见
利用信息隐蔽,确保每一个模块的独立性
从数据出发去构造程序
不要修补不好的程序,要重新编写,也不要一味地追求代码的复用,要重新组织
对太大的程序,要分块编写、测试,然后再集成
输入/输出可视化
对所有的输入都要进行检验,识别错误的输入,以保证每个数据的有效性
检查输入项的各种重要组合的合理性,必要时报告输入状态信息
使得输入的步骤和操作尽可能简单,并保持简单的输入格式
输入数据时,应允许使用自由格式
应允许缺省值
输入一批数据时,最好使用输入结束标志,而不要由用户指定输入数据项目
在交互式输入时,要在屏幕上使用提示符明确提示交互输入请求,指明可用选择项的种类和取值范围。同时,在数据输入过程中和输入结束时,也要在屏幕上给出状态信息
当语言对输入/输出格式有严格要求时,应保持输入格式与输入语句要求的一致性
给所有的输出加注解并设计输出报表格式
编程语言分类
抽象级别
低级语言
高级语言
应用范围
通用语言
专用语言
用户要求
过程性语言
非过程性语言
语言所包含成分的性质
过程性语言
面向对象语言
面向因特网语言
编程语言选择
理想的标准
有理想的模块化机制
可读性好的控制结构与数据结构
使编译程序能尽可能多的发现程序中的错误
有良好的独立编译机制
实践标准
编程语言自身的功能
系统用户的要求
编码和维护成本
软件的兼容性
可以使用的软件工具
软件可移植性
待开发系统的规模
程序设计人员的水平
从技术上要考虑的因素
项目的应用范围
算法和计算的复杂性
软件执行的环境
性能上的考虑与实现的条件
数据结构的复杂性
软件开发人员的知识水平和心理因素等
4.2软件测试基础
基本概念
软件开发必须伴有质量保证活动
软件测试是软件质量保证的关键元素,代表了规约、设计和编码的最终检查
软件产品最大的成本是检测软件错误、修正软件错误
认知的五个阶段
测试=调试
证明软件正确
发现软件中错误
减小软件不工作的风险
可产生低风险软件的一种认知上的训练
通过测试可以评定质量风险,了解被测试系统中存在的错误模式
目的
证明程序有错,而不是证明程序无措
测试原则
所有测试都应追溯到用户需求
概要设计时应完成测试计划
pareto原理
穷举测试
测试人员由独立的第三方构成
测试用例
输入
预期输出
输入数据
合理输入
不合理输入
程序修改后要回归测试
应长期保留测试用例,直至系统废弃
完全测试是不可能的
软件测试有关概念
组件
系统中可以孤立进行测试的部分
错误
可能引起不正常行为的设计或编码错误
误差
执行过程中错误的表现
故障
由一个或多个误差引起
测试用例
一组输入和期待的结果
测试存根
测试驱动程序
改正】
术语和定义
准确和精确
射靶子
验证和合法性检查
验证是检查软件符合产品说明书的过程
合法性检查是保证软件满足用户要求的过程
质量和可靠性
可靠性只是质量的一个方面
测试和质量评判
软件测试员的目的是找出软件缺陷
软件质量评判人员的主要职责是创建和加强促进软件开发并防止软件缺陷的标准和方法
软件错误分类
功能错
软件结构错
数据错
编码错
软件集成错
测试定义域测试执行错误
测试用例设计
选择测试用例是软件测试员最重要的一项工作
属性
name
location
input
oracle
log
22种测试类型
……
单元测试
模块接口
局部数据结构
边界条件
重要的执行路径
错误处理
集成测试
数据穿越接口可能丢失
一模块可能破坏另一模块功能
子功能组装可能未产生所要求的主功能
全程数据结构出问题
误差累积问题
α测试
在开发者场所由用户进行
β测试
最终用户在自己的场所进行
测试的方法与技术
静态测试方法
人工测试方法
计算机辅助静态分析方法
对软件进行分析,检查和审阅,不实际运行
动态测试方法
黑盒测试方法
闭着眼睛测试
不深入代码细节的测试
根据程序外部特征进行
白盒测试方法
带上X光眼镜
了解运作方式
根据程序内部逻辑结构
通过运行软件检验软件的动态行为和运行结果的正确性
各有优缺点,有大表
4.3白盒测试技术
语句覆盖
判定覆盖
条件覆盖
判定/条件覆盖
条件组合覆盖
路径覆盖
4.4黑盒测试技术
等价划分
边界值分析
错误推测
4.5测试策略
分步骤进行
单元测试
集成测试
确认测试
范围
必须有用户积极参加,或者以用户为主进行
用户参加设计测试方案
软件配置复查
α测试和β测试
是否在开发者的环境下
4.6调试
纠错
调试途径
蛮干法
回溯法
原因排除法
4.7软件可靠性
软件可靠性
程序在给定的时间间隔内,按照规格说明书的规定成功地运行的概率
软件可用性
程序在给定的时间点,按照规格说明书的规定成功地运行的概率
3.结构化设计
概述
软件设计的目标
通过概要设计和详细设计环节设计出所要开发的软件的模型
任务
概要设计
通过仔细分析软件规格说明,适当的对软件进行功能分解,从而把软件划分成模块,并且设计出完成预定功能的模块结构
详细设计
详细地设计每个模块,确定完成每个模块功能所需要的算法和数据结构
软件设计
在软件工程中处于技术核心地位
不依赖于所使用的软件过程模型
在完成了软件需求分析并写出软件规格说明之后,软件设计就开始了
是构造和验证软件所需要完成的三项技术活动的第一项
设计
代码生成
测试
结构化设计(SD)
将结构化分析得到的数据流图映射成软件体系结构的一种设计方法
强调模块化、自顶向下逐步求精、信息隐蔽、高内聚低耦合等设计原则
概要设计
对软件的总体设计,采用结构化设计方法
任务是:将系统分解成模块,确定每个模块的功能、接口(模块间传递的数据)及其调用关系,并用模块及其对模块的调用来构建软件的体系结构
详细设计
对模块实现细节的设计,采用结构化程序设计(SP)方法
SA、SD和SP构成完整的结构化方法体系
3.1结构化设计于结构化分析的关系
软件设计必须依据对软件的需求来进行,结构化分析的结果为结构化设计提供了最基本的输入信息
分析模型的每个元素都提供了创建设计模型是所需要的信息
各种设计
数据设计
把分析阶段创建的信息域模型转变成实现软件所需要的数据结构。在实体—关系图中定义的数据对象和关系,以及数据字典和数据对象描述中给出的详细的数据内容,为数据设计活动奠定了坚实的基础
体系结构设计
确定了程序的主要结构元素(即程序构件)之间的关系
接口设计
描述了软件内部、软件与协作系统之间以及软件与使用它的人之间的沟通方式,接口意味着信息流,包括数据流和控制流
过程设计
把程序体系结构中的结构元素,变换成对软件构件的过程性描述。从处理规格说明、控制规格说明和状态转换图所获得的信息,是过程设计的基础
设计为我们提供了可以质量评估的软件表示,设计是我们把用户需求准确地转变为最终的软件产品的唯一方法
软件设计是后续的所有软件开发和软件维护步骤的基础
3.2软件设计的概念和原理
1.模块化
模块
模块是由边界元素限定的相邻的程序元素(如数据说明,可执行的语句)的序列,而且总有一个总体标识符来代表它
模块是具有一定功能的可以用模块名调用的一组程序语句,如函数,子程序等
它们是组成程序的基本单元
模块化就是把程序划分成可独立命名且独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户的需求
模块特征
外部特征
模块的接口(模块名,输入/输出参数、返回值等)和模块的功能
内部特征
模块的内部数据和完成其功能的程序代码
在SD中,我们关注模块的外部特征,而忽略其内部特征
调用和数据
调用
用从一个模块指向另一个模块的箭头来表示,其含义是前者调用了后者
数据
模块调用时需传递的参数可通过在调用箭头旁附加一个小箭头和数据名来表示
结构图的几个概念
深度
宽度
一定程度上反应了程序的规模和复杂程度
扇出
扇出过大意味着模块比较复杂,然而扇出太少,可能导致深度的增加
一般情况下,3~9为宜
扇入
表示由多少模块可直接调用它,它反映了该模块的复用程度
扇入越大越好
模块化定义的5条标准
模块可分解性
模块可组装性
模块可理解性
模块连续性
模块保护性
模块化有如下优势
因为程序错误通常局限在有关的模块及它们之间的接口中,所以模块化使软件容易测试和调试,因而有助于提高软件的可靠性
因为变动往往只设计少数几个模块,所以模块化能够提高软件的可修改性
模块化也有助于软件开发工程的组织管理,一个复杂的大型程序可以由许多程序员分工编写不同的模块,并且可以进一步分配技术熟练的程序员编写复杂的模块
2.抽象
把相似的方面集中和概括起来,暂时忽略它们之间的差异,这就是抽象
软件工程过程的每一步都是对软件解法的抽象层面的一次精化
在可行性研究阶段,软件作为系统的一个完整部件
在需求分析阶段,软件解法是使用在问题环境内熟悉的方式描述的
由总体设计向详细设计过渡时,抽象程度减少
源代码生成后,抽象达到最低层
逐步求精和模块化的概念,与抽象是紧密相关的
3.逐步求精
为了能集中精力解决主要问题而尽量推迟对问题细节的考虑
把一个时期内必须解决的种种问题按优先级排序的技术。逐步求精确保每个问题都将被解决,而且每个问题都在适当的时候解决
求精过程实际上是细化过程
抽象与求精是一对互补的概念
4.信息隐藏
信息隐藏原理指出,应该这样设计和确定模块,使得一个模块内包含的信息对于不需要这些信息的模块来说,是不能访问的
隐藏模块实现的细节
3.3模块独立
模块独立的概念是模块化、抽象、逐步求精、信息隐藏等概念的直接结果,也是完成有效的模块设计的基本标准
模块的独立程度可以由内聚和耦合两个定性标准来度量
内聚
一个模块内部各个元素彼此结合的紧密程度
耦合
不同模块彼此互相以来的紧密程度
独立性的原因
有效模块化的软件比较容易开发出来,这是由于能够分割功能而且接口可以简化,当许多人分工合作开发同一个软件时,这个优点尤其重要
独立的模块比较容易测试和维护,这是因为相对来说,修改设计和程序需要的工作量比较小,错误传播范围小,需要扩充功能时能够“插入”模块
耦合性
数据耦合
只传数据
标记耦合
传递数据结构
控制耦合
控制被调用模块的内部逻辑
外部耦合
与同一外部环境关联
公共耦合
引用同一个公共数据区
软件可理解性降低
诊断错误困难
软件可维护性差
软件可靠性差
公共数据区及全程变量无保护区
慎用公共数据区和全程变量
内容耦合
一模块直接访问另一模块内部信息
代码重叠
多入口模块
最不好的耦合形式
内聚性
高内聚往往意味着松耦合
偶然内聚
没有实质性联系
逻辑内聚
不同功能混在一起,合用部分程序代码
时间内聚
经典内聚,一定程度上反映了程序的某些实质
过程内聚
按特定次序进行
通信内聚
使用相同的输入数据或产生相同的输出结果
信息内聚
多个功能,在同一数据结构上操作
功能内聚
仅包含完成某个功能必须的所有成分
所有成分共同完成,缺一不可
3.4启发规则
改进软件结构提高模块独立性
模块规模应适中
深度,宽度,扇入和扇出都应适当
模块的作用域应该在控制欲之内
力争降低模块接口的复杂程度
设计单入口单出口的模块
模块功能应该可以预测
3.5表示软件结构的图形工具
建立初始结构图
对结构图进行改进
书写设计文档
设计评审
3.6面向数据流的设计方法
交换流
数据流图可被明显分为
输入
变换
输出
事务流
数据流沿着路径到达一个事务中心,选择一条执行
变换分析
事务分析
设计优化
3.7人—机界面设计
设计问题
系统响应时间
用户帮助设施
出错信息处理
命令交互
设计过程
评估标准
设计指南
一般交互
信息显示
数据输入
3.8过程设计
设计出程序的蓝图
顺序、选择、循环
基本控制结构
3.9过程设计工具
程序流程图
盒图(N-S图)
PAD图
判定表
判定树
3.10面向数据结构的设计方法
Jackson图
改进的Jackson图
Jackson方法