第三章 软件构造过程与配置管理

第三章 软件构造过程与配置管理

Software Development Lifecycle(SDLC)软件开发生命周期

From 0 to 1 从无到有

在这里插入图片描述

From 1 to n 从有到好

在这里插入图片描述

传统软件开发模型

两种基本的方式

  • 线性过程

    • 用户需求要明确,不易更改
    • 在这里插入图片描述
  • 迭代过程

    • 各阶段给用户反馈确定需求
    • 在这里插入图片描述

五种模型

  • 瀑布过程(Waterfall (Linear, non-iterative))

    • 在这里插入图片描述

    • 在概念、启动、分析、设计、构建、测试、实施和维护阶段,进展被视为稳步向下流动(如瀑布),易于使用,但事后更改代价高昂。

    • 特点

      • 线性推进
      • 阶段划分清楚
      • 整体推进
      • 无迭代
      • 管理简单
      • 无法适应需求增加/变化
  • 增量过程( Incremental (non-iterative))

    • 在这里插入图片描述

    • 切成小模块,每次开发一个小模块

    • 要求

      • 每个小增量都能单独运行
      • 新开发的不能影响之前开发的
    • 特点

      • 线性推进
      • 增量式(多个瀑布的穿行)
      • 无迭代
      • 比较容易适应需求的增加
  • V字过程(V-Model (for verification and validation))

    • 在这里插入图片描述

    • 每个阶段进行验证测试

  • 原型过程(Prototyping (iterative) )

    • 在这里插入图片描述

    • 先开发一个原型(一般是一个可运行的界面),供用户评价,在圆形的基础上不断地迭代发现用户变化的需求,如果原型不好也可抛弃

    • 优点

      • 开发者早期可以从用户获得有价值的反馈
      • 开发质量高,但时间代价高
      • 适应用户的变化
    • 缺点

      • 未经过整体分析设计,整体架构不好
  • 螺旋模型(Spiral (iterative))

    • 在这里插入图片描述

    • 非常复杂的过程:

      • 多轮迭代基本遵循瀑布模式
      • 每轮迭代有明确的目标,遵循“原型”过程,进行严格的风险分析,方可进入下一轮迭代
    • 适用于大程序,风险不确定的程序,高质量的程序

选择模型的依据

  • 用户参与程度有多大?–适应变化的能力
  • 开发效率/管理复杂度
  • 开发出的软件的质量

Agile Development(敏捷开发)

  • 通过快速迭代和小规模的持续改进,以快速适应变化。
  • 适用于需求不稳定的程序,当需求不稳定时,敏捷模型大于原型模型
  • Agile = 增量 + 迭代,每次迭代处理一个小规模增量
  • 极限的用户参与,极限的小步骤迭代,极限的确认 / 验证

敏捷宣言

  • 不注重文档
  • 适应变化,而不是遵循合同
  • 客户参与开发过程中
  • 每天团队交互

极限编程

  • 列出需求不要文档,先写测试,编程目的是过测试。
  • 在这里插入图片描述

SCM和VCS

Software Configuration Management (SCM) and Version Control System (VCS)

软件配置管理

  • 追踪和控制软件的变化
  • 软件的任何组成部分(源代码、数据、文档、硬件、各种环境)都可能随着软件生命周期中的时间而更新。
  • 软件配置项:软件中发生变化的基本单元(例如:文件)

版本控制和基线的建立

  • 版本控制

    • 为软件的任一特定时刻( Moment )的形态指派一个唯一的编号,作为"身份标识"

    • 为什么需要版本控制

      • 回滚到上一个版本
      • 比较两个版本差异
      • 备份软件版本历史
      • 获取软件备份
      • 合并版本
      • 多个开发者之间共享和协作
      • 记录每个开发者的动作,便于“审计”
    • 版本控制的术语

      • Repository 仓库:即于SCM中的CMDB
      • Working copy 工作拷贝:在开发者本地机器上的一份项目拷贝
      • File 文件:一个独立的配置项
      • Version or revision 版本:在某个特定时间点的所有文件的共同状态
      • Change or diff 变化:即code churn,两个版本之间的差异
      • Head 程序员正在其上工作的版本
    • 版本控制方法

      • Local VCS(本地版本控制系统)

        • 仓库存储于开发者本地机器
        • 无法共享和协作
      • Centralized VCS (集中式版本控制系统)

        • 仓库存储于独立的服务器
        • 支持多开发者之间的协作
      • Distributed VCS(分布式版本控制系统)

        • 仓库存储于独 立的服务器 + 每个开发者的本地机器
        • 难同步
  • 基线的建立

    • 基线:软件持续变化过程中的“稳定时刻”(例如:对外发布的版本)
    • 在这里插入图片描述

