1、2022-8-6教材:软件工程教材:软件工程参考教材:参考教材:软件工程实践者的研究方法软件工程实践者的研究方法 (美)(美)Roger S.PressmanRoger S.Pressman著著 黄柏素黄柏素 梅宏梅宏 译译教学方式:授课教学方式:授课(24)(24)实验实验(24)(24)课课 名:软件工程名:软件工程2022-8-6第一章第一章 软件工程概述软件工程概述2022-8-6第一章第一章 软件工程概述软件工程概述2022-8-6l 什么是软件什么是软件l 软件的特点软件的特点l 软件的发展软件的发展2022-8-6一、什么是软件一、什么是软件软件软件 是计算机系统中与硬件相互依存
2、的另是计算机系统中与硬件相互依存的另一部分,它是包括程序,数据及其相关文一部分,它是包括程序,数据及其相关文档的完整集合。档的完整集合。程序程序 是按事先设计的功能和性能要求执行是按事先设计的功能和性能要求执行的指令序列。的指令序列。数据数据 是使程序能正常操纵信息的数据结构是使程序能正常操纵信息的数据结构文档文档 是与程序开发、维护和使用有关的图是与程序开发、维护和使用有关的图文材料。文材料。2022-8-6二、软件的特点二、软件的特点软件具有抽象性。软件具有抽象性。因为它是一种因为它是一种逻辑实逻辑实体体,而不是具体的物理实体。,而不是具体的物理实体。软件是开发或工程化而形成的。软件是开发
3、或工程化而形成的。而不是而不是传统意义上的制造产生的。传统意义上的制造产生的。软件不会磨损。软件不会磨损。2022-8-6故障率曲线时间故障率软件的故障率曲线时间故障率软件的故障率曲线时间故障率硬件的故障率曲线理想曲线实际曲线2022-8-6软件是自定义的。软件是自定义的。他不能通过已有的构件他不能通过已有的构件组装而来。组装而来。软件对计算机系统有一定的依赖性。软件对计算机系统有一定的依赖性。其开其开发和运行常受到计算机系统的限制。发和运行常受到计算机系统的限制。软件成本昂贵软件成本昂贵2022-8-6软件本身是复杂的软件本身是复杂的v实际问题的复杂性实际问题的复杂性v程序逻辑结构的复杂性程
4、序逻辑结构的复杂性 例例1 1 Windows95 Windows95程序超过程序超过10001000万行万行例例2 2 军事和控制军事和控制系统项目,系统项目,35003500多人花费多人花费了了几年几年时间时间,交付后,交付后相继相继发发现了现了100100个错个错误,最后误,最后以以失败失败告终告终。2022-8-6软件的投入费用越来越高软件的投入费用越来越高2022-8-6三、软件的发展过程三、软件的发展过程程序设计阶段程序设计阶段 50 50至至6060年代年代程序系统阶段程序系统阶段 60 60至至7070年年软件工程阶段软件工程阶段 70 70年代以后年代以后2022-8-6计算
5、机50年的发展 早期早期 第二代第二代 第三代第三代 第四代第四代面向批处理面向批处理 多用户多用户 分布式系统分布式系统 桌面系统桌面系统有限的分布有限的分布 实时实时 嵌入嵌入“智能智能”面向对象技面向对象技术术自定义软件自定义软件 数据库数据库 低成本硬件低成本硬件 专家系专家系统 软件产品软件产品 消费者的影响消费者的影响 人工神经网络人工神经网络 并行计算并行计算 网络计算机网络计算机195019601970198019902000小规模程序小规模程序 软件作坊软件作坊 微处理器微处理器 网络网络 软件产品软件产品 2022-8-6 共 43 页 第13页发展带来的新问题:w 硬件的
6、发展超过软件发展;集成度18个月翻一翻,计算速度、存储容量成倍增长,成本每10年递减两位数。w 制作软件的能力和速度与需求不适应;w 计算机的应用依赖于可靠的软件,软件失败将造成巨大经济损失;w 已有的软件难以维护。2022-8-6 共 43 页 第14页中国软件产业面临挑战与机遇w 外国软件渗透w 软件开发投资力度不足w 软件侵权行为w 软件人才结构不合理,缺乏高级系统程序员和项目负责人。w 软件人员缺乏软件工程化的概念。2022-8-6 共 43 页 第15页 软件已经从特定的问题解决和信息分析工具演化为一门独立的产业!需要解决的新问题:!2022-8-6l 什么是软件危机什么是软件危机l
7、 产生危机的原因产生危机的原因2022-8-6一、什么是软件危机一、什么是软件危机例例:IBM公司在公司在1963年至年至1966年开发的年开发的IBM360机的操作系统。这一项目花了机的操作系统。这一项目花了5000人一年的工作量,最多时有人一年的工作量,最多时有1000人投人投入开发工作,写出了近入开发工作,写出了近100万行源程万行源程序。序。.据统计,这个操作系统每次发据统计,这个操作系统每次发行的新版本都是从前一版本中找出行的新版本都是从前一版本中找出1000个个程序错误而修正的结果。程序错误而修正的结果。.2022-8-6 项目负责人项目负责人F.D.BrooksF.D.Brook
8、s事后总结了他事后总结了他在组织开发过程中的沉痛教训时说:在组织开发过程中的沉痛教训时说:“.正像一只逃亡的野兽落到泥潭中做垂死的正像一只逃亡的野兽落到泥潭中做垂死的挣扎,越是挣扎,陷得越深,最后无法逃挣扎,越是挣扎,陷得越深,最后无法逃脱灭顶的灾难。脱灭顶的灾难。.程序设计工作正像这程序设计工作正像这样一个泥潭,样一个泥潭,.一批批程序员被迫在泥一批批程序员被迫在泥潭中拼命挣扎,潭中拼命挣扎,.谁也没有料到问题竟谁也没有料到问题竟会陷入这样的困境会陷入这样的困境.”.”。IBM360IBM360操作系操作系统的历史教训成为软件开发项目的典型事统的历史教训成为软件开发项目的典型事例为人们所记取
9、。例为人们所记取。2022-8-6问题出在哪里?问题出在哪里?u项目没有被很好地理解;计划不周,最终导致进度拖延;u文档资料不充分,使人与人的交流变得比写程序困难得多;u缺少度量软件可靠性(reliability)的标准,质量无法保证;u软件难以维护(maintainability),不易升级(evolvability);2022-8-6必须意识到:必须意识到:软件软件 编程编程 2022-8-6 软件系统的开发与建造高楼大厦、制造软件系统的开发与建造高楼大厦、制造飞机导弹同理,需要工程化方法和工具。飞机导弹同理,需要工程化方法和工具。2022-8-6二、软件危机的主要特征二、软件危机的主要特
10、征l对软件开发的成本和进度估计常常不准确;l用户对“已完成的”软件系统不满意;l软件质量不可靠;l软件系统常常不可维护;l软件没有适当的文档资料;l软件成本在计算机系统总成本不断上升;l软件生产率的提高速度既比不上硬件的发展,也跟不上计算机应用迅速普及深入的趋势。2022-8-6三、产生危机的原因三、产生危机的原因 1.软件需求巨增!软件需求巨增!2.2.软件通用性不强软件通用性不强 3.软件难于度量软件难于度量 2022-8-6产生危机的原因产生危机的原因 4.用户与软件开发者之间难以沟通 5.软件难以维护:没有适当的文档资料;软件的维护是修改原来的设计;6.软件开发受硬件的限制7.软件是定
11、做而不是组装;8.没有工程化的管理和方法。2022-8-6 共 43 页 第25页改正一个问题需付出的代价改正一个问题需付出的代价改正一个问题的估计费用改正一个问题的估计工作量20200200010005.02.50.050.5(人/天)需求分析概要设计详细设计编码调试系统测试用户现场2022-8-6 解决问题的途径解决问题的途径如何维护已有的软件?如何使软件的如何维护已有的软件?如何使软件的开发速度适应越来越大的软件需求?开发速度适应越来越大的软件需求?2022-8-6l 什么是软件工程什么是软件工程 l 软件工程的基本原理软件工程的基本原理l 软件工程方法学软件工程方法学2022-8-6指
12、导计算机软件开发和维护的工程学科。以系统的、工程的概念、原理、技术和方法开发和维护软件,把先进的管理技术和开发技术相结合,经济地开发出高质量的软件并有效地维护它。w软件工程是1968年NATO在计算机科学家国际会议上首次提出来。2022-8-6为了经济地获得可靠的并能高效运行的软件,而建立和使用的完善的工程化原则。开发、运行、维护和修复软件的系统方法。将系统化的、规范的、可度量的方法应用于软件的开发、运行和维护的过程。2022-8-6Boehm提出了软件工程的7条基本原理:l用分阶段的生命周期计划严格管理;l坚持进行阶段评审;l实行严格的产品控制;l采用现代程序设计技术;l结果应能清楚地审查;
13、l开发人员应该少而精;l承认不断改进软件工程实践的必要性二、软件工程基本原理2022-8-6一个好的工业,应该有一一个好的工业,应该有一套良好的标准来配套。套良好的标准来配套。软件的工业化生产过程应具备的特点:软件的工业化生产过程应具备的特点:明确的工作步骤明确的工作步骤详细具体的规范化文档详细具体的规范化文档明确的质量评价标准明确的质量评价标准三、软件工程方法学方法工具过程2022-8-6软件工程层次图:软件工程层次图:管理:管理:支持软件工程的根基在于对质量的关注。过程:过程:过程将技术层结合在一起,使计算机软件合理并及时开发出来。方法:方法:涵盖一系列的任务:分析、设计、编程、测试和维护
14、。工具:工具:对过程、方法提供自动或半自动的支持。例:CASE软件工程环境。工具(工具(CASE)方法(任务)方法(任务)过程(构建框架)过程(构建框架)质量管理(基础)质量管理(基础)计算机辅助软件工程。集成了软件、硬件和一个软件工程数据库(仓库),形成了软件工程环境。2022-8-6软件工程的一般视图:软件工程的一般视图:软件工程完成对技术实体(计算机软件)的分析、设计、建造、验证和管理。软件工程必须回答的问题:n要解决的问题是什么?n实体有哪些特点?n如何实现?n如何建造?n如何及时发现错误?n如何维护?2022-8-6软件工程方法学的分类l传统方法学 生命周期方法学(结构化范型)采用结
15、构化技术完成软件开发的各项任务l面向对象方法学 面向对象方法对象类继承用消息通信2022-8-6软件生命周期软件生命周期(life cycle)什么是软件生命周期?软件孕育、诞生、成长、成熟、软件孕育、诞生、成长、成熟、衰亡的生存过程。衰亡的生存过程。为什么要研究软件生命周期?!生命周期的全过程决定了软件工程的任务。!生命周期的全过程决定了软件工程的任务。生命周期的三个组成部分:软件定义、软件开发、软件运行与维护。生命周期的六个步骤:制定计划、需求分析、设计、程序编码、测试及运行维护。2022-8-6为什么称为软件生命周期?为什么称为软件生命周期?人的生命周期费用贡献软件生命周期费用效益202
16、2-8-6小结:小结:什么是软件危机?解决软件危机的途径?软件危机是指在计算机软件的开发和维护过软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重的问题程中所遇到的一系列严重的问题;软件工程化软件工程化 软件生命周期都有几部分组成?软件定义、软件开发和软件维护软件定义、软件开发和软件维护 几个重要的概念:几个重要的概念:软件工程、软件危机、软件生命周期软件工程、软件危机、软件生命周期2022-8-6作业:作业:、课后练习中的第一题和第三题、讨论作业:假设你们是某软件公司的项目经理和系统架构师,现在得到了北京石油化工学院几个部门的软件招标信息:一、图书馆管理系统;二、学生选课系统;三、
17、人事管理系统;四、校医院的收费系统。老板要求你在四个系统中任选一个写项目申请书。(可以几位同学一组,下一节课每一组派一位或多位代表讲申请书)2022-8-6 申请书包括的内容、问题定义项目的目的和意义。、工程目标系统应解决的问题。、系统的主要功能及特色、可行性分析(经济和技术)经济可行性和技术可行性。2022-8-6第二章 软件过程l 软件生命周期的基本任务软件生命周期的基本任务l 软件设计模型软件设计模型2022-8-6一、软件生命周期的基本任务l问题定义 “要解决什么问题?”l可行性研究 “上一个阶段所确定的问题是否有行得通的解决办法”目的:用最小的代价在尽可能短的时间内确定问题是否能够解
18、决2022-8-6l需求分析 “系统必须做什么”对待开发软件提出的需求进行分析并给出详细的定义 编写软件需求规格说明书 提交管理机构评审2022-8-6概要设计 把各项需求转换成软件的体系结构。结构中每一组成部分都是意义明确的模块,每个模块都和某些需求相对应详细设计 对每个模块要完成的工作进行具体的描述,为源程序编写打下基础编写设计说明书,提交评审。2022-8-6编码 把软件设计转换成计算机可以接受的程序代码,即写成以某一种特定程序设计语言表示的“源程序清单”写出的程序应当是结构良好、清晰易读的,且与设计相一致的2022-8-6软件测试单元测试:查找各模块在功能和结构上存在的问题并加以纠正组
19、装测试:将已测试过的模块按一定顺序组装起来按规定的各项需求,逐项进行有效性测试,决定已开发的软件是否合格,能否交付用户使用2022-8-6软件维护改正性维护改正性维护:运行中发现了软件中的错误需要修正适应性维护:适应性维护:为了适应变化了的软件工作环境,需做适当变更完善性维护:完善性维护:为了增强软件的功能需做变更2022-8-6 共 43 页 第47页 2.2 GB8566-88将软件生命周期划分为8个阶段问题定义可行性研究概要设计详细设计2022-8-6实际瀑布模型实际瀑布模型特点:特点:阶段间具有顺序性和依赖性阶段间具有顺序性和依赖性推迟实现的观点(逻辑设计推迟实现的观点(逻辑设计与物理
20、设计分开)与物理设计分开)质量保证观点质量保证观点线性顺序2022-8-62.3快速原型模型用于最终系统的早期用户评价。特点:开发工期短;质量有保证;风险最低听取用听取用户意见户意见建造建造/修改修改 原型原型用户测试用户测试运行原型运行原型2022-8-62.4增量模型 先完成一个系统子集的开发,再按同样先完成一个系统子集的开发,再按同样的开发步骤增加功能的开发步骤增加功能(系统子集系统子集),如此递如此递增下去直至满足全部系统需求。增下去直至满足全部系统需求。系统的总体设计在初始子集设计阶段就应系统的总体设计在初始子集设计阶段就应作出设想作出设想 2022-8-62.5螺旋模型l基本思想:
21、使用原型及其他方法尽量降基本思想:使用原型及其他方法尽量降低风险(每个阶段前都增加了风险分低风险(每个阶段前都增加了风险分析)。析)。l适应:大规模软件适应:大规模软件 利于已有软件的重用利于已有软件的重用 减少过多的测试带来的风险减少过多的测试带来的风险 维护和开发没有本质的区别维护和开发没有本质的区别优点:2022-8-6 将原型的迭代特征与线性顺序模型中控制的将原型的迭代特征与线性顺序模型中控制的和系统化的方法结合起来。和系统化的方法结合起来。2022-8-62.6喷泉模型l迭代迭代w重复重复w演进演进w无间隙无间隙w各阶段间无明显界限各阶段间无明显界限2022-8-62022-8-62
22、.7 Rational统一过程(rational unified process,RUP)wRational公司推出的一个软件开发过程框架,指团队可以根据具体的项目组或软件开发企业的不同需求,能够定义、配置、定制和实施一致的软件开发过程。w核心元素:1、用于成功开发软件的一组基本观念和原则 2、一套关于可重用方法内容和过程 3、基础的方法和过程定义语言2022-8-62.7.1 最佳实践w软件开发是一项团队活动,理想情况下通过团队的默契合作,完成贯穿软件生命周期的各阶段。w最佳实践 1、迭代式开发 2、管理需求(使用用例和脚本)3、使用基于组件的架构(组件是功能清晰的模块或子系统)4、可视化建
23、模(通常建立问题模型的方法)5、验证软件质量(贯穿于整个的开发过程)6、控制软件变更(管理变更的能力)2022-8-62.7.2 RUP的十大要素w(1)前景:制定前景 关键术语、解决什么问题、谁是干系人和用户、产品特性、功能性和非功能性需求、设计约束w(2)计划:按计划管理 software development plan,SDP综合了管理项目所需的各种信息。“计划并不重要,重要的是实施计划”。计划、风险、业务案例、架构以及控制变更是管理流程的要点w(3)风险:降低风险并跟踪相关问题(识别风险)w(4)业务案例:检验业务案例 从业务立场提供了确定该项目是否值得投资的必要信息。w(5)架构:
24、设计组件架构 指一个系统关键部件的组织或结构,组件之间通过接口交互,而组件是由一些更小的组件和接口组成的。2022-8-62.7.2 RUP的十大要素w(6)原型:增量地构建和测试产品w(7)评估:定期评估结果w(8)变更请求:管理并控制变更w(9)用户支持:部署可用的产品w(10)过程:采用适合项目的过程2022-8-62.7.3 RUP生命周期w核心工作流(前6个核心过程工作流程,后3个核心支持工作流程)2022-8-62.7.3 RUP生命周期w工作阶段wRUP迭代式开发2022-8-62.8 敏捷过程与极限编程w2.8.1 敏捷过程概述w“个体和交互”胜过“过程和工具”w“可以使用的软
25、件”胜过“面面俱到的文档”w“客户合作”胜过“合同谈判”w“相应变化”胜过“遵循计划”2022-8-6 “极限”的含义是把好的开发实践运用到极致。广泛应用于需求模糊且经常改变的场合。2.8.2 极限编程(extreme programming,XP)2022-8-62.9 能力成熟度模型w能力成熟度模型(capability maturity model,CMM)并不是一个软件生命周期模型,而是改进软件过程的一种策略,与实际使用的过程模型无关。w基本思想:因为问题是由管理软件过程的方法不当引起的,所以新软件技术的运用并不会自动提高生产率和软件质量。能力成熟度模型有助于软件开发组织建立一个有规律的、成熟的软件过程。改进后的过程将开发出质量更好的软件,使更多的软件项目免受时间和费用超支之苦。2022-8-6CMM结构2.9.1 能力成熟度模型结构2022-8-62.9.2 能力成熟度等级2022-8-6作业:作业:结合思考题阅读教材第一、二章结合思考题阅读教材第一、二章