软件工程期末复习

软件工程期末复习

by zetazero 2024.11.19


0.软件工程相关知识点

  • 什么是好软件
    • 用户角度:1.软件符合指定需求 2.软件几乎没有缺陷软件性能正常 3.软件容易上手,操作方便
    • 开发人员角度:1.代码可测试性 代码可维护性 代码可读性 2.代码效率:高效管理资源 3.代码安全:可预防常见威胁
    • 投资者角度:1.软件按时交付 2.软件满足预算 3.可复用的开发过程,确保交付质量
  • 软件工程的通用框架:沟通 策划 建模 构建 部署
  • David Hooker的7个关注软件工程整体实践的原则:
    • 存在价值 保持简洁 保持愿景 关注使用者 面向未来 提前计划复用 认真思考
  • 软件工程师特质:
    • 1.良好的沟通能力 2.掌握比较全面的专业技术 3.充分的自信心 4.足够的耐心和责任感 5.要具备怀疑精神和学习能力 6.超强记忆力和洞察力
  • 假故⾃⼰被指派作为⼀个⼤型软件产品公司的项⽬负责⼈ ⼯作负责公司已被⼴泛应⽤的⽂字处理教件的新版本开发及管理 由于市场竞争微烈 公司规定了严格的完成期限 结合你所学习的软件⼯程的原理⽅法和技术阐述你该如何开展⼯作 (从计划 软件过程 项⽬组织 进度计划及质量管理 产品维护等⽅⾯考虑)
  • 面向数据流的分析建模中处于核心地位的是数据字典
  • **桩模块**可以代替尚未测试过的下层模块------专供测试用的“假”模块称为被测模块的桩模块
  • **配置管理**是对软件修改进行标识 组织和控制的技术 用来协调和控制整个系统工程
  • 软件工程三要素 :方法 工具 过程
  • 软件=程序+文档程序+数据+文档
  • 程序的效率:程序的执行速度 程序占用的存储空间
  • 软件需求的主要工作内容有需求的获取 需求建模 需求评审
  • 软件设计的基本原则:抽象与逐步求精 模块化 信息隐藏 关注点分离
  • 软件体系结构包括 组件 连接件 约束
  • 常用的调试方法有 原始法 回溯法 排除法
  • 软件维护有 纠错性维护 适应性维护 完善性维护 预防性维护
  • 面向数据流的设计方法把数据流图映射成软件结构
  • 可行性研究主要从技术可行性 经济可行性 操作可行性方面研究
  • 数据字典是软件需求分析阶段的最重要工具之一,其最基本的功能是数据定义
  • 软件工程的主要任务不是写程序
  • 当软件验收测试通过 软件开发不是就完成了
  • 什么是软件
    • 1.软件是与计算机系统操作有关的程序 2.规程 规则 及任何与之有关的⽂档 3.数据的完整集合
  • 什么是软件过程
    • 1.软件过程是为了获得⾼质量软件产品所需要完成的⼀系列任务的框架 2.它规定了完成各项任务的⼯作步骤
  • 简述软件项⽬管理主要任务
    • 1.制定软件项⽬的实施计划和⽅案 2.对⼈员进⾏组织和分⼯ 3.按照计划进度 以及成本管理 ⻛险管理 质量管理的要求进⾏软件开发 完成软件项⽬的各项要求和任务
  • 软件⼯程的基本活动有哪些
    • 需求 设计 实现 确认 ⽀持
  • 结构化的需求分析模型由什么组成
    • 数据字典 和实体⼀关系图 数据流图 状态⼀变迁图 及相关描述说明
  • 结构化设计⽅法将数据流图转换为软件结构的步骤有哪些
    • 1.确定信息流的类型 2.划定流界 3.将数据流图映射为程序结构 4.提取层次控制结构 5.通过设计复审和启发式策略精化结构
  • 系统测试包含哪些测试
    • 恢复测试 安全性测试 强度测试 性能测试
  • 什么是⽤例
  • 从外部⽤户的视⻆看⼀个⽤例是主⻆ actor 与⽬标软件系统之间⼀次典型的交互作⽤
  • 从软件系统内部的视⻆出发 ⼀个⽤例代表着系统执⾏的⼀系列动作 动作执⾏的结果能够被外部的主⻆所察觉
  • 简述边界类的主要任务
  • 界⾯控制 外部接回 环境隔离
  • 简述软件维护的分类
  • 改正性维护 适应性维护 改善性维护 预防性维护
  • 关于模块间耦合关系我们的设计标准是什么
    • 1.设计软件时应尽量使⽤教据耦合 2.減少控制耦合 3.限制外部环境耦合和公共数据耦合 4.杜绝内容耦合
  • 什么是软件⼯程 软件⼯程的三要素是什么
  • 是⽤⼯程 科学和数学的原则与⽅法研制 维护计算机软件有关技术及管理⽅法
  • 软件⼯程的三要素是 ⽅法 ⼯具和过程
  • 什么是模块独⽴性
  • 是指软件系统中每个模块只涉及软件要求的具体的⼦功能⽽和软件系统中其它的模块的接⼝是简单的
  • 软件测试过程中主要有哪⼏种测试活动
  • 单元测试 集成测试 确认测试 和系统测试
  • 什么是改正性维护和改善性维护
  • 改正性维护是为诊断和改正软件系统中潜藏的错误⽽进⾏的活动
  • 改善性维护是根据⽤户在使⽤过程中提出的⼀些建设性意⻅⽽进⾏的维护活动
  • 简述 UML 中消息种类
    • 简单消息 同步消息 异步消息 返回消息
  • 简述控制类的主要任务
  • 作为完成⽤例任务的责任承担者 协调 控制其他类共同完成⽤例规定的功能或行为

1.黑盒测试

黑盒测试,黑盒测试又称为功能测试/数据驱动测试

黑盒测试是将测试对象看做一个黑盒,在并不考虑软件产品的内部结构和处理过程的基础上 只依据程序的需求规格说明书 对软件产品进行功能测试。黑盒测试注重软件产品的功能性需求

运用黑盒技术设计测试用例常用的方法有:
① 等价类划分

② 边界值分析
因果图分析法
④ 错误推断法 等

黑盒测试可以发现以下类型错误:

  • 不正确或遗漏的功能
  • 接口错误
  • 数据结构或外部数据库访问错误
  • 行为或性能错误
  • 初始化和终止错误

2.白盒测试

白盒测试又称结构测试/透明盒测试/逻辑驱动测试/基于代码的测试

白盒测试时对软件的过程性细节作细致的检查 这一方法是对测试对象看作一个打开的盒子 他允许测试人员利用程序内部的逻辑结构及有关信息 设计或选择测试用例 对程序的所有逻辑路径进行测试

利用白盒测试方法导出 的测试用例:
①保证一个模块中的所有独立路径至少被执行一次
②对所有的逻辑判定均需测试取真和取假两方面
③在上下边界及可操作的范围内执行所有循环;据结构以确保其有效性

白盒测试方法:(强度由低到高)

  • 语句覆盖

    • 程序中的每个可执行语句至少被执行一次
  • 判定覆盖

    • 程序中每个判断的取真分支和取假分支至少经历一次,即判断真假值均被满足
  • 条件覆盖

    • 每个判断中每个条件的可能取值至少满足一次
  • 判定条件覆盖

    • 判断条件中的所有条件可能取值至少执行一次,同时所有判断的可能结果至少执行一次
  • 条件组合覆盖

    • 判断中每个条件的所有可能取值组合至少执行一次,并且每个判断本身的结果也至少执行一次
  • 路径覆盖

    • 覆盖程序中的所有可能的执行路径

黑盒测试与白盒测试的区别:


3.敏捷开发

最适合采用增量模型

敏捷开发方法以原型开发思想为基础,采用迭代增量式开发,发行版本小型化,比较适合需求变化较大或者开发前期对需求不是很清晰的项目

敏捷团队:小型的并充满动力的项目团队
极限编程是敏捷软件开发使用最广泛的一个方法 XP(极限编程)的四大核心价值观是:沟通、简单、反馈、勇气


4.流图/程序图

环复杂性:V(G)=边数-结点数+2 = 独立路径数量
独立路径是贯穿程序的且引入新边


4.数据流图

  • 数据流图的类型有:变换型 事务型

  • 每个加工至少有一个输入数据流和一个输出数据流

  • 在整套分层数据流图中,每个数据存储应至少有一个加工对其进行读操作。另一个加工对其进行写操作,对于某一张DFD来说,可以只写不读或只读不写。

  • 分层数据流图中,每个数据流和文件都必须命名 名字反应整个对象 而不是部分;避免使用空洞、含义不清的名字

  • 数据流:名词或形容词+名词;

  • 加工:动词或动宾

  • 数据存储:名词

  • 外部实体:可以用实际的人或组织的名称来命名

在这里插入图片描述

在这里插入图片描述


5.瀑布模型

  • 定义:瀑布模型又称为经典生命周期,它提出了一个系统的、顺序的软件开发方法,从用户需求规格说明开始,通过策划、建模、构建和部署的过程,最终提供完整的软件支持

  • 优点:

    • 1.可强迫开发人员采用规范的方法 2.严格的规定了每个阶段必须提交的文档 3.要求每个阶段交出的所有产品都必须经过质量保证小组的验证
  • 缺点:

    • 1.由于瀑布模型几乎完全依赖于书面的规格说明 很可能导致最终开发出的软件产品不能真正满足用户的需求
    • 2.开发周期长 3.前期不能出错 4.瀑布模型只适用于项目开始时需求已确定的情况

6.增量模型

增量模型就是经历n个增量(每个增量都包含 沟通 策划 建模 构建 部署) 每做完一个增量就交付一次产品

  • 优点
    • 1.在达到初始需求之前可降低成本 2.可快速生产出可使用的系统 3.能够有计划地管理技术风险
  • 缺点
    • 增量模型的灵活性可以使其适应这种变化的能力大大优于瀑布模型和快速原型模型,但也很容易退化为边做边改模型,导致软件过程的控制失去整体性

7.演化过程模型

需求不断变化
原型开发:只定义基本任务 没有详细定理功能和特性需求


8.螺旋模型

定义:螺旋模型是一种风险驱动型的过程模型生成器 对于软件集中的系统 它可以指导多个利益相关者的协同工作

只适用大型软件

螺旋模型是系统发展生命周期的模型。它兼顾了快速原型的迭代的特征以及瀑布模型的系统化与严格监控。螺旋模型最大的特点在于引入了其他模型不具备的风险分析,使软件在无法排除重大风险时有机会停止,以减小损失。同时,在每个迭代阶段构建原型是螺旋模型用以减小风险的途径。螺旋模型更适合大型的昂贵的系统级的软件应用。

优势:1.结合了原型的迭代性质和瀑布模型的系统性和可控性的特点
2.强调风险
3.强调阶段质量
4.提供纠错的机会
5.提供原型作为风险降低机制
6.进一步使开发人员能够在产品演变的任何阶段应用原型方法

缺点:1.每个阶段都要提出备选方案 进行风险分析 研发周期长 效率低 2.必须要专业的风险分析人员的参与 3.如果没有发现和管理重大风险 问题无疑将会发生


9.原型模型

允许在需求分析阶段对软件的需求进行初步而非完全的分析和定义 快速设计开发出软件系统的原型 该原型向用户展示待开发软件的全部或部分功能和性能

适用场景:适用于小型和中等规模的交互式系统、大型系统的某些部分,例如用户界面、生命周期短的系统

优点:1.有助于满足用户的真实需求
2.原型系统已经通过与用户的交互而得到验证 据此产生的规格说明文档能够正确的描述用户需求
3.软件产品的开发基本上是按线性顺序进行
4.缩短了开发周期 节约开发成本

缺点:1.为了尽快完成软件 开发者没有考虑整体软件质量和长期的可维护性
2.为了使一个原型快速运行起来 往往在实现过程中采用折中的手段


9.原型化方法

  • 原型化方法用于解决什么问题(其实也就是原型模型适用于哪些项目)
    • 原型法具有较⼤的灵活性 适合于软件需求不明确 设计⽅案有⼀定⻛险的软件项⽬
  • 优点:其主要优点是能统⼀客户和开发⼈员对软件项⽬需求的理解 有助于需求的定义和确认

10.UML图

  • UML:统一建模语言

在这里插入图片描述

  • 协作图与时序图同构的

类图 Check

在这里插入图片描述

类图中常见的关系:
1.泛化

  • 【泛化关系】是一种继承关系,表示子类继承父类的所有特征和行为。
  • 【箭头指向】带三角箭头的实线,箭头指向父类

在这里插入图片描述

2.实现

  • 【实现关系】是一种类与接口的关系,表示类是接口所有特征和行为的实现。
  • 【箭头指向】带三角箭头的虚线,箭头指向接口

在这里插入图片描述

3.关联

  • 【关联关系】是一种拥有关系,它使得一个类知道另一个类的属性和方法。
  • 【代码体现】成员变量
  • 【箭头指向】带普通箭头的实线,指向被拥有者。双向的关联可以有两个箭头,或者没有箭头。单向的关联有一个箭头。

在这里插入图片描述

4.聚合

  • 聚合关系】是一种整体与部分的关系。且部分可以离开整体而单独存在。聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分,必须考察具体的逻辑关系。
  • 【代码体现】成员变量
  • 【箭头指向】带空心菱形的实线,空心菱形指向整体

在这里插入图片描述

5.组合

  • 【组合关系】是一种整体与部分的关系。但部分不能离开整体而单独存在,组合关系是关联关系的一种,是比聚合关系还要强的关系。
  • 【代码体现】成员变量
  • 【箭头指向】带实心菱形的实线,实心菱形指向整体

6.依赖

  • 【依赖关系】是一种使用关系,即一个类的实现需要另一个类的协助。
  • 【箭头指向】带普通箭头的虚线,普通箭头指向被使用者


用例图 Check

  • 【概念】用例图是指由参与者、用例,边界以及它们之间的关系构成的用于描述系统功能的视图。
  • 【目的】用来描述整个系统的功能。
  • 用例是一个系统的动作 动词

