偶然看到Paul Hammant在2007年4月26日写的一篇文章:
http://paulhammant.com/blog/branch_by_abstraction.html。觉得还不错,就翻译了出来。虽然文章的内容并不复杂,翻译过程中仍深深觉得水平有限,好几处翻译得很不理想,请朋友们指正。
Branch By Abstraction
尽管不为人知,但我推行一种叫做Branch by Abstraction的源码控制方法的最佳实践好几个年头了。当对代码进行大规模的改动时,构建很可能失败,甚至得花费数周时间才能重新构建成功。而我说的这种做法能让你把大批开发者拴在同一个主干下工作,而不是产生许多“短期的特性分支”,因为这些分支会一而再、再而三地打断构建过程......
限制条件
需要指出设计单个主干而不是一组主干有一些限制条件,不过这些条件恰恰是敏捷开发所坚持的:
* 应用程序被分解为多个组件
* 每个组件在主干中占有一个目录(可能是多级的)
* 每个目录里的源码是自包含的,可单独构建(可能也是多级的)(译注:这里的多级我理解为组件可以依赖于它的子组件)
* 有一组很好的单元测试,这对于演示组件的用法非常重要
* 应用了持续集成,特别是有数百个组件的时候,得把它们放入类似Maven的库中。CruiseControl有个很好的<httpfile/>指示字,与<include-projects/>指示字一起使用的话能完成超酷的CI效果:既能管理好分支又不需要专门的CI管理员(译注:我对CruiseControl没有深入了解,这一条全凭感觉翻译的)
* 你能做好版本发布的计划与管理
* 开发者从不愿轻易打断构建过程 :-)
主干可能类似下面这个样子:
<root>
trunk/
foo-components/
foo-api/
foo-beans/
foo-impl/
build.xml
src/
java/
test/
cruisecontrol-config-snippet.xml
remote-foo/
bar-services/
bar/
build.xml
src/
java/
test/
cruisecontrol-config-snippet.xml
bar-web-service/
回到问题...
假定,你的团队想把代码从Hibernate移植到iBatis上,而可能有数千个类依赖于Hibernate,该怎么办?架构师可能说这样的改动将让构建中断数周,所以最好新开一个分支。但是,让我们试试Branch by Abstraction(BBA)而不是传统的“Branch by Source Control”(这可是Stacy Curl说的 - 嘿嘿,我得叫他写篇更好的博文)。
实施Branch By Abstraction的步骤
找来负责移植的那帮开发者,然后:
1. 在要改动的重点代码上增加一个抽象层
2. 找到原来直接调用将被改动的代码的地方,把这些地方改为通过新的抽象层间接调用(将被改动的代码)
3. 为抽象层按新的要求重新实现,并编写单元测试来测试新实现的核心功能
4. 找到第2步骤中提到的那些代码,改为调用新的实现(也是通过新的抽象层间接调用)
5. 废弃原有实现(如果你觉得代码足够稳定,也可以直接跳到下一步)
6. 删除原有的实现代码(因为你没不需要回头了)
7. 如果你觉得增加的那个抽象层不够优雅,就把它去掉
好处
* 只有一小撮人受到改动的影响
* 改动到哪个阶段,代码都很健康 - 因为调用这些组件的应用程序总是能照常运行
* 进度是可管理的
* 避免了炼狱般的分支合并操作
* 引入抽象也有助于理解和规范代码 - 这本身就很有意义
当然,BBA不是包治百病的仙丹。它只是一种开发者和架构师都可以常用的实践,让架构师在考虑是否要引入长期的特性分支时少伤脑筋。架构师应该多试试BBA而不是新的特性分支 - 如果架构师在一开始就说新开一个分支是“唯一的途径”,就别想达到目标。(译注:这一段感觉翻译得很有问题,请大家指正)
一个朋友上周告诉我,他的一个客户有21个重要的代码分支,这些分支的合并顺序简直莫名其妙!我吸了一口冷气。当我猜测他们是用ClearCase做SCM时,朋友只是苦笑。无论是ClearCase的动态、静态还是UCM模型,在敏捷开发的实践中都没有立足之地。它象是一个自相矛盾的预言术,需要数十个管理员加数个黑带级合并大师才能玩弄;它只能产生更多分支并导致开发周期拖长、瀑布开发思维及高人才流动率。还有一个更糟的就是PVCS(谁手上还有它?)。如果想找个适合敏捷开发的好工具,应该看看Perforce(我一直最欣赏它的是IntelliJ能很好地与它配合)或Subversion。我想Subversion最快一年内就能超越Perforce了。
那么啥时候新开一个分支呢?
仅仅在发布新版本的时候。
<root>
trunk/
releases/
rel-1.0/
rel-1.1/
rel-1.2.x/
你可以在发布前新开分支,在这个分支上进行最后的锤炼使产品定型。这时你不能再授权给所有的开发者了,而只能给少数几个开发者,他们保证分支稳定并负责后续的合并(仅限于一、两个必要的合并)。当然,你得从主干分支出来 - 这样才能用CI验证主干总是稳定的。
与Stacy Curl一样,我希望Martin能写篇关于这项重要实践的文章。他的文笔可比我要好。
分享到:
相关推荐
### Policy-Sealed Data: 构建可信赖云服务的新抽象 #### 概述 随着云计算技术的迅猛发展,越来越多的企业和个人选择将数据托管在云端,享受便捷的数据存储、处理及应用服务。然而,云环境中的数据安全问题逐渐成为...
当前讨论的文档版本为**Specification of Compiler Abstraction V3.0.0 R4.0 Rev1**,由AUTOSAR于2009年12月2日发布。自初始版本发布以来,该规范经历了一系列重要的更新和发展: - **2006年4月27日**:发布初始...
Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing.SPARK RDD论文
Hierarchical Deep Reinforcement Learning: Integrating Temporal Abstraction and Intrinsic Motivation 分层强化学习论文总结
卡尔文抽象网站 对。 是代理 。 入门:更新网站内容 ...git clone --recurse-submodules git@github.com:Calvin-Abstraction/Calvin-Abstraction.github.io.git 如果已经克隆, git submodule update --init --recu
### Shape Abstraction:掌握视觉传达的艺术 在艺术领域,“形状抽象”(Shape Abstraction)是一种重要的创作手段,它不仅能够帮助艺术家控制观众对作品的理解,还能有效地提升视觉传达的效果。本文将深入探讨形状...
《Java By Abstraction》是一本面向初学者的Java学习资料,采用客户端视角的方法来阐述Java编程的核心概念。这本书旨在帮助新手逐步理解并掌握Java语言,通过抽象的方式将复杂的编程概念转化为易于理解的形式。以下...
根据提供的文件信息,文章标题为"How to Grow a Mind Statistics, Structure, and Abstraction",而描述部分提到的关键词为"表征学习","数据表示","相似度度量"。以下从这些内容中提炼的知识点。 1. 表征学习...
Data Abstraction and Problem Solving with C++(6th) 英文无水印pdf 第6版 pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自...
《PyPI官网下载:midi-abstraction-0.9.2.tar.gz——探索Python音乐处理库》 在Python的世界里,PyPI(Python Package Index)是一个不可或缺的资源库,它为开发者提供了海量的开源软件包,方便他们进行项目开发。...
英文原版书名:OBJECTS, ABSTRACTION, DATA STRUCTURES AND DESIGN USING C++ 作者:ELLIOT B. KOFFMAN Temple University PAUL A. T. WOLFGANG Temple University
- **抽象 (Abstraction)**:在此文中指的是一种简化图像处理的方法,即将复杂的细节和纹理转化为更简单、更一致的图案或区域。 通过上述介绍,我们可以看到这项技术不仅能够有效地模拟出水彩画特有的视觉效果,而且...
System-level abstraction semantics
### 斯坦福大学 Programming Abstraction 课程配套教材解析 #### 标题解析 - **斯坦福大学 Programming Abstraction 课程配套教材**:这表明教材是专门为斯坦福大学的编程抽象(Programming Abstraction)课程设计...
### Concrete Abstraction: An Introduction to Computer Science Using Scheme #### 标题解读 - **Concrete Abstraction**: 这一术语在计算机科学中具有特殊含义。它指的是通过具体的例子来理解抽象概念的方法,...
Abstraction abstraction = new Abstraction(impl); abstraction.service1(); abstraction.service2(); abstraction.service3(); } } ``` 在实际应用中,桥接模式可以通过多种方式实现,如上述代码所示,通过...