软件工程方法学

  • 包括三个要素:

    • 方法
    • 工具
    • 过程

      软件生命周期

  • 是指软件的产生直到报废的生命周期,包括:问题定义、可行性分析、需求分析、总体设计、详细设计、编码、测试、运行维护等阶段。

    软件开发模型

  • 常见的开发模型有:

    • 瀑布模型
    • 增量模型
    • 螺旋模型
    • 喷泉模型
    • 智能模型
    • V模型
    • 快速应用开发模型
    • 构件组装模型
    • 敏捷方法
    • 统一过程

瀑布模型

  • 定义阶段
    • 软件计划
    • 需求分析
  • 开发阶段
    • 软件设计
    • 程序编码
    • 软件测试
  • 维护阶段
    • 软件维护
  • 优点
    • 为项目提供了按阶段划分的检查点。
    • 当前一阶段完成后,只需要去关注后续阶段。
    • 它提供了一个模板,这个模板使得分析、设计、编码、测试和支持的方法可以在该模板下有一个共同的指导。
  • 缺点
    • 各个阶段之间产生大量的文档,极大地增加了工作量。
    • 由于开发模型是线性的,用户只有等到整个过程的末期才能见到开发成果,从而增加了开发风险。
    • 不适应用户需求的变化,并且在需求分析阶段不可能完全获取。
    • 在软件开发前期未发现的错误传到后面的开发活动中时,可能会扩散,进而可能会导致整个软件项目开发失败。所以,瀑布模型适用于需求明确或很少变更的项目

快速原型模型

  • 概述
    • 快速原型是利用原型辅助软件开发的一种新思想。经过简单快速分析,快速建造一个可以运行的软件原型,以便理解和澄清问题,使开发人员与用户达成共识,最终在确定的客户需求基础上开发客户满意的软件产品。(先跑起来再说)
  • 可以分为三类:

    探索型原型

  • 主要用于需求分析阶段,目的是要弄清用户的需求,并探索各种方案的可行性。它主要针对开发目标模糊,用户与开发人员对项目都缺乏经验的情况,通过对原型的开发来明确用户的需求。

    实验型原型

  • 主要用于设计阶段,考核实现方案是否合适,能否实现。对于大型系统,若对设计方案心中没有把握时,可通过这种原型来证实设计方案的正确性。

    演化型模型

  • 也称为变换模型,根据用户的基本需求,通过快速分析构造出一个初始可运行版本(原型),然后根据用户在使用原型的过程中提出的意见和建议对原型进行改进,获得原型的新版本。重复这一过程,最终可得到令用户满意的软件产品。快速原型模型是“抛弃式”的,演化模型是“渐进式”原型方法。

  • 演化模型特别适用于对软件需求缺乏准确认识的情况。
  • 优点
    • (1)很早就可以验证是否符合产品需求。
    • (2)风险管理可以在早期就获得项目进程数据,可据此对后续的开发进度作出比较切实的估算。增加项目成功的机率。
    • (3)经验教训能反馈于本产品的下一个循环过程,提高质量效率。
    • (4)心理上,开发人员早日见到产品的雏型,是一种鼓舞。
    • (5)使用户可以在新的一批功能开发测试后,立即参加验证,以便提供非常有价值的反馈。
  • 缺点
    • (1)产品需求在一开始并不完全弄清楚的话,会给总体设计带来困难及削弱产品设计的完整性,并影响产品性能的优化。
    • (2)如果缺乏严格的过程管理,这个生命周期模型可能退化为一种原始的无计划的“试-错-改”模式。
    • (3)用户接触开发中的尚未测试稳定的功能,可能对用户都产生负面的影响。

增量模型

  • 融合了瀑布模型的基本成分和原型实现的迭代特征,是第三种原型化开发方法,但它不是“抛弃式”的,也不是“渐进式”的。增量模型把软件产品划分为一系列的增量构件,第一个增量往往是核心的产品,即第一个增量实现了基本的需求。客户对每一个增量的使用和评估都作为下一个增量发布的新特征和功能,这个过程在每一个增量发布后不断重复,直到产生了最终的完善产品。(灰度发布,吸收评价,不断完善)
  • 区别
    • 增量模型与原型实现模型和其他演化方法一样,本质上是迭代的,但与原型实现不一样的是其强调每一个增量均发布一个可操作产品。增量模型的特点是引进了增量包的概念,无须等到所有需求都出来,只要某个需求的增量包出来即可进行开发。
  • 优点
    • (1)人员分配灵活,初期不用太大投入。
    • (2)每隔一小段时间就提交用户部分功能,用户可以直观感受项目进展,及时试用产品功能。
    • (3)有利于风险的把控。
  • 增量模型将功能细化、分别开发的方法适应于需求经常改变的软件开发过程。

