软件工程第一章

软件工程第一章

1、软件危机的介绍

  1. 概念:
    软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。这些问题绝不仅仅是不能运行的软件才具有的,实际上,几乎所有的软件都不同程度地存在这些问题。软件危机包含两个方面的问题:
    1. 如何开发软件,以满足对软件日益增长的需求。
    2. 如何维护数量不断膨胀的已有软件。
  2. 典型表现
    1. 对软件开发成本和进度的估计不准确。
    2. 用户对“已完成的”软件系统不满意的现象经常发生。
    3. 软件质量往往靠不住。
    4. 软件常常是不可维护的。
    5. 软件通常没有适当的文档资料。
    6. 软件成本在计算机系统总成本中所占的比例逐年上升。
    7. 软件开发跟不上计算机应用迅速普及深入的趋势。

2、产生软件危机的原因:

  1. 客观原因:
    • 软件是计算机系统中的逻辑部件而不是物理部件
    • 软件规模庞大,而且程序复杂性将随着软件程序规模的增加而呈指数上升。
  2. 主观原因:
    • 对软件开发和维护有不少糊涂观念,采用了错误的方法和技术。
    • 存在与软件开发和维护有关的许多错误认识和做法。
    • 对用户要求没有完整准确的认识就匆忙着手编写程序。
    • 对一个软件从定义、开发、使用和维护,直到最终被废弃,要经历一个漫长的时期。
    • 在软件开发的不同阶段进行修改需要付出的代价是很不相同的。
    • 轻视维护是一个最大的错误。

3、消除软件危机的途径

  1. 应该对计算机软件有一个正确的认识。
  2. 应该充分认识到软件开发是一个组织良好、管理严密、各类人员协同配合、共同完成的工程项目。
  3. 应该推广使用在实践中总结出的开发软件的成功的技术和方法,并且研究探索更有效的技术和方法,尽快消除在计算机系统早期发展阶段形成的一些错误的概念和做法。
  4. 应该开发和使用更好的软件工具。

4、软件工程的介绍

  1. 概念:
    软件工程是从管理和技术两方面研究如何更好地开发和维护计算机软件的一门新兴学科。采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它,这就是软件工程。
  2. 产生
    为了更有效地开发和维护软件,软件工作者在20世纪60年代后期开始认真研究消除软件危机的途径,从而逐渐形成了一门新兴的工程学科——计算机软件工程学。
  3. 本质特征:
    1. 软件工程关注与大型程序的构造
    2. 软件工程的中心课题是控制复杂性
    3. 软件经常变化
    4. 开发软件的效率非常重要
    5. 和谐地合作是开发软件的关键
    6. 软件必须有效的支持它的用户
    7. 软件工程领域是由一种文化背景的人替具有另一种文化背景的人创造产品。

5、软件工程的基本原理

(1)七条基本原理

  1. 用分阶段的生命周期计划严格管理
  2. 坚持进行阶段评审
  3. 实行严格的产品控制
    1. 一切有关修改软件的建议,特别是设计对基准配置的修改建议,都必须按照严格的规程进行评审,获得批准以后才能修改
    2. 绝不能谁想修改软件(包括尚在开发过程中的软件),就随意进行修改。
  4. 采用现代程序设计技术
  5. 结果应能清楚地审查
  6. 开发小组的人员应该少而精
  7. 承认不断改进软件工程实践的必要性

