传统软件工程概述 软件工程的研究内容有哪些?

传统软件工程概述

什么是软件?\r\n为什么需要“软件工程”?\r\n软件工程的研究内容有哪些?


计算机系统的发展\r\n软件、软件生存周期和软件生存周期过程\r\n软件生存周期模型\r\n软件工程定义


进入上个世纪60年代,人们开始逐渐认识到了确实存在着“软件危机” 这样一个事实。例如:\r\n软件生产不能满足日益增长的需要\r\n软件开发成本和开发进度估计往往不准确\r\n软件开发人员和用户之间信息交流不充分,用户对完成的软件满意度很低\r\n软件价格昂贵,软件成本在整个计算机系统中所占的比例急剧上升,软件已成为许多计算机系统中花钱最多的项目\r\n软件质量难以保证\r\n软件可维护性差,程序中的错误很难改正,适应性或完善性维护都极其困难


导致危机问题的一个重要原因,是由于软件研制和维护本身是工程性的任务,但软件人员采取的方式却未能工程化\r\n为克服软件危机,人们开始考虑采用工程化方法和工程途径来研制和维护软件


上个世纪60年代末至70年代初开始,逐渐发展起一组总称为“软件工程”的技术\r\n这些技术把软件作为一个工程产品来处理:它需要计划、分析、设计、实现、测试以及维护\r\n软件工程学主要研究软件结构、软件设计方法论、软件工具、软件工程标准和规范,以及与软件工程有关的理论等\r\n软件产业的逐步建立,也带动了软件工程这门学科的发展。同时,软件生产的系列化、产品化、工程化和标准化形成了软件产业的标志

0.1  计算机系统的发展

软件工程和硬件工程都可以看成是一门更广义的学科——计算机系统工程的一部分\r\n用于计算机硬件的工程技术是由电子设计技术发展起来的,已经达到了比较成熟的水平,可靠性已是一种可以期待的现实而不再是一种愿望\r\n但是,软件已经取代硬件成为系统中设计起来最困难、最不容易成功 (按时完成和不超过预计的成本) ,而且是最不易管理的部分\r\n另一方面,随着以计算机为基础的系统在数量、复杂程度和应用范围上的不断增长,对软件的需求却仍然有增无减

0.1.1  计算机系统及其软件的发展

软件发展的历史与计算机系统发展紧密相关\r\n计算机系统发展的初期 (50~60年代) ,程序设计时期\r\n计算机系统发展的第二个时期(从60年代中期到70年代中期),程序系统时期\r\n计算机系统发展的第三个时期从70年代初期开始,软件工程时期\r\n如今,计算机系统的发展处于第四个时期,即从技术性应用转向消费性市场。

0.1.2  计算机系统工程

计算机系统工程的主要内容是对系统所要求的功能加以揭示、分析,并把它们分配给系统的各个部分\r\n在大多数新系统创建时,对系统所要求的功能往往只有模糊的概念。系统分析和系统定义的目的在于揭示摆在面前的项目的范围\r\n要对需要进行处理的信息、所要求的功能、所期望的性能以及设计的约束和检验的标准等进行系统、详细的分析\r\n范围确定之后,系统工程师必须考虑多种能潜在地满足项目范围的、可供选择的配置。在综合考虑了各项因素之后,选择其中的一种配置,并将系统的功能分配给系统的各个部分

图0-1  计算机系统工程

0.2  软件和软件生存周期

《中国大百科全书》给软件下的定义是:软件是计算机系统中的程序和有关文件\r\n也就是说,“软件”不仅仅是指程序,在软件研制过程中按一定规格产生的各种文件也是软件不可缺少的组成部分

0.2  软件和软件生存周期

一个计算机软件,从出现一个构思之日起,经过开发成功投入使用,在使用中不断增补修订,直到最后决定停止使用,并被另一项软件代替之时止,被认为是该软件的一个生存周期 (或称生命周期、生存期,life cycle)

0.2  软件和软件生存周期

一个软件产品的生存周期可以划分成若干个互相区别而又有联系的阶段,每个阶段中的工作均以上一阶段工作的结果为依据,并为下一阶段的工作提供了前提\r\n\r\n经验表明,失误造成的差错越是发生在生存周期的前期,在系统交付使用时造成的影响和损失就越大,要纠正它所花费的代价也越高。因而在前一阶段工作没有做好之前,决不要草率地进入下一阶段

0.2  软件和软件生存周期

国家标准 GB/T8566-2001《信息技术  软件生存周期过程》将软件生存周期划分为以下8个阶段\r\n可行性研究与计划\r\n需求分析\r\n概要设计\r\n详细设计\r\n实现 (包括单元测试)\r\n组装测试 (即集成测试)\r\n确认测试\r\n使用和维护