螺旋模型

  • 将瀑布模型和演化模型相结合,综合了两者的优点,并增加了风险分析。它以原型为基础,沿着螺线自内向外旋转,
  • 每旋转一圈都要经过
    • 制订计划
    • 风险分析
    • 实施工程
    • 客户评价等活动,
    • 并开发原型的一个新版本。经过若干次螺旋上升的过程,得到最终的系统。
  • 优点
    • (1)设计上灵活,可以在项目的各个阶段进行变更;
    • (2)以小的分段来构建大型系统,使成本计算变得简单容易;
    • (3)客户始终参与每个阶段的开发,保证了项目不偏离正确方向;
    • (4)随着项目推进,客户始终掌握项目的最新信息,从而能够和管理层有效地交互。
  • 缺点
    • (1)需要具有相当丰富的风险评估经验和专门知识,如果未能够及时标识风险,势必造成重大损失;
    • (2)过多的迭代次数会增加开发成本,延迟提交时间。

喷泉模型

  • 是一种以用户需求为动力,以对象为驱动的模型,主要用于描述面向对象的软件开发过程,该模型认为软件开发过程自下而上的,各阶段是相互迭代和无间隙的。无间隙是指在开发活动中,分析、设计和编码之间不存在明显的边界。

基于构件的开发模型

  • 将整个系统模块化,并在一定构件模型的支持下复用构件库中的一个或多个软件构件,通过组合手段高效率、高质量地构造应用软件系统的过程。
  • 基于构件的开发模型由软件的
    • 需求分析定义
    • 体系结构设计
    • 构件库建立
    • 应用软件构建
    • 测试和发布
    • 5个阶段组成。
  • 优点
    • 构件复用,提高了软件开发的效率。构件可由一方定义其规格说明,被另一方实现。然后供给第三方使用,构件组装模型允许多个项目同时开发,降低了费用,提高了可维护性,可实现分步提交软件产品。
  • 缺点
    • 缺乏通用的组装结构标准,因而引入了较大的风险。可重用性和软件高效性不易协调,需要精干的有经验的分析和开发人员。客户的满意度低,并且由于过分依赖于构件,所以构件库的质量影响着产品质量。

快速应用开发模型(RAD)

  • 是一个增量型的软件开发过程模型。强调极短的开发周期。RAD模型是瀑布模型的一个“高速”变种,通过大量使用可复用构件,采用基于构件的建造方法赢得快速开发。如果需求理解得好且约束了项目的范围,随后是数据建模、过程建模、应用生成、测试及反复

软件开发方法

结构化分析和设计

结构化分析(SA)

  • 一种面向数据流的需求分析方法,利用图形表达用户需求,常用工具有数据流图、数据字典。

数据流图(DFD)

iShot_2022-05-24_14.43.51.png

iShot_2022-05-24_14.44.08.png

数据字典(DD)

iShot_2022-05-24_14.50.28.png

iShot_2022-05-24_14.50.38.png

结构化设计(SD)

  • 是一种面向数据流的设计方法,以分析阶段产生的文档(数据流图、数据字典、软件需求说明书)为基础,逐步求精和模块化的过程。结构化设计通常可以分为概要设计和详细设计。

    概要设计

  • 概要设计也称为结构设计或总体设计。

  • 概要设计的基本任务:
    • 设计软件系统结构
    • 进行模块划分
    • 确定每个模块的功能、接口、模块间的调用关系
  • 概要设计工具:

    • 结构图
    • 数据字典(DD)
    • 判定树
    • 判定表

      详细设计

  • 为每个模块设计其实现的细节。

  • 详细设计工具:
    • 程序流程图
    • 盒图(NS图)
    • 问题分析图(PAD)
    • 程序设计语言(PDL)

二、面向数据结构的设计

  • 根据输入/输出数据结构导出程序结构。Jackson方法和Warnier方法是最著名的两个面向数据结构的设计方法。

三、面向对象的分析与设计

  • 面向对象的方法是一种运用对象、类、继承、封装、聚合、消息传送、多态性等概念来构造系统的软件开发方法。
  • 面向对象=对象(object)+类(classification)+继承(inheritance)+通信(communication with messages)
  • 采用这四个概念开发的软件系统是面向对象的。
  • 对象(object)
    • 对象是系统中用来描述客观事物的一个实体,是构成系统的一个基本单位。
    • 属性(attribute)也称为状态或数据,用来描述对象的静态特征。
    • 操作(operation)(也称方法或服务)规定了对象的行为,表示对象所能提供的服务。
    • 封装(encapsulation)是一种信息隐蔽技术,用户只能看见对象封装界面上的信息,对象的内部实现对用户是隐蔽的。
  • 类(class)
    • 类是一组具有相同属性和相同操作的对象的集合。
    • 一个类中的每个对象都是这个类的一个实例(instance)。
    • 类是创建对象的模板,从同一个类实例化的每个对象都具有相同的结构和行为。
  • 3.继承(inheritance)
    • 继承是指特殊类(子类)的对象拥有其一般类(父类)的全部属性与服务。
    • 父类中定义了其所有子类的公共属性和操作,在子类中除了定义自己特有的属性和操作外,可以继承其父类(或祖先类)的属性和操作,还可以对父类(或祖先类)中的操作重新定义其实现方法。
    • 如果一个子类只有唯一一个父类,这个继承称为单一继承。如果一个子类有一个以上的父类,这种继承称为多重继承。
  • 多态性(polymorphism)
    • 是指同一个操作作用于不同的对象上可以有不同的解释,并产生不同的执行结果。
    • 例如“画”操作,作用在“矩形”对象上,则在屏幕上画一个矩形,作用在“圆”对象上,则在屏幕上画一个圆。
  • 5.消息(message)
    • 消息传递是对象间通信的手段,一个对象通过向另一个对象发送消息来请求其服务。一个消息通常包括接收对象名、调用的操作名和适当的参数(如果有必要的话)。
    • 消息只告诉接收对象需要完成什么操作,但并不指示接收者怎样完成操作。消息完全由接收者解释执行。
  • 面向对象方法的优点

    • 与人类习惯的思维方法一致稳定性好
    • 可重用性好
    • 较易开发大型软件产品可维护性好

      内聚相关

  • 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。

  • 顺序内聚:处理元素相同,而且必须顺序执行。
  • 通信内聚:所有处理元素集中在一个数据结构的区域上。
  • 过程肉聚:处理元素相关,而且必须按待定的次序执行。
  • 瞬时内聚:所包含的任务必须在同一时间间隔内执行(如初始化模块)。
  • 逻辑内聚:完成运辑上相关的一组任务。
  • 偶然内聚:完成一组没有关系或松散关系的任务。

