首页 > 技术文章 > 软件工程

sfjzz 2021-07-08 13:51 原文

软件工程

第一章&第二章 软件&软件工程

软件是:指令集合数据结构软件描述信息

软件既是产品、也是产品交付的载体

软件与硬件的区别特征:

  • 软件是设计开发的,不是生产制造的

  • 软件不会磨损,但会退化

  • 大多数软件是根据实际顾客定制的;软件设计中大规模复用刚刚开始

软件是与计算机操作系统有关的程序、规则、规程以及可能有的文件、文档及数据

软件工程:将系统化的、规范的、可量化的方法应用于软件的开发、运行和维护,即将工程化方法应用于软件

软件质量:

  • 明确定义的功能和性能需求的一致性
  • 与明确成文的开发标准的一致性
  • 与所有专业开发的软件所期望的隐含的特征的一致性(健壮性、可维护性、可移植性等)

编程占软件生命周期的:40%左右

第三章 软件过程

通用过程架构:沟通;策划;建模;构建;部署

CMMI:不完整级,已执行级,已管理级,已定义级,已定量管理级,优化级

CMM:初始级,可重复级,已定义级,已管理级,优化级

第四章 传统过程模型

名称 实质 优点 缺点 其他
瀑布模型 面向阶段、线性 1、简单 2、各阶段都验证,便于质量管理 1、缺乏灵活性 2、缺乏演化性 3、线性模型,回溯性差
增量模型 非整体开发、基于瀑布的渐增模型和原型的快速原型 1、开发顺序灵活 2、以组件为单位开发 3、可分批提交产品 1、对于需求没有完整定义 2、体系结构必须开放 与原型的区别:每个增量是一产品与瀑布区别:非整体
原型模型 事先不能定义需求,简单 1、预先不知道所需系统 2、开发人员没有信心 1、难以单独使用 2、太简单
RAD模型 增量型、使用可复用构件、瀑布模型的高速变体、并行操作 加快了开发速度 1、消耗大量人力 2、时间限制 3、需要合理模块化 4、不适合高风险和交际性强的项目 三个阶段:业务建模、数据建模、过程建模
螺旋模型 瀑布+增量+风险分析 1、适用于大型应用开发 2、任意阶段都可使用 3、反映现实生活 1、依赖于风险评估 2、模型较新 步骤:循环:制定计划->风险分析->实施工程->客户评估
UP模型 以架构/体系为中心,以用例和风险驱动,迭代且增量,由UML方法支持 适用于面向对象技术 5个阶段:初始、细化、构建、转换、生产

第五章 敏捷过程模型

敏捷模型

四大价值观:

个体与交互 > 过程和工具

可用的软件 > 完整的文档

客户合作 > 合同谈判

应对变更 > 遵循计划

特点:

1、允许团队调整合理安排任务

2、精简工作产品

3、快速向用户提供适应的产品和环境

XP极限编程

使用面向对象的方法作为模型,包含策划、设计、编码和测试4个活动

Scrum

待定项目->冲刺->例会->演示

第六章 软件工程的人员方面

第七章 理解需求

需求工程的地位和作用:

  • 理解软件如何影响业务、客户想要什么、最终用户如何和软件交互
  • 需求工程的产品:用户场景、功能和特征列表、分析模型或规格说明

需求工程的任务:

起始、导出、精化、协商、规格说明、确认、管理

起始:对问题方案等建立基本理解

导出:询问客户目标

精化:开发一个精确模型

协商:与用户协商处理

规格说明:需求工程完成的最终产品

确认:对结果进行评估和确保

管理:控制跟踪需求变更

需求开发属于软件定义阶段

软件需求的分类:

功能需求

非功能需求:性能需求、质量属性、对外接口、约束

第八章 需求建模—基于场景

第九章 需求建模-基于类

第十章 需求建模-行为模式和APP

结构化分析

用抽象模型,按照软件内部数据传递、变换自顶向下逐层分解

第十一章 设计概念

软件设计的目标和任务

数据设计、系统结构设计、接口设计、过程设计

软件体系的模块化

整个软件软件被划分成若干单独命名和可编址的部分。

