InfoQ

新闻

如何处理单个项目的多个代码版本

作者 Mark Levison译者 郑柯 发布于 2008年6月4日 下午9时4分

社区
Agile
主题
版本化
标签
TargetProcess

一旦产品发布了第一个版本,你的团队将面临下面的困境——如何在继续发布新版本的同时维护第一个版本。对于这个问题,Target Process 公司的CEO兼创始人Michael Dubakov,在“是否应该在项目中采用并行方式进行发布和迭代?”这篇文章中分享了他们的经验。

在Michael的例子中,他打算对1.0版本进行修复,继续1.5版本的工作,并为2.0版本开发新功能。同一个项目的工作应该由同一个团队来完成吗?在这样的团队中,是否该让某些开发人员发布2.0版本,其他人从事1.5版本的工作,并让Joe(具有牺牲精神的开发人员)挤出时间来修复1.0版本的重要问题?Michael得出的结论是:让浪费最小化,而且不在2.0上进行开发。针对进行1.5版本开发的程序员,我们减少了他们需要同时处理的任务,并尽量拖延作决定的时间(到2.0版本开始的时候,一些现在看来2.0所必备的功能可能已经不再需要了)。

根据Steve Campbell的经验,这个问题最好的解决方式是:将所有的任务(包括所有的版本)放置在单独的Sprint Backlog中。这样一来,任何一个团队成员都可以选取一个任务(不管是哪一个版本),然后开始工作。Steve继续讨论了这种情况下的分支策略:要么不要任何分支(采用运行时切换机制来区分不同的版本),要么只在重新开发组件的时候再做分支。

来自Eclipse 软件系统公司的Matt Swaffer采用的方法与之迥异。他的团队不发布补丁程序,实际上他们要保持主干的稳定,如果修复了bug,他们会邀请用户下载最新的版本。另外,他们还会为每一个版本打上标记,一旦发生严重的bug可以回溯到原来的版本进行修复。他们的终极目标是每周发布新版本。

说到基于同一个代码库发布多个产品的问题,《Implementation Patterns》的作者Kent Beck谈到一个例子:他参与了两个项目,团队需要支持七个客户。除了核心逻辑之外,每个项目都有大量的自定义代码。其中一个项目为每个客户保留了独立的代码库,每当有新客户时,他们会克隆一个“最新鲜”的分支,并继续进行开发。正如Kent所指出的,这样一来,他们被合并所带来的工作量淹没了。而另外一个项目中,交付给每个用户的是单独的二进制文件,这种方式保证每个客户执行的都是自己需要的代码。Kent认为这两个项目关键的不同之处在于:

关键在于找到方法推迟关联。我发现从一开始就要定好原则——我们将使用独立的代码库。这种方式减少了一些设计上的选择,但是仍然留有很大余地。还有另一个重要的原则,在第一个案例中我们不介意有一些重复的代码,如果能够明确如何消除重复代码,我们愿意这么做,但现在还没有,我们仍然希望能找到清晰的解决方案。

最后来自N-BRAINJohn A. De Goes这样说:

分支是浪费的一种形式,我们的目标是消除分支。我们采用单独的代码库,只支持最近发布的一个版本,每次发布都强行推送给所有用户,并频繁发布(理想情况是,一次发布增加一个功能,或移除一个缺陷)。采用SaaS的方式实现起来会更简单。

查看英文原文: Handling Multiple Versions in a Single Project Team?

5 条回复

回复

