课程目标:
- 软件开发的基本过程
- 传统的软件开发过程模型
- 敏捷开发
- 软件配置管理
- Git作为配置管理工具
- 广义的软件构造过程
- Eclipse作为Java构造工具
- 软件构造各阶段的常见工具
- 狭义的软件构造:build
- 常见的build工具
3.1软件开发的生命周期
3.2传统的软件开发过程模型
两类基本类型:线性过程、迭代过程
开发过程模型:瀑布、增量、V字、原型、螺旋模型
选择合适的过程模型的依据:用户参与程度(适应变化的程度)、开发效率(复杂度)、软件质量
瀑布模型
特点:线性推进、阶段划分清楚、整体推进、无迭代、管理简单、无法适应需求、难以增加/变化
使用场景:需求稳定的项目
增量模型
特点:线性推进、增量式(多个瀑布的串行)、无迭代、比较容易适应需求的增加
V字模型
特点:在瀑布模型的基础上增加了测试和评价,展示了开发生命周期的每个阶段之间的关系及其相关的测试阶段
原型模型
在原型上持续不断地迭代发现用户变化的需求,时间代价高,但开发质量也高。
迭代:开发之后用用户使用/评审,发现问题反馈给开发者,开发者修改原有的实现,继续交给用户评审。循环直到用户满意。
螺旋模型
一种风险驱动的过程模型
将开发分为4个步骤,并一轮一轮进行迭代。
3.3敏捷开发
核心思想:通过快速迭代和小规模的持续改进,以快速适应变化。
强调:极限的用户参与、极限的小步骤迭代、极限的确认/验证
敏捷开发的方法:XP(极限编程)、Scrum
3.4软件配置项管理(SCM)和版本控制系统(VCS)
3.4.1软件配置管理(Software Configuration Management)
含义:追踪和控制软件的变化
核心:版本控制和基线的控制
软件配置项:软件中发生变化的基本单元
基线:软件持续变化过程中的“稳定版本”(如对外发布的版本)
3.4.2版本控制(Version Control System )
- 个人:回滚到上一个版本、比较版本之间的差异、备份软件版本历史、换取备份、合并
- 团队:多人协作、记录每个人的动作
版本控制术语:
- 仓库:SCM中的CMDB
- 工作拷贝:在开发者本地机器上的一份项目拷贝
- 文件:一个独立的配置项
- 版本:在蘑菇特定时间点的所有文件的共同状态
- 变化:两个版本之间的差异
- HEAD:当前工作版本
VCS的特征:
- 有意义的修改信息(变化以及原因)
- 可靠(保留旧版本)
- 可以回退到旧版本
- 可比较不同版本的差异
- 可查看修改历史
- 多人协作可合并
- 允许独立和共同工作
3.5以git为例讲解SCM工具
git 仓库
一个git仓库有3个部分:
本地的CMDB
工作目录:本地文件系统
暂存区:用来隔离工作目录和git仓库
文件在git仓库的3个状态:
已修改、以暂存、以提交
git中的对象图
git的所有操作都是在一个图数据结构上进行的,git对象图存储在存储库的.git目录中。从另一台机器/服务器复制git项目意味着复制整个对象图。
对象图是一个有向的无环图,一条边A → B 表示“在版本B 的基础上做出变化,形成了版本A”;每个→指向一个父亲,如果有多个commit指向同一个父亲,则为产生分支,如果是一个commit指向多个父亲,则为merge
每次commit都会形成一个新的节点,这个节点包含所有文件的完整快照。
commit的信息:根节点、作者、提交者、备注信息等
git版本控制与传统VCS的不同:
传统VCS记录版本之间的变化信息,根据原信息来进行修改,速度较慢
git直接保存每个版本独自的信息,每个版本都是完整信息,不变化的文件不进行再次存储。每次更新时,没有修改的文件直接将指针指向旧版本,而修改过的文件使用新的指针来指向即可,速度快。
常见git命令
git init//初始化git仓库
git add*.c
git add readme.md//将文件添加到暂存区,开始对这些文件进行跟踪
git commit//将暂存区文件提交到本地仓库
git push//将本地仓库的文件提交到远程仓库(服务器)
git status//查看当前文件状态
git diff//查看当前文件和暂存区快照之间的差异,即修改后未add的内容
git commit -a//跳过git add步骤,直接将所有修改过的文件暂存起来并提交
git rm//从git中移除某个文件,不再跟踪,也将原文件删除
git fetch//从远程仓库抓取文件到本地,但不与本地的合并
git pull//与fetch类似,但是还会与本地合并
git checkout//切换分支
git checkout -b phase1//创建分支phase1并切换到phase1分支
git merge//合并,需要在主分支(main)上进行操作
3.6软件构建的一般过程
3.6.1 编程
软件构造语言可以依据分类标准不同而有不同的划分。
从用途上分:
- 编程语言(C/C++,java,python)
- 建模语言(UML)
- 配置语言(XML)
- 构建语言(XML)
从形态上分:
- 基于语言学的构造语言
- 基于数学的形式化构造语言
- 基于图形的可视化构造语言
3.6.2审查和代码评审
代码审查是源代码的系统检查。其常见方法有:结对编程、走查、正式评审会议、自动化评审等。
正式的代码评审会议:结构化的检査
轻量级的代码评审:相比正式评审开销小,效果可能与其相同
利用工具进行的静态代码分析:对未实际执行程序进行的分析(在执行程序时进行的分析称为动态分析)
代码评审的一些具体例子:bug,结构混乱,方法使用不当,错误使用基本设计概念
3.6.3动态代码分析/profile(评测)
动态程序分析是通过执行程序对软件进行的分析。
动态分析:要执行程序并贯彻现象、收集数据、分析不足
- 分析要求:程序要经过充分的测试、使用软件测试工具(确保代码的可能功能均被充分测试到)、使用评测发现代码中潜在的问题
评测(profile)是一种动态程序分析形式,用于测量程序的空间(内存)或时间复杂性、特定指令的使用情况,或函数调用的频率和持续时间。
3.6.4调试和测试
测试:发现程序是否有错误
调试:在测试发现问题之后,找到bug并修正,之后还要进行回归测试
调试和测试不会提升软件质量,而是发现和解决缺陷的主要手段;软件质量应该通过认真地分析需求、良好的设计、高质量的编码来实现
3.6.5重构
重构:在不改变功能的前提下优化代码,要可以兼容以前版本,既不改变软件的内部结构,也不改变软件的外部行为。
重构后还要进行单元测试保证代码正常工作