0.2  软件和软件生存周期

GB/T8567-88《计算机软件产品开发文件编制指南》建议在软件的开发过程中编制下述14种文件\r\n可行性研究报告\r\n项目开发计划\r\n软件需求说明书\r\n数据要求说明书\r\n概要设计说明书\r\n详细设计说明书\r\n数据库设计说明书

用户手册\r\n操作手册\r\n模块开发卷宗\r\n测试计划\r\n测试分析报告\r\n开发进度月报\r\n项目开发总结报告

图0-2  软件生存周期的瀑布模型

0.2  软件和软件生存周期

可行性研究与计划(策划):对软件进行可行性分析,估算开发费用和时间等\r\n需求分析:向用户了解需求,解决“做什么”的问题\r\n设计:分为概要设计和详细设计。对需要解决的问题进行分析,提出解决方案,解决“怎么做”的问题\r\n实现(编码):按照设计的结果,采用某种编程语言加以实现\r\n测试:编码结束后,要用大量的数据进行测试,找出其中隐藏的错误 \r\n使用和维护:软件交付用户使用后,在运行过程中仍有可能出错,而且用户的需求也有可能改变,因此,软件需要继续修改

图0-3  软件生存周期工作量分配

图0-4  开发期工作量分配

0.3  软件生存周期模型

在软件工程中,重要的概念是软件生存周期模型 (又称软件开发模型) 以及软件生存周期过程\r\n\r\n软件生存周期模型可以定义为:\r\n是软件开发全部过程、活动和任务的结构框架。\r\n\r\n在整个软件开发的发展过程中,为了要从宏观上管理软件的开发和维护,而对软件的发展过程的总体认识和描述。即对软件过程建立的模型。

0.3  软件生存周期模型

软件生存周期模型能清晰、直观地表达软件开发全过程,明确规定了开发工作各阶段所要完成的主要活动和任务,以作为软件项目开发工作的基础\r\n\r\n对于不同的软件系统,可以采用不同的开发方法、使用不同的程序设计语言以及各种不同技能的人员参与工作、运用不同的管理方法和手段等,以及允许采用不同的软件工具和不同的软件工程环境\r\n\r\n软件生存周期模型是稳定有效和普遍适用的

0.3  软件生存周期模型

软件生存周期过程可分为\r\n基本生存周期过程\r\n获取过程、供应过程、开发过程、运作过程和维护过程等\r\n支持生存周期过程\r\n组织生存周期过程

0.3  软件生存周期模型

软件生存周期模型仅对软件的开发、运作、维护过程有意义,在ISO12207和ISO9000-3中都提到软件生存周期模型,它包括:瀑布模型、渐增模型、演化模型、螺旋模型、喷泉模型和智能模型等

0.3.1  瀑布模型

瀑布模型是1970年W. Royce提出的最早的软件开发模型,其开发过程依照固定顺序进行 。该模型严格规定各阶段的任务,上一阶段任务输出作为下一阶段工作输入。\r\n此模型适合于用户需求明确、开发技术比较成熟、工程管理严格的场合使用。\r\n其缺点是:由于任务顺序固定,软件研制周期长,前一阶段工作中造成的差错越到后期越大,而且纠正前期错误的代价高。

0.3.1  瀑布模型

软件维护构成了生存周期的循环表示\r\n如果把软件维护看作是软件的二次开发,便有了软件生存周期的b形表示

0.3.1  瀑布模型

在评价瀑布模型时,应考虑以下的相关风险\r\n需求未被充分理解\r\n系统太大而一次不能做完所有的事\r\n事先打算采用的技术迅速发生变化\r\n需求迅速发生变化\r\n有限的资源\r\n无法利用某一中间产品

图0-5  软件生存周期循环

图0-6  具有维护循环的软件生存周期

维护循环

0.3.2  渐增模型

是指从一组给定的需求开始,通过构造一系列可执行的中间版本来实施开发活动\r\n第一个中间版本纳入一部分需求,下一个中间版本纳入更多的需求,依此类推,直到系统完成\r\n每个中间版本都要执行必要的过程、活动和任务,如:需求分析和体系结构设计需要执行一次,而详细设计、编码和测试、软件组装和验收测试在每个中间版本构造过程中都执行

0.3.2  渐增模型

在评价该模型时,需要考虑的风险因素是\r\n需求未被很好地理解\r\n突然提出一些功能\r\n事先打算采用的技术迅速发生变化\r\n需求迅速发生变化\r\n长时期内仅有有限的资源保证 (工作人员/资金)

图0-7  渐增模型示意

0.3.3  演化模型

