软件构造二

软件构造过程和工具

软件生命周期和配置管理

大纲
  • 软件开发生命周期(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:代码编辑、编译、版本控制、测试、跟踪任务