软件构造过程与配置管理
软件开发的基本过程
传统的软件开发模型
敏捷开发
软件配置管理(Software Configuration Management)
git作为配置管理工具
广义的软件构造过程
- 软件开发生命循环(Software Development Lifecycle SDLC)
是一个从无到有的过程:
软件的生命周期如下:
计划(planning)- >分析(analysis)-> 设计(Design)-> 完成功能(implementation)-> 测试与集成 (testing&integration)-> 维护(maintainance)
并不断周而复始循环,从无到有,从有到好
- 传统软件过程模型
(根据用户参与程度//适应变化的能力、开发效率/管理复杂度、开发出的软件质量来选择核实的模型)
主要分为两类:线性过程和迭代过程
现存的过程模型有:
-
瀑布模型 waterfall(是线性非迭代的)
管理简单、无法适应需求的增加与变化 -
增量模型 increment(是非迭代的)
线性推进,是增量式的(也就是多个瀑布的穿行),比较容易适应需求的增加 -
V字模型 V-model (验证并核实)
可视为瀑布模型的延伸,只是变成了V字形而已 -
原型模型 prototyping (迭代)
在分析与设计之间增加一个原型模块提供给用户,并在原型上持续不断的迭代发现用户变化的需求,开发者不断与用户进行交互,通过用户对开发出来的产品试用的问题反馈修改原有实现,并持续迭代这个过程,直到用户满意为止。
特点:时间代价高但开发质量高。
-
螺旋模型 spiral(迭代)
是瀑布模型与原型模型的结合,非常复杂。在每轮迭代拥有明确的目标,每轮通过瀑布模式进行设计,但遵循“原型”过程,进行严格的风险分析后才能进行下一轮迭代。
3. 敏捷开发(Agile Development)
即通过快速迭代和小规模的持续改进,以快速适应变化。
敏捷开发3Extreme:
即:
-
极限的用户参与
-
极限的小步骤迭代
-
极限的确认/验证
eXtreme Programming(XP)极限编程
pair programming
-
软件配置管理和版本控制系统
A. 软件配置管理:
作用:追踪和控制软件的变化。
几个概念:
软件配置项:Software Configuration Item(SCI)是软件中发生变化的基本单元(例如文件)
基线:软件持续变化过程的“稳定时刻”(对外发布版本的文件使用情况//见下图)
配置管理数据库CMDB(configuration management database)
存储软件的各配置项虽时间发生变化的信息+基线
B. 版本控制
版本的概念就不细述了,根据修改的比重可以分为major、minor、patch
我们经常用的古老的版本控制方法:复制黏贴产生副本并在副本的基础上修改。(往往浪费大量空间)
版本控制的好处:
个人方面:
- 便于回滚到上一个版本
- 便于比较两个版本之间的差异
- 便于备份软件版本历史
- 便于获取备份
- 可以合并先前的版本
团队方面:
- 便于在多个开发者之间共享和协作
- 版本控制记录每个开发者的动作,便于“审计”
几个术语:
- 仓库(repository):即软件配置管理(SCM)中的配置管理数据库(CMDB)
- 工作拷贝(working copy):即在开发者机器上的一份可编辑的本地拷贝。
- 版本(version):在某个特定时间点的所有文件的共同状态
- 变化(diff/change/code churn):两个版本之间的差异
- Head:程序员正在其上工作的版本
三种版本控制系统(Version Control System)
- 本地(local)版本控制系统:仓库存储于开发这本地机器无法共享和协作
- 集中式(centralized)版本控制系统:仓库存储于独立的服务器支持多开发者之间的协作
- 分布式(Distributed)版本控制系统:仓库存储于独立的服务器+每个开发者的本地机器
5. git作为软件控制管理工具
A. Git的仓库
一般说来,git的仓库通常有三个部分:.git目录(本地的配置管理数据库)、工作目录(即本地文件系统)、暂存区:隔离工作目录和git
软件在工作区修改,在暂存区暂时存放,提交至git远程git仓库中。
B. 常用的git指令有:
- git add/mv/rm
- git commit
- git reset
- git push
- git clone/pull
- git diff
- git merge
具体使用见下:
C. git的对象图
在各种操作以后,git会形成一个关于版本的有向图,如果想要获得版本变化的对象图,在git bash中使用下述指令获取:
-git clone URL local_repository
Object Gragh长这样:
有向边从儿子(更新版本)指向父版本,Head为当前版本,一个commit的版本可以有一个父亲也可以有两个(使用merge时),一个父亲可拥有无穷多个分支。
当文件commit的时候,只会存储软件中与原版本相比修改的文件,对于未发生变化的文件不重复存储
一个小练习:
tips:
创建新分支:git branch branchName
切换到新分支:git checkout branchName //checkout实上是将head指向BranchName
以上两个指令可以合并成:git checkout -b branchName
6. 软件构造的过程步骤
没什么好讲的其实,看图就行
建造语言有:编程语言(C,C++,Java,Python),建模语言(UML),配置语言(XML),构建语言(XML)
附:编译器和解释器的区别:
1、解释器
解释器是一种计算机程序,它将每个高级程序语句转换成机器代码。
2、编译器
把高级语言编写的程序转换成机器码,将人可读的代码转换成计算机可读的代码(0和1)。
两者都是将高级语言转换成机器码,解释器在程序运行时将代码转换成机器码,编译器在程序运行之前将代码转换成机器码
注:
Java既是编译的又是解释的,Java代码本身被编译成目标代码。在运行时,JVM将目标代码解释为目标计算机的机器代码。【1】
Review and static code analysis
– 结对编程
– 走查
– 正式评审会议
– 自动化评审
一般错误:
- 错误使用 == 和equals()
- 使用整数参与浮点运算
- list可变时使用了固定数组
- 规约撰写错误
- 发生表示泄露
- 使Immutable类型数据发生改变
- 未声明的变量
- 对象的实现出现问题
动态代码检测
即在执行程序时观察现象、收集数据、分析不足,对代码的运行时状态和性能进行度量,发现代码中的潜在问题。
debug和测试
通过测试发现程序是否有错误,通过debug定位错误发现错误根源。“debugging is a last resort.”
重构:在不改变功能的前提下优化代码
【1】https://www.cnblogs.com/lemon-le/p/13840014.html