主要针对事先不能完整定义需求的软件项目开发\r\n对需要开发的软件给出基本需求,作第一次试验开发,其目标仅在于探索可行性和弄清需求,取得有效的反馈信息,以支持软件的最终设计和实现\r\n通常把第一次试验性开发出来的软件称为原型。这种开发模型可以减少由于需求不明给开发工作带来的风险\r\n与渐增模型的区别是:演化模型承认需求不能被完全了解,且不能在初始时就确定。在该模型中,需求一部分被预先定义,然后在每个相继的中间版本中逐步完善\r\n对所有的中间版本,开发过程中的活动和任务通常接同一顺序被重复使用。维护过程和运作过程可以与开发过程平行地使用。获取过程、供应过程、支持过程和组织过程通常与开发过程平行地使用

图1-8  演化模型示意

0.3.4  螺旋模型

该模型是B. Boehm于1988年提出的,它将瀑布模型与演化模型相结合,并增加了两者所忽略的风险分析\r\n该模型通常用来指导大型软件项目的开发。\r\n它将开发划分为制订计划、风险分析、实施开发和客户评估四类活动。沿着螺旋线每转一圈,表示开发出一个更完善的新的软件版本\r\n如果开发风险过大,开发机构和客户无法接受,项目有可能就此终止;多数情况下,会沿着螺旋线继续下去,自内向外逐步延伸,最终得到满意的软件产品\r\n沿着螺旋线旋转,在笛卡儿坐标的四个象限上分别表达了四类活动\r\n制定计划、风险分析、实施开发、客户评估

图0-9  螺旋模型

0.3.5  喷泉模型

是由B. H. So11ers和J. M. Edwards于1990年提出的一种开发模型,主要用于采用面向对象技术的软件开发项目\r\n“喷泉”一词本身就体现了迭代和无间隙的特性\r\n软件的某个部分常常被重复工作多次,相关对象在每次迭代中随之加入渐进的软件成分\r\n无间隙是指在各项活动之间无明显边界,如分析和设计活动之间没有明显的界限。由于对象概念的引入,表达分析、设计、实现等活动只用对象类和关系,从而可以较为容易地实现活动的迭代和无间隙,使其开发自然地包括复用

图0-10  喷泉模型

0.3.6  智能模型

也称为基于知识的软件开发模型,它是知识工程与软件工程在开发模型上结合的产物\r\n它的维护不在程序一级上进行,把问题的复杂性大为降低,从而可以把精力更加集中于具体描述的表达上,即维护在功能规约一级进行\r\n具体描述可以使用形式功能规约,也可以使用知识处理语言描述等等,因而必须将规则和推理机制应用到开发模型中,所以必须建立知识库,将模型本身、软件工程知识和特定领域的知识分别存入知识库,由此构成某一领域的软件开发系统

图0-11  智能模型

0.4  软件工程定义

定义一:科学知识在设计和构造计算机程序,以及开发、运作和维护这些程序所要求的有关文档编制中的实际应用\r\n定义二:为了经济地获得软件,这个软件是可靠的并且能在实在的计算机上工作,所需要的健全的工程原理 (方法) 的确立和使用\r\n定义三:1983年IEEE (国际电气与电子工程师协会) 的《软件工程术语汇编》中,将软件工程定义为:对软件开发、运作、维护、退役的系统研究方法\r\n定义四:1990年新版的IEEE《软件工程术语汇编》又将定义更改为:对软件开发、运作、维护的系统化的、有纪律的、可定量的方法之应用,即是对软件的工程化应用

0.4  软件工程定义

软件工程已经是一门交叉性学科,它是解决软件问题的工程,对它的理解不应是静止的和孤立的\r\n软件工程是应用计算机科学、数学及管理科学等原理,借鉴传统工程的原则、方法来创建软件,从而达到提高质量、降低成本的目的\r\n计算机科学和数学用于构造模型、分析算法\r\n工程科学用于制定规范、明确风格、评估成本、确定权衡\r\n管理科学用于进度、资源、质量、成本等的管理

0.4  软件工程定义

软件工程的目标是明确的,就是研制开发与生产出具有良好的软件质量和费用合算的产品\r\n费用合算是指软件开发运行的整个开销能满足用户要求的程度\r\n软件质量是指该软件能满足明确的和隐含的需求能力的有关特征和特性的总和

0.4  软件工程定义

软件工程的基础是一些指导性的原则\r\n必须认识软件需求的变动性,并采取适当措施来保证结果产品能忠实地满足用户要求。在软件设计中,通常要考虑模块化、抽象与信息隐蔽、局部化、一致性等原则\r\n稳妥的设计方法大大地方便软件开发,为达到软件工程的目标,软件工具与环境对软件设计的支持来说,颇为重要\r\n软件工程项目的质量与经济开销直接取决于对它所提供的支撑的质量与效用\r\n有效的软件工程只有在对软件过程进行有效管理的情况下才能实现

