0%

第一章 软件工程概述

软件工程的出现是因为存在软件危机。

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

具体表现

  • 对软件开发成本和速度的估计常常不准确。特别是人工工时,造成成本更高
  • 用户对软件不满意。需求分析不到位
  • 软件产品质量靠不住
  • 软件不可维护。文档、软件结构
  • 软件没有适当文档资料
  • 软件成本在计算机系统总成本中所占的比例逐年上升。人力消耗,工资涨
  • 软件开发生产率提高的速度,跟不上计算机应用迅速普及及深入的趋势。

产生软件危机的原因

  • 软件本身的特点

    • 软件是逻辑部件,缺乏可见性
    • 错误隐藏深,测试阶段没有检测出来
    • 软件规模庞大,复杂度较高
      • 技术上
      • 管理上,人员多
  • 软件的开发与维护的方法不正确

    • 软件专业人员错误认识软件开发,忽视软件需求分析,轻视软件维护
    • 只重视程序而忽视软件配置其余成分。软件由程序文档数据组成。

    消除软件危机的途径

    1. 对计算机软件有一个正确的认识。软件由程序相关文档数据组成。

      image-20250513221922796

    2. 认识到软件开发是一种组织良好、管理严密、各类人员协同配合、共同完成的工程项目

    3. 推广成功的技术和方法

    4. 开发和使用更好的软件工具

    两个方面,技术和管理

    软件工程的定义

    image-20250514163335130

本质

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

基本原理

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

软件工程方法学

三个要素:方法、工具、过程

传统方法学

以算法为核心,功能分解

也叫做生命周期方法学,采用结构化技术来完成软件开发的各项任务。结构化技术包括结构化分析(SA)、结构化设计(SD)和结构化实现(SP)

优点
  • 把软件生命周期划分为若干个阶段,每个阶段的任务相对独立且较简单,便于管理以及分工协作
  • 采用科学的管理技术或良好的技术方法,每个阶段严格审查,提高软件开发的成功率

面向对象方法学

以对象为核心,对象分解

以数据为主线,把数据和对数据的操作紧密地结合起来的方法

软件生命周期

从提出开发要求到软件报废的整个时期

  • 软件定义
    • 问题定义
      • 关键是要解决的问题是什么
    • 可行性研究
      • 关键是对于问题定义所确定的问题有行得通的解决办法吗
    • 需求分析
      • 确定目标系统必须具备的功能
  • 软件开发
    • 总体设计
      • 概要设计
      • 确定方案、结构
    • 详细设计
      • 确定算法和数据结构
    • 编码和单元测试
      • 编写易懂、易维护的程序代码
      • 测试编写出的每一个模块
    • 综合测试
      • 通过各种类型的测试使软件达到预定的要求
  • 运行维护
    • 交付之后到软件报废的阶段

软件过程

为了获得高质量软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤

瀑布模型

广泛使用,用于需求明确、完整、无重大变化的软件系统开发,例如操作系统、数据库管理系统、编译系统

特点
  • 阶段间具有顺序性、依赖性
  • 尽可能推迟物理实现
  • 质量保证
    • 写文档
    • 文档写得对

优点:

  • 强迫开发人员采用规范的方法开发
  • 严格规定了每个阶段必须要提交的文档
  • 规定所有提交的产品都必须通过质量验证

缺点:

  • 过于理想化,不可能不犯错
  • 文档驱动的模型,写在纸上的动态说明很难全面正确认识动态的软件产品,可能导致开发的产品不能让用户满意
  • 灵活性差

快速原型模型

适用于用户需求不明确,小型或交互型系统开发、大型复杂系统的模型部分、设计一些复杂算法的场合。

快速建立一个能反映用户主要需求的原型系统,让用户试用它,然后记录反馈,快速修改原型系统,迭代多次版本

优点
  • 软件开发基本上是线性顺序进行的
  • 加速开发过程,节约软件开发成本
  • 获知用户的真正需求
  • 克服瀑布模型的缺点,减少由于需求不明确带来的开发风险
  • 吸引用户,快速占领市场
  • 灵活性强
缺点
  • 选用的开发工具不一定符合主流的发展,小众冷门
  • 快速建立的系统结构和连续的修改下可能导致产品质量低下

增量模型

适用于技术风险较大、用户需求较为稳定的软件系统开发

渐增模型,是瀑布模型的变种

整体设计软件,实践中分阶段做

优点
  • 较短时间内向用户提交可完成部分工作的产品
  • 用户有较充裕的时间学习和适应新产品,减少一个全新软件可能给客户组织带来的冲击
  • 模型的灵活性可以使其适应需求的变化
缺点

很容易退化为边做边改模型

螺旋模型

适用于大型复杂的软件系统开发

瀑布模型+快速原型模型+风险分析

优点
  • 对可选方案和约束条件的强调有利于已有软件的重用,也有助于把软件质量作为软件开发的一个重要目标
  • 减少了过多测试(浪费资金)或测试不足(产品故障多)所带来的风险
  • 在螺旋模型中维护只是模型的另一个周期,在维护和开发之间并没有本质区别。
缺点
  • 风险驱动,依赖人的水平
  • 不能让用户确信这种演化方法是可信的
  • 建设周期长,成本上升

喷泉模型

适用于面向对象的软件开发过程

在开发的早期阶段定义了一系列面向问题的对象,并且在整个开发过程中不断充实和扩充这些对象

优点

可以提高软件项目开发效率,节省开发时间

缺点

不利于项目管理

记忆

  1. 瀑布模型

    “瀑布需求少,熟悉环境好;低风险易控,用户参与少。”

  2. 快速原型模型

    “快速原型适应变,原型工具快;成本高领域熟,用户参与多。”

  3. 螺旋模型

    “螺旋大规模,风险控制严;设计灵活准,知识经验全。”

  4. 阶段化模型

    “阶段化大项目,结构开放灵;风险难集成,整体性易失。”

  5. 喷泉模型

​ “喷泉面向对象,用户需求动;阶段无界限,迭代省时间;(过多迭代)成本增提交延。”

image-20250603212017498