2014/5/3
第1章 软件工程概述
哈工大软件学院\r杨大易
2014/5/3
本章主要内容
1.1 什么是软件\r1.2 软件危机\r1.3 软件工程\r1.4 软件工程方法学\r1.5 软件开发模型\r1.6 本章小结
2014/5/3
1.1 什么是软件
软件的定义\r是计算机程序、程序使用的数据以及说明程序的各种文档的集合。\r\r软件(software)由三部分组成\r可以在计算机上运行的程序(program)。 \r运行程序需要的数据(data)。 \r软件开发、维护、使用需要的各种文档(document)
1.1 什么是软件
软件的特征\r软件是一种逻辑实体,具有抽象性\r软件没有明显的制造过程\r软件在使用过程中,没有磨损、老化的问题 \r软件对硬件和环境有着不同程度的依赖性 \r软件开发至今尚未完全摆脱手工作坊式的开发方式,生产效率低 \r软件的成本相当昂贵 \r大多数软件是自定的,而不是通过已有的构件组装而来的\r软件工作牵涉到很多社会因素
2014/5/3
2014/5/3
1.1 什么是软件
软件的发展过程\r从1946年到60年代初:程序设计时期,其主要特征是程序生产方式为个体手工方式。\r从20世纪60年代初到70年代初:程序系统时期,程序的规模已经很大,需要多人分工协作,软件的开发方式由“个体生产”发展到了“软件作坊”。\r从20世纪70年代中期至80年代中期:软件工程时期,软件的开发以工程化的思想为指导,用工程化原则、方法和标准来开发和维护软件。\r从20世纪80年代中期至今:面向对象时期,面向对象软件开发技术在迅速取代传统软件工程开发方法。
2014/5/3
1.2 软件危机
1968年北大西洋公约组织的计算机科学家在德国召开国际会议,把计算机软件的开发和维护过程中出现的一系列严重问题称为“软件危机”。\r\r软件危机包括两个方面的问题\r如何开发软件以满足用户对软件日益增长的需求\r如何维护数量迅速增长的已有软件
2014/5/3
1.2 软件危机
软件危机的表现\r软件功能与实际需求不符\r软件开发生产率提高的速度远远不能满足用户需要\r软件价格昂贵\r软件产品的质量差\r对软件开发成本和进度的估计常常不准确\r软件文档资料通常既不完整也不合格\r软件的维护费用急剧上升
2014/5/3
1.2 软件危机
产生软件危机的原因\r软件缺乏“可见性”,在写出程序代码并在计算机上运行之前,软件开发过程的进展质量较难衡量,很难检验开发的正确性。\r软件规模庞大,逻辑结构复杂。 \r开发管理人员只重视设计程序而轻视用户需求分析,导致最后研制出的软件产品无法满足用户的需求。\r软件设计技术和管理技术落后,没有统一的软件质量管理规范。\r在软件的开发与维护关系问题上存在错误的概念,重视开发,而轻视维护。
2014/5/3
1.3 软件工程
软件工程的提出\r1968年,北大西洋公约组织在原西德召开计算机科学会议,由Fritz Bauer首次提出了“软件工程”的概念。\r软件工程的定义\r软件工程是用科学知识和技术原理来定义、开发、维护软件的一门学科。它应用工程的概念、原理、技术和方法,应用科学的开发技术和管理方法来开发软件。\r1983年IEEE给出的定义为:“软件工程是开发、运行、维护和修复软件的系统方法。”其中,“软件”的定义为:“计算机程序、方法、规则、相关的文档资料以及在计算机上运行时所必需的数据。”\r软件工程三要素:方法、工具、过程\r
1.3 软件工程
SWEBOK:软件工程知识体系指南
2014/5/3
1.3 软件工程
SWEBOK
2014/5/3
2014/5/3
1.3 软件工程
软件工程基本思想\r——著名的软件工程专家B. W. Boehm于1983年提出\r\r用分阶段的生存周期计划严格管理\r坚持进行阶段评审\r实行严格的产品控制\r采用现代程序设计技术\r结果应能清楚地审查\r开发小组的人员应少而精\r承认不断改进软件工程实践的必要性
2014/5/3
1.3 软件工程
软件工程的目标\r提高软件产品质量和软件开发效率,减少软件维护难度\r\r需考虑的问题\r可修改性:允许对系统修改,而不增加系统复杂性。\r有效性:软件系统能在一定的时间资源和空间资源环境下,完成规定的任务。\r正确性:软件能准确无误地执行用户需求的各种功能,满足用户要求的各种性能指标。\r可靠性:也称为健壮性,在硬件、操作系统出现故障,或人为操作不当的情况下,不会导致软件系统失效。
2014/5/3
1.3 软件工程
可理解性:包括两个方面的内容,一是软件系统结构清晰、容易理解,二是程序算法功能清晰,容易读懂。\r可重用性:软件中的某个部分可以在系统的多处重复使用,或者在多个系统中使用。\r可适应性:软件在不同硬件和操作系统环境下的适应程度。\r可移植性:体现了软件从一种计算机软件移动到另一种计算机环境下的难易程度。\r可跟踪性:包括两方面,一是可以根据软件开发的文档对设计过程进行正向跟踪或逆向跟踪;二是软件测试和维护过程中,对程序的执行进行跟踪,根据跟踪情况,分析程序执行的因果关系。\r互操作性:多个软件相互通信,协作完成任务的能力。
2014/5/3
1.3 软件工程
软件工程的原则\r抽象(abstraction):抽取各个事物中共同的最基本的特征和行为,暂时忽略它们之间的差异。\r信息隐藏(information hiding):将模块内部信息(数据和过程)封装起来。\r局部化(localization):即在一个物理模块内集中逻辑上相互关联的计算资源。\r一致性(consistency):应保证在开发过程中相关内容的一致。\r完全性(completeness):软件系统不丢失任何重要成分,完全实现所需的系统功能的程度。\r可验证性(verifiability):开发大型软件系统需要对系统逐层分解、验证。
2014/5/3
1.4 软件工程方法
把在软件生命周期全过程中使用的一整套技术集合称为方法(methodology),也称为范型(paradigm)。\r\r软件工程方法包括开发方法、开发工具和开发过程三方面\r开发方法:完成软件开发的技术方法\r开发工具:开发软件的支撑环境\r开发过程:完成开发软件各项任务的工作步骤。\r\r目前使用得最广泛的软件工程方法,分别是传统方法和面向对象方法。
2014/5/3
1.4 软件工程方法
传统方法:也可称为软件生命周期方法或结构化方法,把软件开发和维护分成软件定义、软件开发和软件维护三个时期,每个时期又分成若干个阶段。\r软件定义时期:确定软件开发必须完成的任务;论证软件可行性;确定用户需求的详细功能和性能。可划分为三个阶段:问题定义、可行性研究和需求分析。\r软件开发时期:设计和实现软件的定义。四个阶段:总体设计、详细设计、编码及单元测试、综合测试。\r软件维护时期:对投入使用的软件的修改,实际上是对软件的一次重新定义和开发过程。
2014/5/3
1.4 软件工程方法
传统方法的各阶段\r问题定义:弄清楚要解决什么问题。\r可行性研究:分析清楚“用什么办法解决这个问题”,保证在技术上、实效上、法律上都是行得通的。\r需求分析:确定软件的功能和性能。用户要要清楚开发出的软件系统能够做什么;软件开发人员也应该清楚用户的具体要求是什么。\r总体设计:设计软件的总体结构,将一个大系统按照功能设计成小模块,总体设计有时也称概要设计。\r详细设计:对每个模块设计具体算法和数据结构,详细设计有时也称模块设计。\r编码及单元测试:根据详细设计的结果,用程序设计语言,编写正确的源程序,并且对每段程序进行严格测试。\r综合测试:通过测试使软件系统达到用户的要求。最基本的测试集成测试和验收测试。\r软件维护:软件投入运行后的维护活动,通常可划分为四类:改正性维护、适应性维护、完善性维护、预防性维护。\r
1.4 软件工程方法
仍然是使用十分广泛的软件工程方法。\r采用结构化技术来完成软件开发的各项任务,并使用适当的软件工具或软件工程环境来支持结构化技术的运用。\r从上而下,顺序地完成软件开发的各阶段任务。\r
2014/5/3
1.4 软件工程方法
面向对象方法\r一种把面向对象的思想应用于软件开发过程中,指导开发活动的系统方法,简称OO (Object-Oriented)方法。\r面向对象方法的特征\r是建立在对象概念基础上的方法学,对象的概念贯穿于开发全过程。\r运用人类日常的思维方法和原则进行系统开发,体现出继承性、封装性、多态性等基本特征。\r可划分为三个阶段:面向对象分析(OOA)、面向对象设计(OOD)、面向对象实现(OOI)。\r
2014/5/3
2014/5/3
1.5 软件生命周期模型
软件项目开发和维护的全过程\r软件生命周期模型的种类\r以软件需求完全确定为基础的瀑布模型;\r开发初期仅给出基本需求的渐进式模型,如原型模型、螺旋模型、喷泉模型等;\r以形式化开发方法为基础的变换模型、基于第四代语言技术的模型。\r在实际开发时,应根据项目的特点和现有的条件选取合适的模型,也可以把几种模型组合起来使用以便充分利用各模型的优点。
2014/5/3
1.5 软件开发模型
瀑布模型\r严格按照软件生存周期各个阶段来进行开发,上一阶段的输出即是下一阶段的输入,强调每一阶段的严格性。
2014/5/3
1.5 软件开发模型
瀑布模型的优点\r提供了软件开发的基本框架,有利于大型软件开发过程中人员的组织、管理,有利于软件开发方法和工具的研究与使用,因此,在软件工程中占有重要的地位。\r瀑布模型的缺点\r在软件开发的初期阶段就要求做出正确、全面、完整的需求分析对许多应用软件来说是极其困难的。\r作为整体开发的瀑布模型,由于不支持产品的演化,缺乏灵活性,对开发过程中很难发现的错误,只有在最终产品运行时才能暴露出来,从而使软件产品难以维护。\r瀑布模型的适用场合\r适合于功能、性能明确、完整、无重大变化的软件系统
2014/5/3
1.5 软件开发模型
原型模型\r开发人员与用户一起进行需求分析,进行快速设计,建造原型,原型由用户评估,进一步修改原型,再次进行设计。迭代这个过程,逐步满足用户需要。
2014/5/3
1.5 软件开发模型
原型模型的主要优点\r原型模型法可以得到良好的需求定义,能够有效处理用户的模糊需求,开发者和用户得到充分的协作。\r原型模型的主要缺点\r开发者常常需要实现上的折衷,以使原型能尽快工作;\r用户似乎看到的是软件的工作版本,其实软件质量和可靠性难以保证;\r资源规划和管理较为困难,更新文档工作量繁重。\r原型模型的适用场合\r适合于那些不能预先确切定义需求的软件系统的开发,更适合于那些项目组成员(包括分析员、设计员、程序员和用户)不能很好交流或通信有困难的情况。
2014/5/3
1.5 软件开发模型
螺旋模型\r综合了瀑布模型和原型模型的优点,即将两者结合,并加入了风险分析机制。
2014/5/3
1.5 软件开发模型
螺旋模型的优点\r支持用户需求的动态变化。\r螺旋模型特别强调原型的可扩充性和可修改性。\r为项目管理人员及时调整管理决策提供了方便,可降低开发风险。\r螺旋模型的缺点\r如果每次迭代的效率不高,致使迭代次数过多。\r需要有相当丰富的风险评估经验和专门知识,要求开发队伍水平较高。\r螺旋模型适用场合\r支持需求不明确、特别是大型软件系统的开发,并支持多种软件开发方法,是一种具有广阔前景的模型。
2014/5/3
1.5 软件开发模型
喷泉模型\r以面向对象软件开发方法为基础,以用户需求为动力,以对象来驱动的模型。
2014/5/3
1.5 软件开发模型
喷泉模型的特点\r软件系统可维护性较好;\r各阶段相互重叠,表明了面向对象开发方法各阶段间的交叉和无缝过渡; \r整个模型是一个迭代的过程,包括一个阶段内部的迭代和跨阶段的迭代;\r具有增量开发特性,能做到分析一点、设计一点、实现一点、测试一点,使相关功能随之加入到演化的系统中。\r模型是对象驱动的,对象是各阶段活动的主体,也是项目管理的基本内容。\r该模型很自然地支持软部件的重用。
2014/5/3
1.6 本章小结
软件工程是用于解决软件开发中产生的一系列问题的,关系到软件开发各个方面的工程学科。\r软件工程的目标是开发满足用户需求的、高质量的软件产品。\r逐步理解并运用软件工程的基本思想和原则。
\r谢谢!
2014/5/3