用例图中包含以下三种关系:

  • 包含关系使用符号<>,基本用例虚线指向包含用例。

    • 包含的几种功能可以同时进行
  • 扩展关系使用符号<>,扩展用例虚线指向基础用例。

    • 扩展是需要满足特定条件才会触发,比如找回密码,在登陆时只有你选择了才会触发
  • 泛化关系,子用例继承父用例所有结构、行为和关系。子用例实现箭头指向父用例。

    • 泛化的几个功能,只能选择其一

用例规约

  • 定义:是用于描述用例的详细行为和功能的文档,它是用例图的补充

  • 用例名称:指明用例的名称和标识符,用于标示该用例。

    参与者:列出参与该用例的外部角色,如用户、系统或其他实体。

    前置条件:描述执行该用例前需要满足的条件或状态。

    主事件流:该操作成功情况下系统所做的事情

    辅事件流:操作不成功情况系统做的事情


时序图/顺序图 Check

在这里插入图片描述


泳道图
泳道图按角色划分为一个个泳道,每个角色的活动散落在各个角色对应的泳道里。泳道图是将模型中的活动按照职责组织起来。这种分配可以通过将活动组织成用线分开的不同区域来表示。由于它们的外观的缘故,这些区域被称作泳道。


11.CRC

1.首先构成相似现实对象的类;2.明确此类应该知道或者应该做的职责;3.找出在此类实现职责过程中产生相互作用的其他类作为协作者。

在这里插入图片描述


12.体系结构

定义:程序或计算系统的软件体系结构是指系统的一个或者多个结构 它包括软件构件构件的外部可见属性以及它们之间的相互关系

体系结构需考虑要素:经济性 易见性 隔离性 对称性 应急性

  • 以数据为中心的体系结构

  • C/S为中心的体系结构

在这里插入图片描述

  • 组件结构(构件结构)
    • 方块里面写各个功能模块

在这里插入图片描述

  • 整体体系结构


13.黄金规则

界面设计的三条黄金规则:

  • 把控制权交给用户
  • 减轻用户的记忆负担
  • 保持界面一致

14.可行性研究

目的:可行性研究的目的就是用最小的代价尽可能短的时间内确定问题是否能够解决。

实质:可行性研究的实质就是要进行一次压缩简化了的系统分析和设计的过程。

可行性研究需要的时间长短取决于系统的规模,可行性研究的成本只是预期工程总成本的5-10%


15.α测试和β测试

  • α试是在开发者的场所由⽤户进⾏ 在开发者关注和控制的环境下进⾏
  • β 测试是最终⽤户在⾃⼰的场所进⾏

16.需求

  • 什么是需求

    • ⽤户对⽬标软件系统在**功能 ⾏为 性能 设计约束** 等⽅⾯的期望
  • 需求工程包括七项任务:起始 获取 细化 协商 规格说明 确认 和 管理

  • 需求建模的两种方法:结构化分析方法 面向对象分析

  • 功能需求和非功能需求

    • 功能需求:描述系统必须提供的功能和服务,通常涉及系统应具备的具体功能和特性
    • 非功能需求:描述系统在性能、可靠性、可用性、安全性、效率等方面的要求,不直接涉及具体功能,而是关注系统如何执行这些功能
  • 约束性需求(非功能性需求)

    • 描述了系统的质量属性、性能要求、安全性、可用性等方面的约束条件,而不仅仅是系统需要完成哪些功能。约束性需求并不关注系统要做什么,而是系统如何做
  • 质量需求

    • 通常涉及系统的性能、可用性、安全性等方面的要求,如响应时间、吞吐量、可扩展性等
  • 需求评审程序员和销售人员不必参加

  • 软件需求分析阶段的任务是什么

  • 软件需求分析阶段的任务是:1.通过对问题及环境的理解 分析 2.将⽤户需求精确化 完全化 最终形成需求规格说明 3.描述系统信息 功能和⾏为


17.RUP

  • 统一软件开发过程统一软件过程是一个面向对象且基于网络的程序开发方法论
  • RUP是风险驱动的、基于Use Case技术的、以架构为中心的、迭代的、可配置的软件开发流程。
  • RUP描述了如何有效地利用商业的可靠的方法开发和部署软件,是一种重量级过程(也被称作厚方法学),因此特别适用于大型软件团队开发大型项目
  • 核心工作流
    • 1.商业建模 2.需求 3.分析和设计 4.实现 5.测试 6.部署 7.配置和变更管理 8.项目管理 9.环境

18.软件危机

  • 定义:软件危机是指落后的软件生产方式无法满足迅速增长的计算机软件需求 从而导致软件开发和维护过程中所遇到的一系列严重问题
  • 软件危机的表现
    • 1.产品不能符合用户的实际需求 2.软件开发的效率低 3.软件产品的质量低 4.软件开发成本和进度的估算不准确 5.软件维护性差 6.软件开发文档不全不合格
  • 软件危机产生的主要原因
    • ⽤户对软件需求的描述经常出现⼆义性 不确定性 遗漏或者错误
    • 开发⼈员对⽤户需求的理解与⽤户本来的愿望有差异
    • ⼤型项⽬需要组织⼀定的⼈⼒共同完成 多数管理⼈员缺乏开发⼤型软件的经验 同时⼜缺乏管理经验
    • 开发⼈员素质与经验不足
    • 缺乏有⼒的的⽅法学和⼯具⽀持 过分地依赖程序员的技巧和创造性 加固软件个性化
    • 软件产品的特殊性和⼈类智⼒的局限性 使⼈们处理复杂问题困难重重

19.模块内聚性

偶然内聚性的内聚程度最低
为了提高模块的独立性,模块内部最好是 功能内聚

  • 偶然内聚性:模块内的各个元素之间没有任何关系,仅仅是偶然放在一起,内聚程度最低

  • 过程内聚:模块内的各个成分通过执行一系列相关操作来完成一个具体任务

  • 功能内聚:模块内的各个成分共同完成一个单一的功能

  • 时间内聚:1.时间内聚⼜称为经典内聚

    ​ 2.模块内的各个成分在时间上相关,通常是指在同一个时间点或时间段内执行的多个操作

    • 初始化模块和结束模块从块内联系看 被称为时间内聚模块
  • 逻辑内聚:模块内的各个成分通过某种逻辑关系联系在一起

  • 通信内聚:模块内的元素通过操作同一个数据而联系在一起

  • 顺序内聚:模块内的元素之间存在顺序关系,一个元素的输出是另一个元素的输入


20.CMM软件能力成熟度模型

  • 简述:1.CMM 是⽤于衡量软件过程能⼒的事实上的标准 同时也是⽬前软件过程改进最好的参考标准

    ​ 2.CMM把企业控制软件过程的能⼒分五级 初始级 重复级 已定义级 已管理级和优化级


21.基线技术

  • 简述:1.基线标志软件开发过程的各个⾥程碑任⼀SCI⼀旦形成⽂档并复审通过 即成为⼀个基线 它标志开发过程中⼀个阶段的结束

    ​ 2.对于已成为基线的SCI 虽然可以修改 但必须按照⼀个特殊的 正式的过程进⾏评估 确认每⼀处修改


