一、软件
1. 软件定义:
程序 + 文档 + 数据
2. 软件分类
① 基于软件功能:
- 系统软件:操作系统、编译程序
- 支撑软件:协助用户开发软件的工具型软件
- 应用软件:商业数据处理、工程与科学软件、智能产品嵌入软件、人工智能软件、个人软件
② 基于软件规模:
类别 | 参加人员数 | 开发周期 | 产品规模(LOC) |
---|---|---|---|
微型 | 1 | 1~4周 | 0.5K |
小型 | 1 | 1~6月 | 1K~2K |
中型 | 2~5 | 1~2年 | 5K~50K |
大型 | 5~20 | 2~3年 | 50K~100K |
甚大型 | 100~1000 | 4~5年 | 1M |
极大型 | 2000~5000 | 5~10年 | 1M~10M |
二、软件工程
1. 软件发展
① 程序设计阶段:
没有成体系的程序开发,没有科学的文档记录,开发者没有明确分工
② 程序系统阶段:
程序开发者忙于软件维护,出现软件危机
③ 软件工程阶段
工程化的设计原则与流程,软件危机得到缓解
④ 第四阶段
出现新技术,出现新挑战
2. 软件危机
① 定义:
在计算机软件开发和维护过程中遇到的一系列严重问题
② 表现:
- 软件开发成本和进度估计不准
- 产品不符合用户需求
- 软件产品的质量不可靠
- 软件的可维护性差
- 软件没有适当的文档资料
3. 1993年IEEE的定义
把系统化、规范化、可度量的途径应用于软件开发、运行和维护过程中;研究其实现途径
4. 技术
- 软件开发方法学
- 软件开发过程
- 软件工具和软件工程环境
5. 管理
- 软件管理学
- 软件经济学
- 软件心理学
三、软件生存周期
1. 定义:
软件从产生、发展到成熟、直至衰亡为止
2. 组成:
软件定义、软件开发、软件维护
3. 国标《计算机软件开发规范》的8个阶段:
① 可行性研究与计划(可行性分析)
- 关键任务:解决问题是什么?有行得通解决方法?粗略计划?
- 问题定义报告:问题性质、工程目标、工程规模
- 可行性研究报告:经济、技术、社会(操作)可行性
- 项目开发计划:粗略
② 需求分析
- 关键任务:目标系统必须做什么?要求完整、准确、清晰、具体
- 需求规格说明书:目标系统需求
③ 总体设计
- 关键任务:如何实现目标系统?根据需求设计方案
- 总体设计说明书:记录总体设计结果
④ 详细设计
- 关键任务:如何具体实现系统?设计每个模块的算法和数据结构
- 详细设计说明书:用适当表达工具表达算法和数据结构
⑤ 实现(编码和测试单元)
- 关键任务:选择语言、工具翻译详细设计结果、测试模块
- 程序清单
- 单元测试报告
⑥ 集成测试
- 关键任务:将经过单元测试的模块组装起来进行测试,通过测试使软件达到预定要求
- 测试报告:测试计划、测试方案、测试结果
⑦ 确认测试(验收测试:由用户进行的测试)
- 关键任务:由用户按需求规格说明书规定进行测试
⑧ 使用和维护
- 关键任务:通过必要维护活动使系统持久满足用户需求
- 维护类型:
- 改正性维护:软件运行过程中发现错误,进行维护
- 适应性维护:软件运行软硬件环境变化,进行维护
- 完善性维护:用户要求改进或扩充软件,进行维护
- 预防性维护:为将来的维护做准备
四、软件过程模型
1. 瀑布模型
① 基本模型:使用最早,应用最广
② 带反馈环:更具实际性
③ 优点:
- 提高软件质量
- 降低维护成本
- 缓解软件危机
④ 缺点:
- 模型缺乏灵活性
- 无法解决需求不明确问题
- 用户不经过实践提出完整准确需求不切实际
2. 快速原型模型
① 模型:
快速建立反应用户主要需求的原型系统,反复由用户评价修正需求,开发出最终产品
② 优点:
- 确定需求上优于瀑布模型(通过原型与用户交互)
- 提供学习手段,通过开发原型与演示原型对开发者和使用者了解系统都有积极作用
- 有的软件原型可以成为最终产品的一部分
③ 缺点:
- 快速建立的系统结构加连续修改可能导致产品质量低下
- 原型系统的内部结构可能不好
3. 增量模型
① 模型:
又称渐增模型,开发软件时将软件产品做一系列增量构建设计、编码、集成和测试
② 区别:
瀑布和快速原型模型是一次把满足所有需求产品提交给用户,增量模型是分批向用户提交产品
③ 优点:
- 较短时间向用户提交可完成有用工作产品
- 用户有充裕时间学习和适应产品
- 软件结构必须开放,方便向现有产品加入新构件
- 在实现构件前完成总体的需求分析、规格说明和概要设计,相对来说风险较小
④ 缺点:
- 做到第三个优点比较困难
⑤ 风险更大的增量模型:
确定用户需求后,各构件级并行构建
4. 螺旋模型
① 模型:
- 加入风险分析,常指导大型软件项目
- 软件风险:超期、超预算、行业竞争
- 笛卡尔坐标四象限表达四方面活动,延螺线自内向外每旋转一圈开发出更完善新版本:
- 制定计划:确定目标、选定方案、设定约束条件
- 风险分析:评估方案、识别和消除风险
- 实施工程:软件开发
- 客户评估:评价开发工作,计划下一阶段工作
② 优点:
- 大型软件开发项目有较好的风险控制
③ 缺点:
- 需要风险评估的经验
- 契约开发通常需要事先指定过程模型和发布产品
- 普及不如前述模型
5. 喷泉模型
① 模型:
面向对象生命周期模型,体现迭代和无缝特性
- 迭代:求精,系统某部分常被重复工作多次,相关功能在每次迭代中逐渐加入演进系统
- 无缝:分析、设计、编码各阶段不存在明显边界
② 优点:
- 无缝,可同步开发,提高开发效率,节省开发时间
- 适应面向对象软件
③ 缺点:
- 可能随时添加各种信息、需求与资料
- 需严格管理文档,审核的难度加大
6. Rational统一过程
① 模型:
强调迭代的二维模型,具有四个连续阶段,九个核心工作流
② 优点:
- 不断地版本发布成为一种团队日常工作的直正驱动力
- 将发现问题、制定方案和解决过程集成到下一次迭代
- 迭代开发,降低风险
- 更好的安排产品开发的辅助过程
7. 微软公司软件开发过程
① 模型:
- 微软公司在实践过程中开发,具有五个阶段:
- 规划阶段:开展市场调查研究,结合公司战略形成产品的远景目标
- 设计阶段:根据产品远景目标,完成软件功能规格说明和总体设计,确定产品开发的主要进度
- 开发阶段:完成产品中所有构件的开发工作
- 稳定阶段:实行全面的内部和外部测试,最终形成可发布的RTM版本
- 发布阶段:确认产品质量符合发布标准后,发布产品及相关消息
- 递进式的开发策略:解决问题的及时性、不确定和变更因素可控性、缩短产品上市周期
② 缺点:
- 过于依赖实践,理论依据不足
五、结构化分析
1. 核心思想:
- 分解化简问题
- 物理与逻辑表示分开
- 进行数据与逻辑抽象
2. 分析步骤
① 发现需求
- 与用户交谈,向用户提问题
- 参观用户的工作流程,观察用户的操作
- 向用户群体发调查问卷
- 与同行、专家交谈,听取他们的意见
- 分析已经存在的同类软件产品,提取需求
- 从行业标准、规则中提取需求
- 从互联网上搜索相关资料
② 求精
对初步需求反复求精多次细化
③ 建模
建立模型,用图形符号和组织规则书面描述事物
- 核心:数据字典
- 用于描述软件使用和产生的所有数据对象
- 数据模型:数据对象模型、实体—关系图
- 描述数据对象间关系
- 图中数据对象属性用“数据对象描述”表达
- 功能模型:数据流图、处理规格说明
- 描绘数据在软件中移动、变换及相应功能
- 图中功能用“处理规格说明”表达
- 行为模型:状态转换图、控制规格说明
- 描绘系统状态和在不同状态间转换方式
- 图中软件控制附加信息用“控制规格说明”表达
④ 规格说明
书写软件需求规格说明,作为分析阶段最终成果
⑤ 复审
再次审核
3. 数据模型:实体—关系图
① 数据对象:
软件必须理解的复合信息表示,复合信息是具有一系列不同性质或属性的事物
- 事务(报表)
- 地点(教室)
- 角色(学生)
- 单位(学校)
- 行为(上课)
② 数据对象间的关系:
对象彼此间相互连接的方式,也称联系
- 老师教学生:教
- 一对一
- 一对多
- 多对一
③ 属性:
定义数据对象的性质
- 姓名
- 学号
- 班级
④ E—R图:
- 实体:矩形框
- 属性:圆角矩阵、椭圆
- 关系:菱形
4. 功能模型:数据流图
① 符号:
- 数据的源点或终点:正方形
- 变换数据的处理:圆角矩阵
- 数据存储:开口矩形或两条平行线
- 特定数据的流动方向:箭头
- 且:乘号
- 或:加号
- 异或:圆圈加号
② 层次结构的数据流图:
- 顶层数据流图:包含一个加工项
- 底层数据流图:加工项不再分解
- 中间层数据流图:对低层的细化
- 编号:
- 子图的编号是父图相应的处理逻辑的编号
- 子图中处理逻辑编号由子图号、小数点与局部号组成
- 平衡:
- 子图详细地描述父图中处理逻辑
- 子图的输入、输出数据流应同父图处理逻辑的输入、输出数据流相一致
- 局部数据存贮:在子图中出现的数据存贮,可以不出现在父图中,画父图时只需画出处理逻辑之间的联系,不必画出各个处理逻辑内部的细节
- 命名规则:
- 用名词,区别于控制流
- 充分反映全部功能,不能出现描述不充分
- 不用缺乏具体含义名字(不能引发歧义)
③ 作用:
- 作为交流信息的工具
- 作为分析和设计的工具
- 物理系统不同时需标注自动化边界
5. 行为模型:状态转换图
① 组成:
- 状态:被观察到的系统的行为模型
- 事件:引起状态转换的外界事件抽象
- 行为:进入某状态所做动作
② 符号:
- 初始状态:实心圆
- 终止状态:实心圆+圆环
- 中间状态:圆角矩形(表格化处理)
- 状态名
- 状态变量
- 行为
- 事件:箭头表示,需标注箭头名,后跟状态转换的条件
- 行为:状态框内do+行为名
6. 数据字典
对系统使用的所有元素定义的集合,半形式化方法表达
① 定义:
- 数据流:
- 数据流名
- 说明:简要介绍作用即产生的因果
- 数据流去向
- 数据流组成:数据结构
- 每个数据的数据量、流通量
- 数据元素:
- 数据元素名
- 类型:数字(离散值、连续值)、文字(编码类型)
- 长度
- 取值范围
- 相关数据元素及数据结构
- 数据存储:
- 数据存储名
- 简述:存放的是什么数据
- 输入数据
- 输出数据
- 数据文件组成:数据结构
- 存储方式:顺序、直接、关键码
- 存取频率
- 处理:
- 处理名
- 处理编号:反映该处理的层次
- 简要描述:加工逻辑及功能简述
- 输入数据流
- 输出数据流
- 加工逻辑:简述加工程序、加工顺序
② 定义数据方法:自顶向下
由数据元素组成数据的方式:
- 顺序:以确定次序连接两个或多个数据元素
- 选择:从两个或多个可能元素中选一个
- 重复:把指定数据元素重复零次或多次
- 可选:一个数据元素可有可无的
③ 符号:
符号 | 含义 | 举例 |
---|---|---|
= = = | 等价于/定义为 | x = a x=a x=a |
+ + + | 与/连接 | x = a + b x=a+b x=a+b |
[ ∣ ] [~\mid~] [ ∣ ] | 或/选择 | x = [ a ∣ b ] x=[a\mid b] x=[a∣b] |
m { } n m~\left\{~\right\}~n m { } n | 重复m…n次 | x = 1 { a } 5 x=1\left\{a\right\}5 x=1{a}5 |
( ) (~) ( ) | 可选 | x = a + ( b ) x=a+(b) x=a+(b) |
" " "~" " " | 基本数据元素 | x = " 0 " x="0" x="0" |
⋅ ⋅ ·· ⋅⋅ | 范围 | x = " 1 " . . " 9 " x="1".."9" x="1".."9" |
④ 示例: