北京理工大学
软件工程实践
汤铭端
中国航天科工集团公司 706所
课程目的
? 面向软件工程的工程应用
? 了解软件工程的基本概念
? 了解软件工程过程
? 掌握基本的软件工程技术方法
? 掌握基本的软件工程管理方法
课程安排
? 40学时 ( 每周 3学时, 12讲, 1次考试 )
? 参考教材:, 实用软件工程,, 第二版,
郑人杰, 殷人昆, 陶永雷, 清华大学出
版社, 1997年 4月
课时
? 每周三晚上 6,40开始
? 每节课 45分钟,休息 10分钟
? 第一节课 6,40-8,00
? 休息 15分钟( 8,00-8,15)
? 第二节课 8,15-9,10
课程内容
? 软件工程原理
? 结构化方法概论
? 需求分析
? 软件设计
? 软件编码和调试
? 软件测试
? 软件项目策划
? 项目控制和风险管理
? 配置管理和需求管理
? 质量保证和评审与审查
? SW-CMM介绍
? 面向对象方法介绍
? 考试
第一讲
软件工程原理
内容和目的
? 为什么要实施软件工程?
? 实施软件工程的益处?
? 软件工程的基本内容?
? 软件开发模型
计算机系统工程
概念
系统分析和定义
硬 件 软 件 系统(总体
)设计
硬件工程 软件工程
计算机软件
? 计算机软件定义 ( GB),
? a,与计算机系统的操作有关的计算机程
序, 规程, 规则, 以及可能有的文件, 文档
及数据 。
? b,与计算机系统的操作有关的程序, 规
程, 规则及任何与之有关的文档 。
什么是软件?
? 软件 是计算机系统中与硬件相互依存的
另一部分,它是包括程序,数据及其相
关文档的完整集合。
? 程序 是按事先设计的功能和性能要求执
行的指令序列
? 数据 是使程序能正常操纵信息的数据结

? 文档 是与程序开发,维护和使用有关的
图文材料
软件的特点
? 软件是一种 逻辑实体,而不是具体的物理实体。因而具有抽象性
? 软件的生产与硬件不同,在它的开发过程中 没有明显的制造过程
? 在软件的运行和使用期间,没有硬件那样的机械磨损,老化问题
? 软件的开发和运行常受到计算机系统的限制,对计算机系统有着
不同程度的依赖性
? 软件的开发至今 尚未完全摆脱手工艺的开发方式
? 软件本身是复杂的
? 实际问题的复杂性
? 程序逻辑结构的复杂性
? 软件成本相当昂贵
? 相当多的软件工作涉及到社会因素
软件的分类 — 按功能进行划分
? 系统软件
? 操作系统
? 数据库管理系统
? 设备驱动程序
? 通信处理程序等
? 支撑软件
? 文本编辑程序
? 文件格式化程序
? 磁盘向磁带向数据传输的
程序
? 程序库系统
? 支持需求分析、设计、实
现、测试和管理的软件
? 应用软件
? 商业数据处理软件
? 工程与科学计算软件
? 计算机辅助设计/制造
软件
? 系统仿真软件
? 智能产品嵌入软件
? 医疗、制药软件
? 事务管理、办公自动化
软件
? 计算机辅助教学软件
软件的分类 — 按规模进行划分
类别 参加人员数 研制期限 源程序行数
微型 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(=1000k)
极大型 2000~ 5000 5~ 10年 1M~ 10M
软件的分类
? 按工作方式划分,
? 实时处理软件
? 分时软件
? 交互式软件
? 批处理软件
? 按服务对象的范围划
分,
? 项目软件
? 产品软件
? 按使用的频度进行划
分,
? 一次使用
? 频繁使用
? 按软件失效的影响进
行划分,
? 高可靠性软件
? 一般可靠性软件
软件发展阶段
? 程序设计阶段 — 50至 60年代
? 程序系统阶段 — 60至 70年代
? 软件工程阶段 — 70年代以后
软件危机,.,
? 计算机硬件性能/价格比和质量稳步提高
? 软件成本逐年上升,质量没有可靠的保证
? 软件已成为限制计算机系统发展的关健因素
? 将软件开发和维护过程中遇到的一系列严重问题
统称为, 软件危机,
? 在60年代后期开始认真研究解决软件危机的方
法,逐步形成了新兴的计算机软件工程学
...软件危机
? 什么是软件危机?
? 软件危机是指在计算机软件的开发和维护中
所遇到的一系列严重问题。
? 几乎所有软件都不同程度地存在这些问题
? 概括地说软件危机包含两方面问题,
? 如何开发软件,怎样满足对软件的日益增长的需