6、软件工程方法学

  1. 概念
    软件工程包含技术管理两个方面的内容,是技术与管理紧密结合所形成的的工程学科,所谓管理就是通过计划、组织和控制等一系列活动,合理的配置和使用各种资源,以达到既定目标的过程。通过把软件生命周期全过程中使用的一套技术方法的集合称为方法学,也称为范型。目前使用得最广泛的软件工程方法学,分别是传统方法学会和面向对象方法学。
  2. 三要素:方法、工具和过程
    • 方法:是完成软件开发的各项任务的技术方法,回答”怎样做“的问题
    • 工具:是为运用方法而提供的自动的或半自动的软件工程支撑环境。
    • 过程:是为了获得高质量的软件所需要的一系列任务的框架,它规定了完后各项任务的工作步骤。
  3. 传统方法学(生命周期方法学或结构化泛型)
    1. 定义:
      采用结构化技术(结构化分析、结构化设计和结构化实现)来完成软件开发的各项任务,并使用适当的软件工具或软件工程环境来支持结构化技术的运用
    2. 开发步骤
      开发软件时,传统方法学把软件生命周期的全过程依次划分为若干个阶段,然后顺序地完成每个阶段的任务。
      1. 从问题的抽象逻辑分析开始,一个阶段一个阶段地顺序进行开发
      2. 前一个阶段任务的完成是开始进行后一个阶段工作的前提和基础,而后一阶段任务的完成通常是前一阶段提出的解法更进一步具体化,加了更多的实现细节。
      3. 每一个阶段的开始和结束都有严格的标准,对于任何两个相邻的阶段而言,前一阶段的结束标准就是后一阶段的开始标准。
      4. 在每一个阶段结束之前都必须进行严格的技术审查和管理复审,从技术和管理两个方面对这个阶段的开发成果进行检查,通过之后这个阶段才算结束。如果没有通过检查,则必须进行必要的返工,而且返工后还要再经过审查,审查的一个主要标准就是每个阶段都应该交出和所开发的软件完全一致的高质量的文档资料,从而保证在软件开发工程结束时有一个完整准确的软件配置交付使用。
    3. 优点:
      1. 把软件生命周期划分为若干个阶段,每个阶段的任务相对独立,而且比较简单,便于不同人员分工协作,从而降低了整个软件开发工程的困难程度。
      2. 在软件生命周期的每个阶段都采用科学的管理技术和良好的技术方法,且在每个阶段结束之前都进行严格的审查,使得软件开发工程的全过程以一条有条不紊的方式进行,保证了软件的质量,特别是提高了润健的可维护性。
      3. 采用生命周期方法学可以大大提高软件开发的成功率,软件开发的生产率也能明显提高。
    4. 缺点:
      1. 当软件规模庞大,或对软件需求是模糊的或会随着时间变化而变化的时候,传统方法学开发软件往往不成功。
      2. 结构化范型技术要么面向行为,要么面向数据,没有既面向行为又面向数据的结构化技术,而软件系统本质上是信息处理系统,离开了操作便无法更改数据,离开了数据的操作是毫无意义的。数据和对数据的处理原本是密切相关的,把数据和操作人为地分离成两个独立的部分,自然会增加软件开发与维护的难度。
  4. 面向对象方法学
    1. 定义:
      面向对象方法学是把数据和行为看做是同等重要的,它是一种以数据为主线,把数据和对数据的操作紧密结合起来的方法
    2. 基本原则:
      1. 面向对象方法学的出发点和基本原则,是尽量模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界、解决问题的方法与过程,从而使描述问题的问题空间与实现解法的解空间在结构上尽可能一致。
    3. 要点:
      1. 把对象作为融合了数据及在数据上操作的统一的软件构件
      2. 把所有对象都划分成类
      3. 继承性
      4. 对象彼此间仅能通过发送消息互相联系(对象是数据处理的主体,必须向它发消息请求你它执行它的某个操作来处理它的数据,不能从外界直接对它的数据进行处理,即对象的所有私有信息都被封装在该对象内,不能从外界直接访问,这就是通常所说的封装性。)
    4. 与传统方法学比较:
      1. 传统方法学强调了自顶向下顺序完成对软件开发各阶段的任务
      2. 用面向对象方法学开发软件的过程,是一个主动地多次反复迭代的演化过程,面向对象方法在概念和表示方法上的一致性,保证了在各项开发活动之间的平滑过度
    5. 优点:
      1. 降低了软件产品的复杂性
      2. 提高了软件开发的可理解性
      3. 简化了软件的开发和维护工作
      4. 提高了软件的可重用性

7、软件生命周期