CMDB :配置管理数据库

  • 存储软件的各配置项随时间发生变化的信息+基线

Git

在这里插入图片描述

实际的三个区域

  • workspace
  • Local repository
  • Remote repository

注意:staging只是将文件打上标签

Git仓库的三个部分

  • .git directory 本地的CMDB
  • 工作目录:本地文件系统
  • 暂存区:隔离工作目录和Git仓库

文件的三个状态

  • 已修改
  • 已暂存
  • 已提交

Object Graph

  • 在这里插入图片描述

  • 版本之间的演化关系图

  • 一条边 A->B 表征了"在版本 B 的基础上作出变化,形成了版本 A "

  • 有向无环图

  • 历史图中的每个节点都是项目的一个提交,是该时间点所有文件的完整快照。

    • 除了初始节点,每个commit指向一个父亲
    • 多个commit指向同一个父亲:分支
    • 一个commit指向两个父亲:合并
  • 只存储变化的文件,不变的文件存的是文件指针

和传统的VSC对比

  • 传统VCS

    • 存储版本之间的变化(行)
  • Git

    • 存储发生变化的文件,不变化的文件不重复存储

git 命令

  • git checkout -b xx 创建并切换分支

  • git checkout -d xx 删除分支

  • git checkout xx 切换分支

  • git merge xx 合并到当前分支,注意原分支还在

  • git commit

  • git fetch origin 一定要先获取最新版本

  • git push origin xx

  • 示例

    • 在这里插入图片描述

    • 在这里插入图片描述

软件构建的一般流程

(1) Programming

  • Construction languages

    • 从用途上划分

      • 编程语言(C,C++)

      • 建模语言(例如UML)

      • 配置语言(XML,JSON)

        • 配置程序
      • 构建语言(XML)

    • 从形态上划分

      • 基于语言学的构造语言
      • 基于数学的形式化构造语言
      • 基于图形的可视化构造语言
  • Programming tools

    • 集成开发环境

      • Source code editor with intelligent code completion, code refactoring tool 源代码编辑器、智能代码补全工具、代码重构工具
      • File management tool 文件管理
      • Library management tool 库管理
      • Class browser, object browser, class hierarchy diagram 软件逻辑实体可视化
      • Graphical User Interface (GUI) builder 图形化用户界面构造器
      • Compiler, interpreter 编译器、解释器
      • Build automation tools 自动化build工具
      • Version control system 版本控制系统
      • Extensible by more external third-party tools 外部的第三方工具

(2) Review and static code analysis(代码评审)

  • 旨在发现在初始开发阶段被忽视的错误,提高整体质量

  • 形式

    • Formal code review 正式的代码评审会议

    • Lightweight code review 轻量级的代码评审

      • 两个人一起编程Pair programming
    • Static code analysis 利用工具进行的静态代码分析

      • 该过程提供了对代码结构的理解,有助于确保代码符合行业标准。
      • 自动化工具可以帮助程序员和开发人员进行静态分析。
  • 目的

    • 改进代码
    • 提升程序员,相互学习

(3) Dynamic code analysis / profiling

  • 动态分析:要执行程序并观察现象、收集数据、分析不足
  • 对代码的运行时状态和性能进行度量,发现代码中的潜在问题

(4) Debugging and Testing

  • 测试:发现程序是否有错误
  • 调试:定位错误、发现错误根源

(5) Refactoring

  • 重构:在不改变功能的前提下优化代码(不改变外部行为的前提下改善内部结构)
  • 重新排列代码,进行一系列小的、保留语义的转换,让代码更易于维护和修改
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值