软件工程导论 第一章 软件工程学概述

1.1软件危机


软件危机:是指在计算机软件的开发与维护过程中所遇到的一系列严重问题

软件危机包含的两方面问题:1、如何开发软件以满足软件日益增长的需求 2、如何维护数量膨胀的已有软件

软件危机的典型表现:

  1. 对软件开发成本和进度的估计常常很不准确
  2. 用户对“已完成”的软件系统不满意的现象经常发生
  3. 软件产品的质量往往不可靠
  4. 软件常常是不可维护的
  5. 软件通常没有适当的文档资料
  6. 软件成本在计算机系统总成本中所占的比例逐年上升
  7. 软件开发生产率提高的速度,远远跟不上计算机应用迅速普及深入的趋势

软件危机产生原因:

  1. 软件本身的特点有关:软件缺乏预见性(软件开发过程中的进展状况难以衡量,软件质量难以评价,管理与控制开发过程困难)、难以维护(软件是计算机的逻辑部件,使用过程不会发生损坏,软件维护通常意味着改正或修改原来的设计)、规模庞大(程序复杂性随程序规模的增加呈指数上升)
  2. 软件开发与维护的方法不正确:存在与软件开发和维护有关的许多错误认识和做法、忽视软件需求分析的重要性(对用户要求没有完整准确的认识就匆忙着手编写程序)、开发人员只重视程序而忽视软件配置的其余成分(文档和数据等)、轻视软件维护。

消除软件危机途径:

  1. 对计算机软件有正确认识,消除“软件就是程序”的错误观念。  软件 == 程序 + 数据 + 文档。程序:完成预定功能和性能的可执行的指令序列。数据:使程序能够适当的处理信息的数据结构。文档:开发、使用和维护程序所需要的图文资料。
  2. 吸取和借鉴人类长期以来从事各种工程项目所积累的原理、概念、技术和方法与人类从事计算机硬件研究和开发的经验教训
  3. 推广使用在实践中总结出来的开发软件的成功技术和方法,探究更好的技术和方法
  4. 开发和使用更好的软件工具

1.2 软件工程


软件工程:指导计算机软件开发和维护的一门工程学科。采用工程的概念、原理、技术和方法来开发和维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最后的技术结合起来,以经济地开发出高质量软件并有效地维护它

软件工程本质特性:

  1. 软件工程关注于大型程序构造
  2. 软件工程的中心课题是控制复杂性
  3. 软件经常变化
  4. 开发软件的效率非常重要
  5. 和谐地合作是开发软件的关键
  6. 软件必须有效地支持它地用户
  7. 在软件工程领域中通常由具有一种文化背景地人替具有另一种文化背景的人创造产品

软件工程的基本原理:

  1. 用分阶段地生命周期计划严格管理
  2. 坚持进行阶段评审
  3. 实行严格的产品控制
  4. 采用现代程序设计
  5. 结果应能清楚地审查
  6. 开发小组的人员应该少而精
  7. 承认不断改进软件工程实践的重要性

软件工程方法学:软件生命周期全过程使用的一整套技术方法的集合称为方法学,也称作范型

软件工程方法学三要素:方法 、工具和过程

传统方法学(生命周期方法学或结构化范型):采用结构化技术来完成软件开发的各项任务,并使用适当的软件工具或软件工程环境来支持结构化技术的运用。这种方法学把软件的生命周期的全过程以此划分为若干个阶段,然后顺序地完成每个阶段地任务

优点:

    1. 把生命周期划分成若干个相对独立,且比较简单的阶段,便于不太工作人员分工协作,从而降低了整个软件开发工程的困难程度
    2. 开发过程中采用科学的管理技术和良好的技术方法,并且在每个阶段之前都进行严格的审查,保证了软件的质量,提高了软件的可维护性
    3. 大大提高来的软件开发的成功率和生产率

缺点:

    1. 不适用于软件规模庞大、或者对软件的需求是模糊的或会随时间变化而变化的情况
    2. 结构化范型结束把数据和操作人为的分离成两个独立的部分,增加了软件开发与维护的难度

面向对象方法学:

要点:

    1. 把对象作为融合了数据及在数据上的操作行为的统一的软件构件
    2. 把所有对象都划分成类
    3. 继承性
    4. 对象彼此间仅能通过发送信息相互联系

优点:

    1. 降低了产品的复杂性
    2. 提高了软件可理解性
    3. 简化了软件的开发和维护工作
    4. 提高了软件的可重用性

与传统方法学对比:

    1. 传统方法学强调自顶向下、逐层分解、顺序开发
    2. 面向对象方法学强调主动地多次反复迭代地开发,保证了在各项开发活动之间地平滑过渡

面向对象方法 == 对象 + 类 + 继承 + 用消息通信

1.3软件工程生命周期