? 如何维护数量不断膨胀的已有软件
软件危机主要表现
1.对软件开发成本和进度的估计很不准确
2.用户对, 已完成的, 软件不满意的现象经常发生
3.软件产品的质量靠不住
4.软件不可维护
5.软件没有适当的文档资料
6.软件成本占计算机系统总成本的比例逐年上 升
7.软件开发生产率提高的速度远远跟不上计算机应
用迅速普及深入的趋势
产生软件危机的原因
? 一方面与软件本身的特点有关
? 在软件运行前,软件开发过程的进展难衡量,质量
难 评价,因此管理和控制软件开发过程相当困难;
? 在软件运行中,软件维护意味着改正或修改原来的
设计,较难维 护;
? 软件的显著特点是规模庞大,复杂度超线性增长。
要保证高质量 大型软件的开发,极端复杂困难,不
仅涉及技术问题(如分析方 法、设计方法、版本控
制),更重要的是必须有严格而科学的管理。
? 另一方面与软件开发和维护方法不正确有关,
这是主要原因。
? 特别是忽视软件需求分析的重要性
忽视软件需求分析的重要性
? 对用户要求没有完整准确的认识就匆忙
着手编写程序
? 软件开发与编程等同
? 忽略文档
? 软件定义不明
? 轻视维护
对软件开发的错误认识( 1)
? 已经有了关于建造软件的标准和规程
? 使用了吗?
? 开发者知道吗?
? 适用吗?
? 完整吗?
? 已经有了很好的软件开发工具
? 还需要计算机辅助软件工程( CASE) 工具
对软件开发的错误认识( 2)
? 如果计划落后,可以增加人员赶回来
? 给一个已经延迟的软件项目增加人手只会使
其更加延迟
? 原有人员需要抽实践训练新手
? 有了目标的一般描述就可以开始写程序
? 不完善的系统定义是项目失败的主要原因
对软件开发的错误认识( 3)
? 项目需求不断变化,但软件很灵活,变
化能够很容易地得到满足
? 软件需求的变化确实是经常的,但其产生的
影响随着引入的时间不同而不同
? 写出程序并使其正常运行,工作就结束

? 越早开始写程序,就要花越长时间才能够完

对软件开发的错误认识( 4)
? 在程序真正开始运行前,无法评估其质

? 正式的技术评审
? 质量过滤器
? 成功项目唯一应该提交的就是运行程序
? 软件 =程序 +文档 +数据
? 文档是成功开发的基础
? 文档为维护提供指导
解决办法,.,
? 全 面解决软件危机需要一 系列综合措施,
? 在软件研制的各个阶段采用好的工具;
? 对软件的实现提供有效的构件块;
? 为保证软件质量提供自动设计技术;
? 以及为协调、控制、管理提供基本理论和技
术 —— 软件工程。
...解决办法
? 软件工程这一要素将驾驭前面的工具,
构件决和技术
? 软件工程把管理, 控制, 评审等方法与
分析, 设计, 编码, 测试, 维护等技术
结合起来
? 没有坚实的软件开发方法学, 即使最先
进的工具和技术也不能使软件危机有所
减轻
软件工程 — 工程化方法
? 用于解决任何产品开发的一种工程化方法是,
? 要求在定义、开发和维护阶段的每一步中都采用经
过验证的方法
? 要求一系列的复查,以便在产品开发中保证质量
? 规定在每一步中要产生的特定的文档
? 鼓励能够加速开发的各种工具和方法的使用与研制
? 提供从原始产品概念到最后产品制造的一个可追溯
的途径
? 软件工程是使计算机软件走向工程科学的途径
软件工程 — 软件工程定义
? 软件工程是为了 经济地 获得 可靠的 和能在实际机器上
高效 运行的软件而建立和使用的 好的工程原则 。
( Fritz Bauer 1969)
? 软件工程是应用于计算机软件的定义、开发和维护的
一整套方法、工具、文档、实践标准和工序。( GB)
? 软件工程:( 1)将系统化的、规范的、可度量的方法
应用于软件的开发、运行和维护的过程,即将工程化
应用于软件中。( 2)( 1)中所述方法的研究。
( IEEE93)
? 软件工程是模仿在硬件研制中行之有效的一套计划、
管理、技术、方法,基于软件的生存期概念而建立起
来的。
软件工程的定义
? Boehm,运用现代科学技术知识来设计
并构造计算机程序及为开发、运行和维
护这些程序所必需的相关文件资料
? Fritz Bauer,建立并使用完善的工程化
原则,以较经济的手段获得能在实际机
器上有效运行的可靠软件的一系列方法
软件工程三要素:方法、工具和过程
? 软件工程方法为软件开发提供了
,如何做, 的技术
? 软件工具为软件工程方法提供了
自动的或半自动的软件支撑环境
软件工程 — 视图 1..,
质量焦点
过程
方法
工具
...软件工程 — 视图 1
? 质量焦点:任何工程方法必须以有组织的质量保
证为基础。质量的理念刺激不断过程改进,导致
出现更加成熟的软件工程方法。它是软件工程的
根基。
? 过程:软件工程的基础是过程。软件工程过程是
将技术层结合在一起的凝聚力,使得软件能够合
理地和及时地开发出来。
? 方法:软件工程方法层提供了建造软件在技术上
需要“怎么做”。
? 工具:在工具层对过程和方法提供了自动和半自
动的支持。
软件工程 — 生存期概念
? 计算机软件生存期中有三个阶段:定义阶段、
开发阶段,维护阶段。
? 定义阶段:为软件项目做出计划、预算资金和进度,
分析并规定详细的需求 ——做什么
? 开发阶段:用经过验证的各种设计、编码和测试方
法把软件需求转变为一个可执行的程序 ——怎么做
? 维护阶段:纠正所遇到的各种问题,修正软件使之
适合于不同的工作环境,增强功能要求 ——改变
? 每一个阶段都有一系列的工程步骤,每一步都
以能加以 复查并可移交才作为结束
软件工程知识结构
? 2001年 5月 ISO/IEC JTC 1( ISO和 IEC的
第一联合技术委员会)发布了
,SWEBOK指南 V0.95(试用版 ),
? ( Guide to the Software Engineering
Body of Knowledge,简称 SWEBOK)
? SWEBOK把软件工程学科的主体知识分
为 10个知识领域。
软件工程知识结构
? 软件需求
? 软件设计
? 软件构造
? 软件测试
? 软件维护
? 软件配置管理
? 软件工程管理
? 软件工程过程
? 软件工程工具和方法
? 软件质量
软件工程的基本原理
? B.W.Boehm( 1983)
1) 用分阶段的生命周期计划严格管理 ;
2) 坚持进行阶段评审 ;
3) 实行严格的产品控制 ;
4) 采用现代程序设计技术 ;
5) 结果应能清楚地审查 ;
6) 开发小组的人员应该少而精 ;
7) 承认不断改进软件工程实践的必要性 。
计划管理
? 缺乏科学而周密的计划是软件开发普遍现象
? 不成功软件项目一半以上由于计划不周造成
? 应把软件生存期划分为若干阶段, 制定科学周
密, 切实可行的计划, 并严格按计划进行管理,
这是软件项目取得成功的先决条件
? 计划所做的和按计划去做
? 计划一般包括:项目开发计划, 软件配置管理
计划, 软件质量保证计划, 软件测试计划等
评审
? 在每个阶段都进行严格的评审, 以便尽早发现
在软件开发过程中所犯的错误, 是一条必须遵
循的重要原则
? 质量保证工作不能等到程序编制完成后才进行,
? 1,程序中的大部分错误是在编码之前造成的
? 2,错误的检测与改正时间越晚, 所付出的代价
也就越高 。
? 3,错误还会被, 放大,
配置管理,.,
? 软件研制各阶段产生的文档, 报告, 程
序清单和数据等, 构成软件配置
? 全部软件配置是一个软件产品的真正代
表, 必须使其保持精确和一致
? 为了保持软件配置的一致性, 必须实行
严格的产品控制, 对变更进行严格的控
制和管理
...配置管理
? 配置管理是标识和确定系统中配置项的过程,
在系统整个生存周期内控制这些项的投放和变
更,记录并报告配置的状态和变更要求,验证
配置项的完整性和正确性。它包括对软件配置
的标识、控制、审计、记录等一系列的活动
? 在软件研制过程中,由业已经过正式审核与同
意,可用作下一步开发的基础,并且只有通过
正式的修改管理步骤方能加以修改的规格说明
或产品形成了配置管理的基线
软件开发方法和工具
? 软件工程鼓励研制和采用各种先进的软
件开发方法和工具
? 各种软件开发方法的出现和采用大大改
善了软件的开发效率和维护效率
? 软件工程辅助工具, 计算机辅助软件工
程 ( CASE ) 环境
? 工具和环境的使用进一步提高了软件的
开发效率, 维护效率和软件质量
文档,.,
? 软件研制是脑力劳动, 具有不可见性
? 为了实现对软件研制过程的管理, 在软
件研制的每个阶段, 都应按规定的格式
编写出完整准确的文档
? 文档是软件中不可缺少的组成部分
...文档的作用
1)作为阶段工作成果和结束标志;
2)向管理人员提供软件开发过程中的进展和情况,
把软件开发过程中的一些, 不可见的, 事物转
换成, 可见的, 文字资料;
3)记录开发过程中的技术信息, 便于协调以后的
软件开发, 使用和修改;
4)提供对软件的有关运行, 维护和培训的信息,
便于各类人员之间相互了解彼此的工作;
5)向潜在用户报告软件的功能和性能, 使他们能
判定该软件能否服务于自己的需要 。
开发小组
? 软件开发小组的组成人员的素质应该好,
而人数则不宜过多
? 开发小组人员的素质和数量是影响软件
产品质量和开发效率的重要因素
? 随着开发人员数目的增加, 因为交流情
况讨论问题造成的通信开销也急剧增加
? 组成少而精的开发小组是一条基本原理
不断改进
? 仅有前面六条基本原理并不能保证软件
开发和维护的过程能赶上时代前进的步
伐, 跟上技术的不断进步
? Boehm 提出应把承认不断改进软件工程
实践的必要性作为软件工程的第七条基
本原理
? 不仅要积极地采纳新的软件技术, 而且
要注意不断总结经验
软件工程基本 原则 -1
? 抽象 采用分层次抽象, 自顶向下, 逐层细化的办法
控制软件开发过程的复杂性 。
? 信息隐蔽 将模块设计成,黑箱,,实现的细节隐藏在
模块内部,不让模块的使用者直接访问。这就是信息
封装,使用与实现分离的原则。
? 模块化 如 C 语言程序中的函数过程,C++ 语言程序
中的类。模块化有助于信息隐蔽和抽象,有助于表示
复杂的系统。
? 局部化 要求在一个物理模块内集中逻辑上相互关联
的计算机资源,保证模块之间具有松散的耦合,模块
内部具有较强的内聚。这有助于控制解的复杂性。
软件工程基本 原则 -2
? 确定性 软件开发过程中所有概念的表达应是确定的、无
歧义性的、规范的。
? 一致性 整个软件系统的各个模块应使用一致的概念、符号
和术语。程序内部接口应保持一致。软件和硬件、操作系
统的接口应保持一致。系统规格说明与系统行为应保持一
致。用于形式化规格说明的公理系统应保持一致。
? 完备性 软件系统不丢失任何重要成分,可以完全实现系
统所要求功能的程度。为了保证系统的完备性,在软件开
发和运行过程中需要严格的技术评审。
? 可验证性 开发大型的软件系统需要对系统自顶向下、逐
层分解。系统分解应遵循系统易于检查、测试、评审的原
则,以确保系统的正确性。
软件研制过程模型
? 软件生存周期从产品的设想到不再使用,
包含软件开发、运行、维护全过程
? 软件开发包含一系列阶段、活动和里程
碑,如需求分析、设计、编码、测试
? 软件研制过程模型给出了将这些基本阶
段进行有机组合的结构性模型
生存周期支持过程
2 配置管理
1 文档编制
8 问题解决
3 质量保证
4 验证
5 确认
6 联合评审
7 审核
生存周期基本过程
2 供应
1 获取
3 开发
4 运作
5 维护
生存周期组织过程
1 管理
3 改进
2 基础设施
4 培训
瀑布模型
软件
测试
详细
设计
软件
实现
系统
需求 软件
需求 概要
设计
1970年由 W.Royce提出
瀑布模型描述
? 从 60年代开始,为解决软件危机逐渐发展起软
件工程。瀑布模型
? 则是传统软件工程的基础。瀑布模型的基本思
想是将软件生命周期划
? 分为若干明确定义的阶段。需求捕获是软件生
命周期的第一个阶段;
? 上一个阶段生成规定的软件中间产品(软件文
档,伪码等),传到下
? 一阶段作进一步加工,最后得到目标产品。
? 瀑布模型是一个理想化过程,
瀑布模型特点
(1) 阶段间具有顺序性和依赖性
(2) 推迟实现的观点
(3) 质量保证的观点
瀑布模型的使用风险和适用情况
? 使用风险
? 需求未被充分理解
? 系统太大而不能一次
实现
? 事先打算采用的技术
迅速发生变化
? 需求迅速发生变化
? 有限的资源
? 无法利用某一中间产

? 适用情况
? 所有的系统功能一次
交付时
? 必须同时淘汰全部老
系统时 瀑布模型
V模型
系统需求
软件需求
概要设计
详细设计 单元测试
组装测试
编码
确认测试
系统联试
详细设计
概要设计
软件需求
系统需求
型号任务
编译后的单元
测试后的单元
组装后的软件
测试后的软件
交付软件
验证
验证
验证
验证
验证
验证
验证与确认
验证与确认
J.McDermid于 1994年在
,软件工程师参考手册, 中
提出
增量模型
软件 1,
运行维护
详细
设计 编码
测试
系统
需求 软件
需求 概要
设计
软件 2,
运行维护
详细
设计 编码
测试
增量模型描述
? 预先计划的产品改进
? 从一套给定的需求开始,通过一系列的
造型实施开发,第一个造型纳入一部分
需求,下一个造型纳入更多的需求,以
此类推,直到系统完成
? 在每个造型中实行必要的过程、活动和
任务
增量模型特点
? 在开发每个造型时,开发过程中的活动
和任务顺序地或部分平行重叠地使用
? 当相继的造型在部分并发地被开发时,
开发过程中的活动和任务可以在造型间
平行地被采用
增量模型的使用风险和适用情况
? 风险
? 需求未被很好地理解
? 突然提出一些功能
? 事先打算采用的技术
迅速发生变化
? 需求迅速发身变化
? 长时期内有限的资源
投入
? 适用情况
? 需要早期获得功能
? 中间产品可以提供使

