软件工程自我总结
软件过程
- 软件描述->软件开发->软件有效性验证->软件进化
- 基本要素:方法、工具、过程
正式技术评审的目标:发现软件中的错误
模块类型
- 传入:下属模块数据传给上级模块
- 传出:上级模块数据传给下属模块
- 变换:上级模块的数据转换形式后再传回给上级模块
- 协调:对所有下属模块协调和管理
注意区分上级模块和下属模块
成熟度
CMM 5个:
- 初始:制度缺乏,无序
- 可重复:基本管理制度,可跟踪,可重复同类项目
- 已定义:文档化、标准化、可按需改进
- 已管理:详细度量标准,有定量的理解和控制
- 优化:持续改进
CMMI 6个:(0-5)
0.未完成:未执行
1.已执行:可标识的输入输出,关注于过程域的特定目标
2.已管理:过程制度化,监控,控制,评审
3.已定义:关注过程的组织和部署
4.量化:定量管理
5.优化:优化,持续得到改进
软件过程模型
- 瀑布:
- 优点:易理解,管理成本低
- 缺点:必须需求明确,不适合大型软件,风控弱,已延期和超出预算
- 增量:瀑布+原型,优先满足核心需求及功能,再在基本需求上不断优化、完善及补充,确定性比原型高
- 演化:(迭代,需求缺乏准确认知)
- 原型:(规模不大,不太复杂)
- 快速构造部分需求
- 水平:导航,主要用在界面上
- 垂直:主要用在算法上
- 抛弃式:解决需求不确定、不完整
- 演化式:增量式,易于升级和优化,适合Web
- 螺旋:(规模庞大,复杂,高风险)
- 瀑布+演化
- 制定计划+风险分析+实施工程+客户评估
- 原型:(规模不大,不太复杂)
- 喷泉:
- 迭代+无间隙(无明显界限)
- 不利于项目管理和审核
- UP模型(统一过程)
- 用例和风险驱动,架构为中心
- 迭代+增量
- 4个阶段:
- 起始(初始):建立模型,确定边界
- 精华(细化):分析问题,建立完善的架构
- 构建:开发剩余
- 移交:确保可用
- 5个工作流:需求、分析、设计、实现、测试
敏捷方法
- 极限编程:
- 轻量、高效、低风险、柔性、可预测、科学
- 4大价值观+5个原则+12个最佳实践+行为
- 4大价值观:沟通、简单、反馈、勇气
- 5个原则:快速反馈、简单假设、逐步修改、提倡更改、优质工作
- 12个最佳实践:计划游戏、小型发布、隐喻、简单设计、重构、结队编程、集体代码所有制、持续集成、每周40小时、现场客户、编码标准
- 水晶法:不同项目不同策略、约定和方法论
- 并列争球法:迭代+冲刺
- 自适应软件开发:猜测+合作+学习
- 开放式:虚拟团队,开发不在同一处
- FDD驱动:开发人员分类。指挥者+类程序员
需求分析->系统设计->系统测试->运行和维护
需求分析
- 获取
- 分析与协商:超纲、优先级、冲突
- 系统建模:结构化分析(SA):数据流图(DFD)、数据字典(DD),面向对象分析(OOA)
- 规约:分析任务的最终产物
- 引言
- 信息描述
- 功能描述
- 行为描述
- 检验标准
- 参考书目
- 附录
- 验证:
- 复查:正确性+完整性+清晰性
- 评审:目标一致、资料齐全、数据重组、主要功能在范围内、符合约束条件、技术风险、检验标准
- 管理:
- 建立跟踪:正向+逆向
- 确保用户需求
系统设计
- 设计方法:
- 结构化设计(SD):
- 数据流图
- 数据字典
- 结构化语言
- 顺序结构
- 选择结构:IF-THEN-ELSE-ENDIF、CASE-OF-ENDCASE
- 重复结构:DO-WHILE-ENDDO、REPEAT-UNTIL
- 例子

