1、2018/7/22,计算机科学与工程学院,1,第一章 软件工程概述,1.1 软件的发展历史 1.2 软件工程与软件过程 1.3 软件开发的基本策略 1.4 软件的错误观点,2018/7/22,计算机科学与工程学院,2,1.1 软件和软件危机,早期阶段程序设计阶段 在计算机发展的早期阶段,人们认为计算机的主要用途是快速计算,软件编程简单,不存在什么系统化的方法,开发没有任何管理,程序的质量完全依赖于程序员个人的技巧。,一、发展历史,2018/7/22,计算机科学与工程学院,3,2. 第二阶段-程序系统阶段,从60年代中期到70年代末期 多用户系统引入了人机交互的新概念, 实时系统能够从多个源收集
2、、分析和转换数据,从而使得进程的控制和输出的产生是以毫秒而不是分钟来进行, 产生了第一代数据库管理系统 出现了软件产品和“软件作坊”的概念,设计人员开发程序不再像早期阶段那样只为自己的研究工作需要,而是为了用户更好地使用计算机。被开发的软件可以在较宽的范围内使用。主机、微机上的程序可以有数百上千的用户。 出现了“软件危机”问题。 采用“软件工程”的方法来解决“软件危机”问题。,2018/7/22,计算机科学与工程学院,4,3. 第三阶段软件工程阶段,1970年代中期-1980年代末期 分布式系统极大地提高了计算机系统的复杂性,网络的发展对软件开发提出了更高的要求, 特别是微处理器的出现和广泛应
3、用,孕育了一系列的智能产品。 软件开发技术的度量问题受到重视,最著名的有软件工作量估计COCOMO模型、软件过程改进模型CMM等。,CMMSoftware Capability Maturity Model软件能力成熟度模型,2018/7/22,计算机科学与工程学院,5,4. 第四阶段,强大的桌面系统和计算机网络迅速发展的时期 计算机体系结构由中央主机控制方式变为客户机/服务器方式 专家系统和人工智能软件进入了实际应用, 出现了并行计算和网络计算的研究, 面向对象技术在许多领域迅速取代了传统软件开发方法 软件从个性化的程序变为工程化的产品, 从“软件程序”发展为“软件程序数据文档”。软件的需求
4、成为软件发展的动力, 软件工作的考虑范围不再只顾及程序的编写,而是涉及到软件的整个生命周期。,2018/7/22,计算机科学与工程学院,6,软件的发展历史图,2018/7/22,计算机科学与工程学院,7,二、软件的概念和特点,1.软件的概念,有3层含义:(1)能够完成预定功能和性能的可执行指令(program); (2)使得程序能够适当地操作信息的数据结构(data); (3)描述程序的操作和使用的文档(document)。,2018/7/22,计算机科学与工程学院,8,(1)软件是逻辑的,而不是物理的产品。,(2)软件是由开发或工程化而形成的,没有明显的制造过程。软件成本集中于“开发”上,意
5、味着软件项目不能像硬件制造项目那样来管理。,(3)软件在运行和使用期间,不存在硬件那样的磨损和老化问题,但它存在退化问题,开发人员必须维护软件。,2.软件具有以下不同的特点:,2018/7/22,计算机科学与工程学院,9,硬件在生命初期具有较高的故障率,这些故障主要是由于设计或制造的缺陷造成的。当这些缺陷修正后,故障率在一段时期内会降低到一个稳定的曲线上。随着时间的推移,硬件构件由于种种原因受到不同程度的损害,故障率又升高了。也就是说,硬件已经开始磨损了。,硬件故障率的变化曲线,2018/7/22,计算机科学与工程学院,10,软件的生命初期隐藏的错误会使程序具有较高的故障率,理想的情况下当这些
6、错误改正后曲线便趋于平稳,但实际情况是随着这些修改有可能引入新的错误,从而使故障率曲线呈现图中所示的锯齿状。于是,软件的退化由于修改而发生了。,软件的故障率曲线,2018/7/22,计算机科学与工程学院,11,(4)大多数软件是自定的,而不是通过已有构件组装而成的。迄今为止,软件的开发尚未完全摆脱手工的方式。,(5)软件成本相当昂贵。,(6)软件本身是复杂的。 软件比任何其他人类制造的结构更复杂,甚至硬件的复杂性和软件相比也是微不足道的。软件本质上的复杂性是软件产品难以理解,影响软件过程的管理,并使维护过程十分复杂。,2018/7/22,计算机科学与工程学院,12,给出一个科学的、统一的、严格
7、的计算机软件分类标准是不现实的。但对软件的类型进行必要的划分,对于开发和维护软件是很有价值的。因此,有必要从不同角度对计算机软件做适当的分类。,三、软件的分类,2018/7/22,计算机科学与工程学院,13,1.按软件的功能进行划分:,系统软件:与硬件紧密结合的软件 操作系统 数据库管理系统 设备驱动程序 通信处理程序等,文本编辑程序 文件格式化程序 程序库系统 支持需求分析、设计、实现、测试和支持管理的软件,支撑软件:协助用户开发软件的工具性软件,2018/7/22,计算机科学与工程学院,14,商业数据处理软件 工程与科学计算软件 计算机辅助设计制造软件 系统仿真软件 智能产品嵌入软件 医疗
8、、制药软件 事务管理、办公自动化软件 计算机辅助教学软件,应用软件:为特定领域内、特定目的开发的软件,2018/7/22,计算机科学与工程学院,15,类别 参加人员数 研制期限 源程序行数 微型 1 14周 0.5k 小型 1 16月 1k2k 中型 25 12年 5k50k 大型 520 23年 50k100k 甚大型 1001000 45年 1M(=1000k) 极大型 20005000 510年 1M10M,2.按软件规模进行划分:,2018/7/22,计算机科学与工程学院,16,实时处理软件分时软件交互式软件批处理软件,3.按软件工作方式划分:,2018/7/22,计算机科学与工程学院
9、,17,4.按软件服务对象的范围划分:项目软件:受某个特定用户或机构的委托,在合同的约束下靠罚机构开发的软件。产品软件:软件开发机构开发出来直接提供给市场的。,2018/7/22,计算机科学与工程学院,18,四、软件危机,软件危机定义:软件在开发和维护过程中遇到的一 系列严重问题。软件危机包含两层含义: 如何开发软件 如何维护数量不断膨胀的已有软件,2018/7/22,计算机科学与工程学院,19,软件危机的表现软件危机爆发于20世纪60年代末期,虽然人们一直致力于发现解决危机的方法,但是软件危机至今依然困扰着我们,并没有一种方法可以解决。,软件危机的具体表现如下:(1)软件开发的进度难以控制,
10、经常出现经费超预算、完成期限一再拖延的现象。,2018/7/22,计算机科学与工程学院,20,(2)软件需求在开发初期不明确,导致矛盾在后期集中暴露,从而对整个开发过程带来灾难性的后果。,(3)由于缺乏完整规范的资料,加之软件测试不充分,从而造成软件质量低下,运行中出现大量问题。,(4)软件文档资料不完整、不合格,左图定性地描绘了在不同时期引入同一个变动需要付出的代价的变化趋势。,2018/7/22,计算机科学与工程学院,21,(5)软件的可维护性差程序中的错误难以改正,程序不能适应硬件环境的改变,不能应用户要求增加新的功能。(6)软件价格昂贵,软件成本在计算机系统总成本中所占的比例逐年上升,
11、2018/7/22,计算机科学与工程学院,22,2.危机的原因,用户对软件需求的描述不精确,可能有遗漏、有二义性、有错误,甚至在软件开发过程中,用户还提出修改软件功能、界面、支撑环境等方面的要求。软件开发人员对用户需求的理解与用户的本来愿望有差异,这种差异必然导致开发出来的软件产品与用户要求不一致。大型软件项目需要组织一定的人力共同完成,多数管理人员缺乏开发大型软件系统的经验,而多数软件开发人员又缺乏管理方面的经验。各类人员的信息交流不及时、不准确、有时还会产生误解。,2018/7/22,计算机科学与工程学院,23,软件项目开发人员不能有效地、独立自主地处理大型软件的全部关系和各个分支,因此容
12、易产生疏漏和错误。缺乏有力的方法和工具方面的支持,过分地依靠程序人员在软件开发过程中的技巧和创造性,加剧软件产品的个性化。,软件产品的特殊性和人智力的局限性,导致人们无力处理“复杂问题”。所谓“复杂问题”的概念是相对的,一旦人们采用先进的组织形式、开发方法和工具提高了软件的开发效率和能力,新的、更大的、更复杂的问题又摆在人们面前。,2018/7/22,计算机科学与工程学院,24,3.克服危机的途径1968年秋季,NATO(北约)的科技委员会召集了近50名一流的编程人员、计算机科学家和工业界巨头,讨论和制定摆脱“软件危机”的对策。由于认识到软件的设计、实现、维护和传统的工程规则有相同的基础,在那
13、次会议上首次提出了“软件工程”(software engineering)这个概念。,2018/7/22,计算机科学与工程学院,25,1983年,IEEE(Institute of Electrical & Electronic Engineers,电气与电子工程师协会)给出了一个全面的定义:,软件工程: 是研究和应用如何以系统化的、规范的、可度量的方法去开发、运行和维护软件,即把工程化应用到软件上。,一、软件工程的概念,1.2 软件工程,2018/7/22,计算机科学与工程学院,26,软件工程的根本在于提高软件的质量与生产率,最终实现软件的工业化生产。在“软件工程”的概念提出后的几十年里,各
14、种有关软件的技术、思想、方法和概念层出不穷,典型的包括结构化的方法、面向对象方法、软件开发模型和软件开发过程等,软件工程逐步发展为一门独立的科学。,2018/7/22,计算机科学与工程学院,27,软件工程是一种层次化的技术。包含了一个观点和三个要素,如下图:,2018/7/22,计算机科学与工程学院,28,软件工程过程:是进行一系列有组织的活动,从而能够合理和及时地开发出计算机软件。过程定义了技术方法的采用、工程产品(包括模型、文档、数据、报告、表格等)的产生、里程碑的建立、质量的保证和变更的管理。,三要素:,质量观点:,软件工程必须以有组织的质量保证为基础开发软件。,2018/7/22,计算
15、机科学与工程学院,29,软件工程方法:为软件开发提供“如何做”的技术。它包括了项目计划、需求分析、系统设计、程序实现、测试与维护等一系列的任务。 软件工程工具:为过程和方法提供自动的或半自动的支持。这些软件工具被集成起来,建立起一个支持软件开发的系统,称之为计算机辅助软件工程(CASE, Computer Aided Software Engineering)。CASE集成了软件、硬件和一个存放开发过程信息的软件工程数据库,形成了一个软件工程环境。,2018/7/22,计算机科学与工程学院,30,采用先进的软件工程方法,使质量、成本和生产率三者之间的关系达到最优的平衡状态。,二、软件工程学研究
16、的目标,软件开发成本较低;软件功能能够满足用户的需求;软件性能较好; 软件可靠性高; 软件易于使用、维护和移植; 能按时完成开发任务,并及时交付使用。,2018/7/22,计算机科学与工程学院,31,为了开发出高质量低成本的软件,在软件开发过程中必须遵循下列软件工程原则:,1.抽象(abstraction)抽取事物最基本的特性和行为,忽略非基本的细节。采用分层次抽象的办法可以控制软件开发过程的复杂性,有利于软件的可理解性和开发过程的管理。,三、软件工程学的原则,2018/7/22,计算机科学与工程学院,32,2.信息隐藏(information hiding)将模块中的软件设计决策封装起来的技
17、术。 按照信息隐藏的原则,系统中的模块应设计成“黑箱”,模块外部只能使用模块接口说明中给出的信息,如操作、数据类型等等。,3.模块化(modularity)使程序有许多个逻辑上相对独立的模块组成。模块(module)是程序中逻辑上相对独立的单元; 模块的大小要适中; 高内聚、低耦合。,2018/7/22,计算机科学与工程学院,33,4.一致性(consistency)整个软件系统(包括文档和程序)的各个模块均应使用一致的概念、符号和术语; 程序内部接口应保持一致; 软件与硬件接口应保持一致; 系统规格说明与系统行为应保持一致;实现一致性需要良好的软件设计工具(如数据字典、数据库、文档自动生成与
18、一致性检查工具等等)、设计方法和编码风格的支持。,2018/7/22,计算机科学与工程学院,34,软件生存周期:是指软件产品从考虑其概念开始到该软件产品交付使用,直至最终退役为止的整个过程,一般包括计划、分析、设计、实现、测试、集成、交付、维护等阶段。,四、软件生存周期,2018/7/22,计算机科学与工程学院,35,2018/7/22,计算机科学与工程学院,36,在实践中,软件开发并不总是按照计划、分析、设计、实现、测试、集成、交付、维护等顺序来执行的,即各个阶段是可以重叠交叉的。整个开发周期经常不是明显地划分为这些阶段,而是分析、设计、实现、再分析、再设计、再实现等迭代执行。,注意:,20
19、18/7/22,计算机科学与工程学院,37,1.计划阶段确定待开发系统的总体目标和范围 研究系统的可行性和可能的解决方案,对资源、成本及进度进行合理的估算。,软件生存周期的各个阶段主要任务:,2.分析阶段分析、整理和提炼所收集到的用户需求,建立完整的分析模型,将其编写成软件需求规格说明和初步的用户手册。,2018/7/22,计算机科学与工程学院,38,3.设计阶段(总体设计和详细设计)设计阶段的目标是决定软件怎么做;软件设计主要集中于软件体系结构、数据结构、用户界面和算法等方面。,4.实现阶段(编码)实现阶段是将所设计的各个模块编写成计算机可接受的程序代码。,2018/7/22,计算机科学与工
20、程学院,39,5.测试阶段 设计测试用例,对软件进行测试,发现错误,进行改正。,6.运行和维护阶段 维护应当在软件的设计和实现阶段充分考虑软件的可维护性。 维护阶段需要测试是否正确地实现了所要求的修改,并保证在产品的修改过程中,没有做其他无关的改动。 维护常常是软件生命周期中最具挑战性的一个阶段,其费用是相当昂贵的。,2018/7/22,计算机科学与工程学院,40,软件工程的主要环节包括人员管理和项目管理, 项目管理包括了需求分析、系统设计、程序设计、测试、维护等。,五、常见的软件开发模型,软件开发模型是对软件过程的建模,即用一定的流程将各个环节连接起来,并可用规范的方式操作全过程。,2018
21、/7/22,计算机科学与工程学院,41,1.边做边改模型(Build-and-Fix Model),直接根据需求编写程序,有错改写代码,直到用户满意为止。,其主要问题在于: (1) 缺少规划和设计环节,软件的结构随着不断的修改越来越糟,导致无法继续修改; (2) 忽略需求环节,给软件开发带来很大的风险; (3) 没有考虑测试和程序的可维护性,也没有任何文档,软件的维护十分困难。,使用对象:具有几百行的小程序。,2018/7/22,计算机科学与工程学院,42,2.瀑布模型(Waterfall Model)1970年Winston Royce提出了著名的“瀑布模型“,直到20世纪80年代早期,它一
22、直是惟一被广泛采用的软件开发模型。,2018/7/22,计算机科学与工程学院,43,特点:1.自上而下、相互衔接的固定次序,如同瀑布流水,逐级下落。2.在瀑布模型中,软件开发的各项活动严格按照线性方式进行,当前活动接受上一项活动的工作结果,实施完成所需的工作内容。当前活动的工作结果需要进行验证,如果验证通过,则该结果作为下一项活动的输入,继续进行下一项活动,否则返回修改。 3.瀑布模型强调文档的作用,并要求每个阶段都要仔细验证。,2018/7/22,计算机科学与工程学院,44,但是,这种模型的线性过程太理想化,已不再适合现代的软件开发模式,其主要问题在于:(1)各个阶段的划分完全固定,阶段之间
23、产生大量的文档,极大地增加了工作量; (2)由于开发模型是线性的,用户只有等到整个过程的末期才能见到开发成果,从而增加了开发的风险; (3)早期的错误可能要等到开发后期的测试阶段才能发现,进而带来严重的后果。,2018/7/22,计算机科学与工程学院,45,3.快速原型模型(Rapid Prototype Model)第一步是建造一个快速原型(样板),实现客户或未来的用户与系统的交互,用户或客户对原型进行评价,进一步细化待开发软件的需求。逐步调整原型使其满足客户的需求。第二步则在第一步的基础上开发客户满意的软件产品。,该方法可以克服瀑布模型的缺点,减少由于软件需求不明确带来的开发风险,具有显著
24、的效果。使用该方法一旦确定了客户的真正需求,所建造的原型将被丢弃。原型系统的内部结构并不重要,重要的是必须迅速建立原型,随之迅速修改原型,以反映客户的需求。,2018/7/22,计算机科学与工程学院,46,4.增量模型(Incremental Model),增量模型也称为渐增模型,它分批地逐步向用户提交产品,每次提交一个满足用户需求子集的可运行的产品。,2018/7/22,计算机科学与工程学院,47,使用增量模型开发软件时,把软件产品作为一系列的增量构件来设计、编码、集成和测试。 每个构件由多个相互作用的模块构成,并且能够完成特定的功能。 使用增量模型时,第一个增量构件往往实现软件的基本需求,
25、提供最核心的功能。 例如,使用增量模型开发文字处理软件时,第一个增量构件可能提供基本的文件管理、编辑和文档生成功能;第二个增量构件提供更完善的编辑和文档生成功能;第三个增量构件实现拼写和语法检查功能;第四个增量构件完成高级的页面排版功能。 把软件产品分解成增量构件时,应该使构件的规模适中,规模过大或过小都不好。 最佳分解方法因软件产品特点和开发人员的习惯而异。分解时惟一必须遵守的约束条件是,当把新构件集成到现有软件中时,所形成的产品必须是可测试的,必须不破坏原来已经开发出的产品。,2018/7/22,计算机科学与工程学院,48,5.螺旋模型(Spiral Model),1988年,Barry
26、Boehm正式发表了软件系统开发的“螺旋模型”,它将瀑布模型和快速原型模型结合起来 强调风险分析,特别适合于大型复杂的系统。,螺旋模型沿着螺线进行若干次迭代,图中的四个象限代表了以下活动: (1)制定计划:确定软件目标,选定实施方案,弄清项目开发的限制条件; (2)风险分析:分析评估所选方案,考虑如何识别和消除风险; (3)实施工程:实施软件开发和验证; (4)客户评估:评价开发工作,提出修正建议,制定下一步计划。,2018/7/22,计算机科学与工程学院,49,2018/7/22,计算机科学与工程学院,50,螺旋模型也有一定的限制条件,具体如下:(1) 如果执行风险分析将大大影响项目的利润,
27、那么进行风险分析毫无意义,因此,螺旋模型只适合于大规模软件项目。(2) 只有在开发人员具有风险分析和排除风险的经验及专门知识时,使用这种模型才会获得成功。,2018/7/22,计算机科学与工程学院,51,6. 喷泉模型,适用于面向对象方法。 主张分析和设计过程的重叠、不严格区分。 模块集成过程:反复经过分析、设计、测试、集成,再分析、设计、测试、集成。,2018/7/22,计算机科学与工程学院,52,7.RUP(统一过程),RUP(Rational Unified Process)使用UML; 采用用例驱动和架构优先的策略; 采用迭代增量建造方法。,实际中不同的软件开发方法使用不同的开发模型:
28、通常,结构化方法可使用瀑布模型、增量模型和螺旋模型进行开发; 面向数据结构方法可使用瀑布模型、增量模型进行开发; 面向对象方法可采用快速原型、喷泉模型、软件重用开发模型和统一过程RUP进行开发。,2018/7/22,计算机科学与工程学院,53,软件开发中的3种基本策略:,1.3 软件开发的基本策略,一、复用(重用) 复用就是利用某些已开发的、对建立新系统有用的软件元素来生成新的软件系统。,软构件(Software Component):具有一定集成度并可以重复使用的软件组成单元。 软件复用就是直接使用已有的软构件,即可组装(或加以合理修改)成新的系统,而可以不必每次从零做起。,2018/7/2
29、2,计算机科学与工程学院,54,优点:降低了软件的成本、提高了生产率而且新系统也具有较高的质量。,使用构件开发软件的过程:,2018/7/22,计算机科学与工程学院,55,二、 分而治之,分而治之是指把大而复杂的问题分解成若干个简单的小问题,然后逐个解决。诸如软件的体系结构设计、模块化设计都是分而治之的具体表现。,2018/7/22,计算机科学与工程学院,56,优化工作是十分复杂的,有时很难实现所有目标的优化,这时就需要“折中”策略。软件的折衷策略是指通过协调各个质量因素,实现整体质量的最优。 软件折中的重要原则是不能使某一方损失关键的职能,更不可以象“舍鱼而取熊掌”那样抛弃一方。,优化:为了
30、提高软件质量,程序员会不断改进软件中的算法,数据结构和程序组织。,三、优化与折中,2018/7/22,计算机科学与工程学院,57,观点之一: 我们拥有一套讲述如何开发软件的书籍,书中充满了标准与示例,可以帮助我们解决软件开发中遇到的任何问题。,1.4 软件的错误观点,观点之二:如果我们已经落后于计划,可以增加更多的程序员来赶上进度。,观点之三:项目需求总是在不断变化,但这些变化能够很容易地满足,因为软件是灵活的。,2018/7/22,计算机科学与工程学院,58,观点之四:有了对目标的一般描述就可以开始写程序了,我们以后可以再补充细节。,观点之五:一旦我们写出了程序并使其正常运行,我们的工作就结束了。人们有时认为,只有差的软件产品才需要维护。如下图:,观点之六:一个成功的项目惟一应该提交的就是运行程序。 软件包括程序、数据和文档,其中文档是成功开发的基础,为软件维护提供了指导。,2018/7/22,计算机科学与工程学院,59,软件开发的各阶段的成本比例,