好处:

  • 更容易计划开发
  • 可以定义和交付软件增量
  • 更容易实施变更
  • 能够更有效地开展测试和调试
  • 可以开展长期维护而没有严重副作用

抽象化:再进行模块设计时,可有不同的抽象过程。包括:过程抽象和数据抽象

信息隐蔽:每个模块实现细节对其他模块是隐蔽的

功能独立

是模块化、抽象化和信息隐蔽的直接结果

通过开发专一功能和避免与其他模块有过多交互来实现功能独立

耦合:模块间相互连接的紧密程度

内聚:一个模块内部各个元素彼此结合的紧密程度

模块独立性强的模块应该是高内聚低耦合

重构:无需改变代码设计的外部行为而是改进其内部结构

设计模式——接口设计元素

设计模式——构件级设计元素

  • 为所有本地数据定义数据结构
  • 为构件内发生的处理定义算法细节
  • 允许访问所有构件行为接口

第十二章 体系结构设计

第十三章 构件级设计

构件级设计

构件:软件中一个模块化的构造块

OMG UML:定型化的可配置和可替换的部件,暴露了一系列的接口。

四个基本设计原则:

开闭原则:模块应该对外延具有开放性,对修改具有封闭性,

Liskov原则:子类可以替换它们的基类。

依赖倒置原则:依赖于抽象,而非具体实现

接口分离原则:多个用户专用接口比一个通用接口要好。

第十四章 用户界面设计

用户界面设计

黄金规则

  • 用户操纵控制
  • 减少用户的记忆负担
  • 保持界面一致

模型:

用户模型

设计模型

心里模型

实现模型

第十七章 软件测试策略

软件测试的目的

从用户角度:普遍希望通过软件测试暴露软件中隐藏的错误和缺陷

软甲开发者角度:希望测试成为表明软件产品不存在错误的过程

  • 测试是程序的执行过程,目的在于发现错误
  • 一个好的测试用例在于能发现至今未发现的错误
  • 一个成功的测试是发现至今未发现的错误

换言之:

  • 用最少的人力系统的找出软件中潜在的各种错误和缺陷
  • 它能够证明软件的功能和性能是否与需求说明相吻合
  • 测试不能表面软件中不存在出错误,只能说明软件存在错误

软件测试的对象

  • 贯穿于软件定义和开发的整个阶段
  • 各阶段得到的所有文档都应该成为测试对象
  • 需要进行确认和验证工作

软件测试的组织

独立测试小组(ITC)

策略问题

四个步骤:单元测试、集成测试、确认测试、系统测试

组装测试

非渐增式组装测试:

  • 将单元测试和集成测试分为2个阶段测试
  • 工作量大,每个模块都要驱动模块和桩模块
  • 组装才能发现
  • 可并行测试所有模块

渐增式组装测试:

  • 组合在一起同时完成
  • 工作量少,用的都是测过的模块
  • 较早发现接口错误
  • 有利于排错
  • 比较彻底

单元测试(模块测试)

  • 针对软件设计的最小单位—软件构件或模块进行测试,目的发现各模块内部可能存在的各种差错
  • 从程序的内部出发,多个模块可平行地独立进行单元测试

内容

  • 主要是白盒测试
  • 模块接口测试
  • 局部数据结构测试
  • 路径测试
  • 错误处理测试
  • 边界测试

集成测试(联合测试)

  • 在单元测试的基础上,需要将模块按照设计要求组装成系统
  • 在单元测试的同时可以进行组装测试
一次性组装方法
  • 非增殖式组装方法。也叫整体组装
  • 对每个模块测试后一次性组装
增值式组装方式(渐进式组装)
  • 首先一个个测试,然后逐步组装

  • 边连接便测试,以发现问题

  • 自顶向下的增值方法:

    • 按深度方向组装
    • 较早验证控制和判断点
  • 自底向上的增值方法:

    • 不再需要庄模块
    • 可以直接允许子程序获得信息
  • 混合增值测试:

    • 衍变的自顶向下的增值测试
      • 首先对输入输出测试
      • 自底向上组装
      • 主模块自顶向下测试
    • 自底向上—自顶向下的增值测试
      • 对读进行自底向上
      • 对写进行自顶向下

冒烟测试

