软件工程导论(第5版)普通高校本科计算机专业特色教材精选张海藩编著主讲:徐怡E-mail:xuyi1023@126.com主要内容第1章软件工程学概述第2章可行性研究第3章需求分析第5章总体设计第6章详细设计第7章实现第8章维护第9章面向对象方法学引论成绩期末考试(70%)平时成绩(30%)考勤+作业+练习上机成绩(单独给成绩)参考书籍软件工程技术概论朱三元科学出版社实用软件工程郑人杰清华出版社现代软件工程周之英科学出版社第1章软件工程学概述1.1软件危机1.2软件工程1.3软件生命周期1.4软件过程1.5小结本章要点1.了解软件的发展和软件危机2.掌握软件工程和软件生存周期的概念3.了解软件过程思考两个问题什么是软件软件有什么特点什么是软件软件是计算机系统中与硬件相互依存的另一部分,它是包括程序,数据及其相关文档的完整集合。软件=程序+数据+文档程序是按事先设计的功能要求执行的指令序列。程序=算法+数据结构数据是使程序能正常操纵信息的数据结构文档是与程序开发,维护和使用有关的图文资料软件用户了解软件的入口。软件开发人员交流、通信的有效工具。软件维护人员进行软件维护的依据。文档有什么作用?软件的特点软件是一种逻辑实体,具有抽象性。软件在使用过程中无磨损问题,却会退化。软件对硬件和环境有不同程度的依赖,这导致了移植问题。软件开发至今尚无法摆脱手工作坊式的开发方式,生产效率低。软件本身是复杂的。软件成本相当昂贵。软件工作涉及到很多社会因素。个体化开发阶段(20世纪60年代中期以前)计算机系统发展的初期,软件带有强烈的个人色彩,采用个体化开发方式;软件开发没有方法可寻,软件设计是在人们头脑中完成的,除了程序清单之外,没有其他文档资料保存下来。软件作坊时期(60年代中期到70年代)软件作为一种产品被广泛使用;但是仍然使用早期的个体化开发方式。1.1软件危机随着软件数量的增加及软件需求的日趋复杂,维护难度越来越大,开发成本高,质量低。更严重的是,许多程序的个体化特性使得它们最终成为不可维护的。导致“软件危机”。1968年北大西洋公约组织的计算机科学家在联邦德国召开国际会议,讨论软件危机问题,在这次会议上正式提出并使用了“软件工程”这个名词,一门新兴的工程学科就此诞生了。软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。概括地说,软件危机包含下述两方面的问题:如何开发软件,以满足对软件日益增长的需求。如何维护数量不断膨胀的已有软件。1.1.1软件危机的介绍具体地说,软件危机主要有以下一些典型表现。(1)对软件开发成本和进度的估计常常很不准确。(2)用户对已完成的软件不满意的现象经常发生。(3)软件产品的质量往往靠不住。(4)软件常常是不可维护的。(5)软件通常没有适当的文档资料。(6)软件成本逐年上升。(7)软件开发生产率提高的速度,远远跟不上计算机应用迅速普及深入的趋势。几个软件危机的著名案例1966年,IBM公司开发OS/360系统,共有4000多个模块,约100万条指令,投入5000人一年的工作量,耗资数亿美元,结果还是延期交付。在交付使用后的系统中仍发现大量(2000个以上)的错误。1963年,美国用于控制火星探测器的计算机软件中的一个“,”号被误写为“。”,而致使飞往火里的探测器发生爆炸,造成高达数亿美元的损失。美国丹佛新国际机场自动化行李系统软件。担资1.93亿美元,计划1993年万圣节启用。但开发人员一直为系统错误困扰,屡次推后启用时间,直到1994年6月,机场计划者承认无法预测何时能启用。与软件本身的特点有关。和软件开发与维护的方法不正确有关。1.1.2产生软件危机的原因(1)正确认识计算机软件。(2)借鉴前人在开发软件的实践中积累和总结的宝贵经验。(3)积极开发和使用计算机辅助软件工程工具。总之,为了解决软件危机,既要有技术措施,又要有必要的组织管理措施。软件工程正是从管理和技术两方面研究如何更好地开发和维护计算机软件的一门新兴学科。1.1.3消除软件危机的途径对人、财、物的合理使用和配置。软件开发中使用的方法、工具和过程几个思考题?只要是编程高手,即使不懂软件工程也能遍出很好的软件。只要熟读了软件工程的书籍,就可以开发出高质量的软件。软件开发时如果进度慢,可以通过增加更多的程序员来解决。软件工程是指导计算机软件开发和维护的一门工程学科。采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它,这就是软件工程。1.2软件工程1.2.1软件工程的介绍软件工程具有下述的本质特性。1.软件工程关注于大型程序的构造。2.软件工程的中心课题是控制复杂性。3.软件经常变化。4.开发软件的效率非常重要。5.和谐地合作是开发软件的关键。6.软件必须有效地支持它的用户。7.在软件工程领域中是由具有一种文化背景的人替具有另一种文化背景的人创造产品。软件工程的7条基本原理(确保软件产品质量和开发效率的原理的最小集合)1.用分阶段的生存周期计划严格管理。2.坚持进行阶段评审。3.严格实行产品控制。4.采用现代程序设计技术。5.结果应能清楚地审查。6.开发小组的人员应该少而精。7.承认不断改进软件工程实践的必要性。1.2.2软件工程的基本原理通常把在软件生命周期全过程中使用的一整套技术方法的集合称为方法学(methodology),也称为范型(paradigm)。软件工程方法学包含3个要素:方法、工具和过程。方法是完成软件开发的各项任务的技术方法,回答“怎样做”的问题。工具是为运用方法而提供的自动的或半自动的软件工程支撑环境。过程是为了获得高质量的软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤。使用得最广泛的软件工程方法学:传统方法学和面向对象方法学。1.2.3软件工程方法学1.传统方法学传统方法学也称为生命周期方法学或结构化范型。它采用结构化技术(结构化分析、结构化设计和结构化实现)来完成软件开发的各项任务。把软件生命周期的全过程依次划分为若干个阶段,顺序地完成每个阶段的任务。前一个阶段任务的完成是开始进行后一个阶段工作的前提和基础,而后一阶段任务的完成通常是使前一阶段提出的解法更进一步具体化。在每一阶段结束前都进行管理复审和技术审查。引入同一变动付出的代价随时间变化的趋势在软件开发的不同阶段进行修改需要付出的代价是很不相同的(后期是前期的2-3个数量级)为什么要进行复审?2.面向对象方法学面向对象方法学尽量模拟人类习惯的思维方式,把数据和对数据的操作紧密地结合起来,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法与过程,从而使描述问题的问题空间(也称为问题域)与实现解法的解空间(也称为求解域)在结构上尽可能一致。概括地说,面向对象方法学具有下述4个要点。(1)把对象(object)作为融合了数据及在数据上的操作行为的统一的软件构件。也就是说,用对象分解取代了传统方法的功能分解。(2)把所有对象都划分成类(class)。每个类都定义了一组数据和一组操作,类是对具有相同数据和相同操作的一组相似对象的定义。(3)按照父类(或称为基类)与子类(或称为派生类)的关系,把若干个相关类组成一个层次结构的系统(也称为类等级)。在类等级中,下层派生类自动拥有上层基类中定义的数据和操作,这种现象称为继承。(4)对象彼此间仅能通过发送消息互相联系。也就是说,对象的所有私有信息都被封装在该对象内,不能从外界直接访问,这就是通常所说的封装性。一个软件从定义、开发、使用和维护,直到最终被废弃,要经历一个漫长的时期。通常把这个漫长的时期称为生命周期。软件生命周期由软件定义、软件开发和运行维护(也称为软件维护)3个时期组成,每个时期又进一步划分成若干个阶段。1.3软件生命周期软件定义进一步划分成3个阶段:问题定义、可行性研究和需求分析。软件开发进一步划分成4个阶段:总体设计,详细设计,编码和单元测试,综合测试。其中前两个阶段又称为系统设计,后两个阶段又称为系统实现。软件维护不再进一步划分。下面简要介绍软件生命周期每个阶段的基本任务。1.问题定义:要解决的问题是什么?2.可行性研究:对于上一个阶段所确定的问题有行得通的解决办法吗?3.需求分析:为了解决这个问题,目标系统必须做什么?4.总体设计:概括地说,应该怎样实现目标系统?5.详细设计:应该怎样具体地实现这个系统呢?6.编码和单元测试:写出正确的容易理解、容易维护的程序模块并测试。7.综合测试:通过各种类型的测试(及相应的调试)使软件达到预定的要求。8.软件维护:通过各种必要的维护活动使系统持久地满足用户的需要。软件过程是为了获得高质量软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤。过程定义了运用方法的顺序、应该交付的文档资料、为保证软件质量和协调变化所需要采取的管理措施,以及标志软件开发各个阶段任务完成的里程碑。通常使用生命周期模型简洁地描述软件过程。生命周期模型规定了把生命周期划分成哪些阶段及各个阶段的执行顺序,因此,也称为过程模型。常用软件过程模型:瀑布模型,快速原型模型、增量模型、螺旋模型、喷泉模型等。1.4软件过程瀑布模型又叫流水式过程模型,它是模仿旅游景点的阶梯瀑布,由上向下一个阶梯一个阶梯地倾泻下来,最后进入一个风平浪尽的大湖,这个大湖就是软件企业的产品库。模型的本意:把软件生存周期中的每个阶段当作瀑布中的一个台阶,把软件生存过程比喻成瀑布中的流水,由上向下地奔流。开发人员按阶段开发,管理人员按阶段管理。1.4.1瀑布模型图1.2传统的瀑布模型图1.3实际的瀑布模型瀑布模型的特点:1.阶段间具有顺序性和依赖性必须等前一阶段工作完成后,才能开始后一阶段工作。前一阶段的输出文档就是后一阶段的输入文档。2.推迟实现的观点瀑布模型在编码之前设置了系统分析与系统设计的各个阶段,尽可能推迟程序的物理实现。3.质量保证的观点每个阶段都必须完成规定的文档,没有交出合格的文档就是没有完成该阶段的任务。每个阶段结束前都要对所完成的文档进行评审,以便尽早发现问题,改正错误。模型的优缺点:(1)文档驱动,使软件维护变得比较容易一些(2)由于逆转性差,所以返工会造成重大损失。(3)错误的传递,会采取发散扩大的方式。选择模型的条件:(1)在开发时间内需求没有或很少变化。(2)用户使用环境很稳定。快速原型是快速建立起来的可以在计算机上运行的程序,它所能完成的功能往往是最终产品能完成的功能的一个子集。模型本意:在初步需求分析之后,马上向客户展示一个软件产品原型,对客户进行培训,让客户试用,在试用中收集意见,修改原型,再让客户试用,反复循环几次,直到客户确认为止。1.4.2快速原型模型为什么要采用快速原型方法?用户也很难一次性把其真实的要求完全提交给软件公司。用户开始阶段提出的需求往往只是对系统的期望和比较模糊的设想。软件公司明确用户需求的最佳方式就是为用户提供原型并由用户进行评价。图1.4快速原型模型快速原型模型基本是线性顺序,需要实际瀑布模型中的反馈线么?增量模型也称为渐增模型,使用增量模型开发软件时,把软件产品作为一系列的增量构件来设计、编码、集成和测试。每个构件由多个相互作用的模块构成,并且能够完成特定的功能。模型的本意:要开发一个大的软件系统,先开发其中的一个核心构件,完成系统的基本功能,然后再开发其他构件,这样一个个构件逐渐增加,就象搭积木一样,直至整个系统开发完毕为止。1.4.3增量模型图1.5增量模型软件分解成增量构件时,必须满足当把新构件集成到现有软件中时,所形成的产品是可测试的。图1.6风险更大的增量模型提高开发速度,但要密切监控整个过程,否则将冒构件无法集成到一起的风险模型的优点:任务或功能模块驱动,可以分阶段提交产品;逐步增加产品功能可以使用户有较充裕的时间学习和适应新产品。