能力成熟度模型old(CMM)

CMM模型分为5个等级:①初始级,②可重复级,③ 已定义级,④定量管理级,⑤优化级

能力成熟度模型new(CMMI)

  • CMMI 模型是若干过程模型的综合和改进,是支持多个工程学科和领域的系统的、一致的过程改进框架,能适应现代工程的特点和需要,能提高过程的质量和工作效率
  • CMMI 模型为每个学科的组合都提供两种表示法:阶段式模型 和 连续式模型
  • 阶段式模型,类同于软件CMM,关注组织的成熟度,分5个成熟度等级:
    1. 初始的,过程不可预测且缺乏控制
    2. 已管理的,过程为项目服务
    3. 已定义的,过程为组织服务
    4. 定量管理的,过程已度量和控制
    5. 优化的,集中于过程改进
  • 连续式模型,关注每个过程域的能力,一个组织对不同的过程域可以达到不同的过程域能力等级(Capability Level, CL)

    • CMMI中包括6个过程域能力等级,CL0~CL5
      • CL0:未完成的
      • CL1:已执行的
      • CL2:已管理的
      • CL3:已定义的
      • CL4:定量管理的
      • CL5:优化的
    • CL2~CL5的名字于成熟度等级2~5同名,但含义不同。CL可以独立地应用于任何单独的过程域,任何一个CL都必须满足比它等级低的CL的所有准则。
    • 所有过程域共同的能力等级决定组织的能力等级
    • 允许组织对连续式模型的过程域进行裁剪,也允许对不同的过程域采用不同的能力等级

      敏捷开发方法

  • 极限编程(XP):

    • 敏捷开发的典型方法之一,是一种轻量级(做捷)、高效,低风险、柔性、可预测的、科学的软件开发方法,它由价值观、原则、实战和行为4个部分组成。其中4大价值观为沟通、简单性、反馈和勇气。
  • 水晶法(Crystal):
    • 水晶方法体系与XP一样,都有以人为中心的理念,但在实战上有所不同。水晶方法体系考息到人们一般很难严格避循一个纪律约束很强的过程,认为每一种不同的项目都瑞要一套不同的策略、约定和方法论。因此,与XP的高度纪律性不同,水晶方法体系探常了用最少纪律约東而仍能成功的方法,从而在产出效率与易于运作上达到一种平衡。也就是说,虽然水晶系列不如XP那样的产出效率,但会有更多的人能够接受并遊循它。
  • 并列争球法(Scrum):
    • 用达代的方法,其中把每30天一次的迭代称为一个“冲刺“,并按需求的优先级来实现产品。多个自组织和自治小组并行地递增实现产品。协调是通过简短的日常会议来进行的。
  • 自适应软件开发(ASD):

    • ASD的核心是三个非线性的、重迭的开发阶段:猪测,合作与学习。

      模块化设计

      模块化设计的原则应该是尽量考虑高内聚、低耦合
  • 模块独立

    • 模块的独立性原则表现在模块完成独立的功能,与其他模块的联系应该尽可能得简单,各个模块具有相对的独立性。
  • 模块的规模要适当
    • 模块的规模不能太大,也不能太小。如果模块的功能太强,可读性就会较差,若模块的功能太弱,就会有很多的接口。读者需要通过较多的程序设计来进行经验的积累。
  • 分解模块时要注意层次

    • 在进行多层次任务分解时,要注意对问题进行抽象化。在分解初期,可以只考虑大的模块,在中期,再逐步进行细化,分解成较小的模块进行设计。

      加密算法

  • 对称加密比非对称加密效率要高。

    • RSA和ECC:非对称加密算法
    • MD5:摘要算法
    • RC-5:对称加密
    • DES、3DES、IDEA、AES:共享密钥加密

结构化分析

  • 一套分层的数据流图、
  • 一本数据词典、
  • 一组小说明(也称加工逻辑说明)、
  • 补充材料