? 系统被自然地划分成
增量
? 工作人员和(或)资
金可以逐步增加
渐进模型
开发 1
运行维护 1
开发 3
运行维护 3
开发 2
运行维护 2
渐进模型描述和特点
? 通过造型开发系统
? 需求不能被完全理解,且不能在初始时就确定
? 需求一部分被预先定义,然后在每个相继的造
型中逐步完善
? 每个造型被开发时,开发过程中的活动和任务
顺序地或部分重叠并行地被采用
? 对所有造型,开发过程中的活动和任务通常按
同意顺序被重复使用
采用渐进模型的一些原因
1) 需要某些用户经验来改进和完善需求;
2) 某些部分的实现可能取决于未来技术的
可用性;
3) 某些新的用户需求被预料到, 但目前还
不清楚;
4) 某些需求可能比遇到的那些还难以满足,
并且确定不允许因这些需求推迟可用的
交付 。
渐进模型的使用风险和适用情况
? 风险
? 突然提出一些功能
? 长时期内有限的资源
投入
? 适用情况
? 需要早期获得功能
? 中间产品可以提供使用
? 系统被自然地划分成增

? 工作人员和(或)资金
可以逐步增加
? 需要用户反馈来理解全
部需求
? 便于对技术变化的监督
原型开发模型
需求分析
快速设计
用户评价原型
建立原型
生产产品
修改原型
原型分类
? 抛弃式原型开发
? 样品式原型开发
? 渐增式原型开发
螺旋模型
B.Boehm于 1988年提出
螺旋模型描述
? 瀑布模型和渐进模型相结合,增加风险
分析
? 用来指导大型软件项目的开发
? 将开发划分为制定计划、风险分析、实
施工程、客户评估四类活动
? 沿螺旋线每转一圈,表示开发出一个更
完善的新的软件版本
喷泉模型
喷泉模型描述
? 1990年 B.H.Sollers和 J.M.Edwards提出
? 主要用于采用面向对象技术的项目
? 喷泉体现迭代和无间隙的特征
? 软件的某些部分常常被重复工作多次,
相关对象在每次迭代中随之加入渐进的
软件成分
? 在分析、设计、实现等各项活动之间无
明显边界
RUP模型
软件过程模型的选择
1)模型应符合软件本身的性质(规模、复杂性)
2)模型应满足软件应用系统整体开发进度要求
3)模型应有可能控制并消除软件开发风险
4)模型应有可用的计算机辅助工具(如快速原
型工具)的支持
5)模型应与用户和软件开发人员的知识和技能
相匹配
6)模型应有利于软件开发的管理与控制
航天型号软件研制过程模型
? 航天型号研制经历方案阶段, 模样, 初
样, 试样 ( 正样 ), 定型
? 型号软件研制通常也经历模样, 初样,
试样 ( 正样 )
? 模样, 初样, 正样软件是针对同一个软
件开展的循环研制, 侧重面不同 。
? 结合原型, 渐进模型, 以原型 -基本型 -更
新型来形成航天型号软件研制过程模型
原型、基本型、更新型
? 基本思想是:首先在需求尚不明确的情况下,对已知
的需求和尚不能确定的需求进行分析整理,在此基础
上简单地设计、编制软件,产生一个软件的原型,并
对原型进行多方面的研究、分析和讨论,以便确定所
采取的技术实现方案是否可行,需求还要做哪些补充、
修改和完善,从而获得一个内容较完整、接口较明确
的软件需求和一个切实可行的软件实现技术途径;其
次在软件原型研制的基础上,进行一次完整、严格的
软件研制工作,获得一个高质量的软件基本型;最后
在软件基本型的基础上,针对更新的软件需求,采用
软件更新与更改的的方法,对软件进行更新,获得软
件的更新型
模样、初样、试样 -正样
模样
初样
正样
原型
基本型
更新型
更新版本 1
更新版本 2……
原型
? 软件原型研制的目的是明确接口、确定需求、试验系统方

? 需求分析:根据系统的任务分解和技术要求,对已知需求、
应有需求、未确认需求等进行综合分析,形成粗略的原型
软件需求规格说明。
? 设计:对软件的总体结构和接口进行设计,形成软件设计
说明。
? 编码调试:编制程序并调试通过。
? 分析总结:运行软件,并与系统总体、相应接口单位进行
详细的分析讨论,对软件需求进行补充、修改和完善,并
确定技术途径的可行性。
? 对高质量要求的软件研制,软件原型研制所获的程序应废
弃,不带入以后的研制阶段。
基本型
? 基本型研制的任务是根据基本确定的软件需求,
全面开展软件的研制工作,形成一个基本满足
系统对软件各项要求的基本型软件,以直接应
用于型号或作为下一步更新的基础。
? 基本型软件的研制,必须采用瀑布式开发过程,
严格执行。
? 研制阶段包括:系统需求、软件需求分析、概
要设计、详细设计、软件实现、软件组装测试、
软件确认测试、系统联试
更新型
? 在获得软件基本型之后,可根据系统对软件需
求的补充、修改、完善的需要,在软件基本型
的基础上对软件进行一次直至多次的更新。
? 更新型软件的研制按照软件更新与更改方法进
行。它也遍历软件研制的全过程,但是所有工
作都是以基本型为基础进行的。更新后获得的
更新型软件又可作为后续更新工作的基本型。
? 更新型软件研制包括:更新系统需求、修改补
充软件需求、修改软件设计、修改补充软件程
序、测试和回归测试、系统联试
谢谢!
68389085( O)
68389504( H)
mdtang@btamail.net.cn