软件生命周期:

  • 软件定义 任务:确定软件开发工程必须完成地总目标;确定工程的可行性;导出实现工程目标应该采用的策略及系统必须完成的功能;估计完成该项工程需要的资源和成本,制定工程进度表
  • 软件开发 任务:具体设计和实现前一个阶段定义的软件
  • 软件维护 任务:使软件持久地满足用户地需要

软件生命周期各阶段地基本任务:

1.软件定义阶段: 该阶段必须要回答的问题是“需要软件解决的问题 是什么”,

    • 问题定义:  通过对客户的访问调查,系统分析员扼 要地写出关于问题性质、工程目标和工程规模的书 面报告,经过讨论和必要的修改之后这份报告应该得到客户的确认。
    • 可行性研究: 提交“可行性研究报告”,要回答“对于上 一个阶段所确定的问题有行得通的解决方法 吗?”
    • 软件需求分析: 主要确定目标系统必须具备哪些功能,提交 “需求规格说明书”,描述软件的功能和性 能,确定软件设计的限制和软件与其他系统 元素的接口,定义软件的其他有效性需求。

 2.软件开发阶段: 该阶段的任务是设计实现已定义的并经过需 求分析的软件系统。

    • 总体设计 (概要设计): 需要解决的问题是“应该如何宏观地解决问 题”确定软件德模块功能,得出意义明确的 功能模块,确定每个模块的输入、输出以及相互联系。
    • 详细设计(模块设计): 给出具体实现这个系统的步骤,但还不是编 写程序,而是设计出程序的详细规格说明(类 似于工程师的工程蓝图),它们包含必要的 细节,程序员可以根据它们写出实际的程序 代码。
    • 编码和单元测试 :写出正确的容易理解、容易维护的程序模块。程序员应该根据目标系统的性质和实际环境 选取一种适当的高级程序设计语言把详细设 计的结果翻译成用选定的语言书写的程序, 并仔细测试编写出的每一个模块。
    • 综合测试 :关键任务是通过各种类型的测试及相应的调 试使软件大道预定的要求。 此阶段最重要的测试是:集成测试、验收测 试。(1)集成测试:是根据设计的软件结构,把经过单 元测试的模块按照某种选定的策略装配起来。 (2)验收测试:按照规格说明书的规定,由用户(或在用户积极参加下)对目标系统进行验收。
    • 软件维护: 运行阶段的任务是保障软件的正常运行以及对软件 进行维护。为了排除软件系统中可能隐含的错误, 适应用户需求及系统操作环境的变化,需要继续对 系统进行修改或扩充。

1.4软件过程


软件过程:软件过程是为了获得高质量软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤,过程定义了运用方法的顺序、应该交付的文档资料、为保证软件质量和协调变化所需要采取的管理措施,以及标志软件开发各个阶段任务完成的里程碑

把软件生存周期中各项开发活动的流程用一 个合理的框架-开发模型来规范描述,这就是 软件过程模型,或称为软件生存周期模型。

软件生存周期模型:

  • 瀑布模型
  • 快速原型模型
  • 增量模型
  • 螺旋模型
  • 喷泉模型
  • Rational模型
  • 敏捷过程与极限编程
  • 微软过程

瀑布模型

瀑布模型是将软件生存周期的各项活动规定为按固定顺序而连接的若干阶段工作,形如瀑布流水,最终得到软件产品

特点:1、阶段间具有顺序性和依赖性 2、推迟实现的观点 3、质量保证的观点

优点:

1)为项目提供了按阶段划分的检查点。
2)当前一阶段完成后,您只需要去关注后续阶段。
3)可在迭代模型中应用瀑布模型。
增量迭代应用于瀑布模型。迭代解决最大的问题。每次迭代产生一个可运行的版本,同时增加更多的功能。每次迭代必须经过质量和集成测试。
4)它提供了一个模板,这个模板使得分析、设计、编码、测试和支持的方法可以在该模板下有一个共同的指导。
缺点:
1)各个阶段的划分完全固定,阶段之间产生大量的文档,极大地增加了工作量。
2)由于开发模型是线性的,用户只有等到整个过程的末期才能见到开发成果,从而增加了开发风险。
3)通过过多的强制完成日期和里程碑来跟踪各个项目阶段。
4)瀑布模型的突出缺点是不适应用户需求的变化。

快速原型模型

快速原型是快速建立起来的可以在计算机上运行的程序,他所能完成的功能往往是最终产品能完成功能的一个子集

