[HITSC]哈工大2020春软件构造复习笔记 (2)

本系列文章

2.1 Software Lifecycle and Configuration Management

本节的重点在版本控制工具git的基础使用

1. 基本知识

  1. 软件开发生命周期(SDLC):从无到有,从有到好

  2. 传统软件过程模型:基本类型有线性过程(Linear)和迭代过程(Iterative),目前存在的模型有瀑布过程(waterfall),增量过程(incremental),V字模型(V-model),原型过程(prototyping),螺旋模型(spiral)。

  3. 敏捷开发:Agile = 增量 + 迭代

    将任务划分成一个个小规模的任务,因此较小的团队也能够适应大规模软件的开发。在每个小步骤的迭代中,用户可以参与开发,软件可以随时修正,质量因此得到了保证。因此,敏捷开发是一次次小迭代,将任务细分成一个个小任务,在每个小任务上完成迭代。

  4. 极限编程:关注于测试驱动的开发(TDD),自动化构建、持续集成、持续交付。

2. 软件配置管理(SCM)和版本控制系统(VCS)

软件配置管理是为了追踪和控制软件的变化,而软件中发生变化的基本单元,如文件,就被成为软件配置项(SCI)

当软件在开发过程中达到了一个稳定的状态,如可以对外发布的状态,此时的文件组成了基线(Baseline)

为了存储各配置项随时间变化的信息和基线信息,就有一个数据库来管理这些内容,即配置管理数据库(CMDB)

VCS分为三种:本地版本控制系统(无法协作)存储在本地、集中式版本控制系统(支持协作但没办法抵抗服务器崩溃导致无法开发的风险)存储在服务器上、分布式版本控制系统(解决了前两者的问题,代价是存储空间)同时存储在本地和服务器。

3. Git

创建:git init

暂存:git add <filename>

提交:git commit -m “commit message”

链接:git remote add origin <URL>

推送:git push- u origin master

创建分支:git checkout -b <branch name>

切换分支:git checkout <branch name>

合并分支:git merge <branch name>

删除分支:git branch -d <branch name>

git中的四个区域:workspace、staging area、Local repository、Remote repository

git的存储结构是一张有向无环图,每次commit在图上会增加一个新的节点,并将HEAD指向这个节点。通常一个子节点有一个父节点,当一个父节点有多个子节点时表明创建了分支,一个子节点有多个父节点时表明进行分支合并。

git单个节点的存储的信息是文件信息指针tree、作者信息author、提交者信息commiter,而在每个tree中,包含所有文件的信息,对于每个文件指针,如果文件变化了,则指向变化后的新文件,如果没有变化,则指向上次提交的文件,不做重复存储。

传统VCS存储的是文件每个版本之间的变化,这种办法的优点是存储空间较小,但由于存储的只是变化,取出指定时期的文件要先取出原文件,再取出变化内容,最后做合并形成新文件,所以取出文件的时间复杂度较高。git存储的则是文件,所以取出特定版本的文件比较方便,但是代价的是空间复杂度较高。

关于分支的合并:对于合并操作来说,如果是把一个做了更改的分支合并到一个未作更改的分支,那么就将未作更改的分支的指针移到做过更改分支的指针的位置。示意图:把hotfix合并到master

在这里插入图片描述

而如果两个分支都做了更改,那么就找到更改的共同的祖先节点,以祖先节点为开始,将两个分支所有做出的更改都放在一起,在工作分支上形成一个新的节点。示意图:把iss53合并到master
在这里插入图片描述
删除分支时,只是删除了分支指针,并没有删除在该分支上的commit。

2.2 Process, Systems, and Tools of Software Construction

1. 通常软件构造过程

(1) Programming:有编程语言,也有建模语言,如UML,还有配置语言,如XML、JSON。

(2) Code review、Static code analysis:可以使用工具来发现bug,如CheckStyle, SpotBugs。

(3) Testing:测试,单元测试、集成测试、系统测试…

(4) Debugging:调试

(5) Dynamic code analysis/profiling:在程序运行的过程中查看并发现问题,本课程不涉及这部分

(6) Refactoring:重构不改变功能,只是处于更容易维护的目的对代码优化

(7) Build:第2部分

2. 狭义的软件构造过程(Build)

这是一个借助于工具,将软件构造过程中大的各阶段的活动自动化的过程,尽可能地脱离人工,以提高构造效率。

常用的工具:Jenkins、Make、Ant、Maven、Gradle

利用工具完成项目的自动化构建、测试、打包release等功能,完成build time–>run time。

习题