软件生命周期由软件定义、软件开发、运行维护(也称为软件维护)这3个时期组成,每个时期又进一步划分成若干个阶段。

  1. 组成:

    1. 软件定义:问题定义、可行性研究和需求分析
      1. 总任务:
        1. 确定软件开发工程必须完成的总目标
        2. 确定工程的可行性
        3. 导出实现工程目标应该采用的策略及系统必须完成的功能。
        4. 估计完成该项工程需要的资源和成本,并且制定工程进度表。
    2. 软件开发:总体设计、详细设计、编码和单元测试,综合测试。其中前两个阶段又称为系统设计,后两个阶段称为系统实现。
    3. 运行和维护(软件运行和维护的主要任务是使软件持久的满足用户的需要):
      1. 当软件在使用过程中发现醋五时应该加以改正
      2. 当环境改变时应该修改软件以适应新的环境
      3. 当用户有新要求时应及时改进软件以满足用户的新需要。
  2. 软件声明周期各阶段的基本任务

    1. 问题定义:
      要解决的问题是什么

    2. 可行性研究:
      这个问题是否直接去解,是否有可行的方法

    3. 需求分析:
      系统必须做什么

    4. 总体设计(概要设计):
      怎样实现目标系统?

    5. 详细设计(模块设计):
      怎样具体的实现这个系统?(设计出程序的详细规格说明)

    6. 编码和单元测试

    7. 综合测试
      通过各种类型的测试使软件达到预订的要求,最基本的测试是集成测试和验收测试

      1. 集成测试:根据设计的软件结构,把经过单元测试检验的模块按某种选定的策略装配起来,在装配的过程中对程序进行必要的测试
      2. 验收测试:按照软件需求规格说明书的规定,由用户对目标系统进行验收。
    8. 软件维护:
      通过必要的维护活动使得系统持久地满足用户的需要。实质上维护过程是经历了一次压缩和简化了软件定义和开发的全过程。每一项维护活动都应该准确的记录下来,作为正式的文档资料加以保存。

      1. 改正性维护,即诊断和改正在使用过程中发现的软件错误
      2. 适应性维护,即修改软件以适应环境的变化
      3. 完善性维护,即根据用户的要求改进或扩充软件使它更完善
      4. 预防性维护,即修改软件,为将来的维护活动预先做准备

    8、软件过程——概念

    1. 定义:
      软件过程是为了获得高质量软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤。软件过程描述为了开发出客户需要的软件,什么人(who)、在什么时候(when)、做什么事(what)以及怎样(how )做这些事以实现某一个特定的具体目标。在完成开发任务时必须进行一些开发活动,并且使用适当的资源,在过程结束时将把输入转化为输出。

    9、软件过程——瀑布模型:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HzSNrxvG-1655601400242)(C:\Users\W\AppData\Roaming\Typora\typora-user-images\image-20220618194114120.png)]

  3. 特点:

    1. 阶段间具有顺序性和依赖性
    2. 推迟实现的观点
    3. 质量保证观点
  4. 实际的瀑布模型:

在这里插入图片描述

优点:

  1. 可强迫开发人员采用规范的方法
  2. 严格地规定了每个阶段必须提交的文档
  3. 要求每个阶段交出的所有产品都必须经过质量保证小组的仔细验证
  4. 对文档的约束,使软件维护变得容易一些,且能降低软件预算。

缺点:

  1. 开发过程一般不能逆转,否则代价太大
  2. 实际的项目开发很难严格按该模型进行
  3. 客户往往很难清楚地给出所有的需求
  4. 软件的实际情况必须到项目开发的后期客户才能看到

适用范围:

  1. 用户的需求非常清楚全面,且在开发过程中没有或很少变化
  2. 开发人员对软件的应用领域很熟悉
  3. 用户的使用环境非常稳定
  4. 开发工作对用户参与的要求很低

10、软件过程——快速原型模型

①定义
快速原型是快速建立起来的可以在计算机上运行的程序,它所能完成的功能往往是最终产品能完成的功能的一个子集。如图1-3所示(图中实线箭头表示开发过程,虚线箭头表示维护过程)。快速原型的本质是“快速”。UNIX Shell、超文本、第四代语言(4GL)都是广泛使用的快速原型语言。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WwpTnBmh-1655601400244)(C:\Users\W\AppData\Roaming\Typora\typora-user-images\image-20220618215706419.png)]

优点:

  • 可以得到比较良好的需求定义,容易适应需求变化
  • 有利于开发和培训的同步
  • 开发费用低、开发周期短,对用户友好

缺点:

  • 客户与开发者对原型理解不同
  • 准确的原型设计比较困难
  • 不利于开发人员的创新

适用范围:

  • 对所开发的领域比较熟悉而且有快速的原型开发工具
  • 项目进行招标时,可以以原型模型作为软件的开发模型
  • 进行产品移植或升级时,或对已有产品原型进行客户化工作时

快速原型模型是不带反馈环的,这正是这种过程模型的主要有点,即软件产品的开发基本上是线性顺序进行的。能基本是做到线性顺序开发的原因如下:

  • 原型系统已经同行过与用户交互而得到验证,产生的规格说明文档正确地描述了用户需求,因此,在开发的过程的后续阶段不会因为发现了规格说明稳定的错误而进行较大的返工
  • 开发人员通过建立原型系统已经学到了很多东西。因此,在设计和编码阶段发生错误的可能性也比较小,减少了在后续阶段需要改正前面阶段所犯错误的可能性

11、软件过程——增量模型

①原理
增量模型也称为渐增模型,如图1-4所示。使用增量模型开发软件时,把软件产品作为一系列的增量构件来设计、编码、集成和测试。每个构件由多个相互作用的模块构成,并且能够完成特定的功能。使用增量模型时,第一个增量构件往往实现软件的基本需求,提供最核心的功能。把软件产品分解成增量构件时,应该使构件的规模适中。分解时唯一必须遵守的约束条件是:当把新构件集成到现有软件中时,所形成的产品必须是可测试的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7xPuFusj-1655601400244)(C:\Users\W\AppData\Roaming\Typora\typora-user-images\image-20220618220320075.png)]