0.4.1  软件工程学的内容

从软件的生产管理技术来分\r\n软件的需求定义和分析技术\r\n软件设计技术和设计审查技术\r\n软件设计表现技术\r\n软件测试技术\r\n软件可靠性的理论及其评价方法\r\n软件扩充和维护\r\n软件成本估算等

0.4.1  软件工程学的内容

从内容上可分为理论、结构、方法、工具等部分\r\n理论与结构是方法论与工具的基础及前提\r\n在方法论与工具方面存在着这样的关系:为了找出行之有效的方法就应该具备合适的工具;反之,为了制造、改进软件工具,也应先有合适的方法\r\n\r\n要达到如何以较少的代价获得高质量的软件这个目的,就必须研究软件开发方法和软件开发工具

0.4.1  软件工程学的内容

软件开发方法就是开发软件的规范化方法\r\n工作步骤,即明确软件系统的基本开发步骤及每一步的条件、目的、结果等\r\n软件文件格式\r\n评价标准,即确定对各种不同的软件开发方案的评价标准

0.4.2  软件工程过程

是指为获得软件产品,在软件工具的支持下,由软件工程师完成的一系列软件工程活动,通常包含4种基本的过程活动\r\nP (Plan) :软件规格说明,规定软件的功能及其运行的限制\r\nD (Do) :软件开发,产生满足规格说明的软件\r\nC (Check) :软件确认,确认软件能够完成客户提出的要求\r\nA (Action) :软件演进,为满足客户的变更要求,软件必须在使用的过程中演进\r\n事实上,软件工程过程是一个软件开发机构针对某一类软件产品为自己规定的工作步骤

0.4.3  软件工程学的基本目标和原则

软件工程项目的成功,是指达到以下几个主要目标\r\n付出较低的开发成本\r\n达到要求的软件功能\r\n取得较好的软件性能\r\n开发的软件易于移植\r\n需要较低的维护费用\r\n能按时完成开发工作,及时交付使用\r\n上述目标有些很可能是互相冲突的\r\n若只顾降低开发成本,很可能同时也降低了软件的可靠性\r\n如果过于追求提高软件的性能,可能造成所开发软件对硬件有较大的依赖,从而直接影响到软件的可移植性等等

图0-12  软件工程目标之间的关系

0.4.3  软件工程学的基本目标和原则

各种软件工程技术所遵循的基本原则是\r\n分解 \r\n抽象和信息隐蔽\r\n一致性\r\n确定性

0.4.4  软件工程与一般工程的差异

软件是逻辑产品而不是实物产品,其功能只能依赖于硬件和软件的运行环境以及人们对它的操作才能得以体现。软件与硬件的密切相关\r\n对软件产品的要求比一般有形产品来得复杂\r\n软件产品要完成的多种多样功能,用户难以清晰、准确地表达\r\n对软件产品的要求,如可靠性、易移植性、易使用性等等是隐含的,也是难以表达的,而且也缺少度量的具体标准\r\n软件设计不仅仅涉及到技术复杂性,也还涉及到管理复杂性\r\n软件工程是智力密集型产业,知识产权保护极为重要

0.4.4  软件工程与一般工程的差异

软件特征包括四个方面\r\n功能的多样性。使用软件产品往往还会伴随培训任务,软件产品的用户手册还不一定能全面描述其功能\r\n实现的多样性。对软件产品的要求不仅包括功能和性能要求,还必须包括在符合功能和性能要求的各种实现中做出选择,更有实现算法上的优化带来的不同,所以实现上的差异会带来使用上的差异\r\n能见度低。要看到软件进度涉及到如何使用文档表示的概念能见度,这为软件管理复杂性增加了难度\r\n软件结构的合理性差。软件管理复杂性随着软件规模增大而呈指数地增长,管理复杂性成了软件设计的难题

0.5  小结

软件危机的根本原因是软件系统高度复杂、难于驾驭和早期软件开发所带有的个人色彩\r\n\r\n要解决软件危机,必须应用严格的技术,使用帮助管理复杂性的工具。在广泛的意义上,我们称这个学科为软件工程

0.5  小结

一项计算机软件,从出现一个构思之日起,经过开发并投入使用,到停止使用止,被认为是该软件的一个生存周期。软件产品的生存周期又划分成若干个互相区别而又有联系的阶段\r\n\r\n软件工程方法学的目标是,把一种系统化的方法学用于系统开发上,为系统的开发提供一组可加以复审的任务,改善系统的质量和可维护性,以及加强对系统开发的管理和控制