这是每家企业都要遇到的问题 发表人 jun xiao 发表于 2008年6月5日 上午1时33分
Re: 这是每家企业都要遇到的问题 发表人 avatar blogbin 发表于 2008年6月5日 上午2时34分
分支还是需要的 发表人 Ford Guo 发表于 2008年6月5日 上午8时25分
Re: 分支还是需要的 发表人 Ford Guo 发表于 2008年6月5日 上午10时15分
如果分支无法避免 发表人 Arion Saint 发表于 2008年6月6日 上午12时24分
  1. 返回顶部

    这是每家企业都要遇到的问题

    2008年6月5日 上午1时33分 发表人 jun xiao

    这是每家企业都要遇到的问题,可惜这里也并没有提到好的解决方案。毕竟每家企业都是不一样的

  2. 返回顶部

    Re: 这是每家企业都要遇到的问题

    2008年6月5日 上午2时34分 发表人 avatar blogbin

    只要测试->修复-〉发布的能力足够快,理论上抛弃分支。

  3. 返回顶部

    分支还是需要的

    2008年6月5日 上午8时25分 发表人 Ford Guo

    如果你的产品只有一个用户的话,可以没有分支,但是如果有不同的用户的话,也许分支还是解决不同用户的需求的一个必要保障吧,毕竟你不能强迫每个用户强制升级你的系统。

  4. 返回顶部

    Re: 分支还是需要的

    2008年6月5日 上午10时15分 发表人 Ford Guo

    不过,分支是应该要尽快很快的合并到主干,否则就象kent所说的,会被合并所淹没的。

  5. 返回顶部

    如果分支无法避免

    2008年6月6日 上午12时24分 发表人 Arion Saint

    我想如果就Michael的例子的解决办法是:
    1把1.5作为trunk
    2那为2.0的新功能做一个或多个实验分支
    3为1.0开一个bug fix分支
    这样大部分的人在1.5的trunk上工作,同时可以在1.0的分支上fix bug,并且及时的合并修复到trunk,同时一部分人可以为2.0的新功能工作。
    Eclipse的办法并不适用于所有的情况;
    Kent Beck的例子比较极端,可以把trunk作为vender分支来尽量减少合并所带来的工作量。
    当然最好的办法仍然是减少分支:)

独家内容

剖析短迭代

敏捷教练Dave Nicolette提出:我们应该如何设定迭代长度?是要根据发布周期的时间么?使用短迭代又有哪些好处?

应用JSF、Ajax和Seam开发Portlets(1/3)

本文主要讲述了如何用JBoss Portlet Container 和JBoss Portlet Bridge创建新项目,怎样配置一个JSF应用去使用JBoss Portlet Bridge,以及JBoss Portlet Bridge所具备的功能。

AtomServer:数据分发的发布动力(第二部分)

在这篇文章里,Bryon Jacob和Chris Berry将和我们继续探讨AtomServer,它是基于Apache Abdera的完整Atom存储实现。作者还创建了几个Atompub规范扩展,其中包括自动标记、批处理和Feeds聚合。

架构师(试刊第二期)

InfoQ中文站的电子杂志《架构师》试刊第二期出版了!相比于上期,我们在内容的选择安排和版式上都根据读者的意见重新做了修正。“细节决定成败”,我们希望基于InfoQ中文站的专业内容,《架构师》能逐渐成为大家喜欢的电子刊物!

一种正规的性能调优方法:基于等待的调优

在本文中,Steven Haines探讨了Web应用性能调优问题。该领域过去更像是一门艺术而不是一门科学。他提出了一种称为基于等待调优的方法,使整个调优过程更加可度量,也因此更具科学性。

Java程序员ActionScript 3入门

通常来说,改变技术路线时最艰难的部分是辨别语言语法之间的不同。这篇文章就为Java开发者提供了一份如何转向Flex基础语言ActionScript的指南。

浅谈如何创建Rails应用

本视频主要以财帮子为例,介绍了如何创建一个PV为百万级的Rails应用。其中包括:Rails应用的服务器架构、Rails Cache的优化、负载均衡的处理、Web服务器的调试、分布式解决方案、Open API的设计等等。

Alexandru Popescu谈InfoQ.com网站架构

InfoQ首席架构师Alexandru Popescu在采访中谈论了InfoQ架构、Webwork与DWR、Hibernate与JCR、Hibernate可扩展性、最新的InfoQ视频流系统和InfoQ的未来规划。