- 判定表
- 结构化语言
- 面向对象设计(OOD):UML图
- 原则:
- 单一责任:修改某个类的原因只有一个
- 开放-封闭:实体可扩展但不可修改
- 里氏替换:子类必须能够替换基类,任何基类对象可以出现的地方,子类对象一定可以出现
- 依赖倒置:细节依赖于抽象,但不能反过来
- 接口分离:不强迫客户依赖于不用的方法
- 共同重用:重用了包中的一个类,相当于重用了包中的所有类
- 共同封闭:一个变化对一个封闭的包产生影响,则对该包中的所有类产生影响,而对其他包不造成任何影响
- 迪米特原则:一个对象对其他对象有尽可能少的了解
- 原则:
- 结构化设计(SD):
- 概要设计:
- 总体结构
- 数据结构与数据库:概念->逻辑->物理
- 编写设计文档
- 评审
- 详细设计:
- 模块和算法
- 模块内数据结构
- 代码+输入输出格式+界面
- 详细设计说明书
- 评审
数据库设计过程
- 需求分析:数据+功能+性能
- 概念结构设计:ER图
- 逻辑结构设计:ER图转换成表
- 物理设计:存储结构+存取路径
- 实施:编程+测试+试运行
- 运行与维护:运行+日常维护
系统测试
原则:
- 尽早开始
- 避免开发或小组承担(单元测试除外)
- 不能穷举
- 重视群集
- 严格按计划,避免随意
对象:程序+文档+数据,不包括开发人员
过程:计划->大纲->用例+说明文档->实施->报告
策略:单元测试->集成测试->确认测试->系统测试
单元测试
- 模块接口
- 局部数据结构
- 模块内路劲
- 边界条件
- 错误处理
集成测试
把所有模块组装成一个系统测试
- 非渐增式:先单元,再完整
- 渐增式
- 自顶向下:先上层模块,再下层模块,需要桩模块,不需要驱动模块
- 自底向上:先下层模块,再上层模块,需要驱动模块,不需要桩模块
- 驱动模块:主程序,装模块:模拟需要调用的模块
- 回归测试:重新执行已测试过的子集,只包括主要程序功能
- 冒烟测试:暴露影响构建的错误
确认测试
- 进一步检查软件功能和性能
- Alphea测试(开发者场所)和Beta测试(用户场所)
- 退化测试是用来防止改动产生的新错误
系统测试
- 恢复
- 安全
- 压力
- 性能
- 部署
白盒测试
- 语句覆盖:每个语句至少执行1次
- 判定覆盖:每种结果(分支)至少1次
- 条件覆盖:每个条件至少一次(不同的条件可能出相同的分支结果)
- 判定/条件覆盖:同时满足判定覆盖和条件覆盖
- 路径覆盖:每条执行到的路径至少1次
使用判定表看出条件取值的组合
调试
- 测试之后,开发人员进行
- 方法:试探、回溯、对分查找、归纳、演绎
运行和维护(生命周期最长)
新旧转换
- 直接转换
- 并行准换
- 分段转换
- 运行新系统过程:初始->推广->控制->集成->管理
维护
- 指标:可理解、可测试、可修改
- 文档:用户文档、系统文档
- 类型:硬件、软件
- 内容:
- 软件:正确性、适应性、完善性(在使用或运行中添加的需求)、预防性
- 数据:安全性、完整性、并发性
- 代码
- 管理:提出修改->领导审查答复->领导分配任务->验收+登记
- 工具:
- 版本控制
- 文档分析
- 开发信息库
- 逆向工程
- 再工程
评价
- 立项:规划阶段
- 中期:实施过程中,里程碑式
- 结项:正式运行后
- 内容:
- 需求:目标
- 规格说明:所有分析和测量,表示软件部件
- 记录:执行计划时详细记载
- 报告:执行测量和分析的结果,能重复及重新评价
项目管理
范围(4P)
- 人员:项目管理、高级管理、开发、客户、用户
- 产品:环境、目标、功能+性能
- 过程
- 项目
- 输入:
- 项目章程
- 项目范围管理计划
- 组织过程资产
- 批准的变更申请
估算模型
COCOMO(静态)
- 基本:静态单变量,只有LOC(源代码行数)
- 中级:基本+产品、硬件、人员项目等因素
- 详细:中级+分析、设计各步骤的影响
- COCOMO II:对象点、功能点、代码行
Putnam(动态)
进度
- 基本原则:划分、相互依赖、实践分配、工作量确认、确定责任、明确输出、里程碑
- 安排:Gantt图、Pert图
- Pert图不能描述并行关系
- Gant图不能描述依赖关系
组织
- 基本原则:尽早落实、减少交流接口、责权均衡
- 模式:项目划分、职能划分(专项组)、矩阵(项目+职能)
配置管理(SCM)
基线、配置项、版本控制、变更控制
配置项
- 产品组成部分的工作成果:需求文档、设计文档、源码、测试用例
- 项目管理和机构支撑过程产生的文档:工作计划、项目质量报告、项目跟踪报告
设备清单不属于配置项
风险管理
- 识别:性能、成本、支持、进度
- 预测:建立标准->描述后果->估算影响->标注精度
- 评估:RE=P x C,P:发生概率,C:成本
- 控制:避免、监控、RMMM计划
软件质量
- 内部、外部、使用
- 满足规定或潜在用户需求的能力

