软件工程概述
软件
什么是软件
-
用户和计算机之间的桥梁
-
从问题空间到求解空间的映射
-
软件是计算机系统中与硬件相互依存的另一部分,它是包括程序、数据及其相关文档的完整集合
软件的特点
- 软件是一种逻辑实体,而不是一种具体的物理实体
- 软件在运行和使用期间与硬件不同
- 软件的生产与硬件不同
软件危机
什么是软件危机
在计算机软件系统的开发和维护过程中产生的一系列严重的问题
软件危机的主要表现
- 成本和进度估计不准确
- 用户不满意
- 质量靠不住
- 不可维护
- 没有适当的文档
- 软件成本逐年上升
- 生产率提高速度跟不上普及趋势
产生软件危机的原因
- 软件本身的特点
- 软件开发和维护的方法不对
软件工程
软件工程的概念
软件工程是指导软件开发和维护的一门工程学科。采用工程的概念、原理、技术和方法来开发和维护软件。把经过时间考验并证明正确的管理技术和当前所能够得到的最好的技术方法相结合,以经济地开发出高质量的软件,并有效地维护它。这就是软件工程。
软件工程的基本原理(7条)
- 用分阶段的生命周期计划严格管理
- 坚持进行阶段审查
- 实行严格的产品控制
- 采用现代程序设计技术
- 结果应能清楚地审查
- 开发小组成员应少而精
- 承认不断改进软件工程实践的必要性
软件工程方法学三要素
- 方法
- 工具
- 过程:为了获得高质量软件所规定的一系列任务的框架 步骤 方法和工具组合起来合理,及时地开发
- 顺序 2. 文档资料 3. 管理 4. 里程碑
传统方法学的优点
- 若干个阶段,降低了软件开发的难度
- 严格审查,质量,可维护性
面向对象方法学 = 对象 + 类 + 继承 +消息
- 复杂性
- 可理解性
- 简化开发和维护
- 重用
软件生命周期
- 孕育、诞生、成长、成熟、衰亡、演化的生命过程
- 工程化管理方式,若干阶段,软件生命周期
- 从用户需求开始,软件开发,交付使用,在使用过程中不断增补修订,直至让位于新软件的过程
- 软件定义、软件开发、运行维护
软件过程
过程
产生某种预定输出的可预测的步骤
包含 一组活动 约束 资源要素
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7sWnldpf-1627095340896)(C:\Users\No.6\AppData\Roaming\Typora\typora-user-images\image-20210624094839347.png)]
何为软件过程
为建造高质量软件所需完成任务的框架, 它规定了完成各项任务的工作步骤
经典软件过程模型
瀑布模型
原型/快速原型模型
螺旋模型
现代软件过程模型
RUP的4大阶段, 9种工作流
初始 精化 构建 产品化
- 业务建模 需求 分析设计
- 实施 测试 部署
- 配置和变更管理 项目管理 环境
敏捷过程价值观
- 个体和交互胜过过程和工具
- 可以工作的软件胜过面面俱到的文档
- 客户合作胜过合同谈判
- 响应变化胜过遵循计划
可行性研究
可行性研究的任务
目的
用最小的代价,在最短的时间内确定 问题是否能够解决
实质
一次压缩,简化了的系统分析和设计过程
任务
- 技术可行性
- 经济可行性
- 操作可行性
- 法律可行性
- 开发方案选择性研究
系统流程图
数据流图
自顶向下逐层画数据流图
- 基本系统模型加上源点和终点作为顶层数据流图
- 画出各层数据流图
- 画出总的数据流图
软件需求
需求分析的任务
借助于当前系统的逻辑模型导出目标系统的逻辑模型,解决目标系统"做什么"的问题
-
数据模型(问题信息域)
-
功能模型(软件应完成的功能)
-
行为模型(软件行为)
-
分解(层次)
-
确认系统的综合要求
-
数据要求
-
导出系统的逻辑模型
-
修正系统的开发计划
验证软件需求的正确性
- 一致性
- 完整性
- 有效性
- 现实性
总体设计
软件设计过程
软件设计过程-开发阶段的信息流
概要设计
将软件需求转化为数据结构和软件的系统结构,即系统的模块划分
详细设计
对系统的结构表示进行细化,详细的数据结构和算法
软件设计原理
-
模块化
-
抽象
-
逐步求精
-
信息隐藏和局部化
-
耦合/内聚
启发规则
-
改进软件结构提高模块独立性
-
模块规模应当适中
-
深度,宽度,扇入,扇出应当适中
-
模块作用域应位于控制域内
-
力争降低模块接口的复杂度
-
设计单入口单出口的模块
-
模块的功能应当可以预测
描绘软件结构的图形工具
层次图
HIPO图
结构图
面向数据流的设计方法(建议看教材 ppt也可以 教材详细一点)
软件体系结构
概念
软件体系结构是对子系统,软件系统构建以及他们之间相关关系的描述
软件体系结构风格的概念
根据软件系统结构定义了软件系统族
限制及组成与设计原则
管道-过滤器风格
基于事件/隐式调用风格 (Implicit Invocation)
层次系统(Layerd System)
每一层为上层服务,并作为下层的客户
黑板/仓库风格
- 中央数据结构
- 独立构件
客户/服务器风格
详细设计
结构程序设计
- 3种基本控制结构
- 一个入口一个出口
过程设计技术和工具
-
程序流程图
-
盒图
-
PAD(Problem Analysis Diagram)
-
判定表
不能表达加工顺序和循环结构
- 判定树
- 过程设计语言(PDL) aka 结构化英语
程序复杂程度的定量度量
流图(程序图)
- 结点:代表一条或多条语句
- 边:箭头,一边必须终止于一个结点
- 区域:边和结点围成的面积
MaCabe方法(以10作为一个上限 )
- 区域数等于环形复杂度
- E-N+2
- P+1 P是流图中判断的数目
编码
编码风格
- 程序的内部文档
- 数据说明
- 语句构造
- 输入/输出问题
- 效率问题
软件测试
软件测试基础
目标
-
发现错误
-
能发现至今未发现的错误
方法
黑盒 aka 功能测试(functional testing) or 数据驱动测试
白盒 aka 结构测试(structional testing), 玻璃盒测试(glass-box testing) or 逻辑驱动测试
- 程序内部的逻辑结构
- 程序的所有逻辑路径
“错误潜伏在角落里,聚集在边界上”
步骤
- 模块测试(编码和详细设计)
- 集成测试
- 子系统测试(接口)
- 系统测试(软件设计,需求说明)
- 验收测试(需求说明书) aka 确认测试
- 平行运行
单元测试
测试重点
- 模块接口
- 局部数据结构
- 重要的执行通路
- 出错处理通路
- 边界条件
驱动程序和存根程序
“主程序” “虚拟子程序”
集成测试
4种继承测试策略
- 一次集成
- 自顶向下
- 自底向上
- 三明治
回归测试(regression test)
确认测试
验证与确认的概念
- 确实实现了用户需求
- 验证实现了某种特定要求
α和β测试
- 开发者场所 指导 受控环境
- 客户场所 开发者不在场 真实
白盒测试
逻辑覆盖
- 语句覆盖
- 判定覆盖
- 每个分支至少执行一次
- 条件覆盖
- 每个分支条件执行一次
- 判定/条件覆盖
- 点覆盖
- 边覆盖
- 路径覆盖
基本路径法
- 计算环形复杂度
- 定义执行路径的基本集合
- 从基本集合导出测试用例
黑盒测试
等价划分法
边界值分析(发现程序错误的能力最强)
调试
区分测试和调试
调试是在成功测试之后,任务是进一步诊断和修正程序中潜在的错误
软件可靠性
给定时间间隔内,按照规格说明书正确运行的概率
软件维护
在软件交付使用后,改正错误或满足新的需要
- 改正性维护
- 适应性维护
- 完善性维护
- 预防性维护
软件维护过程
维护组织
维护报告
维护的事件流
软件的可维护性
概念
维护人员理解,改正,改动,改进软件的难易程度
决定软件可维护的因素
- 可理解性
- 可测试性
- 可修改性
- 可移植性
- 可重用性
可维护性复审
软件再工程过程
软件再工程的六个环节
- 库存目录分析
- 文档重构
- 逆向工程
- 代码重构
- 数据重构
- 正向工程
尽可能使用高级语言编写程序(√) 高级语言开发速度块,易于理解,好维护
在进行总体设计时应加强模块间的联系(×)
软件项目管理
软件成本与工作量估算
-
代码行
-
功能点
- 功能数量
进度计划
Gantt图的缺点
- 不能显式描绘依赖关系
- 关键部分不明确
- 潜力
工程网络图的绘制
计算EET/LET
关键路径
机动时间
人员组织
软件工程的Brooks定律
向进度落后的项目增加人手,只会使进度更加落后
软件配置管理
概念
软件系统发展过程中管理和控制变化的规范
软件配置项概念(Software Configuration Item)
软件过程输出的全部计算机程序,文档,数据
基线概念
通过了正式复审的软件配置项
软件风险管理
软件开发中常见的4种风险
- 进度安排的先天错误
- 需求膨胀
- 人员流失
- 规约崩溃
能力成熟度模型(CMM Capability Maturity Model)
评判软件组织过程能力成熟水平的准则
5个级别
- 初始级(Initial)
- 可重复级(Repeatable)
- 已定义级(Defined)
- 已管理级(Managed)
- 优先级(Optimizing)
面向对象分析与设计
UML 1.1版9种主要图形
-
用例图
-
类图
-
对象图
-
组件图
-
部署图
-
顺序图
-
协作图
-
状态图
-
活动图
面向对象的需求提取
用例的概念(Use Case)
典型交互作用
用例的描述形式
- 自然语言文本,活动图
- 用例图
场景与用例的关系
- 场景是用例的真实例子
- 帮助理解问题域,归纳出用例
- 执行一次用例,得到一个场景
- 可理解性,完整性
用例间的关系
- 包含(<
- 扩展(<> )
- 泛化
包含与扩展的区别
- 主用例对子用例是否知情
- 包含知情
- 扩展不必知情
面向对象分析
三种分析类:实体类,边界类,控制类的含义
<> <> <>
实体类:系统要记录和维护的信息
边界类:系统和外部要素间交互的边界
##### 控制类:用例中行为的协调