优点:

  • 能在较短时间内向用户提交可完成部分工作的产品
  • 逐步增加产品的功能可以使用户有充裕的时间学习和适应新产品,减少了一个全新的软件可能给客户组织带来的冲击。

缺点:

  • 并行开发构建有可能遇到不能集成的风险,软件必须具备开放式的体系结构
  • 增量模型的灵活性很容易退化为边做边改模型,从而使软件过程的 控制失去整体性

12、软件过程——螺旋模型

①基本思想
螺旋模型的基本思想是,使用原型及其他方法来尽量降低风险。可以把它看作在每个阶段之前都增加了风险分析过程的快速原型模型,如图1-6所示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sn35fbKI-1655601400244)(C:\Users\W\AppData\Roaming\Typora\typora-user-images\image-20220618220638643.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CSqMj8qA-1655601400245)(C:\Users\W\AppData\Roaming\Typora\typora-user-images\image-20220618220653728.png)]

优点:

  • 对可选方案和约束条件的强调有利于已有软件的重用,有助于把软件质量作为软件开发的一个重要目标
  • 减少了过多的测试(浪费资金)或测试不足(产品故障多)所带来的风险
  • 在螺旋模型中维护只是模型的另一个周期,在维护和开发之间并没有本质区别

缺点:

  • 螺旋模型是风险驱动的。如果软件开发人员没有丰富的风险评估和这方面的专业知识,将会出现真正的风险时,察觉不到。
  • 过多的迭代次数会增加开发成本,延迟提交时间

13、软件过程——喷泉模型

①面向对象方法学
这种方法在开发的早期阶段定义了一系列面向问题的对象,并且在整个开发过程中不断充实和扩充这些对象。分析阶段得到的对象模型也适用于设计阶段和实现阶段。整个开发过程都是“无缝”连接的,这就很容易实现各个开发步骤的多次反复迭代,达到认识的逐步深化。每次反复都会增加或明确一些目标系统的性质,但不是对先前工作结果的本质性改动,减少了不一致性,降低了出错的可能性。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5f8ZTB0E-1655601400245)(C:\Users\W\AppData\Roaming\Typora\typora-user-images\image-20220618221037044.png)]

14、Rational统一过程的优缺点。

优点

提高了团队生产力,在迭代的开发过程、需求管理、基于组件的体系结构、可视化软件建模、验证软件质量以及控制软件变更等方面、针对所有关键的开发活动为每个开发成员提供了必要的准则、模板和工具指导,并确保全体成员共享相同的知识基础、它具有简洁和清晰的过程结构,为开发过程提供了较大的通用性。
缺点:
RUP只是一个开发过程,并没有涵盖软件过程的全部内容,例如它缺少关于软件运行和支持等方面的内容,此外,它没有支持多项目的开发结构,在一定程度上降低了在开发组织内大范围实现重用的可能性。

15、Rational统一过程主要适用于何种项目?

Rational统一过程(RUP)强调采用迭代和渐增的方式来开发软件,整个项目开发过程由多个迭代过程组成。在每次迭代中只考虑系统的一部分需求,针对这部分需求进行分析、设计、实现、测试和部署等工作,每次迭代都是在系统已完成部分的基础上进行的,每次给系统增加些N的功能,如此循环往复地进行下去,直至完成最终项目。它适用于大型的需求不断变化的复杂软件系统项目。

16.说明敏捷过程的适用范围。

敏捷过程具有对变化和不确定性的更快速、更敏捷的反应特性,而且在快速的同时仍然能够保持可持续的开发速度。较适用于开发可用资源及开发时间都有较苛刻约束的小型项目。

17.说明微软过程的适用范围。

微软过程的每一个生命周期发布一个递进的软件版本,各个生命周期持续、快速地迭代循环。它综合了Rational统一过程和敏捷过程的许多优点,是对众多成功项目的开发经验的正确总结;适用于商业环境下具有有限资源和有限开发时间约束的项目。
行的,每次给系统增加些N的功能,如此循环往复地进行下去,直至完成最终项目。它适用于大型的需求不断变化的复杂软件系统项目。

16.说明敏捷过程的适用范围。

敏捷过程具有对变化和不确定性的更快速、更敏捷的反应特性,而且在快速的同时仍然能够保持可持续的开发速度。较适用于开发可用资源及开发时间都有较苛刻约束的小型项目。

17.说明微软过程的适用范围。

微软过程的每一个生命周期发布一个递进的软件版本,各个生命周期持续、快速地迭代循环。它综合了Rational统一过程和敏捷过程的许多优点,是对众多成功项目的开发经验的正确总结;适用于商业环境下具有有限资源和有限开发时间约束的项目。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

允谦呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值