软件工程概述重庆大学计算机学院曾一email:zyjckxx@cqu.edu.cnTel:023-65102621(o)第1讲软件工程概述•1.1软件危机与软件工程的产生•1.2软件工程的基本概念•1.3软件工程研究的主要内容•1.4软件开发模型1.1软件危机与软件工程的产生1.1.1软件与软件的特点软件的定义:软件是能够完成预定功能和性能的可执行的计算机程序和使程序正常执行所需要的数据,加上描述程序的操作和使用的文档。简略地说:软件=程序+文档–程序程序按事先设计的功能和性能要求执行的指令序列。–数据数据是使程序能正常操纵信息的数据结构。–文档文档是与程序开发、维护和使用有关的图文资料。1.1.1软件与软件的特点软件的特点软件是一种逻辑实体,而不是具体的物理实体,它具有抽象性软件是“开发”出来的,不是“制造”出来的软件维护不同于硬件维修(参看硬件和软件失效率的对比图)软件的开发和运行常常受到计算机系统的限制,对计算机系统有着不同程度的依赖性软件的开发效率仍相当低,至今尚未完全摆脱手工作坊式的开发方式软件本身是复杂的,相当多的软件工作还涉及到社会因素。1.1.1软件与软件的特点硬件和软件失效率的对比:1.1.2软件的三个发展阶段第1个阶段:程序时期(约为20世纪50至60年代)硬件已经通用化,而程序却是个体化的。程序的编写者和使用者往往是同一个人,程序规模小,每一个程序都是为求解某一个问题而专门设计的,几乎没有什么系统的方法可遵循,程序设计常常是设计者头脑中进行的隐含过程,除了程序清单,基本没有设计文档资料,其生产方式完全是“个体手工方式”,人们只有程序的概念而没有软件的概念。第2个阶段:程序+说明时期(约为20世纪60至70年代)软件技术取得了很大的进展,如多道程序设计、多用户人机交互、文件管理、多种高级语言的出现、形式语言理论、编译技术的突破等,给计算机的广泛应用奠定了基础。但是,软件应用的需求变多,规模变大,复杂程度变高,使得“个体生产方式”已经不能适应生产要求,而是需要多人分工合作共同编制程序,形成了所谓的“作坊式生产方式”,这种方式造成了开发约定不清晰、程序说明不完整,导致了软件质量不高、成本失控、生产效率过低、工期延误,后期难于维护,甚至一个软件项目在开发过程中途夭折等,最终导致“软件危机”的开始。1.1.2软件的三个发展阶段软件危机指不断增加的为大系统制造可靠软件的困难度。软件系统的规模和复杂性不断增长,对软件的需求增长超过了供应(开发、演化和维护)能力。软件开发人员极度短缺、开发效率和软件质量不能满足用户的需求,最终延缓经济和社会的发展。1.1.2软件的三个发展阶段第3个阶段:软件工程时期(约为20世纪70年代以后)为了摆脱软件危机这一困境,北大西洋公约组织NATO(NorthAtlanticTreatyOrganization)于1968年召开软件研讨会(ConferenceonSoftwareEngineering),并首次提出“软件工程”这个术语,从此诞生了软件工程这个新兴学科。从70年代初开始,软件工作者主要围绕软件过程和开发模型、开发方法和技术、开发工具和环境,开发规范和标准以及软件管理等各个方面的研究和实践,使“作坊式生产方式”,逐步过渡到“软件工厂式的生产方式”,软件的生产步入了系列化、产品化、工程化和标准化的进程。1.1.2软件的三个发展阶段1.2软件工程的基本概念1.2.1软件工程软件工程是指导软件开发和维护的工程类学科,它以计算机科学理论及其他相关学科的理论为指导,采用工程化的概念、原理、方法和技术,进行软件的开发和维护,并与经过时间证明正确的管理方法与措施相结合,以较少的代价获取高质量的软件。•软件工程–是软件工程是对需求、计算机技术、人员及其技能、时间、成本和其它资源的管理,并籍此在一个满足开发者需求的过程中形成一个满足客户需求的软件产品。•软件工程(TheIEEEComputerSociety)–是(1)将系统化的、规范的、可度量的方法应用于软件的开发、运行和维护的过程,即将工程化应用于软件中。(2)对(1)中所述方法的研究。1.2.1软件工程简单地说,目标是能够成功地完成软件开发项目。而一个成功的项目目标是生产一个可接受的产品。总的来说,目标是应用计算机科学、数学及管理科学等原理,借鉴传统工程的原则和方法创建软件,以达到改善生产效率、提高质量、降低成本的目的。1.2.2软件工程的目标软件生存周期SLC(SoftwareLifeCycle)一个软件产品通常是从模糊的概念开始,逐步建立起产品的需求,并对需求进行说明,然后进行设计、实现和测试。如果客户是满意的,那么就可安装产品,并且开始运行和维护它。如果产品到达了其有用生命的尽头就会退役、报废或停止使用。这一系列过程,我们称为软件的生命周期。1.2.3软件生存周期软件生存周期的各个阶段从软件跨越的整个生命周期所实施的过程、活动和任务来划分,软件的生命周期可以归结为以下几个主要阶段:软件计划、需求分析、软件设计、编码、测试、维护与运行、退役等。这些阶段互相区别而又有联系。实际上,每个软件的生命周期有所不同,如有的软件可能在需求阶段花费几年的时间,有的软件在设计和实现阶段只需几个月时间,有的软件则在维护阶段可能长达十几年。1.2.3软件生存周期第一个阶段:软件计划(Planning)确定要解决的“问题是什么”及“解决问题的可行方案”即确定要开发软件系统的总目标,给出它的功能、性能、可靠性以及接口等方面的概要性要求;从技术方面、经济方面、法律方面探讨解决问题的可能方案,对可利用的资源(如计算机硬件、软件、人力等)、成本、可取得的经济效益、开发的进度做出估计,制定出完成开发任务的实施计划等,提交管理机构评审。1.2.3软件生存周期第二个阶段:需求分析和规格说明(RequirementAnalysisandSpecification)确定目标系统要“做什么”。即对软件计划阶段的要求进一步细化和求精,加强并集中软件的需求分析和规格说明,强调软件分析人员与用户、软件分析人员与软件开发人员的交互,充分理解软件的作用域、所需功能、性能及接口、安全与保密、人机工程与人机界面、数据定义及数据库、安装及验收等需求,落实用户所需文档、用户操作和运行需求、用户维护需求,然后写出软件需求规格说明书,提交管理机构评审。1.2.3软件生存周期第三个阶段:设计(SoftwareDesign)确定目标系统要“怎么做”。软件设计是将需求转换成为软件的表示,包括数据结构、软件结构、接口表示和过程细节。通常将前三者划为软件的初步(概要)设计,后者则归为软件的详细设计。例如,可将需求转化为层次化的软件模块结构、模块所用的数据结构或数据库文件表示、模块之间接口描述、模块应完成的功能等,以及每个模块完成相应功能的过程细节如局部变量、内部数据结构、算法等。这些软件表示应该按照规定的标准形式加以描述,形成软件设计规格说明书,提交管理机构评审。1.2.3软件生存周期第四个阶段:编码(Coding)编码体现了目标系统的“具体实现”。编码是将设计转换成计算机可以接受的语言代码——源程序。如果设计给出的描述很详细,那么编码几乎可以机械地完成。自然,编码必须与设计表示一致、具有结构简单、清晰易读等良好的编码风格。1.2.3软件生存周期第五个阶段:软件测试(SoftwareTesting)软件测试是保证软件质量的重要手段,其主要任务是检查该软件是否符合要求,其目的是发现软件存在的错误。软件测试应该是有计划地进行。软件测试依据软件规格说明设计测试用例,并施加在已经编码的程序上进行执行,经过对预期结果和实际执行结果的比较、分析,来发现程序的错误,最后形成测试报告。测试的主要过程有单元、集成、系统、验收和安装测试等。1.2.3软件生存周期第六个阶段:运行/维护(Running/Maintenance)该阶段体现软件是否能够持久满足用户的需求。已交付的软件投入正式使用后,便进入运行和维护阶段。这个阶段可能持续若干年甚至几十年,因此占整个软件费用的比例最大,是相当重要的一个阶段。软件维护的实质是对软件继续进行查错、纠错、修改和确认的过程。无论是应用软件或系统软件,都要在使用期间不断改善和加强产品的功能和性能、适应运行环境的改变、纠正在开发期间未能发现的遗留错误。1.2.3软件生存周期第七个阶段:报废/退役(Retirement)当软件经过一段时期运行和服务后,便可能报废或退役。主要的原因有:为满足用户的需求所做的维护费用太高,可能比新开发一个软件所花费的代价更高。维护的少量变化对于依赖性很强的软件的整体功能而言,有极大的危险。环境的变更(如硬件或操作系统)导致软件的更换。用户不再需要这个软件。1.2.3软件生存周期软件生存周期是软件工程中一个重要概念把软件的整个生存周期划分为较小的阶段,给每个阶段赋予确定而有限的任务,就能简化每一步的工作,使软件开发过程易于控制和管理。采用这种划分,使得每一个阶段的工作相对独立,有利于简化整个问题的解决,且便于不同人员分工协作。而且严格的科学的评审制度提高了软件的质量,从而大大提高了软件开发的生产率和成功率。1.2.3软件生存周期软件生存周期各阶段的关键问题阶段关键问题结束标准问题定义与可行性研究问题是什么?有可行解吗?可行性研究报告需求分析软件必须做什么?需求分析报告软件概要/总体设计怎样概括地解决该问题?概要设计报告详细设计怎样具体地解决该问题?详细设计报告编码如何编码并最终实现该系统?源程序清单测试寻找软件错误并使其符合要求?测试报告运行与维护用户发现新问题?有新要求?如何解决新问题?满足新要求?运行日志和维护记录1.2.3软件生存周期1.3软件工程研究的主要内容•软件工程研究的主要内容-4个方面规范和标准方法和技术工具和环境过程与管理1.3.1规范和标准(1)软件工程规范和标准所谓规范就是明文规定或约定俗成的标准。软件规范化就是使软件工作与产品符合一定的标准。软件工程标准有很多类型。按照中国国家标准GB/T15538-1995《软件工程标准分类法》,分类法由标准划分和软件工程划分以及这两种划分的表示关系所组成。按标准划分有过程、产品、行业、记号4大类型,标准划分确定了标准的作用;按软件工程划分包括2个部分,任务功能(产品工程、技术管理、确认与验证)和软件生存周期(概念、需求、设计、实现、测试、安装验收、运行、引退等阶段),软件工程划分确定了与标准有关的软件工程方面的特性。(2)软件工程标准的意义必要性在软件的开发、测试与评价、运行、维护、管理等一系列工作中,都要有一系列的约束和规定,都要求提供统一的行动规范和衡量准则,使得各种工作都能有章可循。标准化带来的好处提高软件的质量提高软件的生产率提高软件人员之间的通信效率,减少差错和误解有利于提高软件管理水平有利于降低软件的成本有利于缩短软件开发周期1.3.1规范和标准(3)软件工程标准的层次根据软件工程标准制定的机构和标准适用的范围有所不同,它分为5个级别:国际标准国家标准行业标准企业规范项目规范1.3.1规范和标准国际标准:由国际联合机构制定和公布,提供各国参考的标准。ISO(InternationalStandardsOrganization)国际化标准组织有着广泛的代表性和权威性,所公布的标准也有较大的影响。该机构的计算机与信息处理委员会(ISO/TC97)专门负责与计算机有关的标准化工作,所制定的标准冠有ISO字样,如ISO8631-86InformationProcessing-programconstructsandconventionsfortheirrepresentation《信息处理-程序构造与表示法的约定》。1.3.1规范和标准国家标准:由政府或国家级的机构制定或批准,适用于全国范围的标准。GB中华人民共和国技术监督局是中国的最高标准化机构