时间关键性项目的步进机制,让软件团队频繁地对项目进行评估

好处:

  • 降低集成风险
  • 提高最终产品质量
  • 简化错误的诊断和修正
  • 易于评估进展状况

回归测试

重新执行以进行测试的子集,以确保变更没有传播不期望的副作用

α测试&β测试

α测试:

  • 可以在编码结束时开始

  • 也可以在确认测试过程中产品达到稳定可靠程度后开始

β测试:

  • 多个用户在实际情况下测试
  • 开发者通常不在场

第十八章 传统测试用例设计

黑盒测试

在程序接口上进行测试

等价类划分法

输入域划分成若干部分,然后从中选取少数代表性数据

边界法

等价类比的补充,选取正好、刚刚大于、刚刚小于的数据测试

白盒测试

基本路径测试:

程序环路的复杂性:

区域的数量 = 环复杂度V(G)

环复杂度V(G) = E-N+2

环复杂度V(G) = P+1 (P为判定节点数)

条件测试路径选择:

嵌套型:若有n个判定语句,需要n+1个用例

连锁型:若有n个判定语句,需要2^n个测试用例

循环测试路径选择:

1、简单循环

2、嵌套循环

第十九章 面向对象的测试技术

第二十二&二十三章 项目管理

  • 范围覆盖整个软件工程过程

  • 对工作规范、可能风险、需要资源、要实现的任务、经历的里程碑、花费工作量、进度安排做到有数

  • 在技术工作开始前就开始了

The 4 P's

  • People—成功项目的重要因素
  • Product—要建造的软件
  • Process—活动任务等
  • Project—所需所有工作

团队泛型

  • 封闭式泛型—按权利来分
  • 随机泛型—依赖于个人主动性,适用于创新
  • 开放式泛型—具有封闭式的控制,又有随机的创新,适用于解决复杂问题,效率低
  • 同步式泛型—没有主动联系,各自解决片段

定义项目特征和项目计划的方法W5HH原则

why:为什么系统被开发

what:做什么

when:什么时候

who:某功能由谁负责

where:机构组织位于何处

how much:每种资源需要多少

how:工作如何进行

软件度量

为了了解产品开发的技术过程和产品本身

作用:有效的定量地进行管理

目的:

  • 改进过程
  • 提高产品质量

度量方法:直接度量、间接度量

直接度量

代码行数、执行速度、存储量大小

面向规模的度量:列出了过去几年完成项目及其规格数据

image-20210708011314741

image-20210708011324807

间接度量

面向功能的度量:FP = 总计数 X (0.65 + 0.01 X SUM(Fi))

image-20210708011743846

image-20210708011921257

缺陷排除效率(DRE)

DRE = E/(E+D)

E是交给用户前发现的错误数

D是交给用户后发现的错误数

理想状态为DRE = 1

第二十四章 估算

  • 软件项目管理开始于项目计划
  • 项目计划第一项活动就是估算
  • 主要为时间和工作量估算

目标:对资源成本进度进行合理规划

LOC&FP

步骤:

1、对每个分解的功能提出一个有代表性的估算值范围

2、利用历史数据和经验,对功能划分为最佳、可能、悲观三种情况,a、m、b

3、计算LOC或FP的期望值: E = (a+4m+b)

COCOMO三个阶段:

应用组装阶段:

Application:用应用点进行估算规模

Composition:用原型解决高风险问题

早期设计阶段

体系结构后阶段

决策树分析

image-20210708090844137

第二十五章 进度安排

人员与工作量的关系

image-20210708091226861

一个软件项目单独开发生产率最高

40-20-40原则:

编码工作占20%,编码前工作占40%,编码后工作占40%

获得值分析

BCW : 每项工作的预计工作量 BCWS : 计划按指定时间完成的每项工作任务的预计工作量和

BAC : BCW总和 EV : EV = BCWS / BAC BCWP:已经按指定时间完成的工作任务的预计工作量之和。

ACWP : 已经完成的工作任务的实际工作量之和。

EV = BCWS / BAC

SPI = BCWP / BCWS

SV = BCWP - BCWS

CPI = BCWP / ACWP

CV = BCWP - ACWP

推荐阅读