软件构造过程和工具
软件生命周期和配置管理
大纲
- 软件开发生命周期(SDLC)
- 传统的软件过程模型(瀑布、增量、v模型、原型、螺旋)
- 敏捷开发和极限编程(XP)
- 协作软件开发
- 软件配置管理(SCM)
- GIT作为SCM的工具
软件开发生命周期(SDLC)
软件开发生命周期:
需求收集$\rightarrow$可行性研究$\rightarrow$系统分析$\rightarrow$软件设计$\rightarrow$编码$\rightarrow$测试$\rightarrow$集成$\rightarrow$实现$\rightarrow$操作与维护$\rightarrow$配置
传统的软件过程模型
- 两种基本模型:线性、迭代
- 现有的模型:
- 瀑布模型:利于使用,应对变化代价高
- 增量模型:以增量的方式实施瀑布模型,通常首先实现优先级最高的需求,一旦开始开发某增量,则该增量的对应需求被冻结
- V模型(用于验证和确认):瀑布模型的扩展,强化测试
- 原型法:实现系统的原型
- 螺旋模型:一种风险驱动的过程模型
- 关键质量因素:
- 用户参与(适应变化)
- 开发效率、项目管理的复杂性
- 软件质量
敏捷开发
- 提倡适应性规划、演化开发、尽早交付和持续改进,并鼓励对变化做出快速和灵活的响应
- 人以及人与人的互动胜于过程和工具
- 可运行的软件胜于面面俱到的文档
- 提倡适应性规划、渐进开发、早期交付和持续改进,并鼓励对变化做出快速灵活的响应
- 客户合作胜于合同谈判
- 响应变化胜于遵循计划
协作软件开发
软件配置(SCM)和版本控制(VCS)
- SCM:任务时追踪与控制软件中的变化,实际任务是版本控制和建立基线
- 软件配置是软件配置管理的基本单位,任何需要管理的要素都是软件配置项(源代码、数据、文档、硬件、环境等)
版本控制系统VCM:本地VCM、集中式VCM、分布式VCM
Git作为SCM工具的例子
- GIt的所有操作都是在一个数据图库上进行
- 从另一台机器/服务器复制git项目意味着复制整个对象图
- 提交:
- 不重复保存各版本中没有发生变化的文件
- 每个文件的每个版本只保存一次,多个提交可共享副本
- 分支和合并:分支是在版本控制下对对象的复制,以便修改可沿两个分支平行进行
小结
- 通用的软件开发生命周期(SDLO)
- 传统的软件过程模型
- 敏捷开发
- 协作软件开发
- 软件配置管理(SCM)
- Git作为SCM的工具实例
过程、系统和工具
大纲
- 软件构造的一般过程:设计$\Rightarrow $编程/重构$\Rightarrow $调试$\Rightarrow $测试$\Rightarrow $构建$\Rightarrow $发布
- 编程/重构
- 检查和静态代码分析
- 调试(转储和日志)和测试
- 动态代码分析/概要
- 狭义的软件构造过程:验证$\Rightarrow $编译$\Rightarrow $链接$\Rightarrow $测试$\Rightarrow $打包$\Rightarrow $安装$\Rightarrow $部署
- 构建系统:组件和流程
- 构建变量和语言
- 构建工具: Make, Ant, Maven, Gradle, Eclipse
软件构造的一般过程
编程 $\Rightarrow $调试$\Rightarrow $静态代码检查$\Rightarrow $动态代码分析/概要分析$\Rightarrow $测试$\Rightarrow $重构$\Rightarrow $构建$\Rightarrow $编程
构建$\Rightarrow $编译$\Rightarrow $链接$\Rightarrow $测试$\Rightarrow $打包$\Rightarrow $安装 $\Rightarrow $部署
1)编程
a、编程语言
Eclipse作为IDE的示例:
Eclipse包含一个基本工作区,其中包含用于编码、构建、运行和调试的工具,以及用于定制环境的可扩展插件系统
核心组件:
—运行时内核:可启动基础功能、动态发现和运行插件
OSGi是java动态化模块化系统的一系列规范,Eclipse的插件采用OSGi规范描述自身,Eclipse platform维护插件及其功能的注册
—资源管理插件:定义了用于管理工具插件的通用资源模型。
—Workbench UI核:实现了工作台UI并定义了许多扩展点,允许其他插件提供UI功能
—java开发工具(JDT)
—插件开发环境
b、建模语言和工具
建模语言是一种人工语言,用于表达信息、知识或系统,以一套一致的规则定义来可视化、推理、验证和交流系统的设计
c 、配置语言
配置参数和初始化设置:分离稳定和不稳定的部分
2)评审和静态代码分析
代码评审是对源代码的系统检查(同行评审):
正式代码检查、轻量级代码评审、静态代码分析(没有实际执行程序,对执行程序的分析称为动态分析)
3)动态代码分析/概要分析
- 运行程序以分析代码
- 程序需要经过充分的测试
- 利用测试度量技术(如覆盖率)确保代码的可能功能均被充分测试到
- 概要分析是动态代码分析的一种形式,用于测量程序的时空复杂度,特定指令或函数的调用频率或持续时间
4)调试和测试
- 测试:
- 为软件的利益相关者提供有关被测产品或服务质量的信息
- 软件测试涉及要评估的组件或系统组件的执行
- 测试技术包括执行程序或应用程序的过程,目的是找到能验证软件产品是否合适的验证系统
- 调试
- 调试是识别错误的根本原因并对其进行纠正的过程
- 调试往往是成功测试的后序环节,成功测试不意味着没有错误
测试和调试不会提升软件质量,而是发现缺陷的主要手段;
软件质量应通过认真的分析需求、良好的设计、高质量的编码来确保
调试是最后的手段
5)重构
重构是在不改变代码外部行为的前提下,改善其内部结构,改进其外部行为
狭义的软件构造过程
1)建设体制
- 典型的构建场景:
- 1、编译代码
- 2、打包和测试解释型语言
- 3、编译和打包web应用程序
- 4、执行单元测试
- 5、进行静态分析,得到bug报告
- 6、输入不同格式的文件,得到人可读的文档(PDF/HTML)
- 编译语言
- C,C++,java,C#。源文件被编译后得到目标文件,后被链接入类库或可执行程序中,最终得到可部署到目标机器的发布包
- 工具:版本控制工具、源树和对象树、编译器、构建机器、发布打包和目标机
- 解释型语言
- j解释的源码不会编译成目标代码,所以不需要对象树。源文件本身被收集到一个发布包中,准备安装到目标机器上
- 编译工具专注于形成源文件并将它们存储到发布包中
- 编译成机器码不会在构建时执行,但可以在运行时执行
- 基于web的应用程序
- 基于web的应用程序的构建系统是编译、解释代码和配置或数据文件的组合
- 静态HTML文件只包含在web浏览器中显式的数据。文件被直接复制到发布包
- JavaScript文件包含最终被用户浏览器解释的代码,文件也被直接复制到发布包
- JSP,JAP或PHP页面包含HTML和程序代码。文件由web应用程序服务器编译执行,而不是由构建系统。这些文件被复制到发布包,安装到web服务器上
- java源文件被编译成目标文件并打包成web应用程序、构建系统在打包前执行该转换。java文件可在web应用程序服务器或web浏览器中执行
- 单元测试、静态分析等
2)构建系统的组件
版本控制工具、源树、对象树、编译器、构建工具、构建机器(本地(目标机器和构建机器相同)/交叉编译环境)、发布打包和目标机:生成可安装在用户机器上的软件
3)构建过程和描述
- 构建过程:构建工具调用每个编译工具来完成任务,这是一个端到端的事件序列
- 构建描述:构建工具需要构建描述信息,基于文本的格式编写
- 构建系统的使用
- 开发人员(或私有)构建:从VCS检出源码私有开发。最终的发布包用于开发人员的私有开发
- 发布构建:提供一个完整的软件包供测试组测验。用于发布构建的源树只编译一次,并且永远不会修改源树
- 健全性构建:除了不会讲软件包给客户外与发布构建相同。构建过程决定了源码是否有错误。这种构建每天可执行多次并且往往是完全自动化的
4)java的编译工具
write once ,run anywhere
java的目标文件
- java类的目标文件格式称为类文件,后缀为 .class
- 与机器无关的字节码来描述程序流,而不是直接编译到本地代码
- 需要JVM加载和解释这些字节码,JVM可能在实际执行程序前将它们转换为本机代码
- 使用javac命令将java源文件转换为类文件
java可执行程序
java语言是动态类加载,在运行时根据需要,类会被加载入内存
java程序时一个动态库的集合,单个类一次加载一个
java程序需要执行两件事:
JVM必须提供包含主方法的类的名称作为执行的起点
JVM必须提供一个类的路径用于识别其他类的地址
java库
- JAR文件通常作为分发程序的一种方法
- 由于动态加载的特性,可以随时替换和升级jar文件
5)子目标和构建的变体
可存在任意数量的构建方式,每个方式都使用稍微修改的构建过程并创建一个稍微不同的发布包
- 三种构建方式:
- 局部构建
- 构建不同版本(家庭版、专业版、企业版等)
- 面向不同目标架构的构建(不同的CPU指令集、不同的操作系统)
- 构建的字目标:软件模块化;避免耗时的完全构建,限制构建涉及的模块数量
6)构建工具
java:Make、 Ant 、Maven 、Gradle 、Eclipse
- Apache Ant:遵循的是将构建系统中的每个活动都封装成一个高级任务
- Apache Maven:让开发人员在最短的时间内理解开发工作的完整状态:简化构建模型、提供统一的构建系统、提供优质项目资讯、为最佳实践提供指导方针、运行透明的迁移到新特性
- Gradle:构建everything、完全自动化、转发更快
- Eclipse:代码编辑、编译、版本控制、测试、跟踪任务