1、第1章 软件工程学概述,1. 软件与程序 2. 计算机系统发展史3. 软件危机 4. 软件工程 5. 软件生命周期 6. 软件过程,一、软件与程序,1.“软件”这个词已广为所知 What: 什么东西没有软件?Where:哪里没有软件?When: 什么时候不用软件? Why: 怎么能够不用软件?Who: 谁能不用软件?,一、软件与程序,2.感性认识“软件”Window XP、腾讯QQ、暴风影音、疯狂的小鸟、手机中的软件是计算机上运行的程序-编写程序很重要,一、软件与程序,3.“程序”一个最简单的C程序一个画图程序操作系统 Windows,#include int main( ) printf(“
2、Welcome to Software Institute!n”);return 0; ,一、软件与程序,3.“程序”的变化趋势规模越来越大逻辑越来越复杂编写者与使用者分离 -出现了用户和开发者、出现了分工各方需要有效沟通 先理解再构造编写程序不是唯一工作 产品不能称为程序,软件是播撒梦想和收获噩梦的地方, 是一片恶魔与神仙相竞争的抽象而神秘的沼泽, 是一个人狼与银弹共存的矛盾世界。 ,一、软件与程序,4.“软件”不等于“程序”几个错误的观念软件就是程序软件开发就是编程序软件开发是一项工程软件工程的由来,没有“银弹” 没有任何一种单纯的技术或管理上的进步,能够独立地承诺在十年内大幅度地提高软件
3、的生产率、可靠性和简洁性。Frederick P. Brooks,二、计算机系统发展史,1. 程序设计阶段2. “软件=程序+文档”阶段3. 软件工程阶段4. 第四代技术阶段 -软件形态的变化、软件危机的产生、软件工程的提出,二、计算机系统发展史,1.程序设计阶段20世纪40年代中期-60年代中期无计划、具体应用、规模小、易编写、无方法、编用一人、无文档、个体化、数值计算-个体化时代软件形态:软件 = 程序,二、计算机系统发展史,2.“软件=程序+文档”阶段60年代中期-70年代中期集成电路技术、多道程序、多用户系统、人机交互、编用分离、实时系统、在线存储、第一代DBMS-作坊式时代软件形态:
4、软件 = 程序 + 文档,二、计算机系统发展史,2.“软件=程序+文档”阶段软件使用广泛、难以维护(存在费用和时间问题)、质量低下-软件危机、软件工程 1968年,北大西洋公约组织(NATO)在联邦德国召开国际会议,讨论软件危机问题,正式提出了“软件工程(SE)”的术语。SE:Software Engineering NATO:North Atlantic Treaty Organization,二、计算机系统发展史,3.软件工程阶段70年代中期-90年代大规模集成电路技术、数据库技术的成熟、分布式系统、计算机网络、即时访问、微处理器、PC、计算机大众化、应用于工业界和学术界-软件工程时代软件
5、形态:软件 = 程序 + 文档 + 数据,二、计算机系统发展史,3.软件工程阶段美国当时的统计数据表明:软件投资占软硬件总投资的70%到1985年,软件成本大约占90%-软件危机仍困扰着我们 应对措施:把软件作为一种产品进行批量生产运用工程学的原理和方法软件开发技术的进步软件形态:软件 = 构件 ,二、计算机系统发展史,4.第四代技术阶段90年代至今桌面系统、GUI、Internet、C/S、B/S、信息共享、应用于各个角落、4GT、4GL、多媒体、CASE、虚拟现实、网格计算、计算机文化、社会与道德-信息产业(IT)时代软件形态:软件 = 构件 + 体系结构、模型 + 体系结构,Evolut
6、ion of software 早期 第二阶段 第三阶段 第四阶段 面向批处理 多用户 分布式系统 强大的桌面系统 有限的分布 实时 嵌入“智能” 面向对象技术 自定义软件 数据库 低成本硬件 专家系统软件产品 消费者的影响 人工神经网络 并行计算 网络计算机,1950,1960,1970,1980,1990,2000,计算机系统的发展历程,软件结构的发展,指令,数值算法,数据结构,非数值算法,三种基本结构,模块,数据库结构,对象,构件,控制硬件,指令的有序结合,数据如何存储,不同的数据结构有不的算法,程序越来越大危机出现化解危机,高内聚低耦合,程序存储和数据存储分离,过程与数据耦合,将对象概
7、念化,体系结构,无结构,有结构,体系结构,软件的发展趋势,规模:越来越大复杂性:越来越复杂应用:越来越广泛能力:越来越大形态:越来越多样,不断变化存储:越来越分布重用:粒度越来越大使用:越来越方便体系结构越来越重要,50年代60年代 软件=程序 60年代 70年代 软件=程序+文档 70年代 80年代 软件=程序+文档+数据 80年代 90年代 软件=构件 90年代 2000年 软件=构件+体系结构 现在 软件=网构+体系结构 未来(五年) 软件=模型+体系结构 面向过程的程序=算法+数据结构 面向对象的程序=对象+消息 面向构件的程序=构件+体系结构 软件定义的变化说明了软件形态的变化。,软
8、件形态的变化,Internet环境及其应用: 基础平台的开放性、动态性和多变性 共享资源的多样性(信息、计算、服务) 产业模式的服务化,Internet平台和环境的出现, 对软件形态 技术发展 理论研究 提供了新的契机 提出了新的问题,未来软件基本形态,未来软件基本形态,未来软件主要特征,具有这些新特征的未来软件形态我们称之为 网构软件,未来软件主要特征,网构软件是Internet开放、动态和多变环境下软件系统基本形态的一种抽象既是传统软件结构的自然延伸又具有区别于传统软件形态的独有的基本特征,网构软件 Internetware,1. 什么是危机出大问题了例子:金融危机、经济危机、婚姻危机2.
9、 什么是软件危机 (software crisis)软件出大问题了,三、软件危机,3. 软件危机的概念软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。 即:“两低一高” 问题,三、软件危机,4. 软件危机主要表现1)开发成本和进度估计不准2)用户对“已完成的”软件系统不满意3)软件质量往往靠不住4)软件常常是不可维护的5)软件通常没有适当的文档资料6)软件成本逐年上升7)软件开发生产率滞后于硬件和计算机应用普及的趋势,三、软件危机,5. 产生软件危机的原因1)与软件本身的特点有关2)和软件开发与维护的方法不正确有关,三、软件危机,1)软件本身的特点软件不同于硬件,是逻辑部件而
10、不是物理部件缺乏可见性难于测试管理和控制开发过程困难不会因使用时间过长而被“用坏”难以维护软件不同于一般程序,规模庞大,而且程序复杂性随着程序规模的增加而呈指数上升,三、软件危机,软件的特点,(1)软件是无形的(intangible)比其他工程产品更加不可捉摸。你无法感觉软件产品的形状,它的设计也难以直观表示。因此确定软件产品的质量或者估计其开发的工作量是非常困难的。这就是人们总是低估系统开发时间的一个原因。,(2)软件副本的大批量生产轻而易举 绝大多数其他类型的工程师非常关心每一个部件耗费的成本与劳动量。换句话说,对于有形产品,设计完成之后的制作过程往往是代价昂贵的部分。与之相反,软件产品能
11、通过网络下载或制作CD以极低的成本进行复制。因此,几乎全部的软件成本都存在于它的开发过程中,而不是制造过程中。,软件的特性,软件的特性,(3)软件业是劳动密集型的 通过使用机器,制造业与建筑业的许多领域已经实现了自动化;因此其他工程分支可以用更少的劳动量生产出更多的产品。但是,使软件的设计与编程完全实现自动化,需要真正“智能”的机器。目前这个方向上的尝试离成功还很遥远。,软件的特性,(4)一个没有经过充分训练的软件开发人员很容易编写出难以理解和修改的软件 编程新手可以创建复杂的系统完成有用的功能,但它的设计却可能极其紊乱。其他工程领域也可能产生不良的设计,但是这些缺陷通常比较容易发现,因为它们
12、不会隐藏在上千页的源代码中。例如,如果土木工程师设计了一座不安全的桥梁,审查人员一般会比较容易地发现设计中的缺陷,因为他们清楚地知道在每张图纸和每次计算中应当寻找什么。,软件的特性,(5)软件本身很容易修改但由于它的复杂性,又很难正确地修改 人们总是试图在尚未完全了解软件的时候就去修改它,而这些修改又会带来新的错误。,软件的特性,(6)软件不像其他的工业产品那样会因使用而磨损,随着反复修改,它的设计会逐渐退化上一点提到,对软件的修改很容易引入新的缺陷,因此修改过的软件从设计角度讲容易变差。随着时间的流逝,软件后续版本的设计可能会表现出严重的退化,这时就需要完全重新设计了。,2)软件开发与维护的
13、方法不正确对软件开发和维护有关的错误认识和作法忽视软件需求分析的重要性认为软件开发就是写程序轻视软件维护 对软件开发过程与方法的认识与应用软件开发要经历一个漫长的时期(编程占10-20%)程序仅是完成软件配置的一个组成部分软件开发方法要有利于软件维护,三、软件危机,6. 消除软件危机的途径1)对计算机软件的正确认识2)认识到软件开发不是个体劳动的神秘技巧,而是一种组织良好、管理严密、各类人员协同配合、共同完成的工程项目3)推广使用成功的软件开发技术和方法4)开发和使用更好的软件开发工具总之:为了消除软件危机,既要有技术措施(方法和工具),又要有必要的组织管理措施。,三、软件危机,对“工程 (e
14、ngineering) ”的理解:大事情, 施工的过程, 工程学科。大事情:大的、复杂的、由众多的人共同完成的。如建筑工程、三峡工程、航天工程。,四、软件工程,构建一个小狗屋,可以由一个人制造 需求:最小模型简单的过程简单的工具,构造一栋房屋,由一个团体建设,并且需要更高的效率、更精确的时间限制 需求模型良好定义的过程功能强大的工具,构建一个高层建筑,早期的结构,过程有限的理论知识,现代的结构,进步- 先进的原材料和 先进的分析 范围- Pantheon的五倍范围 Cheops的3倍高度,1.对“工程”的理解:大事情,施工的过程,工程学科。施工的过程: 分析设计 实现 维护,是啥,要啥,啥样,
15、理解,搞清楚,弄明白,做啥,怎么做,用什么做(工具、技术),谁作,什么时候做,开始做: 做得怎么样?,持久使用:维修,四、软件工程,1.对“工程”的理解:大事情,施工的过程,工程学科。 工程学科的简称。文、理、法、医、农、工 计算机工程、化学工程、机械工程、电子工程 ,四、软件工程,四、 软件工程,经典定义:软件 = 程序 + 文档 + 数据,Software is a set of items or objects that form a “configuration” that includes programs documents data .,软件的概念,软件的概念软件是计算机程序及其
16、有关的数据和文档的完整集合。计算机程序是能够完成功能的可执行的指令序列数据是程序能适当处理的信息,具有适当的数据结构软件文档是开发、使用和维护程序所需要的图文资料,四、 软件工程,软件文档的概念软件文档:software documentation以人们可读的形式出现的技术数据和信息。描述和规定软件的设计细节说明软件具备的能力为使用该软件以便从软件系统得到所期望的结果提供操作指令,四、 软件工程,软件文档的概念,四、 软件工程,流行定义:软件=指令集合+数据结构+描述信息,软件是: (1)指令的集合(计算机程序),通过执行这些指令可以满足预期的特征、功能和性能需求; (2)数据结构:使得程序可
17、以合理利用信息; (3)软件描述信息:它以硬拷贝和虚拟形式存在,用来描述程序操作和使用。,软件工程的概念概括地说,软件工程是指导计算机软件开发和维护的工程学科。采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它,这就是软件工程。目标:项目成功(BFC),四、 软件工程,四、 软件工程,软件工程的本质特征(1)软件工程关注于大型程序的构造(2)软件工程的中心课题是控制复杂性(3)软件经常变化(4)开发软件的效率非常重要(5)和谐地合作是开发软件的关键(6)软件必须有效地支持它的用户
18、(7)在软件工程领域中通常由具有一种文化背景的人替具有另一种文化背景的人创造产品,四、 软件工程,软件工程的基本原理(1)用分阶段的生命周期计划进行严格管理 (2)坚持进行阶段评审 (3)实行严格的产品控制 (4)采用现代程序设计技术 (5)结果应能清楚地审查 (6)开发小组的人员应该少而精 (7)承认不断改进软件工程实践的必要性,软件工程方法学通常把在软件生命周期全过程中使用的一整套技术的集合称为方法学(methodology),也称为范型(paradigm)。在软件工程范畴中,这两个词的含义基本相同。,四、 软件工程,软件工程方法学软件工程方法学三要素,这就是方法、工具和过程。其中:方法是
19、完成软件开发任务的技术方法,回答“如何做”的问题;工具是为方法的运用提供自动的或半自动的软件支撑环境;过程规定了完成各项任务的工作阶段、工作内容、产品、验收的步骤和完成准则。,四、 软件工程,软件工程:一种层次化技术,工具,方法,过程,质量焦点,Software engineering layers,软件工程三要素:方法、工具、过程,软件工程方法学传统方法学(结构化方法学):SA、SD、SP、ST 面向对象方法学:OOA、OOD、OOP、OOT,四、 软件工程,人月神话焦油坑,史前史中,没有别的场景比巨兽在焦油坑中垂死挣扎的场面更令人震撼。上帝见证着恐龙、猛犸象、剑齿虎在焦油中挣扎。它们挣扎得
20、越是猛烈,焦油纠缠得越紧,没有任何猛兽足够强壮或具有足够的技巧,能够挣脱束缚,它们最后都沉到了坑底。,周期(Cycle):起点-终点-(起点)的循环. 生命周期(Life Cycle):诞生-成长-死亡的时期 人:出生-婴儿-少年-青年-中年-老年-死亡,五、软件生命周期, 概括地说,软件生命周期由软件定义、软件开发、和运行维护三个时期组成,每个时期又可进一步划分成若干个阶段。(三个时期八个阶段),五、软件生命周期,各个阶段的基本任务 (1).问题定义(2).可行性研究(3).需求分析 (4).概要设计(5).详细设计 (6).编码和单元测试(7).综合测试(8).软件维护,五、软件生命周期,
21、5.各个阶段的基本任务 (1).问题定义问题定义阶段必须回答的关键问题是:“要解决的问题是什么”。,客户 customer,确认,起草,5.各个阶段的基本任务 (2).可行性研究这个阶段要回答的关键问题是:“上一个阶段所确定的问题是否有行得通的解决办法”。在最短的时间内确定问题是否有解、是否可解、是否值得解。在技术、经济、法律、社会、可操作性方面进行可行性研究。可选的方案、最佳的方案、初步的计划和预算。,5.各个阶段的基本任务 (2).可行性研究,5.各个阶段的基本任务 (3).需求分析这个阶段的任务仍然不是具体地解决客户的问题,而是准确地回答“目标系统必须做什么”这个问题。这个阶段的另外一项
22、重要任务,是用正式文档准确地记录对目标系统的需求,这份文档通常称为规格说明(specification) 。 需求获取是困难的。5个需求:功能、性能、数据、环境、将来需求规格说明书(requirement specification ),5.各个阶段的基本任务 (3)需求分析,5.各个阶段的基本任务 (4) 概要设计这个阶段的基本任务是,概括地回答“怎样实现目标系统?”这个问题。概要设计又称为初步设计、逻辑设计、高层设计或总体设计。,5.各个阶段的基本任务(5).详细设计详细设计阶段的任务就是把解法具体化,也就是回答“应该怎样具体地实现这个系统”这个关键问题。这个阶段的任务还不是编写程序,而是
23、设计出程序的详细规格说明。 也称:模块设计、物理设计、底层设计、过程设计、算法设计,5.各个阶段的基本任务 (6).编码和单元测试这个阶段的关键任务是写出正确的容易理解、容易维护的程序模块。,5.各个阶段的基本任务 (7).综合测试这个阶段的关键任务是通过各种类型的测试(及相应的调试)使软件达到预定的要求。,系统测试员 System tester,客户 customer,操作员 operator,5.各个阶段的基本任务 (8).软件维护维护阶段的关键任务是,通过各种必要的维护活动使系统持久地满足用户的需要。4类维护:改正性维护、适应性维护、完善性维护、预防性维护,维护工程师 Maintenan
24、ce engineer,操作员 operator,软件过程(PROCESS) ISO9000定义:把输入转化为输出的一组彼此相关的资源和活动。,过程(PROCESS) 资源 活动,输入,输出,?做豆浆的过程,六、 软件过程,软件过程(Software Process):是为了获得高质量软件所需要完成的一系列任务的框架(Framework),它规定了完成各项任务的工作步骤。 如:,需求阶段,分析阶段,设计阶段,实现阶段,任务: 获取需求 描述需求 验证需求,任务: 需求分析 需求建模 规格说明,任务: 编写代码 测试,任务: 结构设计 接口设计 过程设计 数据设计,在实际从事软件开发工作时,软件
25、规模、种类、开发环境及开发时使用的技术方法等因素,影响阶段的划分。生命周期模型规定了把生命周期划分成哪些阶段及各个阶段的执行顺序,因此称为软件周期模型也称为软件开发模型。,六、 软件过程,瀑布模型 (Waterfall),在20世纪80年代之前,瀑布模型一直是唯一被广泛采用的生命周期模型,现在它仍然是软件工程中应用得最广泛的过程模型。 特点:(1) 阶段间具有顺序性和依赖性 (2) 推迟实现的观点(3) 质量保证的观点,传统的瀑布模型 线性的,Tom Gilb: “假如你不积极地解决你项目中存在的风险,它们就会积极地解决掉你”瀑布方法会掩饰项目中真正的风险,当你太晚发现它们时已无济于事。,快速
26、原型模型Prototype,所谓快速原型是快速建立起来的可以在计算机上运行的程序,它所能完成的功能往往是最终产品能完成的功能的一个子集。,快速原型模型,快速原型模型,快速原型的本质是“快速”。开发人员应该尽可能快地建造出原型系统,以加速软件开发过程,节约软件开发成本。原型的用途是获知用户的真正需求,一旦需求确定了,原型将被抛弃。树:广度优先,增量模型 Incremental Models,增量模型也称为渐增模型。使用增量模型开发软件时,把软件产品作为一系列的增量构件来设计、编码、集成和测试。每个构件由多个相互作用的模块构成,并且能够完成特定的功能。使用增量模型时,第一个增量构件往往实现软件的基
27、本需求,提供最核心的功能。树:深度优先,增量模型,增量模型,迭代是软件开发过程中普遍存在的一种内在属性。经验表明,软件过程各个阶段之间的迭代或一个阶段内各个工作步骤之间的迭代,在面向对象范型中比在结构化范型中更常见。“喷泉”这个词体现了面向对象软件开发过程迭代和无缝的特性。为避免使用喷泉模型开发软件时开发过程过分无序,应该把一个线性过程(例如,快速原型模型或图2.8中的中心垂线)作为总目标。但是,同时也应该记住,面向对象范型本身要求经常对开发活动进行迭代或求精。,喷泉模型,喷泉模型,螺旋模型,软件开发几乎总要冒一定风险,因此,在软件开发过程中必须及时识别和分析风险,并且采取适当措施以消除或减少
28、风险的危害。螺旋模型的基本思想是,使用原型及其他方法来尽量降低风险。理解这种模型的一个简便方法,是把它看作在每个阶段之前都增加了风险分析过程的快速原型模型。完整的螺旋模型如图2.7所示。图中带箭头的点划线的长度代表当前累计的开发费用,螺线旋过的角度值代表开发进度。,螺旋模型,决定目标、 方案和限制,评价方案、 识别风险、 弱化风险,开发、验证、 下一级产品,计划下一阶段,集成 测试,统一过程,使用统一建模语言,采用用例驱动和架构有限的策略,使用迭代增量建造方法。,Rational统一过程,Rational 统一过程:Rational Unified Process, RUP 1、最佳实践 (1
29、)迭代式开发 (2)管理需求 (3)使用基于构件的体系结构 (4)可视化建模 (5)验证软件质量 (6)控制软件变更,Rational统一过程,Rational 统一过程:Rational Unified Process, RUP 1、最佳实践 (1)迭代式开发 应对需求的不断变化 符合人类认识问题的规律通过采用可验证的方法减少风险每个迭代过程以完成可执行版本结束,Rational统一过程,1、最佳实践 (2)管理需求 使用用例和脚本 给出了提取、组织功能性需求和约束条件的方法 (3)使用基于构件的体系结构 构件是功能清晰的模块或子系统 提供了使用现有的或新开发的构件定义体系结构的系统化方法
30、降低了软件开发的复杂性 提高了软件的重用率,Rational统一过程,1、最佳实践 (4)可视化建模 建模即建立模型 模型是为了理解事物而对事物作出的一种抽象,是对事物的一种无歧义的书面描述 与UML结合,建立软件系统的可视化模型 提高了管理软件复杂性的能力,Rational统一过程,1、最佳实践 (5)验证软件质量 软件质量评估是内建在贯穿于整个开发过程的、由全体成员参与的所有活动中 (6)控制软件变更 RUP描述了如何控制、跟踪和监控修改,Rational统一过程,2、RUP软件开发生命周期是一个二维的生命周期模型。,Rational统一过程,2、RUP软件开发生命周期 (1)核心工作流9
31、个核心工作流=6个核心过程工作流+3个核心支持工作流 业务建模 需求 分析与设计 实现 测试 部署 配置与变更管理 项目管理 环境,Rational统一过程,2、RUP软件开发生命周期 (2)工作阶段4个阶段 初始阶段 精化阶段 构建阶段 移交阶段 (3)RUP的思想用例驱动、架构为中心、迭代与增量,敏捷过程与极限编程,1、敏捷过程为了使软件开发团队具有高效工作和快速响应变化的能力,17位著名的软件专家于2001年2月联合起草了敏捷软件开发宣言。 (1)个体和交互胜过过程和工具 (2)可以工作的软件胜过面面俱到的文档 (3)客户合作胜过合同谈判 (4)响应变化胜过遵循计划,敏捷过程与极限编程,
32、2、极限编程极限编程:eXtreme Programming, XP 极限是指把好的开发实践运用到极致 极限编程是敏捷过程之一 应用于需求模糊且经常改变的场合,敏捷过程与极限编程,(1)极限编程的有效实践 客户作为开发团队的成员 使用用户素材 短交付周期 验收测试 结对编程 测试驱动开发 集体所有 持续集成 可持续的开发速度 开放的工作空间 及时调整计划 简单的设计 重构 使用隐喻,敏捷过程与极限编程,(2)极限编程的整体开发过程,敏捷过程与极限编程,(3)极限编程的迭代过程,微软过程,1、微软过程准则 项目计划应该兼顾未来的不确定因素 用有效的风险管理来减少不确定因素的影响 经常生成并快速地
33、测试软件的过渡版本,从而提高产品的稳定性和可预测性 采用快速循环、递进的开发过程 用创造性的工作来平衡产品特性和产品成本 项目进度表应该具有较高稳定性和权威性 使用小型项目组并发地完成开发工作 在项目早期把软件配置项基线化,项目后期则冻结产品 使用原型验证概念,对项目进行早期论证 把零缺陷作为追求的目标 里程碑评审会的目的是改进工作,切忌相互指责,微软过程,2、微软软件生命周期,微软过程,3、微软过程模型,小测验,1、谈谈你对软件的理解。 2、瀑布模型是文档驱动的模型,这既是它的优点,也是它的缺点,你如何理解? 3、造成软件复杂性的因素有哪些,谈谈你个人的理解。 4、习题1 第2题。 5、假设要求你开发一个软件,该软件的功能是把读入的浮点数开平方,所得到的结果应该精确到小数点后4位。一旦实现并测试完之后,该产品将被抛弃。你打算选用哪种软件生命周期模型?说明你的理由。 6、习题1第9题。, the END,