22.⾯向功能的度量

  • 面向功能的度量主要是通过衡量软件系统的功能来评估其复杂性、效率、质量等特征。面向功能的度量着重于软件提供的功能和这些功能所需要的资源或成本,它强调软件的功能性而非其代码结构或实现技术

  • 优点:1.与程序设计语⾔⽆关

    ​ 2.功能点度能⽤于软件项⽬的开发初期

  • 缺点:1.它涉及到的主观因素⽐较多 如各种权函数的取值

    ​ 2.信息领域中的某些数据有时不容易采集

    ​ 3.FP 的值没有直观的物理意义


23.软件工程原则

  • 按软件⽣存期分阶段制定计划并认真实施
  • 坚持进⾏阶段评审
  • 坚持严格的产品控制
  • 使⽤现代程序设计技术
  • 明确责任
  • ⽤⼈少⽽精
  • 不断改进开发过程

24.软件生命周期的活动

  • 主要活动:需求 设计 实现 确认 支持和管理
    • 需求:定义问题 即建立系统模型
    • 设计:在需求分析的基础上 给出系统的软件解决方案
    • 实现:选择合适的工具编码
    • 确认:需求 设计的评审及软件的测试
    • 支持:交付后的各种维护
    • 管理:对软件工程项目进行计划 组织 监控和管理

  • 软件定义时期

    • 主要解决做什么的问题
    • 问题定义 可行性研究 需求分析
  • 软件开发时期

    • 主要解决如何做的问题
    • 概要设计 详细设计 编码 测试
  • 软件运行维护时期

    • 主要使软件持久地满足用户的需要
    • 改正性维护 适应性维护 完善性维护 预防性维护

25.结构化需求分析模型

  • 简述:1.数据字典 实体-关系图 数据流图和状态迁移图及相关描述说明

    ​ 2.实体-关系图用于数据建模 数据流图用于功能建模 状态迁移图用于行为建模


26.扇入扇出

  • 扇入衡量一个模块被上级调用的次数,表示其复用程度;
  • 扇出则指模块直接管理的下级模块数量,过高表示复杂度增加。
  • 理想情况下,应保持适度的扇出,避免模块过于复杂或内聚度低。适当增加中间模块层次可以降低扇出,而扇入过低可能需要考虑模块重构或合并。

27.软件设计原则

  • 分而治之 模块独立性 提高抽象层次 复用性设计 灵活性设计

