团队做业Week14——源代码管理

  0. 在吹牛以前,先回答这个问题: 若是你的团队来了一个新队员,有一台全新的机器, 大家是否有一个文档,只要设置了相应的权限,她就能够根据文档,从头开始搭建环境,并成功地把最新、最稳定版本的软件编译出来,并运行必要的单元测试? (在这过程当中,不须要和老队员作任何交流)html


  答:是。java

  这个问题早在Alpha阶段初期就困扰了咱们团队。咱们爬虫的核心基本就在两个方面——爬取和存储。爬取动做是在代码实现之中的,编译程序不会遇到什么大的问题。而存储涉及到了咱们项目的核心之一——数据库。因为软工和数据库是在同一学期开设的课程,大多同窗在开始Alpha的时候数据库知识匮乏,而咱们的程序却必需要链接数据库才可以正常运行。当时我本身再摸索成功链接上数据库时就把链接数据库的几个常见的问题写成博客发表了出来。新成员若是可以阅读咱们这一博客,成功链接上数据库,那么编译过程和单元测试问题不大。程序员

  这是咱们早在11月4号就写好的博客,在Beta阶段中对两位新成员运行程序也提供了帮助。(当时新成员仍是与咱们进行了直接的交流来更轻易的执行程序。可是相信就算不与咱们进行任何交流,多花费些时间按照博客的操做链接上数据库,也是可以编译程序来进行测试的。)数据库

  http://www.cnblogs.com/cnmxfd/p/4935890.html服务器

 

1. 你的团队的源代码控制在哪里?用的是什么系统?如何处理文件的锁定问题?
   场景:  程序员果冻正在对几个文件进行修改,实现一个大的功能, 这时候, 程序员小飞也要改其中一个文件,快速修复一个问题。怎么办?
    一个代码文件被签出 (check out) 以后,另外一个团队成员能够签出这个文件,并修改,而后签入么?
   有几种设计,各有什么优缺点?
   例如,签出文件后,此文件就加锁,别人没法签出;  或者, 全部人均可以自由签出文件

  答:咱们使用的是TFS的源代码资源管理器进行源代码的管理。
  其实这一问题在咱们Alpha阶段进行代码签入时就有出现:
  
  从图中能够看出我在11.9号中午的时候反复进行代码签入,这就是由于在Alpha阶段初期咱们对源代码管理的疏忽而产生的问题。几名成员同时对某一个变动集工做多日而久久不进行代码的签入,致使最后签入的时候新旧代码循环覆盖。
  因此在Beta阶段刚开始,我就再三更DEV们声明:当天若是有代码实现,就算实现了一半,也能够用注释的方法将之进行代码签入,天天编写代码以前获取最新版本的代码。然而仍是会出现这样的问题:由于成员们大多编码时间都集中在晚上9~11点之间,因此就算进行了这样的行为规范,仍是难以免在同一时间共同操做同一变动集的问题。在出现了这种状况以后,咱们利用TFS源代码资源管理器自带的锁,避免了这样一种状况的出现:
  
  编码人员在肯定了要修改哪几个.java文件以后,就在TFS源代码管理器上对其锁定,此时其余编码人员的签出动做就会被拒绝。等待该.java文件获得修改以后,为其解锁,其余人员就可以签出该文件的最新版本了。(与多线程的锁的控制原理简直如出一辙,其实就是为了防止两个编码人员在同一时间对同一文件进行操做形成了最终该文件内容的不肯定性)
 
 
2. 如何看到这个文件和以前版本的差别? 如何看到代码修改和工做项 (work item),缺陷修复 (bug fix) 的关系。
   场景: 程序员果冻看到某个文件被修改了,他怎么看到这个文件在最近的修改究竟改了哪些地方? 
   场景: 程序员果冻看到某个文件在最新版本被改动了100 多行, 那么和这100多行对应的其余修改在什么文件中呢? 这个修改是为了解决哪些问题而做的呢? 那些问题有工做项 (work item,issue),或者bug 来跟踪么?

  答:这一功能在TFS的源代码资源管理器也能进行操做。当时Alpha阶段因为初期代码管理紊乱的问题也正是经过变动集的反复比较而最终肯定下最新的变动集的。
  
 
  如图咱们能够将本地代码与某一指定变动集进行比较,也能够将历史中的两个变动集进行比较。比较结果将会返回有差别的文件,点开差别的文件咱们就可以看到具体的代码不一样:新添了绿色阴影部分的代码。
  
 
 
 
3. 若是某个文件在你签出以后已经被别人修改,而且签入了,那么你在签入你的修改的时候, 如何合并不一样的修改(merge)? 你用了什么工具来帮助你?

  答:在Alpha阶段时咱们赶上这种状况只能经过比较,而后各自找出最新的代码块新添入本身的.java文件中再进行签入。现在咱们能够经过TFS上的分支与合并有效解决这一问题,因为锁的问题会影响DEV们的编码时间,因此在对某一文件进行签出修改以前,咱们能够为他创建一个新的分支,在编码以后把分支合并回去。这样可以解决一个文件遭到同时修改的冲突,也可进行比较进行选择。
  
 
  合并以后再将主分支进行签入。
  
 
