2.1
软件生成周期与配置管理
一.Software Development Lifecycle(软件生命周期SDLC)
From 0 to 1 从无到有:
计划——分析——设计——实现——测试——运维
From 1 to n 从有到好:
不断地更新升级版本
预期目标:
能够很长时间都保有生命力。
二.传统的软件开发模型
选择合适的过程模型的依据:
1. 用户参与程度有多大?--适应变化的能力
2. 开发效率/管理复杂度
3. 开发出的软件的质量
(1)线性过程:
①瀑布过程:从无到有的开发过程如瀑布一样。
特点:线性推进。阶段划分清楚。整体推进。无迭代。管理简单。无法适应需求,增加/变化。
②增量过程:设计实现与预测都是逐步完成的(每次只需完成一点),直到全部完成。
特点:线性推进。增量式(多个瀑布的串行)。无迭代。比较容易适应需求的增加。
(2)迭代过程:
③原型过程:开发软件应用的原型
过程:确认基本需求——开发应用的原型——交给用户审查——改进原型
迭代:开发出来之后由用户试用/评审,发现问题反馈给开发者,开发者修改原有的实现,继续交给用户评审。
优点:循环往复这个过程,直到用户满意为止。
时间代价高,但开发质量也高。
④旋涡模型:
特点:多轮迭代基本遵循瀑布模式。
每轮迭代有明确的目标,遵循“原型”过程,进行严格的风险分析,方可进入下一轮迭代。
三.敏捷开发
通过快速迭代和小规模的持续改进,以快速适应变化。
需要:
1. 极限的用户参与
2. 极限的小步骤迭代
3. 极限的确认/ 验证
采用eXtreme Programming (XP,极限编程)的方式:
四.软件配置管理(SCM)和版本控制系统(VCS)
SCM:追踪和控制软件的变化
包括版本控制和基线的建立。
① Software Configuration Item(软件配置项SCI)软件中发生变化的基本单元。
② 基线:软件持续变化过程中的“稳定时刻”(例如:对外发布的版本)。
③ CMDB :配置管理数据库存储软件的各配置项随时间发生变化的信息+基线。俗称:仓库。
④ 版本控制:为软件的任一特定时刻(Moment)的形态指派一个唯一的编号,作为“身份标识”。
古老的版本控制方法:通过复制文件并修改文件名。
SCM比之强在哪里:
个人方面:
1. 能够回滚到上一个版本
2. 比较两个版本的差异
3. 备份软件版本历史
4. 获取备份
5. 合并
团队方面:
1. 在多个开发者之间共享和协作
2. 记录每个开发者的动作,便于“审计”
名词:
1. Repository仓库:即于SCM中的CMDB
2. Working copy工作拷贝:在开发者本地机器上的一份项目拷贝
3. Change or diff变化:即code churn,两个版本之间的差异
4. HEAD:程序员正在其上工作的版本
SCM的特点:
·可靠性
·支持多文件
·版本变化的声明
·返回旧版本
·能够比较版本之间的不同
·检阅开发的历史
·不仅仅针对代码有效
不同的版本控制系统:
1. 本地版本控制系统:仓库存储于开发者本地机器无法共享和协作。
2. 集中式版本控制系统:仓库存储于独立的服务器,支持多开发者之间的协作。
3. 分布式版本控制系统:仓库存储于独立的服务器+每个开发者的本地机器。
五.Git——SCM tool
Git工作过程:
Git repository包括:
1. 本地的CMDB
2. 工作目录:本地文件系统
3. 暂存区:隔离工作目录和Git仓库
Object Graph :版本之间的演化关系图,一条边B->A 表征了“在版本A的基础上
作出变化,形成了在版本A的基础上作出变化,形成了版本B 。
2.2
软件构造的过程体系与工具
一.软件构造的传统过程
(1) 编码
语言的划分:
从用途上划分:
1. 编程语言(e.g., C, C++, Java, Python)
2. 建模语言(e.g., UML)
3. 配置语言(e.g., XML)
4. 构建语言(e.g., XML)
从形态上划分:
1. 基于语言学的构造语言
2. 基于数学的形式化构造语言
3. 基于图形的可视化构造语言
①Programming Languages 编程语言
Integrated development environment (IDE集成开发环境) 包括如下:
1. 源代码编辑器、智能代码补全工具、代码重构工具
2. 文件管理
3. 库管理
4. 软件逻辑实体可视化
5. 图形化用户界面构造器
6. 编译器、解释器
7. 自动化build工具
8. 版本控制系统
9. 外部的第三方工具
Eclipse就是典型的集成开发环境
②Modeling languages 建模语言
建模语言:以可视化,能反应关系,准确,表现设计思想为目标建立一种结构。
UML:一种典型的建模语言。
③Configuration languages 配置语言
配置文件能够配置参数,为程序初始化设置。
比如:配置环境参数。在运行时改变软件的行为。将稳定的部分与不稳定的分离。
配置语言有:Key-Value texts (.ini, .properties, .rc), XML, YAML, JSON
(2)代码评审和静态代码分析
代码评审由不同的部分组成:
1. 结对编程
2. 走查
3. 正式评审会议
4. 自动化评审
Formal code review 正式的代码评审会议:(比如 Fagan inspection)
Lightweight code review 轻量级的代码评审:
特点:
·Over-the-shoulder
·Email pass-around
·Pair programming
·Tool-assisted code review
静态代码分析:
对软件进行分析,而不需要它运行。
能够提供易于理解的代码结构,并且确保它符合开发的标准。
Java的自动化工具:CheckStyle, FindBugs, PMD
(3)动态分析
执行程序并观察现象、收集数据、分析不足。
对代码的运行时状态和性能进行度量,发现代码中的潜在问题。
(4) 调试与测试
测试:发现程序是否有错误。
调试:定位错误、发现错误根源
改正错误,得到正确的test结果。
两者都不是为了提高软件质量,而是诊断错误的方法。
Eclipse中的调试:
(5) 重构
重构:在不改变功能的前提下优化代码。
代码的重构是小的,保留含义的转换。
目的是为了让代码更容易维护和应对变化。
集成环境Eclipse支持重构
二.狭义的软件构造(build)
build:build-time——run-time借助于工具,将软件构造各阶段的活动“自动化”
(1)构建系统
1. 编译传统编译语言写的软件
源文件被编译到目标文件,目标文件可以被连接到别的代码库或可执行的程序。
2. 打包并测试解释性语言写的软件
3. 编译并打包基于网络的应用
4. 能够执行JUNIT测试代码的一小部分,也可以进行静态测试
(2)构建系统的构成元素
1. Version-Control Tools版本控制工具
2. Source Tree: 程序源代码的组织结构
3. Object Trees:包含目标文件和可执行的程序
4. Compilation Tools:编译工具
①编译器 ②连接器 ③基于UML的源代码生成器 ④文件生成器
5. Build Tools:构建工具
6. Build Machines: 允许构建的机器
7. Release Packaging and Target Machines:发行的包与目标机器
8. Types of packaging:打包的种类
(3) 构建的过程和构建语言
构建的过程:
每一种构建工具都需要自己的构建语言。
(4)java的编译工具
Java的标准字节码在Java Virtual Machine (JVM)上被解释
java的编译工具:
1.The Java Development Kit (JDK)
2.GNU Java Compiler
3.Eclipse Java Compiler (ECJ)
Java的源文件的标志“.java”
Java的目标文件的标志“.class”
Java的程序执行需要main方法和类路径
Java的库可以调用命令行生成或使用
(5)不同的构建方式
1. 构建子目标
2. 构建不同的版本
3. 构建不同的目标体系结构
(6)构建工具
我使用的是ant,下面是简单程序的构建
命令行运行结果如下: