软件工程第1章软件工程概述本章要点:软件工程产生的原因软件工程的基本原理软件工程方法学和面向对象方法学基本原理软件过程软件工程有关工具和环境软件工程本章学习目标:了解软件工程产生的原因掌握软件工程的基本原理了解软件工程方法学和面向对象方法学基本原理了解软件过程了解软件工程有关工具和环境软件工程§1.1软件工程的产生一、软件发展经历了三个阶段:1、程序设计时代(1946-1956年)采用“个体生产方式”2、程序系统时代(1956-1968年)随着软件规模的扩大,个体生产已经不能够满足软件生产的需要,一个软件需要由几个人协同完成,采用“生产作坊方式”,随着软件需求量、规模及复杂度的增大,生产作坊的方式已经不能够适应软件生产的需要,出现所谓“软件危机”。软件工程主要表现在两个方面:(1)软件产品质量低劣,甚至开发过程就夭折。(2)软件生产率低,不能满足需要。“软件危机”产生的原因“软件危机”(Softwarecrisis)的出现是由于软件的规模越来越大,复杂度不断增加,软件需求量增大。而软件开发过程是一种高密集度的脑力劳动,软件开发的模式及技术不能适应软件发展的需要。致使大量质量低劣的软件涌向市场,有的软件花费了大量人力财力,却在开发过程中就夭折。软件工程3、软件工程时代(1968年至今)为了克服软件危机,适应软件发展的需要,而采用“工程化的生产”方式。将工程学的某些原理和方法应用在软件的设计和开发中来软件工程研究的主要内容有以下两个方面:1、软件开发技术,它包括软件开发方法、技术和软件开发工具及环境、软件管理技术。2、软件规范(国际规范)包括:(1)软件开发技术(软件结构、开发方法、工具与软件工程环境、软件工程标准化)(2)软件工程管理(质量管理,软件工程经济学:成本估算,计划安排)软件工程研究的目标是“以较少的投资获取较高质量的软件”。软件工程§1.2软件工程及其基本原理一、软件工程的的定义软件工程是指导计算机软件开发和维护的工程学科。采用工程学的概念、原理、技术和方法,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来开发与维护软件。二、有关概念程序:为了使计算机实现预期的目的(如解某一算题或控制某一过程)而编排的一系列步骤称为程序。软件:计算机的程序加上该程序的各种规格书或文档。软件方法是以大型程序为研究对象的。相应文档是软件的核心之一。软件工程软件工程:生产软件的工程。研究软件工程的学问叫软件工程学(有时人们也把软件工程学简称为软件工程)。软件可靠性:软件在所给条件下和规定时间内,能完成所要求的功能的性质。软件可靠度:软件在所给条件下和规定时间中,能完成所要求功能的概率。软件工程软件工程的基本原理软件工程的七条基本原理:1.用分阶段的生命周期计划严格管理2.坚持进行阶段评审3.实行严格的产品控制4.采用现代程序设计技术5.结果应能清楚地审查6.开发小组的人员应该少而精7.承认不断改进软件工程实践的必要性软件工程§1.3软件生存期软件生存期又称软件生命周期,是指一个软件系统从目标提出到最后丢弃的整个过程。软件工程基本原理强调软件生命周期的阶段性,其基本思想是各阶段任务相对独立,具有明确的完成标志。阶段的划分使得人员分工职责清楚,项目进度控制和软件质量得到确认。原则上,前一阶段任务的完成是后一阶段工作的前提和基础;而后一阶段的任务则是对于前一阶段问题求解方法的具体化。软件工程生存期瀑布模型(目标与范围说明书)(需求说明书)(设计文档)(程序)(测试报告)(维护报告)(可行性论证报告)问题定义测试运行维护可行性分析需求分析设计编程设计时期开发时期运行时期图1.1软件生命周期的阶段划分软件工程一、问题定义问题定义阶段必须回答的关键问题是:“要解决的问题是什么?”二、可行性研究此阶段的任务不是具体解决问题,而是研究问题的范围,探索这个问题是否值得去解决,是否有可行的解决办法。三、需求分析这个阶段的任务,主要是确定目标系统必须具备哪些功能。软件工程四、总体设计这个阶段必须回答的关键问题是:“应该如何解决这个问题?”五、详细设计详细设计阶段的任务就是把解法具体化,设计出程序的详细规格说明,包括必要的细节,程序员可以根据它们写出实际的程序代码。六、编码和单元测试这个阶段的任务是程序员根据目标系统的性质和实际环境,选取一种适当的高级程序设计语言(必要时用汇编语言),把详细设计的结果翻译成用选定的语言书写的程序,并且仔细测试编写出的每一个模块。软件工程七、综合测试这个阶段的任务是通过各种类型的测试,使软件达到预定的要求。八、软件维护维护阶段的任务,是通过各种必要的维护活动使系统持久地满足用户的需要。软件工程§1.4软件工程方法学软件开发方法和技术可归纳为三大类:瀑布型模型、原型化模型和变换型。一、软件开发的瀑布型模型严格按照软件生命周期的阶段划分,顺序执行各阶段构成软件开发的瀑布型模型。瀑布模型的特点是:1.阶段间具有顺序性和依赖性顺序性要求每个阶段工作开始的前提是其上一阶段工作结束。因此前一阶段输出的文档就是其后一阶段的输入文档。依赖性是指各阶段工作正确性依赖与上一阶段工作的正确性。软件工程2.推迟实现的观点编码开始的越早,项目完成的时间很可能越长。这是因为过早进入编码往往意味着大量的返工。3.质量保证的观点为保证软件开发质量,瀑布型模型在生命周期的各阶段强调:第一,制作规定的文档是各阶段完成的里程碑,没有交出合格的文档也就没有完成该阶段的任务。第二,每个阶段结束之前都必须对完成的文档进行评审,以便及早发现问题,改正错误。软件工程二、原型化开发模型瀑布型模型的缺陷在于软件开发阶段推进是直线型的,工程实践说明这是一个“理想化”模型,不完全符合人们认识问题的规律。原型化开发方法。其主要思想是:先建立一个能够反映用户需求的原型系统(“样机”),使得用户和开发者可以对目标系统的概貌进行评价、判断。然后对原型进行若干轮反复的扩充、改进、求精,最终建立完全符合用户需求的目标系统。初始原型可以非常简单,它只实现未来系统的主要功能,系统主要模块之间的重要接口。初始原型主要用于向用户展示系统功能概貌。确认开发人员对系统主要功能的理解。对系统应该具备的功能的演示运行通常可以对用户与开发人员之间的沟通起到催化剂作用,确立用户对项目开发的信心。软件工程基于初始原型的评价可以建立实验性进化原型。实验性进化原型的建立是一个逐步迭代的增量过程,每次迭代的新版本应该具有更强的功能,更优的性能。当实验性进化原型得到最终确认以后,开发进入目标系统的实现阶段:将原型转换为完全符合系统运行环境要求的目标系统,并进行最终集成和验收测试。由原型转化为目标系统的途径有:(1)抛弃原型法:建立原型系统的目的主要是准确定义系统需求,严格验证方案设计。原型使用完毕后抛弃,然后在重新建立目标系统。应用抛弃原型法建立原型的过程相当于瀑布型模型的需求分析和总体设计过程。软件工程(2)演化原型法:目标系统是对实验性原型不断扩充、完善送代的结果。每次迭代都要求再分析、再设计、再实现以及再测试评价。当认为问题求解基本满意时就可以交付系统的初始版本了。演化原型法的实施要求用户和开发人员在一个相当长的时期中对信息交流和系统修改持一种开放的态度。许多面向市场的软件产品采用所谓β版发布,就是施行演化原型法开发的一种策略。软件工程原始用户需求初始原型快速生成评价∕确认实验性原型进化最终确认目标系统实现目标系统测试系统交付展示∕理解∕沟通补充∕确认∕优化软件工程三、变换型变换型开发方法是一种形式化软件开发方法。它从软件需求的形式化规格说明出发,经过一系列的程序变换,得到最终的程序系统。软件需求形式化规格说明,也往往经过原型检查和确认。如能保证形式化规格说明是正确的,在逐级变换中所使用的变换规则是保持正确性的变换规则,那么就可确认,变换最后所得到的程序系统一定是正确的。变换型开发方法必须有严格的数学理论和形式化技术的支持,目前这种开发方法尚处于研究和实验阶段。软件工程1.4.2面向对象方法面向对象方法学的基本思想是,在问题求解过程中,应该尽可能符合人类习惯的思维方式。软件开发的方法应该过程与人类认识世界解决问题习惯的方法与过程接近,也就是使描述问题的问题空间与问题求解的解空间在结构上尽可能一致。客观世界的问题都是由客观世界中的实体和实体之间的相互联系构成的。对象(Object)是客观世界中的实体在问题域中的抽象。软件工程对象的概念是抽象数据类型概念的发展。面向对象的方法的基本出发点是,将描述实体对象静态属性的数据与描述实体动态行为的操作统一为一个不可分割的整体。对象与传统数据类型的区别在于:(1)对象不是被动地等待外部对其施加操作。对象是进行操作的主体,通过消息发送请求对象主动地执行某些操作,处理其私有数据。软件工程面向对象的方法学可以概括为:面向对象的方法=对象+类+继承+消息通信(1)客观世界是由各种对象组成的。对象是可以分解的:复杂对象可以由比较简单的对象组合构成。因此面向对象的软件系统是若干对象的有机集合。(2)所有对象按其结构成分,可以划对分为各种对象类。(3)局部于一个对象的私有成分都被“封装”在对象内部,外部不能访问。对象之间仅能通过消息传递互相作用。软件工程面向对象方法的主要优点是:(1)使用现实世界的概念抽象地思考问题从而自然地解决问题。(2)保证软件系统的稳定性。(3)软件系统具有可重用性。(4)软件系统具有良好的可维护性。软件工程§1.5软件过程软件过程(SoftwareProcesses)也称为软件生存周期过程或软件过程组,是指软件生存周期中的一系列相关过程(Process)。过程就是活动的集合,活动是任务的集合,任务则起到把输入加工成输出的作用。活动的执行可以是顺序的、迭代的(重复的)、并行的、嵌套的或者是有条件地引发的。软件过程应当包含以下3个含义:·个体含义:即指软件或系统在生存周期中的某一类活动的集合,如获取过程、供应过程、开发过程、管理过程等。软件工程·整体含义:即指软件或系统在所有上述含义下的软件过程的总体。·工程含义:即指解决软件过程的工程,它应用软件工程的原则、方法来构造软件过程模型,并结合软件的具体要求进行例化,以及在用户环境中运作,以此进一步提高软件开发率、降低成本。工程含义还可以包含如下几个方面:(1)软件过程不仅要有工程视面,也要有合同视面(包括系统视面和用户视面)。(2)软件过程包含管理视面。软件工程(3)软件过程应包含运作视面。(4)不同角色由于其视面不同,所参与的软件过程亦不相同。2、软件过程的基本成分软件过程涉及软件生存周期中相关的过程与活动,其中“活动”是构成软件过栓的最基本的成分之一。此外,软件开发是由多人分工协作、并使用不同的硬件环境和软件环境来完成的,因此软件过程还包括支持人与人之间进行协调与通信的组织结构、资源及约束等因素。因而,过程活动、活动中所涉及的人员、软件产品、所用资源和各种约束条件是软件过程的基本成分。软件工程3、软件过程标准1995年8月1日,ISO/IEC经过多次讨论和修改后,正式发布了ISO/IEC12207第一版“信息技术软件生存周期过程”国际标准。我国则根据该草案于1995年颁布GB/T8566一1995《信息技术软件生存周期过程》国家标准;软件工程ISO/IEC12207国际标准集各种相关标准的优点于一体,把软件生存周期的各个过程分成三类,即主要生存周期过程、支持生存周期过程和组织的生存周期过程,软件人员可以根据具体的软件项目进行剪裁。主要生存周期过程包括:(1)获取过程:确定需方和组织向供方获取系统、软件或软件服务的活动。(2)供应过程:确定供方和组织向需方提供系统、软件或软件服务的活动。(3)开发过程:确定开发者和组织定义并开发软件的活动。软件工程(4)操作过程:确定操作者和组织在规定的环境中为其用户提供运行计算机系统服务的活动。(5)维护过程:确定维护者和组织提供维护软件服务的活动。支持生存周期过程包括8个过程,其目的是支持其他过程,作为其组成部分,它们有助于软件项目的成功和质量提