《ACM通信》有一篇论文《为什么 Google 要把几十亿行代码放在一个库?》,作者是谷歌基础设施小组的工程师。作者详细讲述了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。

2.5 主干开发

Google 采用”主干开发”(trunk-based development)。代码一般提交到主干的头部。这样保证了所有用户看到的都是同一份代码的最新版本。

“主干开发”避免了合并分支时的麻烦。谷歌一般不采用分支开发,分支只用来发布。大多数时候,发布分支是主干某个时点的快照。以后的除错和功能增强,都是提交到主干,必要时 cherry-pick 到发布分支。与主干长期并行的开发分支,在谷歌极少见。

由于不采用"分支开发",谷歌引入新功能,一般在代码中使用开关控制。这避免了另起一个分支,也使得通过配置切换功能变得容易,一旦新功能发生故障,很容易切换回旧功能。等到新功能稳定,再彻底删除旧代码。谷歌有类似A/B测试的路由算法,评估代码的表现,由于存在配置开关,这种测试很容易实现。

2.6 代码评审

所有代码合并进仓库之前,都必须进行代码评审。大部分评审对所有人开放,任何谷歌员工都可以对代码提意见或者提交变动。

代码评审的依据是《Google 代码风格指南》。谷歌有一个叫做 Critique 的工具,可以查看每一行代码的历史演变。

2.7 自动测试

评审完成后,会自动运行测试。通过测试以后,代码就合并进了 Piper 仓库,整个过程不需要人工干预。

三、单一代码仓库的优点

(1)统一的版本

整个公司的代码,有统一的版本和路径,不存在找不到文件的最新版本这样的问题。

(2)广泛的代码共享和复用

任何人都可以浏览和使用全公司的代码,这大大促进了代码的共享和复用。

(3)简化的依赖管理

如果你是库文件或者 API 的作者,因为所有人的代码都在一个库里面,所以很容易找到依赖你的所有下游代码。

每当代码变动,所有依赖你的代码都会自动构建。如果有大量的构建失败,那么系统会自动撤销这次提交。这样也保证了所有代码依赖的都是最新版本,避免依赖不同的版本所导致的冲突。

另外,由于代码的边界很清楚,所以不会发生循环依赖。而且,API的作者也很容易发现,别人怎么使用他的API。

(4)原子性变动

由于每次代码变动所导致的影响,都在一个仓库里面,所以都属于原子性的变动。因此,很容易撤销,或者预先测试它所造成的影响。

为了防止错误提交,谷歌引入了”预提交”(即在提交之前,先分析一下依赖它的代码是否会构建失败)。

(5)大规模代码析构

单一代码仓库为查找和分析代码,提供了巨大的方便。

Google的静态分析引擎 Tricorder 定时运行,对代码进行分析。比如,C++ 11 标准公布以后,很容易找到所有需要改进的变量声明语句,进行性能优化。该引擎还对许多错误提供"一键修正"的功能,同时产出大量的统计数据。

此外,编译器团队也会对不同语言的所有代码进行分析,找出不合理的代码和过时的API。

单一代码仓库的缺点

单一代码仓库的主要缺点是,所有工具都必须自己写,因为市场上没有能够管理这种规模的代码仓库的软件。

总结

单一代码仓库,适合提倡透明开放的大型软件公司,不适合小公司和有大量私密代码的公司。

原文:

http://m.cacm.acm.org/magazines/2016/7/204032-why-google-stores-billions-of-lines-of-code-in-a-single-repository/fulltext

————

编辑 ∑Gemini

来源:算法爱好者

☞泰勒定理的奇闻轶事

☞丘成桐:漫谈微分几何

☞Leibniz 如何想出微积分?(一)

☞线性相关和秩的物理意义

☞数学史上你认为最丑陋的公式是什么?

☞陶哲轩谈什么是好的数学

☞田渊栋:数学的用处(下篇)

☞你绝对没想过原来数学家这么流氓,一言不合就进行暴力证明

☞世界上最牛的五篇博士论文

☞数学中有哪些巧合让人眼前一亮?

☞算法立功!清华毕业教授美国被抢车,警察无能为力自己用“贪心算法”找回

☞学术史上的奇文:怎样用数学抓狮子

☞台大教授的反思:最难的一课 我们却没教给学生

☞麻省理工学院(MIT)研究生学习指导—— 怎样做研究生

☞分享 数学,常识和运气 ——投资大师詹姆斯·西蒙斯2010年在MIT的讲座

算法数学之美微信公众号欢迎赐稿

稿件涉及数学、物理、算法、计算机、编程等相关领域,经采用我们将奉上稿酬。

投稿邮箱:math_alg@163.com