一、软件工程概述 1.软件特点 软件:计算机程序、方法、规则、相关的文档资料,以及计算机程序运行时所需要的数据。 软件是计算机系统中的逻辑成分,具有无形性。其主要内容包括:程序、配置文件、系统 文档、用户文档等。 2.软件分类 (1)按功能划分:系统软件、支撑软件、应用软件。 (2)按工作方式划分:实时处理软件、分时处理软件、交互式软件、批处理软件。 (3)按规模划分:微型软件、小型软件、中型软件、大型软件。 (4)按服务对象划分:通用软件、定制软件。 3.软件发展阶段 (1)程序设计时代(20世纪50年代)。 (2)程序系统时代(20世纪60年代)。 (3)软件工程时代(20世纪70年代起)。 4.软件危机 (1)危机现象:软件开发成本与进度估计不准确,软件产品与用户要求不一致,软件产品质量可靠性差,软件文档不完整不一致,软件产品可维护性差,软件生产率低。 (2)危机原因:软件的不可见性,系统规模庞大,生产工程化程度低,对用户需求关心不 够,对维护不够重视,开发工具自动化程度低。 5.软件工程 软件工程:运用现代科学技术知识来设计并构造计算机程序及为开发、运行和维护这些程序所必须的相关文件资料。 软件工程是一门关于软件开发与维护的工程学科,它涉及软件生产的各个方面,能够为经济、高效地开发高质量的软件产品提供最有效的支持。 (1)工程方法:结构化方法、JSD方法、面向对象方法。 (2)软件工具:具有自动化特征的软件开发集成支撑环境。 (3)工程过程:在软件工具支持下的一系列工程活动,基本活动是软件定义、软件开发、 软件验证、软件维护。 (4)工程管理:项目规划,项目资源调配,软件产品控制。 (5)工程原则:分阶段生命周期计划,阶段评审制度,严格的产品控制,采用先进的技术, 成果能清楚地审查,开发队伍精练,不断改进工程实践。 (6)工程目标:开发成本较低,软件功能能满足用户需求,软件性能较好,软件可靠性高, 软件易于使用、维护与移植,能按时完成开发任务并及时交付使用。 (7)工程文化:包括工程价值、工程思想和工程行为三个方面的内容。 二、软件工程过程模型 1.软件生命周期 如同任何事物都有一个发生、发展、成熟直至衰亡的全过程一样,软件系统或软件产品也有一个定义、开发、运行维护直至被淘汰这样的全过程,我们把软件将要经历的这个全过程称为软件的生命周期。它包含:软件定义、软件开发、软件运行维护三个时期,并可以细分为可行性研究、项目计划、需求分析、概要设计、详细设计、编码实现与单元测试、系统集成测试、系统确认验证、系统运行与维护等几个阶段。 软件定义期 软件定义是软件项目的早期阶段,主要由软件系统分析人员和用户合作,针对有待开发的软件系统进行分析、规划和规格描述,确定软件是什么,为今后的软件开发做准备。这个时期往往需要分阶段地进行以下几项工作。 1.软件任务立项 软件项目往往开始于任务立项,并需要以“软件任务立项报告”的形式针对项目的名称、性质、目标、意义和规模等作出回答,以此获得对准备着手开发的软件系统的最高层描述。 2.项目可行性分析 在软件任务立项报告被批准以后,接着需要进行项目可行性分析。可行性分析是针对准备进行的软件项目进行的可行性风险评估。因此,需要对准备开发的软件系统提出高层模型,并根据高层模型的特征,从技术可行性、经济可行性和操作可行性这三个方面,以“可行性研究报告”的形式,对项目作出是否值得往下进行的回答,由此决定项 目是否继续进行下去。 3.制定项目计划 在确定项目可以进行以后,接着需要针对项目的开展,从人员、组织、进度、资金、设备等多个方面进行合理的规划,并以“项目开发计划书”的形式提交书面报告。 4.软件需求分析 软件需求分析是软件规格描述的具体化与细节化,是软件定义时期需要达到的目标。 需求分析要求以用户需求为基本依据,从功能、性能、数据、操作等多个方面,对软件系统给出完整、准确、具体的描述,用于确定软件规格。其结果将以“软件需求规格说明书”的形式提交。 在软件项目进行过程中,需求分析是从软件定义到软件开发的最关键步骤,其结论不仅是今后软件开发的基本依据,同时也是今后用户对软件产品进行验收的基本依据。 软件开发期 在对软件规格完成定义以后,接着可以按照“软件需求规格说明书”的要求对软件实施开发,并由此制作出软件产品。这个时期需要分阶段地完成以下几项工作。 1.软件概要设计 概要设计是针对软件系统的结构设计,用于从总体上对软件的构造、接口、全局数据结构和数据环境等给出设计说明,并以“概要设计说明书”的形式提交书面报告,其结果将成为详细设计与系统集成的基本依据。 模块是概要设计时构造软件的基本元素,因此,概要设计中软件也就主要体现在模块的构成与模块接口这两个方面上。结构化设计中的函数、过程,面向对象设计中的类、对象,它们都是模块。概要设计时并不需要说明模块的内部细节,但是需要进行全部的有关它们构造的定义,包括功能特征、数据特征和接口等。 在进行概要设计时,模块的独立性是一个有关质量的重要技术性指标,可以使用模块的内聚、耦合这两个定性参数对模块独立性进行度量。 2.软件详细设计 设计工作的第二步是详细设计,它以概要设计为依据,用于确定软件结构中每个模块的内部细节,为编写程序提供最直接的依据。 详细设计需要从实现每个模块功能的程序算法和模块内部的局部数据结构等细节内容上给出设计说明,并以“详细设计说明书”的形式提交书面报告。 3.编码和单元测试 编码是对软件的实现,一般由程序员完成,并以获得源程序基本模块为目标。 编码必须按照“详细设计说明书”的要求逐个模块地实现。在基于软件工程的软件开发过程中,编码往往只是一项语言转译工作,即把详细设计中的算法描述语言转译成某种适当的高级程序设计语言或汇编语言。 为了方便程序调试,针对基本模块的单元测试也往往和编码结合在一起进行。单元测试也以“详细设计说明书”为依据,用于检验每个基本模块在功能、算法与数据结构上是否符合设计要求。 4.系统集成测试 所谓系统集成也就是根据概要设计中的软件结构,把经过测试的模块,按照某种选定的集成策略,例如渐增集成策略,将系统组装起来。 在组装过程中,需要对整个系统进行集成测试,以确保系统在技术上符合设计要求,在应用上满足需求规格要求。 5.系统确认验证 在完成对系统的集成之后,接着还要对系统进行确认验证。 系统确认验证需要以用户为主体,以需求规格说明书中对软件的定义为依据,由此对软件的各项规格进行逐项地确认,以确保已经完成的软件系统与需求规格的一致性。为了方便用户在系统确认期间能够积极参入,也为了系统在以后的运行过程中能够被用户正确使用,这个时期往往还需要以一定的方式对用户进行必要的培训。 在完成对软件的验收之后,软件系统可以交付用户使用,并需要以“项目开发总结报告”的书面形式对项目进行总结。 软件运行与维护期 软件系统的运行是一个比较长久的过程,跟软件开发机构有关的主要任务是对系统进行经常性的有效维护。 软件的维护过程,也就是修正软件错误,完善软件功能,由此使软件不断进化升级的过程,以使系统更加持久地满足用户的需要。因此,对软件的维护也可以看成为对软件的再一次开发。在这个时期,对软件的维护主要涉及三个方面的任务,即改正性维护、适应性维护和完善性维护。 2.瀑布模型 瀑布模型诞生于20世纪70年代,是最经典的并获得最广泛应用的软件过程模型。瀑布模型中的“瀑布”是对这个模型的形象表达,即山顶倾泻下来的水,自顶向下、逐层细化。 (1)特点:线性化模型、阶段具有里程碑特征、基于文档的驱动、阶段评审机制。 (2)作用:为软件项目按规程管理提供了便利,为其他过程模型的推出提供了一个良好的 拓展平台。 (3)局限性:主要适合于需求明确且无大的需求变更的软件开发,但不适合分析初期需求 模糊的项目。 3.原型模型 (1)快速原型方法:是原型模型在软件分析、设计阶段的应用,用来解决用户对软件系统在需求上的模糊认识,或用来试探某种设计是否能够获得预期结果。 (2)原型进化模型:针对有待开发的软件系统,先开发一个原型给用户使用,然后根据用 户的使用意见,对原型不断修改,使它逐步接近,并最终到达开发目标。 4.增量模型 增量模型结合了瀑布模型与原型进化模型的优点。在整体上按照瀑布模型的流程实施开发,以方便对项目的管理。但在软件的实际创建中,则将软件系统按功能分解为许多增量构件逐个地创建与交付,直到全部构件创建完毕,并都被集成到系统之中交付使用。 比较瀑布模型、原型进化模型,增量模型具有非常显著的优越性。但增量模型对软件设计有更高的技术要求。 5.螺旋模型 螺旋模型是一种引入了风险分析与规避机制的过程模型,是瀑布模型、快速原型方法和风险分析方法的有机结合。其基本方法是,在各个阶段创建原型进行项目试验,以降低各个阶段可能遇到的项目风险。 6.喷泉模型 喷泉模型是专门针对面向对象软件开发方法而提出的。“喷泉”一词用于形象地表达面向对象软件开发过程中的迭代和无缝过渡。 7.组件复用模型 组件复用方法是最近几年发展起来的先进的软件复用技术,在基于组件复用的软件开发中,软件由组件装配而成,这就如同用标准零件装配汽车一样。因此,组件复用模型能够有效地提高软件生产率。 三、项目分析与规划 1.计算机系统分析 (1)计算机系统 计算机系统是一个非常复杂并具有智能特性的开发系统,包括:硬件系统、软件系统、网络通信系统、人工操作系统等诸多子系统。 (2)系统分析 系统分析是对软件项目的高层分析,需要获取的是有关系统的框架描述,并需要使系统从它所处的环境中分离出来,为划分系统边界与确定系统构架提供依据。 (3)系统分析模型 分析模型是指采用作图方式对系统进行直观的描述。系统前期分析过程中经常使用的图形模型有系统框架图和系统流程图。其中,系统框架图用于说明系统的基本构造框架,而系统流程图则用于表现系统的基本加工流程。 2.项目可行性分析 (1)意义 •以少量的费用对项目能否实施尽早作出决断。 •根据项目条件限制,对系统的体系构造、工作模式等作出高层抉择。 •其结果可作为一个高层框架被用于需求分析之中。 (2)分析内容 •技术可行性:从技术与技术资源这两个方面作出可行性评估。 •经济可行性:从项目投资和经济效益这两个方面作出可行性评估。 •应用可行性:从法律法规、用户操作规程等方面作出可行性评估。 (3)分析过程 •建立系统模型。 •进行可行性评估。 •撰写可行性研究报告。 3.项目成本效益分析 (1)项目成本估算方法:基于软件规模的成本估算;基于任务分解的成本估算。 (2)项目效益分析指标:纯收入;投资回收期;投资回收率。 4.项目规划 (1)项目开发计划 项目开发计划涉及的内容包括: •开发团队的组织结构,人员组成与分工。 •项目成本预算。 •项目对硬件、软件的资源需求。 •项目任务分解和每项的任务里程碑标志。 •基于里程碑的进度计划和人员配备计划。 •项目风险计划。 •项目监督计划。 (2)项目进度表 项目进度是基于里程碑制定的,可以使用进度图表来描述项目进度。甘特图表是一种常用的项目进度图表,可以直观地描述项目任务的活动分解,以及活动之间的依赖关系、资源配置情况、各项活动的进展情况等。 四、软件需求分析 1.需求分析任务 (1)用户需求 用户需求是用户关于软件的一系列意图、想法的集中体现,是用户关于软件的外界特征的规格表述。 (2)系统需求 系统需求是比用户需求更具有技术特性的需求陈述,是提供给开发者或用户方技术人员阅读的,并将作为软件开发人员设计系统的起点与基本依据。主要包括:功能、数据、性能、安全等诸多方面的需求问题。 2.需求分析过程 需求分析是对软件系统的后期分析,需要进行的活动包括:分析用户需求、建立需求原型、分析系统需求和进行需求验证等。 3.用户需求获取 (1)用户调查是最基本的用户需求信息收集方法,比较常用的调查方法包括:访谈用户、开座谈会、问卷调查、跟班作业、收集用户资料。 (2)需求原型可被用来解决用户对软件系统在需求认识上的不确定性。一般情况下,开发人员将软件系统中最能够被用户直接感受的那一部分东西构造成为原型。例如,界面、报表或数据查询结果。 4.结构化分析建模 所谓模型,就是对问题所做的一种符号抽象。可以把模型看作为一种思维工具,利用这种工具可以把问题规范地表示出来。主要的分析模型包括: (1)功能层次模型。它使用矩形来表示系统中的子系统或功能模块,使用树形连线结构来表达系统所具有的功能层级关系。 (2)数据流模型。用于描述系统对数据的加工过程,其图形符号是一些具有抽象意义的逻辑符号,主要的图形符号包括:数据接口、数据流、数据存储和数据处理。可以依靠数据流图来实现从用户需求到系统需求的过渡。结构化分析就是基于数据流的细化实现的,它是结构化分析方法的关键。 (3)数据关系模型。也称为ER图,是应用最广泛的数据库建模工具。需要通过数据实体、数据关系和数据属性这三类图形元素建立数据关系模型。 (4)系统状态模型。通过系统的外部事件、内部状态为基本元素来描绘系统的工作流程,这种建模方式比较适合于描述一些依赖于外部事件驱动的实时系统。 5.需求有效性验证 需求有效性验证是指对已经产生的需求结论所要进行的检查与评价。一般需要对需求文档草稿从有效性、一致性、完整性、现实性、可检验性等几个方面进行有效性验证。比较常用的需求有效性验证方法与工具包括:需求评审、需求原型评价和基于CASE工具的需求一致性分析。 6.需求规格定义 需求规格说明书是需求分析阶段需要交付的基本文档,将成为开发者进行软件设计和用户进行软件验证的基本依据,涉及引言、术语定义、用户需求、系统体系结构、系统需求等有关软件需求及其规格的诸多描述与定义。 五、软件概要设计 1.设计过程与任务 概要设计中首先需要进行的是系统构架设计,然后是软件结构、数据结构等方面的设计。主要有以下几个方面的设计任务:制定规范、系统构架设计、软件结构设计、公共数据结构设计、安全性设计、故障处理设计、可维护性设计、编写文档、设计评审。 2.系统构架设计 (1)集中式结构 集中式系统由一台计算机主机和多个终端设备组成。其具有非常好的工作稳定性和安全保密性。但系统建设费用、运行费用比较高,灵活性不够好,结构不便于扩充。 (2)客户机/服务器结构 客户机/服务器结构依靠网络将计算任务分布到许多台不同的计算机上,但通过其中的服务器计算机提供集中式服务。其优越性是结构灵活、便于系统逐步扩充。 (3)多层客户机/服务器结构 •两层结构:将信息表示与应用逻辑处理都放在了客户机上,服务器只需要管理数据库事务。 •三层结构:将两层结构的客户机上的容易发生变化的应用逻辑部分提取出来,并放到一个专门的“应用服务器”上。 •B/S结构:是Web技术与客户机/服务器结构的结合。其优点是不需要对客户机进行专门的维护。 (4)组件对象 分布式结构通过组件进行计算分布。它依赖于对象中间件建立,具有灵活的构架,系统伸缩性好,能够给系统的功能调整与扩充带来便利。 3.软件结构设计 软件结构设计是对组成系统的各个子系统的进一步分解与规划。主要设计内容有:确定模块元素、定义模块功能、定义模块接口、确定模块调用与返回、进行结构优化。 (1)模块概念 •模块化:使用构造程序,可使软件问题简化。 •抽象化:概要设计中的模块被看成是一个抽象化的功能黑盒子。 •信息隐蔽:每个模块的内部实现细节对于其他模块来说是隐蔽的。 (2)模块的独立性 软件系统中每个模块都只涉及自己特定的子功能,并且接口简单,与软件中其他模块没有过多的联系。一般采用耦合和内聚这两个定性的技术指标进行度量。 耦合用来反映模块相互关联程度,模块间连接越紧密,耦合性就越高。内聚用来反映模块内元素的结合程度,模块内元素结合越紧密,则内聚性就越高。为提高模块独立性,要求模块高内聚、低耦合。 耦合形式由低至高是:非直接耦合、数据耦合、控制耦合、公共耦合、内容耦合。 内聚形式由低至高是:偶然内聚、逻辑内聚、时间内聚、过程内聚、通信内聚、顺序内聚、功能内聚。 (3)设计建模 •软件结构图:由Yourdon于20世纪70年代提出,被广泛应用于软件结构设计中,能够有效说明软件中模块之间的调用与通信。 •HIPO图:由美国IBM公司推出。其中,H图用于描述软件的分层调用关系,作用类似软 件结构图,IPO图用于说明描述模块的输入—处理—输出特征。 (4)软件结构优化 主要优化设计原则有:使模块功能完整、使模块大小适中、使模块功能可预测、尽量降低模块接口的复杂程度、使模块作用范围限制在其控制范围之内、模块布局合理。 4.面向数据流的结构设计 (1)变换分析 软件结构由输入、变换和输出三个部分组成。 (2)事务分析 软件结构由接收事务与事务活动两个部分组成。 (3)混合流分析与设计 软件系统是变换流与事务流的混合。对于这样的系统,通常采用变换分析为主、事务分析为辅的方式进行软件结构设计。5.数据库结构设计 (1)逻辑结构设计 •设计数据表 •规范数据表 •关联数据表 •设计数据视图 (2)物理结构设计 •数据存储结构 •数据索引与聚集 •数据完整性 六、面向对象分析与设计 1.面向对象方法学 面向对象技术涉及面向对象分析(OOA)、面向对象设计(OOD)和面向对象编程实现(OOP)这三个方面的问题。 (1)基本概念 •类:面向对象模块单位,作用是为创建对象实例提供模板。其具有数据与行为这两个方面的特征,并需要通过属性、操作和方法进行描述。 •属性、操作与方法:类具有数据与行为这两个方面的特征,并需要通过属性、操作和方法进行描述。 •类的继承性:指上级父类能够把自己的属性、操作传递给下级子类。 •类的多态性:子类对象可以像父类对象那样使用,它们可以共享一个操作名,然而却有不同的实现方法。 •对象:对象是类模块实例化的结果。 •消息:指对象之间的通信。 (2)优越性 •跟现实世界更加接近 •可使软件系统结构更加稳定 •软件具有更好的可重用性 •软件更加便于维护与扩充 2.面向对象分析建模 面向对象分析建模需要建立的是软件系统的用户领域模型,需要从系统业务流程、组织结构和行为过程等几个方面对系统进行分析。 (1)用例图 用例图涉及参入者、用例等元素,用于描述用户与系统之间的交互关系,说明系统所具有的业务能力和业务流程,能够方便开发者理解用户领域的专有术语和业务内容。 (2)活动图 活动图是一种行为模型,主要用于描述用例图中用例的内部活动状态与活动转换过程,以获得对用例的交互行为与工作流程的细节说明。涉及活动状态、活动转换等元素。 (3)分析类图 建立类图的概念模型,描述体现现实世界中数据构造的实体类及其它们之间的关系。 (4)序列图 以用例图中的用例为描述单位,以类图中的类为对象依据,以活动图中的活动转换为行为依据,建立与时间顺序有关的用例中对象之间的交互模型。 3.面向对象设计建模 面向对象设计建模需要把分析阶段的结果扩展成技术解决方案,需要建立的是软件系统的技术构造模型。 (1)设计类图 设计类图中的类是构造系统的基本模块单位,需要在分析类图基础上进行更加完整的面向设计的描述。除了实体类,设计类图中还需要考虑用于向外提供操作接口的边界类和用于实现内部协调的控制类。 (2)协作图 描述对象交互时的链接关系和基于链接而产生的消息通信及其操作接口。 (3)状态图 描述一个特定对象的所有可能的状态以及引起状态转换的事件。 (4)构件图 描述组成系统的物理构件及其它们之间的关系。构件之间关系主要是依赖关系。 (5)部署图 描述系统运行时的物理架构,涉及物理节点、节点之间的连接关系以及部署到各个节点上的构件的实例等。 七、用户界面设计 1.图形用户界面(GUI)所具有的特点 (1)比较容易学习和使用。 (2)用户可利用多屏幕(窗口)与系统进行交互,并可通过任务窗方便地由一个任务转换到另一个任务。 (3)可以实现快速、全屏的交互,能很快在屏幕上的任何地方进行操作。 图形用户界面设计已不是设计人员能够独立解决的了,需要邀请图形设计人员、系统分析人员、系统设计人员、程序员、用户应用领域方面的专家和社会行为学方面的专家以及最终用户的共同参入。 2.基于原型的用户界面设计 用户界面设计是一个迭代的过程,其基本过程包括三个步骤: (1)建立界面需求规格模型。 (2)以界面需求模型为依据创建界面原型。 (3)评价界面原型。 3.界面设计中需要考虑的因素 用户界面设计将会受诸多用户因素的影响,并主要体现在以下几个方面: (1)用户工作环境与工作习惯。 (2)用户操作定势。 (3)界面一致性。 (4)界面动作感。 (5)界面信息反馈。 (6)个性化。 (7)容错性。 (8)审美性与可用性。 4.界面类型 在基于图形界面的应用系统中,用户界面一般由若干个窗体组成,其窗体类型包括: (1)单窗体界面(SDI)。其特点是应用程序一次只能打开一个独立窗体。 (2)多窗体界面(MDI)。由一个MDI主窗体和多个MDI子窗体组成。其中MDI主窗体如同容器用来装载MDI子窗体,而MDI子窗体则被限制于MDI主窗体之内,不能独立存在。诸多公共操作都被放置在MDI主窗体上。 (3)辅助窗体。通常也叫做对话框,它是对主窗体的补充,用于扩展主窗体的功能。辅助窗体的种类主要有:登录窗、消息窗、设置窗等。 (4)Web页面。当采用到基于Web的B/S结构时,系统中的某个Web页面可能会被作为Web应用的进入点,则它可以作为一个特殊的主窗体看待。 5.界面功能特征 在进行用户界面设计时,需要考虑界面的功能问题。大体上说来,用户界面的功能主要体现在以下方面: (1)用户交互。指用户与计算机系统之间的信息交流。 (2)信息表示。指系统提供给用户信息,信息可以采用文本形式表示,也可以采用图形形式表示。 (3)用户联机支持。指系统给用户提供的应用指导。 6.界面导航设计 界面导航所指的是如何由一个界面转换到另一个界面。可以使用活动图来描述界面之间的转换关系,其中活动图中的每一个活动状态可用来表示系统中的每一个界面。 八、程序算法设计与编码 1.结构化程序特征 结构化程序的基本特征是程序的任何位置是单入口、单出口的。因此,结构化程序设计中,GOTO语句的使用受到了限制,并且程序控制也要求采用结构化的控制结构,以确保程序是单入口和单出口的。 2.程序算法设计工具 (1)程序流程图 程序流程图又称为程序框图,其历史悠久、应用广泛,从20世纪40年代末到70年代中期,它一直是程序算法设计的主要工具。程序流程图的主要优点是能够非常直观的描述程序的控制流程。但是,传统的程序流程图却是一种非结构化的程序算法设计工具。 (2)N-S图 为了满足结构化程序设计对算法设计工具的需要,Nassi和Shneiderman推出了盒图,又称为N-S图。它是一种严格符合结构化程序设计原则的图形描述工具。 N-S图的基本特点是通过矩形框描述模块内部程序的各个功能区域,并通过由外到内的矩形框嵌套表示程序的多层控制嵌套。 (3)PAD图 PAD是问题分析图(ProblemAnalysisDiagram)的英文缩写,由日本日立公司首先推出,并得到了广泛的应用。它是符合结构化程序设计原则的图形描述工具。 PAD图的基本特点是使用二维树形结构表示程序的控制流程,从上至下是程序进程方向,从左至右是程序控制嵌套关系。 (4)PDL语言 PDL语言也称为伪码,或过程设计语言,它一般是某种高级语言稍加改造后的产物,可以使用普通的正文编辑软件或文字处理系统进行PDL的书写和编辑。 PDL语言的语法规则分外部语法和内部语法。其中,外部语法用于定义程序中的控制结构和数据结构,内部语法则用于表示程序中的加工计算或条件。 (5)判定表 判定表是算法设计辅助工具,专门用于对复杂的条件组合关系及其对应的动作行为等给出更加清晰的说明,能够简洁而又无歧义地描述涉及条件判断的处理规则。 3.Jackson程序设计方法 1983年法国科学家Jackson提出了一种以软件中的数据结构为基本依据的程序算法设计方法。在以数据处理为主要内容的信息系统开发中,具有一定的应用价值。 Jackson程序设计方法的基本设计途径是通过分析输入数据与输出数据的层次结构,由此对程序算法的层次结构进行推论。 为了方便由数据结构映射出程序结构,Jackson将软件系统中所遇到的数据分为顺序、选择和重复三种结构,并使用图形方式加以表示。Jackson程序结构也是顺序、选择和重复这三种结构,并可以使用与数据结构相同的图形符号表示。 4.程序编码 在完成程序算法设计之后,接着需要编码。 (1)编程语言种类 •低级语言:包括第一代机器语言与汇编语言,它们是直接面向机器的语言。 •高级语言:指面向问题求解过程的语言,使用了与人的思维体系更加接近的概念和符号,一般不依赖于实现这种语言的计算机,具有较好的可移植性。 •第四代语言(4GL):指一些面向问题的高级语言,第四代语言是在更高一级抽象的层次上表示数据与猜想结构,它不需要规定程序算法细节。 (2)选择编程语言的依据 在对软件系统进行编码之前,必须抉择使用什么样的程序设计语言实现这个软件系统。在选择编程语言时往往需要考虑诸多方面的因素,例如软件项目的应用领域、软件问题的算法复杂性、软件的工作环境、软件在性能上的需要、软件中数据结构的复杂性、软件开发人员的知识水平和心理因素等。 (3)编程风格与质量 编程风格是编写程序时需要遵守的一些规则。在衡量程序质量时,源程序代码的逻辑简明清晰、易读易懂是一个重要因素,而这些都与编程风格有着直接的关系。 (4)影响程序工作效率的因素 一般说来,程序工作效率会受到处理器计算速度、存储器存储容量和输入输出速度等几个方面因素的影响,并与程序设计语言、操作系统、硬件环境等有着直接关系。因此,在考虑程序工作效率时,需要将诸多因素综合起来分析。 5.程序算法复杂性度量 程序算法复杂性主要指模块内程序的复杂性。比较著名的程序算法复杂性度量方法是McCabe度量法,其对程序复杂性的度量采用的是程序的环形复杂度,计算公式是: V(G)=m–n+p 其中,V(G)是程序有向图G中的环数,m是程序有向图G中的弧数,n是程序有向图G中的节点数,p是程序有向图G中分离部分的数目。 九、软件测试 1.测试目标 尽力发现软件中的错误,而不是为了验证软件的正确性。 2.测试方法 (1)黑盒测试:基于程序的外部功能规格而进行的测试,又称为功能测试。 (2)白盒测试:基于程序的内部结构与处理过程而进行的测试,又称为结构测试。 3.单元测试 单元测试的对象是单元模块,一般以白盒测试为主,以黑盒测试为辅。测试内容包括模块接口测试、局部数据结构测试、路径测试、错误处理测试、边界测试。 单元测试通常在编码阶段进行。测试时需要用到辅助模块,如驱动模块、桩模块。 4.集成测试 系统集成时主要有非渐增组装测试和渐增组装测试这两种方法: (1)非渐增组装测试:一种一次性地进行系统组装的方法。 (2)渐增组装测试:一种将单元模块的确认测试与集成测试结合在一起的测试方法,它比非渐增组装测试是具有更大的优越性。可以自顶向下渐增集成,也可以自底向上渐增集成。5.确认测试 确认测试又称有效性测试,其任务是验证软件的功能、性能及其他特性是否与用户的要求一致。在进行确认测试时,可以采用Alpha测试或Beta测试。其中,Alpha测试是在开发环境下由用户进行的测试,而Beta测试则是由软件用户在软件实际使用环境下进行的测试。 6.测试用例设计 设计测试用例就是为测试准备测试数据。由于测试用例不同,发现程序错误的能力也就不同,为了提高测试效率降低测试成本,应该选用高效的测试用例。 白盒测试用例设计主要采用逻辑覆盖,包括语句覆盖、判定覆盖、条件覆盖、判定—条件覆盖、条件组合覆盖和路径覆盖。 黑盒测试用例设计包括等价划分、边界值分析和错误推测等几种方法。 7.面向对象测试 (1)面向对象单元测试 不能孤立地测试单个操作,而应该把操作作为类的一部分来测试。 (2)面向对象集成测试 •基于线程的测试。 •基于使用的测试。 (3)面向对象确认测试 研究系统的用例模型和活动模型,设计出确认测试时的用户操作脚本。 8.软件调试 软件调试也叫做排错,涉及诊断与排错这两个步骤。但调试的关键是诊断。 常用的调试方法有:输出存储器内容、在程序中插入输出语句、使用自动调式工具。 常用的调试策略有:试探法、回溯法、对分查找法、归纳法、演绎法。 9.自动测试工具 常用的自动测试工具有:测试数据生成程序、动态分析程序、静态分析程序、模块测试、程序。 10.软件可靠性评估 软件可靠性的定义是:程序在给定的时间间隔内,按照规格说明书的规定成功地运行的概率。 软件可用性的定义是:程序在给定的时间点,按照规格说明书的规定,成功地运行的概率。为了方便可用性的计算,一般使用稳态可用性对系统进行可用性评价。 系统平均无故障时间的估算式是:MTTF=1/(K(ET/IT–Ec(t)/IT)) 十、软件维护 1.软件维护定义 软件维护是在软件运行维护阶段,为了改正软件错误或为了满足用户新的应用需要,而对软件进行改错、变更或进化的过程。 维护任务一般分为:改正性维护、适应性维护、完善性维护和预防性维护。 2.影响软件维护工作的因素 主要因素有:系统大小、程序设计语言、系统文档和系统年龄等。 3.非结构化维护 没有按照软件工程原则实施软件开发,以致和软件配套的一系列文档没有建立起来,保留下来的可能只有源程序。 4.结构化维护 建立在严格按照软件工程原则实施软件开发基础上,因此各个阶段的文档完整,能够比较全面地说明软件的功能、性能、软件结构、数据结构、系统接口和设计约束等。 5.软件维护的代价 软件维护代价包括有形与无形这两个方面的代价。其中,有形代价是指软件维护的直接费用支出,无形代价则指其他非直接的维护代价。 6.软件可维护性 软件可维护性是指维护人员理解、改正、改动和改进这个软件的难易程度。 可以从系统的可理解性、可靠性、可测试性、可修改性、可移植性、运行效率和可使用性这七个方面对软件的可维护性进行综合评估。 7.软件维护的实施 软件维护实施过程中,一般涉及以下几个问题:维护机构、维护申请报告、软件维护工作流程、维护记录和维护评价。 8.对老化系统的维护 老化系统是指一些使用早期程序设计语言开发的系统。为了能够有效地对老化系统进维 护,Yourdon提出了以下的几点维护建议: (1)尽可能得到更多的背景信息。 (2)力图熟悉程序的所有控制流程。 (3)评价现有文档的可用性。 (4)充分利用交叉引用信息。 (5)必须非常谨慎地对程序进行修改。 (6)在删除某些代码时,要确认代码确实不再使用。 (7)不要试图共享程序已有的临时变量或工作区。 (8)保持详细的维护活动和维护结果记录。 (9)如果程序结构混乱,修改受到干扰,可抛弃程序重新编写。 (10)插入出错检验。 9.逆向工程与再工程 逆向工程是通过源程序,甚至是目标程序,由此导出设计模型、分析模型的过程。可以把逆向工程描述为一个魔术管道,从管道一端流入的是一些非结构化的无文档的源代码或目标代码,而从管道另一端流出的则是计算机软件的分析、设计文档。 逆向工程被用到了软件维护上,通过从老化系统的源代码中提取程序流程设计、系统结构设计,甚至是数据流图,给老化系统的维护带来方便。 当逆向工程被用于重新构造或重新生成老化系统时,这个过程就叫做再工程。再工程不仅能从已存在的程序中重新获得设计信息,而且还能使用这些信息来改建或重建现有的系统。 10.软件配置管理 配置管理包括软件配置标识、软件变更控制和软件版本控制等方面的内容。 当对软件进行维护时,软件产品发生了变化,这一系列的改变,必须在软件配置中体现出来,以防止因为维护所产生的变更给软件带来混乱。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值