日期: 2016年7月 2日
谷歌和 Facebook 都只有一个代码仓库,全公司的代码都放在这个库里。
我一直很困惑,为什么要这样做,不同语言的项目放在一个库有什么好处?
最新一期的《ACM通信》(59卷第7期)有一篇论文《为什么 Google 要把几十亿行代码放在一个库?》,作者是谷歌基础设施小组的工程师,可以看作官方对这个问题的详细解答。我读后感到收获很大,下面就是摘录。
一、概况
谷歌最早使用 CVS 进行代码管理,1999年改为 Perforce。那时是一台 Perforce 主机,加上各种缓存机。
当时,全公司的代码就在一个仓库里面,后来一直沿用这种做法。由于规模不断增长,Perforce 已经无法满足需求,谷歌就开始使用自己开发的版本管理系统 Piper。
Piper 架设在谷歌自己的分布式数据库系统(以前叫 Bigtable,现在改名 Spanner)之上,分布在全世界10个数据中心,保证世界各地的谷歌员工都有良好的访问速度。
目前,这个代码仓库包含10亿个文件、3500万次提交记录,大小为86TB,用户达到几万人。工作日每秒有50万次请求,高峰时80万次,大部分来自自动构建和测试系统。
谷歌90%以上的代码,放在 Piper 里面。对于那些开源的、需要外部协作的项目,代码放在 Git,主要是 Android 项目和 Chrome 项目。Git 的特点是,所有历史记录都会复制到用户的本地机器,所以不适合大型项目,必须拆分成更小的库。以 Android 为例,该项目一共包含800多个独立的仓库。
二、Piper 的设计
2.1 结构
整个仓库采用树状结构。每个团队有自己的目录。目录路径就是代码的命名空间。每个目录都有负责人(owner),他负责批准该目录的文件变动。
2.2 权限控制
Piper 支持文件级别的权限控制。99% 的代码对所有用户可见,只有少部分重要的配置文件和机密的关键业务,设有访问限制。
如果机密信息不小心放上了 Piper,文件可以被快速清除。并且,所有的读写都有日志,管理员能够查到谁读过这个文件。
2.3 工作流
Piper 的工作流(workflow)如下图。
开发者先创建文件的本地拷贝,这叫做"工作区"(workspace)。完成开发后,工作区的快照共享给其他开发者进行代码评审。只有通过了评审,代码才能合并到中央仓库。
2.4 客户端
大多数开发者通过一个叫做 CitC 的客户端,访问 Piper。
开发者通过 CitC 浏览和同步 Piper 上的文件,但是编辑和修改是在自己工作区,里面只保存有变动的文件(一个工作区一般不超过10个文件)。CitC 带有云储存机制,每个工作区就是云上的一个目录。通过代码评审以后,这些文件才从 Citc 合并进 Piper。
不使用 CitC 也是允许的,所有代码保存在本地,最终用 Git 客户端提交到 Piper。不过,由于 CitC 提供更多的功能,目前使用率达到 80% 。
2.5 主干开发
Google 采用"主干开发"(trunk-based development)。代码一般提交到主干的头部。这样保证了所有用户看到的都是同一份代码的最新版本。
"主干开发"避免了合并分支时的麻烦。谷歌一般不采用分支开发,分支只用来发布。大多数时候,发布分支是主干某个时点的快照。以后的除错和功能增强,都是提交到主干,必要时 cherry-pick 到发布分支。与主干长期并行的开发分支,在谷歌极少见。
由于不采用"分支开发",谷歌引入新功能,一般在代码中使用开关控制。这避免了另起一个分支,也使得通过配置切换功能变得容易,一旦新功能发生故障,很容易切换回旧功能。等到新功能稳定,再彻底删除旧代码。谷歌有类似A/B测试的路由算法,评估代码的表现,由于存在配置开关,这种测试很容易实现。
阅读全文直接点击:
http://click.aliyun.com/m/9974/
分享到:
相关推荐
2. SDK集成:Android SDK是开发Android应用的基础,离线源代码包可以与SDK相结合,帮助开发者更好地调试和理解Android API的行为,提高开发效率。 三、源代码包的内容 "src"文件夹是源代码的主要组成部分,它包含...
5. **性能优化**:探究源代码中的性能优化技巧,如如何减少CPU占用,提高数据传输效率。 6. **安全性**:了解Bluedroid如何保障蓝牙通信的安全性,如加密算法的使用和安全模式的实现。 通过对Bluedroid源代码的...
通过对Google桌面搜索源码的深入学习,开发者不仅能提升自己的搜索引擎开发技能,还能借鉴其优秀的工程实践,应用于其他领域,如数据分析、信息检索等。总的来说,Google桌面搜索源码是一个宝贵的教育资源,对于想要...
11. **第三方库集成**:许多Android应用会集成Glide、Retrofit、Dagger等库,提升开发效率和应用性能。 12. **单元测试与自动化测试**:使用JUnit和Mockito进行单元测试, Espresso进行UI测试,确保代码质量。 13....
Android 一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导开发 IOS 由苹果公司开发的移动操作系统 Webkit 一个开源的浏览器引擎,在手机上的...
在“Android应用开发揭秘6”这个主题中,我们可以深入探讨Android应用程序开发的多个关键知识点...通过实践这些知识点,开发者不仅可以增强对Android系统的理解,还能提升开发效率,为构建更好的移动应用奠定坚实基础。
- 使用Git进行版本控制,配合Jenkins等工具实现持续集成,可以自动化构建和部署,提高开发效率。 总结,这个基于安卓系统的课堂管理App源码数据库揭示了移动教育应用的开发实践,涵盖了安卓开发、数据库设计、后端...
【三金连锁便利超市管理平台的设计与实现】 ...通过以上设计与实现,三金连锁便利超市管理平台旨在提供一个高效、智能化的管理工具,提升超市的运营效率,降低管理成本,助力连锁超市在市场竞争中保持优势。
9. **性能优化**:探究如何优化代码执行效率,减少内存占用,提升用户体验。 通过研究这个源代码,开发者不仅可以学习到Android应用开发的基础知识,还能深入了解实际项目中的最佳实践,对提高个人技能和解决实际...
对于Android开发者而言,理解源代码有助于提升开发效率和解决问题的能力。可以从以下几个方面入手: 1. 熟悉Android系统的架构和组件关系,了解每个部分的功能。 2. 学习构建系统,理解如何编译和定制Android系统...
【Apk改之理3.1】是一款专用于Android应用(APK)修改与分析的工具,主要用于开发者和逆向工程爱好者对APK...通过熟练掌握这款工具,用户可以深入了解APK的内部结构,进行各种定制化操作,从而提升开发效率和应用质量。
13. **第三方库集成**:为了提高开发效率,开发者常使用如Glide、ButterKnife、Dagger等第三方库。源码中可能包含了这些库的使用方法。 14. **测试与调试**:源码中可能包含单元测试、集成测试的代码,以及使用...
Android 5.0,代号...通过深入研究这个"Android5.0.1_r1-sources"压缩包,开发者可以了解Android系统的设计思想,学习最佳实践,并且有能力针对特定场景进行系统级别的优化和定制,从而提升开发效率和用户体验。
这个扩展程序的核心在于提升用户的搜索效率,让用户能够更便捷地对选定的文本进行深入探究。 【描述】:“chrome浏览器右键菜单扩展程序源代码,划词搜索,自定义搜索引擎” 描述中提到了几个关键点: 1. **源代码...
其次,Node.js的底层是基于V8引擎的,V8是Google开发的开源高性能JavaScript引擎,它也用于Chrome浏览器中。V8引擎的特点是编译执行JavaScript代码,具有快速的执行速度。V8引擎的内存管理机制包括NewSpace和Old...
- 代码规范与重构:遵循Google的Android开发规范,进行代码重构以提高代码质量。 - 数据持久化:SQLite数据库、SharedPreference的使用,以及现代存储方案如Room。 每一期的【eoeAndroid特刊】都会结合具体的实例...
在Android开发中,注解(Annotations)是一种强大的工具,它们允许开发者在代码中添加元数据,从而提升开发效率,改善代码质量。本文将深入探讨Android注解的使用、优势及其在ButterKnife和Otto等库中的应用。 首先...
JabRef是一款强大的开源文献管理软件,主要设计用于Linux/Unix操作系统环境...对于科研人员来说,掌握JabRef的使用可以大大提高文献管理的效率,而对于开发者来说,探究其源代码则是一次学习和贡献开源软件的良好机会。
Go(也称为Golang)是由Google开发的一种静态类型的、编译式的、垃圾回收的、并发型且具有C/C++风格语法的编程语言。这个项目可能是对Go 1.5版本的早期实现或者一个基于该版本的开发实例,让我们深入探讨一下Go语言...
8. **库的使用**:分析AndroidX库中的组件,学习如何利用它们提高开发效率和代码质量。 9. **性能优化**:通过阅读源码,学习如何避免内存泄漏、提高应用性能、减少电量消耗。 要充分利用这些源码,可以结合...