1.软件过程模型(重要)
1.1.瀑布模型
- 只适合需求明确的项目
- 严格串行化,很长时间才能看到结果。
- 严格区分阶段,每个阶段因果紧密相连,且要求每个阶段一次性解决该阶段的任务
1.2.原型模型(构造简易模型确定需求)
- 适合需求不明确的项目
- 分为原型开发阶段和目标软件开发阶段
- 原型开发阶段分为:需求分析,软件设计,程序设计
1.3.螺旋模型(原型+瀑布+风险分析)
- 增加了风险分析
- 把开发过程分为多个阶段,每个阶段都有评审+目标设定+风险分析+开发与有效性验证构成
1.4.统一过程
1.4.1.阶段
- 初始:确定系统范围,定义产品视图和业务模型
- 细化:设计系统架构,确定工作计划及资源需求
- 构造:开发剩余构件,并集成成产品测试
- 移交:制作产品发布版本
1.4.2.九个核心工作流
- 过程:业务建模,需求,分析与设计,实现,测试,部署
- 支持:配置与变更管理,项目管理,环境
1.4.3.核心
- 用例驱动
- 架构为中心
- 迭代和增量
1.5.敏捷方法(适合小型项目)
1.5.1.特点
- 增量迭代,小步快跑
- 适应性的而非预设性
- 以人为本
- 适合小型项目
- 价值观:沟通(面对面),简单(不过度设计),反馈,勇气
1.5.2.敏捷方法
- 极限编程XP:近螺旋开发方法。价值观(交流,朴素,反馈,勇气)
- 水晶方法:提倡机动性
- scrum:侧重于项目管理
- 特征驱动开发(FDD):开发三要素(人,过程,技术)。六种关键项目角色(项目经理,首席架构师,开发经理,主程序员,程序员,领域专家)
- 开放式源码:开发人员地域上分布广,不会集中办公
1.6.构建组装模型(易复用)
1.6.1.优缺点
- 优点:易扩展,易重用,降低成本,安排任务更灵活
- 缺点:构件设计需要经验丰富架构师,第三方构件质量难控制
- 服务是一种标准化程度更高的构件
1.6.2.基于构件的软件工程CBSE(购买而不是重新构造)
1.6.2.1.特征
- 可组装:所有外部交互通过公开接口进行
- 可部署:构件是二进制形式,作为一个独立实体在平台运行
- 文档化:用户根据文档判断是否满足需求
- 独立性:在无其他构件情况下组装
- 标准化:符合某种标准化的构件模型
1.6.2.2.模型要素
- 接口:构件通过构件接口来定义(操作名/参数/异常)
- 使用信息:构件元数据是构件本身相关的数据。构件是通用实体,在部署的时候,必须对构件进行配置适应系统
- 部署:有关包中内容信息+二进制构成信息
1.6.2.3.组装(借助胶水代码)
- 顺序组装:按顺序调用已经存在的构件
- 层次组装:A调用B,B调用C,一条调用链.接口兼容
- 叠加组装:多个构件形成新构件,对外提供新接口
1.6.2.4.组装出现不兼容
- 参数不兼容:操作名相同,但是参数个数或者类型不同
- 操作不兼容:操作名不同
- 操作不完备:提供接口是所需的子集,或者相反
1.7.V模型
- 测试贯穿始终,而不是像瀑布模型最后再有,避免最后出问题再整体改
- 从需求分析起,每个阶段都有对应的测试
2.逆向工程(设计的恢复过程)
- 实现级:抽象语法树,符号表,过程
- 结构级:程序分量之间的依赖关系,调用图,结构图,数据结构
- 功能级:程序段功能及程序段之间关系,数据和控制流模型
- 领域级:应用领域概念间关系。实体关系模型
3.净室软件工程(理想化软件开发)
3.1.概念
- 强调以合理的成本开发高质量软件
- 函数理论和抽样理论为其理论基础
- 不需要单元测试(保留传统的模块测试),进行正确性验证和统计质量控制
3.2.技术手段
- 控制迭代:统计过程控制下增量式开发
- 基于函数的规范和设计:行为视图(黑盒)- 有限状态机视图(状态盒)-过程视图(明盒)
- 正确性验证:净室工程的核心,使软件质量有了极大的提高
- 统计测试和软件验证:抽样
3.3.缺点
- 太理论化,正确性验证步骤比较难且耗时
- 不进行传统模块测试不现实
- 带有传统软件工程的弊端
4.需求工程
4.1.概念
- 需求开发+需求管理构成
- 需求开发:需求获取+需求分析+形成需求规格(SRS)+需求确认与验证(形成需求基线)
- 需求管理是对需求基线机型管理,包括变更控制,版本控制,需求跟踪,需求状态跟踪
4.2.需求获取
4.2.1.获取方法
- 用户面谈:1对1或3,有代表性用户,成本高,需要有领域知识支撑
- 需求专题讨论会(JRP):高度组织的群体会议,了解想法,消除分歧,成本高,
- 问卷调查:用户多,无法一一访谈,成本低
- 原型:解决早期需求不确定问题
- 头脑风暴:发散思维
4.2.2.需求分层
- 业务需求(整体全局)
- 用户需求(用户视角)
- 功能需求(计算机化):功能需求+性能需求+设计约束
4.2.3.项目管理维度(QFD)
- 基本需求(明示)
- 期望需求(隐含)
- 兴奋需求(多余)
4.3.需求分析
4.2.1.组成(数据字典是核心)
- 行为模型:状态转换图(状态+事件)
- 功能模型:数据流图(DFD):数据流+加工+数据存储+外部实体
- 数据模型:ER图(实体+联系)
- 数据字典:数据元素+数据结构+数据流+数据存储+加工逻辑+外部实体
4.2.2.ER图
- m:n
4.2.3.UML
- 静态图:类图,对象图,构件图,部署图(软硬件映射)
- 动态图:用例图(系统与外部参与者互动),顺序图(按时间顺序),通信图(协作图),活动图(并行行为),状态图(状态变迁)
4.3.需求定义(形成需求规格)
4.3.1.严格定义法
- 所有需求能够被预先定义
- 开发人员与用户之间能够准确而清晰的交流
- 图形/文字可以充分体现最终系统
4.3.2.原型法
- 并非所有需求都能在开发前被定义
- 项目参与者之间通常存在交流困难
- 需要实际可供用户参与的系统模型
4.4.需求变更管理过程
- 需求变更管理过程:问题分析和变更描述(识别出问题)- 变更分析和成本计算 - 变更实现
- 需求变更控制流程十大步骤:明确问题-书面申请-判断变更需求类别-评估变更影响-判断变更紧急级别-沟通确认-明确解决方案-审批管理(变更控制委员会)-执行变更-版本控制
5.系统设计
5.1.界面设计
- 置于用户控制之下
- 减少用户记忆负担
- 保持界面一致性
5.2.结构化设计
5.2.1.分类
- 概要设计(外部设计):确定每个模块的功能和调用关系,形成模块结构图
- 详细设计(内部设计):为每个具体任务选择适当的技术手段和处理方法
5.2.2.结构化设计原则
- 模块独立性原则(高内聚,低耦合)
- 保持模块大小适中
- 多扇入,少扇出
- 深度和宽度不宜过高
5.2.3.耦合(低-高)
- 非直接耦合
- 数据耦合(简单数据传递)
- 标记耦合(数据结构传递)
- 控制耦合(控制模块内部逻辑信息传递)
- 外部耦合:全局简单变量
- 公共耦合:公共数据环境
- 内容耦合:代码重叠
5.2.4.内聚(高-低)
- 功能内聚:完成单一功能,各部分协同工作
- 顺序内聚:必须顺序执行
- 通信内聚:处理元素集中在一个数据结构区域上
- 过程内聚:处理元素相关,必须按特定次序执行
- 时间内聚:必须同一时间间隔执行
- 逻辑内聚:逻辑上相关的任务
- 偶然内聚:没啥关系
5.2.5.面向对象设计原则
- 输入和输出
- 处理功能
- 内部数据
- 程序代码
5.2.6.类的分类
- 边界类(API接口、用户界面)
- 控制类(应用逻辑,业务逻辑,数据访问逻辑)
- 实体类(数据ER图)
5.2.7.面向对象设计原则
- 单一职责:目的单一的类
- 开放-封闭原则:扩展开放,修改封闭
- 李氏替换:子类可以替换父类
- 依赖倒置:针对接口编程而不是具体实现
- 接口隔离原则:多个专门接口比单一综合接口好
- 组合重用原则:尽量使用组合,而不是继承关系
- 迪米特原则:一个对象对其他对象尽可能了解少
6.软件测试
6.1.软件测试方法
- 动态测试:白盒测试(关注内部结构与逻辑),黑盒测试(关注输入输出)
- 静态测试:桌前检查,代码审查(静态分析),代码走查
6.2.动态测试
6.2.1.白盒测试(结构测试,单元测试阶段)
- 控制流测试:逻辑覆盖测试(语句覆盖最弱-路径测试覆盖最强)
- 程序变异测试(错误驱动)
6.2.2.黑盒测试(功能测试,集成,确认,系统测试阶段)
- 等价类划分
- 边界值分析
- 错误推测:测试人员的经验和直觉
- 判定表:多个逻辑条件取值的组合所构成的复杂情况下,分别要执行哪些不同操作
- 因果图:根据输入条件与输出结果之间的因果关系来设计测试用例
6.3.软件测试阶段
6.3.1.阶段
- 单元测试:依据详细设计,模块内
- 集成测试:依据概要设计,模块间
- 系统测试:依据需求文档,功能测试,性能测试,验收测试(确认测试,依据需求文档,用户参与),压力测试
6.3.2.其他测试
- AB测试:多版本同时使用(网页优化方法)
- Web测试:web系统测试与其他测试测试重点不同
- 链接测试:确实链接到该链接的页面,测试链接页面是否存在,确定没有鼓励页面
- 表单测试:验证服务器是否正确保存数据,测试提交操作的完整性
6.3.3.集成测试策略
- 一次性组装(风险高)
- 增量式组装(测试全面):自顶向下(桩模块mock),自底向上(驱动模块),混合式(都需要)
6.3.4.软件系统测试
- 功能测试
- 性能测试:负载测试,压力测试(测上限),强度测试(测下限),容量测试(并发测试)。可靠性测试