4. 你有20个文件都是关于同一个功能的修改,你要如何保证这些文件都同时签入成功(修改的原子性),或者同时签入不成功?
    场景: 程序员果冻要签入 20 个文件,他一个一个地签入, 在签入完5 个 .h 文件以后, 他发现一些 .cpp 文件和最新的版本有冲突,他正在花时间琢磨如何合并... 这时候, 程序员小飞从客户端同步了全部最新代码, 开始编译, 可是编译不成功 - 由于有不一样步的 .h 文件和 .cpp 文件!  这时候, 别的程序员也来抱怨一样的问题,果冻应该怎么办?

  答:在这两个阶段咱们都没有碰到过这样的状况,由于没有同一时间签入如此多的修改而且刚好碰到这样悲剧的小飞。但我想也许以下几个方法能够进行尝试:
  1.直接对工程文件进行整个的签入挂起的更改,这样TFS会直接把有更改的全部文件进行签入(尚不知道这样作是否具备原子性)。
  
 
  2.在修改以前为将要修改的文件都上锁,防止其余DEV在签入的时候进行签出操做。
 
 
5. 你的PC 上有关于三个功能的修改,可是都没有完成,有不少文件处于半完工的状态,这时你要紧急修改一个新的 bug,如何把本地修改放一边,保证在干净的环境中修改这个 bug, 并成功地签入你的修改 --- changelist management。

  答:一样没有遇到过。可是分支应该是解决这一问题的有效方法。在对文件修改以前创建分支并在这个分支上进行功能的修改,若是遇到BUG,则在主分支上再创建一个新的分支,最后当这两个分支都完成以后把它们合并到主分支当中去。
 
 
6. 如何给你的源代码创建分支?
    场景:大家须要作一个演示,因此在演示版本的分支中对各处的代码作了一个临时的修改, 同时,主要的分支还保持原来的计划开发。 大家怎么作到的? 在演示以后,演示版本的有些修改应该合并到主分支中,有些则不用,大家是怎么作到的?
    场景: 大家的软件发布了,有不少用户,一天,一个用户报告了一个问题,可是他们是用某个老版本,并且没有条件更新到最新版本。 这时候,你如何在本地构建一个老版本的软件,并试图重现那个问题?

  答:
  经过TFS源代码资源管理器能够为某一.java文件创建新的分支:
  
  场景一:演示版本的代码是实如今分支当中的,因此咱们能够在演示时用分支的代码进行编译,主分支仍旧留在服务器之中,若是某些分支的修改是主分支所须要的,则把相应的分支合并到主分支便可。
  场景二:首先咱们会分析这一问题的体验影响程度,而且对这一老版本的用户量作一个估计的考量(报告此问题的人次也可反映),并查看新版本是否也存在这一问题。若是一切指标指向这一BUG的影响不容忽视,咱们能够经过变动集历史找到老版本,在相应的变动集上进行回滚,就可以重现当时的代码。
  
 
 
 
7. 一个源文件,如何知道它的每一行都是何时签入的,为了什么目的签入的 (解决了哪一个任务,或者哪一个bug)?
   场景: 一个重要的软件突然出现崩溃的状况,  程序员果冻通过各类debug手段,发现问题是在某一个文件中有一行代码彷佛显然出了问题,可是这个模块被不少其余模块调用,这行代码是何时,为了什么目的,通过谁签入的呢?若是贸然修改,会不会致使其余问题呢? 怎么办?

  答:在TFS源代码管理器中,可选中改行查看历史记录:
  
  结果会显示改行的修改记录,经过后面的注释能够知道该次签入的说明。
  
 
  场景回答:因为历史查看也会显示出修改人员,能够向该次修改的DEV进行更详细的询问。
 
 
 
8. 如何给一个系统的全部源文件都打上标签,这样别人能够同步全部有这个标签的文件版本?
   代码天天都在变, 有时质量变好,有时变差,咱们须要一个 Last Known Good (最后稳定的好版本) 版本, 这样新员工就能够同步这个版本, 咱们若是须要发布,也是从这个版本开始。那么如何标记这个 Last Known Good 版本呢? 

  答:咱们两个版本的源代码管理都没有用到标签。多是应该项目规模还比较小,用标签的收益不大。标签其实就是为整个项目或者某一个.java文件制定一个索引,在版本的推移中,如若发现新版本的各方面均不如以前的版本,能够经过标签查到到以前的版本或者某一文件。
  从标签的试用上来看,标签在大型项目中会十分灵活。可以快速定位到某一个变动集并对其进行操做。
  
 
  标签test的查找结果:
  
 
 
9. 你的项目的源代码和测试这些代码的单元测试,以及其余测试脚本都是放在一块儿的么? 修改源代码会确保相应的测试也更新么?你的团队是否能部署自动构建的任务?
    在签入以前,程序员可否自动在本身的机器上运行自动测试,以保证本地修改不会影响整个软件的质量?
    在程序员提交签入以后,服务器上是否有自动测试程序, 完成编译,测试,若是成功,就签入,不然,就取消签入?
    团队是否配置了服务器,它自动同步全部文件,自动构建,自动运行相关的单元测试,碰到错误能自动发邮件给团队
  答:测试目前的确是咱们团队一个一个短板,场景所提到的自动测试程序咱们几乎没有。现在Beta的开发阶段已通过去,也仅是对成员作出测试数据记录以及测试日志的上传,测试强度依然欠缺。从如今到项目展现的这段时间,咱们会尤为重视测试。如若时间条件容许,也会编一个自动测试程序进行各个变动集的编译测试。
相关文章
相关标签/搜索