一.软件概述

1.工程化思想软件开发流程

(1)需求分析
(2)软件设计
(3)程序设计
(4)软件测试
(5)软件维护

2.软件及其特点

(1)软件:是与计算机系统中硬件相互依存的另一部分,包括程序,数据和相关文档的完整集合

  • 程序是按事先设计的功能和性能要求执行的指令序列
  • 数据是是程序能正常操纵信息的数据结构
  • 文档是与程序开发,维护和使用有关的图文材料

(2)软件的特点:

  • 软件是抽象的,是一种逻辑实体而不是一种物理实体
  • 软件是不会因为使用而损坏的
  • 软件的开发和允许受计算机系统的限制,对计算机系统有不同程度的依赖性
  • 软件是可以被拷贝的
  • 软件是复杂的
  • 软件是昂贵的

    3.软件分类

    (1)软件分类(按功能):

  • 系统软件:操作系统,数据库管理系统,设备驱动程序,通信处理程序等

  • 支撑软件:文本编辑软件,文件格式化软件等
  • 应用软件:商业数据处理软件,医疗软件,办公自动化软件等

(2)软件分类(按规模):

类别 参加人员数 研制期限 源程序行数
微型 1 1-4周 0.5k
小型 1 1-6月 1k-2k
中型 2-5 1-2年 5k-20k
大型 5-20 2-3年 50k-100k
甚大型 100-1000 4-5年 1M(1000k)
极大型 2000-5000 5-10年 1M-10M

(3)软件分类(按工作方式):

  • 实时处理软件
  • 分时软件
  • 交互式软件
  • 批处理软件

(4)软件分类(按服务对象范围):

  • 项目软件
  • 产品软件

(5)软件分类(按使用频度):

  • 一次使用
  • 频繁使用

(6)软件分类(按失效影响):

  • 高可靠性软件
  • 一般可靠性软件

    二.软件的发展及危机

    1.软件发展

    (1)程序设计阶段 - 50至60年代(软件=程序)
    (2)程序系统阶段 - 60至70年代(软件=程序+文档)
    (3)软件工程阶段 - 70年代以后(软件=程序+文档+数据)

    2.软件工程的定义

    (1)软件工程是指导计算机软件开发和维护的工程学科。采用工程的概念、原理、技术和方法来开发和维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它,这就是软件工程。
    (2)软件工程是研究和应用如何以系统性的、规范化的、可定量的过程化方法去开发和维护软件,以及如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来的学科。

    3.软件危机

    (1)软件开发技术的进步未能满足发展的要求,开发过程中遇到无法解决的问题,积累起来形成尖锐的矛盾,导致了软件危机
    (2)软件危机的表现:

  • 对软件开发成本和进度的估计常常很不准确

  • 用户对已完成的软件不满意的现象时有发生
  • 软件产品的质量往往是靠不住的
  • 软件维护困难(维护的多样性,复杂性,副作用)
  • 软件通常没有适当的文档资料
  • 软件成本在计算机系统总成本中所占比例逐年上升
  • 软件开发生产率提高的速度远跟不上日益增长的软件需求

(3)解决软件危机:软件工程

  • 提高软件产品的质量
  • 降低软件开发的成本

    三.软件开发周期

    1.软件开发周期

    (1)一个软件从定义,使用,开发,维护,直到最终被废弃为止的整个过程

    2.软件生存期的六个步骤

    (1)制定计划:

  • 确定系统的目标

  • 给出功能,性能及接口等方面的要求
  • 可行性研究
  • 估计可利用资源,成本,效益,开发进度
  • 制定计划,连同可行性研究报告,提交相关的管理部门进行审查

(2)需求分析:

  • 对软件进行需求分析并给出详细定义
  • 编写软件需求说明书和系统功能说明书及初步的系统用户手册
  • 提交管理机构评审

(3)软件设计:

  • 概要设计-把各项需求转换成软件的体系结构
  • 详细设计-对每个模块要完成的工作进行具体描述
  • 编写设计说明书,提交评审

(4)程序编码
(5)测试
(6)运行维护:

  • 改正性维护:运行时发现错误进行修正
  • 适应性维护:为适应变化了的软件工作环境,做适当变更
  • 完善性维护:为增强软件功能需做变更

    四.软件开发模型

    1.软件生存期模型是跨越整个生存期的系统开发,运作和维护所实施的全部过程,活动和任务的结构框架

    2.瀑布模型:

    image.png
    (1)特点:

  • 可在迭代模型中应用瀑布模型

  • 阶段间具有顺序性和依赖性
  • 推迟实现的观点
  • 每个阶段必须完成规定的文档(缺乏灵活性)
  • 每个阶段结束前完成文档的审查,及早改正错误

    3.快速原型模型

    image.png

(1)克服了瀑布模型的缺点,使它更好的满足用户并减少由于需求不明确带来的项目风险
(2)适合预先不能确切定义需求的软件系统的开发
(3)不适合开发大型的软件系统,只适合开发小型的
(4)前提是要有一个展示性的原型,因此在一定程度上限制了开发人员的创新

4.增量模型(渐增模型)

image.png
(1)先完成一个系统子集的开发,再按同样的开发步骤增加功能(系统子集),如此递增下去直至满足全部的系统需求
(2)优点:

  • 软件逐次交付,每次增量交付过程中获取的经验,有利于后面的改进,客户也有机会对建立好的模型作出反应
  • 用户可以更好的获得收益
  • 核心功能先被开发,降低了项目失败的可能性
  • 风险分布到几个更小的增量中,而不是集中于一个大型开发中

(3)缺点:

  • 系统体系结构非常重要,需要良好的可扩展性架构设计,这是增量开发成功的基础
  • 开发人员既要把软件系统看作整体,又要看作独立的构件,相互矛盾
  • 多个构建并发开发,具有无法集成的风险

    5.螺旋模型

    image.png
    (1)基本思想:使用原型或其他方法来尽量降低风险(可理解为每个阶段前都增加了风险分析过程的快速原型模型)
    (2)优点

  • 对可选方案和约束条件的强调有利于已有软件的重用,也有助于把软件质量作为软件开发的一个重要目标

  • 减少了过多测试(浪费资金)或测试不足(产品故障多)所带来的风险
  • 在螺旋模型中维护只是模型的另一个周期,在维护和开发之间并没有本质区别

(3)缺点:

  • 采用螺旋模型需要具有相当丰富的风险评估经验和专门知识,在风险较大的项目开发中,如果未能够及时标识风险,势必造成重大损失
  • 过多的迭代次数会增加开发成本,延迟提交时间

    6.喷泉模型(面向对象)

    image.png
    (1)特点:迭代(重复,演进) 和无间隙(各阶段间无明显界限)

    7.交换模型

    (1)基本思想:从软件需求的形式规格说明出发,经过一系列的程序变化,得到最终结果
    (2)特点:有严格的数学理论和形式化的技术支持,但目前在研究和实验阶段

    8.智能模型-依赖于知识库/专家系统

    image.png