第一章 软件工程导论
1.1 软件危机
- 软件危机的定义:
在计算机软件的开发和维护过程中所遇到的一系列严重问题。 - 软件危机的典型表现
- 1、对软件开发成本和进度的估计常常很不准确;
- 2、用户对“已完成的”软件不满意现象经常发生;
- 3、软件产品的质量往往靠不住;
- 4、软件常常不可维护;
- 5、软件通常没有适当的文档资料;
- 6、软件成本在计算机系统总成本中所占比例逐年上升;
- 7、软件开发生产率提高的速度,远远跟不上计算机应用迅速普及深入的趋势。
- 产生软件危机的原因
- 与软件本身特点有关
- 1、软件不同于硬件,管理和控制软件开发过程相当困难;
- 2、软件不会被“用坏”,运行中错误引入可能是开发时引入且未被检测出来的错误;
- 3、不同于一般程序,软件规模大,且复杂性随着规模的增加呈指数上升;
- 4、对用户需要没有准确认识就匆忙编码是许多软件项目失败的主因之一;
- 5、软件专业人员,采用错误的方法和技术可能是使软件问题发展成软件危机的主要原因。
- 6、错误的认识和做法:忽视软件需求分析的重要性,轻视软件维护等。
- 软件开发与维护的方法不正确有关
- 1、只重视程序而忽视软件配置的其余成分的糊涂概念;
- 2、或多或少地采用了错误的方法和技术,这可能是使软件问题发展成为软件危机的主要原因;
- 3、错误的认识和做法:忽视软件需求分析的重要性,轻视软件维护等。
- 与软件本身特点有关
- 消除软件危机的途径
- 1、首先应该对计算机软件有一个正确的认识;
- 2、充分认识到软件开发应该是各类人员协同配合,共同完成的工程项目;
- 3、推广使用成功的技术和方法,并且研究探索更好更有效的技术和方法;
- 4、应该开发和使用更好的软件工具。
1.2 软件工程
软件工程:是指导计算机软件和维护的一门工程学科。采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量地软件并有效地维护它,这就是软件工程。
- 软件具有的本质特性
- 1、软件工程关注于大型程序的构造;
- 2、软件工程的中心课题是控制复杂性
- 3、软件经常变化;
- 4、开发软件的效率非常重要;
- 5、和谐地合作是开发软件地关键;
- 6、必须有效地支持它的用户;
- 7、两种背景的人创造产品这个特性与前两个特性紧密相关
- 软件工程的基本原理
- 用分阶段的生命周期计划严格管理
- 坚持进行阶段评审
- 实行严格的产品控制
- 采用现代化程序设计技术
- 结果应能清楚地审查
- 开发小组的人员应该少而精
- 承认不断改进软件工程实践的必要性
- 软件工程方法学
- 方法:完成软件开发的各项任务的技术方法,回答“怎样做”的问题
- 工具:为运用方法而提供的自动的或半自动的软件工程支撑环境
- 过程:为了获得高质量的软件所需完成的一系列任务的框架,它规定了完成各项任务的工作步骤- 1、传统方法学
传统方法学也称为生命周期方法学或结构化范型。采用结构化技术(结构化分析、结构化设计和结构化实现)完成软件开发的各项任务,并使用适当的软件工具或软件环境来支持结构化技术的运用。- 特点
- 传统方法学把软件生命周期的全过程依次划分为若干个阶段,然后顺序地完成每个阶段的任务。
- 每个阶段的开始和结束都有严格标准,对于任何两个相邻地阶段而言,前一阶段的结束是后一阶段的开始标准。
- 采用生命周期方法学可以大大提高软件开发的成功率,软件开发生产率也能明显提高。
- 目前,传统方法学仍然是人们在开发软件时使用得广泛得软件工程方法学。
- 特点
- 2、面向对象方法学
与传统方法学相反,面向对象方法学把数据和行为看成是同等重要的,它是一种以数据为主线,把数据和对数据的操作紧密地结合起来的的方法。- 四个要点:
- 把对象(object)作为融合了数据及在数据的操作行为的统一的软件结构。
- 把所有对象都划分成类(class)。
- 按照父类与子类的关系,把若干个相关组成一个层次结构系统。
- 对象彼此间仅能通过发送消息互相联系。
- 面向对象方法学基本原则:
尽量模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界,、解决问题的方法与过程,从而使描述问题的问题空间(也称问题域)与现实解法的解空间(也称求解域)在结构上尽可能一致。 - 面向对象方法学优点:
降低了软件产品的复杂性,提高了软件的可理解性,简化了软件的开发和维护工作。面向对象方法特有的继承性和多态性,进一步提高了面向对象软件的可重用性。
- 四个要点:
- 1、传统方法学
1.3 软件生命周期
软件生命周期由软件定义、软件开发和运行维护(软件维护)三个时期组成,每个时期又进一步划分成若干各阶段。
- 1、软件定义时期的任务:
软件定义时期通常进一步划分成3各阶段,即问题定义、可行性研究、和需求分析。- 确定软件开发工程必须完成的总目标;
- 确定工程的可行性;
- 导出实现工程目标应该采用的策略及系统必须完成的功能;
- 估计该工程需要的资本和成本,并且制定工程进度表
- 这个时期的工作常称为系统分析,由系统分析员负责完成。
- 2、软件开发时期具体设计和实现前一个时期定义的软件,它通常由下述4个阶段组成:
- 总体设计
- 详细设计
- 编码和单元测试
- 综合测试
其中前两个阶段又称为系统设计,后两个阶段称为系统实现。
- 3 、软件维护时期的主要任务是使软件持久地满足用户的需要。
1.4 软件过程
软件过程是为了获得高质量软件所需完成的一系列任务的框架,它规定了完成各项任务的工作步骤。
软件过程描述为了开发出客户需要的软件,什么人(who)、在什么时候(when)、做什么事(what)以及怎么样(how)做这些事以实现某一特定的具体目标。
- 1 瀑布模型
瀑布模型一直是唯一被广泛采用的生名周期模型,现在他仍然是软件工程中应用得最广泛得过程模型。
- 传统瀑布模型的特点:
- 1 阶段间具有顺序性和依赖性,包含两重含义:
- a.必须等前一阶段的工作完成之后,才能开始后一阶段的工作;
- b.前一阶段的输出文档就是后一阶段的输入文档,因此,只有前一阶段的输出文档正确,后一阶段的工作才能获得正确的结果。
- 2 推迟实现的观点:
瀑布模型在编码之前设置了系统分析与系统设计的各个阶段,分析与设计阶段的基本任务规定,在这两个阶段主要考虑目标系统的逻辑模型,不涉及软件的物理实现。 - 3 质量保证的观点:
软件工程的基本目标就是优质、高产。为了保证所开发的软件的质量,在瀑布模型的每个阶段都应该坚持两个重要做法。- a.每个阶段都必须完成规定的文档,没有交出合格的文档就是没有完成该阶段的任务。
- b.每个阶段结束前都要对所完成的文档进行评审,以便尽早发现问题,改正结果。
- 1 阶段间具有顺序性和依赖性,包含两重含义:
传统的瀑布模型过于理想化,事实上,人在工作过程中不可能不犯错误。实际的瀑布模型是带"反馈环"的。
1、图中实线箭头表示开发过程,虚线箭头表示维护过程。
2、实际的瀑布模型当在后面阶段发现前面阶段的错误时,需要沿途中左侧的反馈先返回前面的阶段,修正前面阶段的产品之后再回来继续完成后面阶段的任务。
-
瀑布模型的优点:
- 可强迫开发人员采用规范的方法;
- 严格地规定了每个阶段必须提交的文档;
- 要求每个阶段交出的所有产品都必须经过质量保证小组的仔细验证。
-
2 快速原型模型:快速原型是快速建立起来的可以在计算机上运行的程序,它所能完成的功能往往是最终产品能完成的功能的一个子集。
实线表示开发过程,虚线表示维护过程
快速原型模型是不带反馈环的,这正是这种过程模型的只要优点:软件产品的开发基本上是线性顺序进行的。能基本上做到线性顺序开发的主要原因如下:
(1)原型系统已经通过与用户交互而得到验证,据此产生的规格说明文档正确的描述了用户需求,因此,在开发过程的后续阶段不会因为发现了规格说明文档的错误而
进行较大的返工。
(2)开发人员通过建立原型系统已经学到了许多东西,因此,在设计和编码阶段发生错误的可能性也比较小,这自然减少了在后续阶段需要改正所犯错误的可能性。
- 3 增量模型
增量模型也称渐增模型。使用增量模型开发软件时,把软件产品作为一系列的增量构建来设计、编码、集成和测试。每个构件由多个相互作用的模块构成,并且能够完成特定的功能。使用增量模型时,第一个增量构件往往实现软件的基本需求,提供最核心的功能。
- 增量模型优点:
- 能够在较短时间内向用户提交可完成部分工作的产品。
- 逐步增加产品功能可以使用户有教充裕的时间学习和适应心产品,从而减少一个全新的软件可能给用户组织带来的冲击。
-增量模型的困难: - 在把每个新的增量构件集合成到现有的软件体系构件中时,必须不破坏原来已经开发出的产品。
- 必须把软件的体系结构设计得边缘这种方式进行扩充,向现有产品中加入新构件的过程必须简单、方便,也就是说,软件体系结构必须是开放的。
- 增量模型优点:
风险更大的增量模型
- 4 螺旋模型
螺旋模型的基本思想是,使用原型及其他方法来尽量降低风险/理解这种模型的一个简单方法,是把它看作在每个阶段之前都增加了风险分析过程的快速原型模型,如图:
简单的螺旋模型
完整的螺旋模型
- 5 喷泉模型
”喷泉“这个词体现了面向对象软件开发过程迭代和无缝的特性。迭代是软件开发过程中普遍存在的一种内在属性。用面向对象方法学开发软件时,工作重点应该放在生命周期中的分析阶段。
图中代表不同阶段的圆圈相互重叠,这明确表示两个活动之间存在交迭;在一个阶段内地向下箭头代表该阶段内的迭代(或求精);较小的圆圈代表维护,圆圈较小象征着采用了面向对象范型之后维护时间缩短了。