快速原型模型过程:快速建立一个能反映用户主要需求的原型系统,让用户试用来了解目标系统的概貌,开发人员按照用户试用后的意见快速修改原型系统,然后再次试用直到用户认可,开发人员据此书写说明文档。
优点:软件开发基本是线性顺序进行。克服瀑布模型的缺点,减少由于软件需求不明确带来的开发风险。这种模型适合预先不能确切定义需求的软件系统的开发。
缺点:所选用的开发技术和工具不一定符合主流的发展;快速建立起来的系统结构加上连续的修改可能会导致产品质量低下。使用这个模型的前提是要有一个展示性的产品原型,因此在一定程度上可能会限制开发人员的创新。

增量模型

增量模型也称渐增模型,增量模型是把待开发的软件系统模块化,将每个模块作为一个增量组件,从而分批次地分析、设计、编码和测试这些增量组件。运用增量模型的软件开发过程是递增式的过程。相对于瀑布模型而言,采用增量模型进行开发,开发人员不需要一次性地把整个软件产品提交给用户,而是可以分批次进行提交

快速原型是快速建立起来的可以在计算机上运行的程序,他所能完成的功能往往是最终产品能完成功能的一个子集

增量模型特点:将待开发的软件系统模块化和组件化

优点:
  • 1、将待开发的软件系统模块化,可以分批次地提交软件产品,使用户可以及时了解软件项目的进展。
  • 2、以组件为单位进行开发降低了软件开发的风险。一个开发周期内的错误不会影响到整个软件系统。
  • 3、开发顺序灵活。开发人员可以对组件的实现顺序进行优先级排序,先完成需求稳定的核心组件。当组件的优先级发生变化时,还能及时地对实现顺序进行调整。

缺点:要求待开发的软件系统可以被模块化。如果待开发的软件系统很难被模块化,那么将会给增量开发带来很多麻烦。

增量模型适用于具有以下特征的软件开发项目:

  • 1、软件产品可以分批次地进行交付。
  • 2、待开发的软件系统能够被模块化。
  • 3、软件开发人员对应用领域不熟悉,难以一次性地进行系统开发。
  • 4、项目管理人员把握全局的水平较高。

螺旋模型

螺旋模型是一种演化软件开发过程模型,它兼顾了快速原型的迭代的特征以及瀑布模型的系统化与严格监控。螺旋模型最大的特点在于引入了其他模型不具备的风险分析,使软件在无法排除重大风险时有机会停止,以减小损失。同时,在每个迭代阶段构建原型是螺旋模型用以减小风险的途径。螺旋模型更适合大型的昂贵的系统级的软件应用

螺旋模型(Spiral Model)采用一种周期性的方法来进行系统开发。这会导致开发出众多的中间版本。使用它,项目经理在早期就能够为客户实证某些概念。该模型是快速原型法,以进化的开发方式为中心,在每个项目阶段使用瀑布模型法。这种模型的每一个周期都包括需求定义、风险分析、工程实现和评审4个阶段,由这4个阶段进行迭代。软件开发过程每迭代一次,软件开发又前进一个层次。采用螺旋模型的软件过程如下图所示::螺旋模型基本做法是在“瀑布模型”的每一个开发阶段前引入一个非常严格的风险识别、风险分析和风险控制,它把软件项目分解成一个个小项目。每个小项目都标识一个或多个主要风险,直到所有的主要风险因素都被确定。
螺旋模型强调风险分析,使得开发人员和用户对每个演化层出现的风险有所了解,继而做出应有的反应,因此特别适用于庞大、复杂并具有高风险的系统。对于这些系统,风险是软件开发不可忽视且潜在的不利因素,它可能在不同程度上损害软件开发过程,影响软件产品的质量。减小软件风险的目标是在造成危害之前,及时对风险进行识别及分析,决定采取何种对策,进而消除或减少风险的损害。
 

优点:

  • 1)设计上的灵活性,可以在项目的各个阶段进行变更。
  • 2)以小的分段来构建大型系统,使成本计算变得简单容易。
  • 3)客户始终参与每个阶段的开发,保证了项目不偏离正确方向以及项目的可控性。
  • 4)随着项目推进,客户始终掌握项目的最新信息 , 从而他或她能够和管理层有效地交互。
  • 5)客户认可这种公司内部的开发方式带来的良好的沟通和高质量的产品。

缺点:很难让用户确信这种演化方法的结果是可以控制的。建设周期长,而软件技术发展比较快,所以经常出现软件开发完毕后,和当前的技术水平有了较大的差距,无法满足当前用户需求。螺旋模型的

项目适用:对于新近开发,需求不明确的情况下,适合用螺旋模型进行开发,便于风险控制和需求变更。

喷泉模型

迭代是软件开发中普遍存在的一种内在属性

喷泉模型主要用于采用对象技术的软件开发项目。该模型认为软件开发过程自下而上周期的各阶段是相互迭代和无间隙的特性。软件的某个部分常常被重复工作多次,相关对象在每次迭代中随之加入渐进的软件成分。无间隙指在各项活动之间无明显边界,如分析和设计活动之间没有明显的界限,由于对象概念的引入,表达分析、设计、实现等活动只用对象类和关系,从而可以较为容易地实现活动的迭代和无间隙,使其开发自然地包括复用。