Google 为什么把几十亿行代码放在一个库相关推荐

  1. 谷歌为什么把几十亿行代码放在一个库?

    <ACM通信>有一篇论文<为什么 Google 要把几十亿行代码放在一个库?>,作者是谷歌基础设施小组的工程师.作者详细讲述了Google的代码为什么全部放在一个库里面. 一. ...

  2. 为何Google将几十亿行源代码放在一个仓库?| CSDN博文精选

    作者 | Rachel Potvin,Josh Levenberg 译者 | 张建军 编辑 | apddd [AI科技大本营导读]与大多数开发者的想象不同,Google只有一个代码仓库--全公司使用不 ...

  3. 为何Google将几十亿行源代码放在一个仓库?

    作者 | Rachel Potvin,Josh Levenberg 译者 | 张建军 编辑 | apddd [AI科技大本营导读]与大多数开发者的想象不同,Google只有一个代码仓库--全公司使用不 ...

  4. 为什么Google上十亿行代码都放在同一个仓库里?

    导读:相对于一般公司,Google 使用了单一代码仓库,很多人不理解为什么这么做.本文作者是谷歌基础设施小组的工程师,对这个问题进行了详细解读.译者在翻译过程中受益良多,也相信大家看完之后会认为自己还 ...

  5. python代码翻译-Python编程学习 -- 用十几行代码实现一个翻译器

    前言 本文所用的方法十分简(ruo)易(zhi),非常适用想用Python做点有趣的功能的Python初学者. 先上一波效果图 那么这到底是怎么实现的呢?其实说起来很简单,我们只需要写一个爬虫就行啦! ...

  6. python代码翻译器-Python编程学习 -- 用十几行代码实现一个翻译器

    前言 本文所用的方法十分简(ruo)易(zhi),非常适用想用Python做点有趣的功能的Python初学者. 先上一波效果图 那么这到底是怎么实现的呢?其实说起来很简单,我们只需要写一个爬虫就行啦! ...

  7. 面对 20 亿行代码,Google 如何管理?

    面对"Google 这家公司有多大?"这种问题,你可能会用收入.股票价格.客户数量或者是形而上学的影响力来回答这个问题.但是,这还不是全部.Google 作为全球最大的互联网公司, ...

  8. IBM开源了5亿行代码数据集,里面最多的编程语言却不是Python

    谷歌服务包含 20 亿行代码,一辆汽车的系统包含 1 亿行代码--写代码.debug 这么大的工作量不交给 AI 来做能行? 机器之心报道,编辑:小舟.陈萍. 让 AI 自动生成代码,是很多开发者的梦 ...

  9. 30分钟扫描一亿行代码库,bug漏洞都能找,这款Facebook神器黑粉都赞叹不已

    Facebook,拥有数十亿用户规模的超级大厂,代码总行数高达一亿行. Bug,可能藏在一亿行代码中的每一行里,而且Facebook的工程师们还一直在添加新的代码进去,这要是出了什么问题,影响超多用户 ...

最新文章

  1. Python读取内容UnicodeDecodeError错误
  2. 新到DELL M1000e 刀片服务器
  3. python怎么导入文件-Python 导入文件过程图解
  4. python pcm 分贝_语音文件 pcm 静默(静音)判断
  5. 客户机操作系统已禁用 cpu。请关闭或重置虚拟机。_黑科技教学丨Win10竟然内置了一台虚拟机?教你如何玩转它...
  6. Ubuntu Vi 编辑器 命令(转)
  7. EasyDarwin开源流媒体服务器如何实现按需推送直播的
  8. nodejs的mysql初始化
  9. ubuntu下使用vi退出终端出现乱码的解决方案
  10. 物资管理信息系统4 -- 修改密码界面
  11. 区块链开发(四)Nodejs下载安装
  12. Atitit nlp文本挖掘和自然语言处理方面,常用的算法总结 比如tf-idf 目录 1.1. tf:词频,是指某个词在某篇文章中出现的频率 2 1.2. 去停用词算法 2 1.3. idf。
  13. shellshock漏洞回顾
  14. html直播源怎么转码,直播源列表格式转换 - 黑鸟博客
  15. PTA 数据结构题集
  16. 2022 年第十二届 MathorCup 高校数学建模挑战赛C题解析
  17. loadrunner下载地址
  18. (附源码)springboot球鞋商城 毕业设计 011229
  19. 实现wpf的doevents
  20. 如何安装PrCC2019

热门文章

  1. Spring Security用户认证和权限控制(默认实现)
  2. python之路day4_python之路day4
  3. 包管理工具conda极简教程
  4. [错误记录] --- clickhouse报错Decimal value is too small
  5. SpringMVC默认访问路径配置
  6. Objective-C成员变量声明方式探究
  7. spriteatlas 白屏的问题_Discuz白屏问题解决思
  8. 高级java技术web组件_(重温)JavaWeb--Servlet技术(二)(JavaWeb 的三大组件之一)...
  9. treeselect只选了分支节点全选_vue Treeselect 树形下拉框:获取选中节点的ids和lables操作...
  10. 10大最高效的Java库盘点