工具
特征:
- 覆盖整个软件周期
- 为项目调度提供多种手段
- 估算模型进行估算
- 支持多项目和子项目管理
- 确定关键路径、松弛时间、超前实践、滞后时间
- 成语与任务间的通信辅助
- 资源平衡
- 跟踪资源使用
- 生成固定格式的报表和报告
不具备指导性作用
补充
冗余附加技术:
- 备份程序的存储及调用(不是关键程序)
- 纠错检测及恢复
- 容错固化
环路复杂性(McCabe)
V(G)=E-N+2,E:边数,N:节点数
开发方法
- 原型法:需求不清晰+多变
- 结构化法:规模不大+不复杂+不多变
- Jackson法:以数据结构驱动+规模小
------------------------------------------------------------------------------------------
类
- 实体类:存储和管理系统的内部信息,可以有行为
- 边界类:描述外部参与者与系统之间的交互
- 控制类:具有事件流控制行为,控制一个用例中的时间顺序,比如身份验证
多态
参数多态:应用最广泛、最纯的多态
包含多态:同样的操作可用于一个类型及其子类型。(继承)
强制多态:编译程序通过语义操作,把操作对象的类型强型转换
过载多态:同一个名在不同上下文中有不同的类型
模块划分原则:
- 大小适中
- 扇入扇出合理
- 扇出大=复杂度高,扇入大=复用度高
- 顶层扇出大,中间删除较少,底层扇入大
- 一般扇入扇出系数在3或4,不超过7
- 深度宽度合理
完善模块不能改进设计质量
体系结构风格
- 仓库风格:
- 优点:多方法、可更改、可维护、可重用、支持容错和健壮
- 缺点:测试困难、选择太多、效率低、成本高、缺少并行支持
- 包括:数据库系统、黑板系统、超文本系统
数据仓库
- OLAP:针对联机数据访问与分析,通过多维的方式对数据进行分析、查询和报表
UML图
- 用例图:描述参与者必须要完成的任务,关系(扩展、包含、泛化)
- 扩展:<<extend>>,虚线箭头,基用例的扩展,存在一个扩展点,只有当扩展点被激活时,子用例才能执行
- 包含:<<include>>,虚线箭头,相同动作抽出来成独立的子用例,供基用例共享使用
- 泛化:<<generalize>>,实线空心箭头,继承关系,基用例可以被子用例替代
- 类图:类名、接口、属性、操作、关系(依赖,泛化,关联,实现)
- 依赖:独立事务变化会影响依赖事务,箭头虚线
- 关联:描述了一组链,描述了整体和部分间的关系,实线和0..1,0..*
- 泛化:子元素对象可替代父元素对象,共享父元素的结构和行为,空心箭头实线
- 实现:一个类元指定另一个类元保证执行的契约。接口构件,用例协作
- 对象图:对象:类型,某一时刻一组对象以及他们之间的关系
- 状态图:状态词(动名词)+动作
- 包图:文件夹
- 活动图:有开始有结束
- 构件图:接口+依赖
- 制品图:系统的物理结构,常与部署图一起使用
- 组合结构图:描述类的内部结构
- 部署图:立方体+<<artifact>>
- 交互图:
- 序列图:生命线+控制焦点(像川字)
- 通信图:路劲+顺序号
- 交互概览图:活动图+顺序图
- 计时图:任务对象的生命线,强调消息实际时间以及相对顺序
UML视图
5种视图:
- 逻辑视图:表示架构中类、子系统、包和用例的子集
- 进程视图:描述并发与同步
- 实现视图:基于代码的文件和构件进行建模
- 部署视图:表示软件到硬件的映射和分布结构
- 用例视图:最基本的需求分析模型
设计模式
- 创建型
- 抽像工厂:工厂和产品都是接口,客户使用这两接口
- 生成器:产品的各个部件的抽象接口
- 工厂方法:实现时重定义方法
- 原型:有个原型用来被克隆
- 单例:只有一个实例,全局访问
- 结构型
- 适配器:接口兼容
- 桥接:抽象和实现之间没有固定的绑定关系
- 组合:不同对象的行为都从组件类中获取,进行组合
- 装饰:给对象添加额外的职责
- 外观:为一组接口提供一致的界面(相当于用一个接口就能涵盖了其他所有接口)
- 享元:共享(公共变量文件)
- 代理:权限控制对象访问
- 行为型
- 责任链:不确定的多个对象处理一个请求
- 命令:将请求封装成一个参数化的对象
- 解释器:同一句话不同语言解释
- 迭代器:顺序访问聚合对象
- 中介者:封装多个对象的交互
- 备忘录:对象之外保存一个状态,便于恢复
- 观察者:一个对象的状态发生改变时,依赖于它的对象都得更新(静观其变,它变我就变)
- 状态:状态变行为则变
- 策略:封装算法
- 模板方法:一次性实现算法不变的部分
- 访问者:对象中还有更具体地对象(不同地访问者有不同的操作)
面向对象分析
认定对象->组织对象->描述对象间的相互作用->定义对象操作->定义对象内部信心

浙公网安备 33010602011771号