优点:

喷泉模型不像瀑布模型那样,需要分析活动结束后才开始设计活动,设计活动结束后才开始编码活动。该模型的各个阶段没有明显的界限,开发人员可以同步进行开发。其优点是可以提高软件项目开发效率,节省开发时间,适应于面向对象的软件开发过程。

缺点:

由于喷泉模型在各个开发阶段是重叠的,因此在开发过程中需要大量的开发人员,因此不利于项目的管理。此外这种模型要求严格管理文档,使得审核的难度加大,尤其是面对可能随时加入各种信息、需求与资料的情况

 Rational统一过程RUP

最佳实践(优点):

  1. 迭代式开发:在软件开发的初期就想完全、准确地获得用户的需求基本是不可能的。实际上,设计者常常碰到的问题是需求在整个软件开发过程中经常会发生变化。而迭代式开发允许每次迭代开发过程中需求发生变化,它正是通过不断迭代来细化对问题的理解。这样,迭代式开发大大降低了项目开发的风险,提高了软件开发的效率。
  2. 需求管理:准确地确定系统的需求是一个连续渐进的过程,开发人员不可能在系统开发之前就完全详细地理解系统的全部需求。而RUP正是提供了如何获得、组织系统的功能和约束条件并将其文档化的方法。
  3. 便于复用的软件体系结构:组件是可复用的单位,为了达到软件复用的目的,可以由组件来组成系统。基于独立的、可替换的、模块化组件的体系结构的优点是它方便管理,并能有效地提高软件的重用性。RUP展示了如何设计一个灵活的、有很强适应性的、有利于理解和便于复用的软件体系结构。
  4. 有利于可视化建模:RUP常常和UML相互联系,这就有利于建立软件系统的可视化模型。RUP提供了对软件系统进行可视化建模的方法。
  5. 对软件质量进行验证:在RUP中,软件质量的评估不再是事后进行或单独小组进行的分离活动,而是贯穿于软件开发的过程中,这样就有利于及早发现软件中存在的不足。
  6. 控制软件变更:RUP描述了如何控制、跟踪和监控修改,以确保迭代的开发成功

RUP软件开发生命周期

  • 核心工作流:
    1. 业务建模
    2. 需求
    3. 分析与设计
    4. 实现
    5. 测试
    6. 部署
    7. 配置与变更管理
    8. 项目管理
    9. 环境
  • 工作阶段
    1. 初始阶段
    2. 精化阶段
    3. 构建阶段
    4. 移交阶段
  • RUP迭代式开发

敏捷过程与极限编程

敏捷软件开发宣言:

  1. 个体和交互胜过过程和工具
  2. 可以工作的软件胜过面面俱到的文档
  3. 客户合作胜过合同谈判
  4. 相应变化胜过遵循计划

极限编程

极限编程有效实践

  • 客户作为开发团队成员
  • 使用用户素材
  • 短交付周期
  • 验收测试
  • 结对编程
  • 测试驱动开发
  • 集体所有
  • 持续集成
  • 可持续的开发速度
  • 开放的工作空间
  • 及时调整计划
  • 简单的设计
  • 重构
  • 使用隐喻

以极限编程为代表的敏捷过程,具有对变化和不确定性的更快速、更敏捷的反应特性,而且在快速的同时仍然能够保持可持续的开发速度。可以较好的适应商业竞争环境下对小型项目提出的有限资源和有限开发实践的约束

微软过程

微软过程准则:

  • 项目计划应该兼顾未来的不确定因素
  • 用有效的风险管理来减少不确定因素的影响
  • 经常生成并快速地测试软件地过渡版本,从而提高产品的稳定性和可预测性
  • 采用快速循环、递进的开发过程
  • 用创造性工作来平衡产品特性与成本
  • 项目进度表应该具有较高的稳定性和权威性
  • 使用小型项目组并发地完成开发工作
  • 在项目早期把软件配置项基线化,项目后期则冻结产品
  • 使用原型验证概念,对项目进行早期论证
  • 把零缺陷作为追求地目标
  • 里程碑评审会地目的是改进工作,切忌相互指责

微软软件生命周期:

  • 规划阶段:项目目标得到认可
  • 设计阶段:完成产品设计
  • 开发阶段:完成产品开发
  • 稳定阶段:准备好可发布版本
  • 发布阶段:完成产品发布

微软过程模型:微软的每一个生命周期发布一个递进的软件版本,各个生命周期持续、快速地迭代循环

 

posted @ 2022-01-08 22:24  sun_flow_er  阅读(640)  评论(0)    收藏  举报