2.1

  1. 以下哪些不是 agile development敏捷开发过程的特征
    A. 线性过程
    B. 增量式过程
    C. 迭代过程
    D. 测试驱动开发 (Test-Driven)
    E. 持续集成、持续交付
    F. V字模型(确认/验证)

  2. 关于软件配置管理SCM的说法,不正确的是
    A. 用于追踪和控制软件开发过程中的变化
    B. 其基本管理单元是软件配置项SCI,即开发过程中发生变化的基本单元
    C. 版本是为软件处于特定时刻( moment)的形态指派一个唯一的编号
    D. Git是一种典型的集中式版本控制系统

  3. 以下关于软件配置管理SCM和Git的说法,不正确的是
    A. 软件配置项SCI是软件演化过程中发生变化和SCM管理变化的基本单元,不需再细分
    B. Git在本地机器上的 .git 目录对应于SCM中的配置管理数据库CMDB
    C. Git中的SCI是“文件”,它有三种形态:已修改(modified)、已暂存(staged)、已提交(committed)
    D. Git中两次相邻提交v1和v2,若后者提交时间晚于前者,那么Git仓库中只记录v2中的文件相对于v1中的文件发生变化的代码行(增加和删除的代码行)

  4. 针对Git仓库的 object graph,以下不正确的说法是
    A. 它是一个有向图,边的方向指向产生时间较晚的commit节点
    B. 一个comm节点可以有0个、1个、2个、多个 parent节点
    C. 一个 branch(分支)本质上相当于一个指向特定commit节点的“指针”
    D. 可以有两个不同的 branch指向同一个 commit节点
    E. git commit指令相当于在Object graph当前分支HEAD指向的 commit基础上,派生出一个新的 commit节点。

  5. 针对Git中 commit节点的数据结构,说法不正确的是
    A. 包含一个tree,tree中包含了一组指针,分别指向本次commit所修改的每一个文件。
    B. 若某commit相比起其parent来说,某文件f未发生变化,则f在.git中不会重复存储。
    C. 如果文件f在前后两个commit中相比只增加了一行代码,那么.git只需要存储的这一行的变化代码即可。
    D. 如果某个commit节点仅存在于远程服务器的object graph,那么当本地向远程git push的时候,会出现错误提示

  6. 如果使用 https://xx.yy/zz.git 作为本地Git仓库的远程仓库,其别名为 origin,若本地git仓库当前正在 master分支上工作,那么以下能够最恰当的将本地仓库中 master分支的最新提交推送至远程仓库的指令是

    A. git push origin master
    B. git pull origin master
    C. git fetch origin master
       git merge
       git push origin master
    D. git commit-m "fix bugs"
       git pull origin master
    

答案:1. A 2. D 3. D 4. AB 5. AC 6. C

2.2

  1. 以下用于在软件设计阶段描述设计思想和设计结果?
    A. Programming languages(e.g.,C, C++,Java, Python)
    B. Modeling languages(e.g.,UML)
    C. Configuration languages(e.g., JSON)
    D. Build languages (e.g.,XML)
  2. 以下关于软件构造过程各阶段的说法,不正确的有
    A. Profiling是 static code analysis的一种典型式
    B. Code review的目的是发现代码中的潜在错误
    C. Refactoring是在不改变代码功能的前提下重写代码以消除bug,提高质量
    D. Build是将软件从开发态转化为可运行状态的过程
  3. 以下环节无需执行正在开发的软件?
    A. Code review
    B. Dynamic code analysis
    C. Debug
    D. Testing
  4. Dynamic code analysis / profiling解决不了的问题是
    A. 发现程序运行过程中的内存分配和占用情况
    B. 发现程序运行过程中每个类被实例化的数目,及其所占用的内存
    C. 发现程序潜在的性能瓶颈
    D. 发现程序中潜在的重复代码以便于抽取出来形成可复用函数/类
  5. 以下可纳入自动化build的过程?
    A. Compiling .java into .class
    B. Executing JUnit test cases
    C. Using Checkstyle tool to check if code follows Google’s Java code style
    D. Packaging .class files into .jar file and deploying it to a remote server
  6. 以下说法,不正确的是
    A. 常规的构造次序是: coding->refactoring-> testing->code review-> debugging->build ->dynamic profiling
    B. 通过code review和profiling找出可能的bug,通过 testing找出真实的bug,通过debug找出bug的根源
    C. 先根据spec构造完备的测试用例,后续对代码的任何修改,都应重新运行测试用例
    D. Buld脚本是由配置语言书写告知build工具如何一步一步完成自动化build任务

答案:1. B 2. A 3. A 4. D 5. ABCD 6. A

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值