谷歌代码库已超过 20 亿行代码,他们是如何管理的?

简介: Google有多庞大?要回答这个问题,我们可以看收入,看股价,看客户数量,看影响力。但是这都还不够充分。说到规模,那么Google绝对是一个巨大的计算机软件帝国。

Google有多庞大?要回答这个问题,我们可以看收入,看股价,看客户数量,看影响力。但是这都还不够充分。说到规模,那么Google绝对是一个巨大的计算机软件帝国。为了印证着一点,我们还可以看看Google的代码规模。

周一,Google员工 Rachel Potvin 在一个硅谷举办的工程会议上提到了代码量这个问题(戳这里看视频,请科学上网)。根据她的估计,你平时用到的Google互联网服务的软件(包括搜索服务、邮箱、地图)的总代码量,大约有20亿行之多。相比之下,微软公司的Windows操作系统,作为世界上最复杂的个人电脑操作系统,从1980年代至今不断研发和演化,其代码量规模也不过是5千万行而已。







(截图来自湾区日报)

所以说,把Google的代码全部重新构建一次,其规模相当于把Windows系统构建40次之多。其实和Windows系统作比较是合乎情理的(译注:作者的意思是:可能会有人质疑,Windows只是一个操作系统软件,但是Google搜索,Gmail,Google地图是好几个软件,用一个软件的代码量与好几个软件的代码总量做比较,貌似不合乎情理,作者在后面会解释这个问题)

和Windows的基础代码很像,Google的20亿行代码是用来驱动整个Google服务的,他们是一个整体!这20亿行代码支撑着Google搜索、Google地图、Google文档、Google plus、Google日历、Gmail、Youtube,以及其他各种Google互联网服务。并且,这20亿行代码是存放在一个单一的代码仓库里的,供Google的25000个工程师共同使用。Google把自己的代码看成一个“巨大的操作系统”,“尽管我没法证明,”,Potvin表示,“但是我猜这应该是世界上最大的单一代码仓库了。”

Google的情况其实是个特例。但这个例子向我们展示了,在互联网时代我们的软件有多么的复杂,以及我们如何通过改革工具来适应这种复杂度。Google的超大代码仓库只对内部员工开放。不过,我们也有类似的工具——Github,这是一个开源代码仓库平台,它向全世界所有的工程师开放,任何人都能最大程度地共享其中的海量代码。时代变了,现在的工程师能利用超大规模的代码库进行协同工作。这也是现代互联网服务能够维持快速进化的不二之法。

“让25000个开发人员共享代码库,就像Google这种大公司做的这样,意味着开发人员丰富各异,技能多种多样。”,GitHub 的系统总监 Sam Lambert 如是说,“不过,对于小公司来讲,通过Github和开放源代码,你也可以具有(与Google)同样的优势。因为有句古话说得好:‘水涨船高’”。

“关于编译20亿行代码,其挑战的一面在于:一次性构建和运行20亿行代码,这可不是闹着玩的。”“这肯定是一项技术挑战——一次伟大的壮举。”“20亿这个数字无疑是令人震惊的。”

Github的天才之处在于,它能让程序员分享和协作的代价降低。但是Github(不像Google)并不把所有东西都存储成单一软件项目。它的方式是存储上百万个小项目。Google先行一步,把无数的小项目化零为整。考虑到这涉及那么多的工程师,那么多的项目,化零为整听上去有点疯狂。但是根据Potvin的说法:Google做到了。

听 Piper 的

简单来说,Google自己做了一个“版本控制系统”,用来对其所有的代码进行判审。这个系统名字叫做Piper,它运行在整个Google的已经搭建好的庞大的在线基础设施上,并管理着所有在线服务。根据Potvin的说法,这个系统分布在10个不同的Google数据中心上。

这件事情的意义绝不仅仅是说Google的工程师能够访问20亿行代码这么简单,这件事情的意义在于:每一个Google的工程师都有充分的自由对仓库中的无数项目进行使用和组合。“你新建一个项目”,Potvin向《连线》杂志解释到,“然后就有无比富裕的代码库资源供你使用。基本上你需要的东西都有现成的。”更美妙的是,工程师对代码进行了修改以后,马上就能实施部署,然后反映到所有Google的服务上。只需要对一处进行更新,你就对所有的东西都完成了更新。

当然这个系统还是有限制的。Potvin说,有一些高度敏感的代码——比如像Google的网页排名搜索算法(PageRank Search Algorithm)这种——是放在单独的代码仓库里的,只有部分被授权的员工才能看到。因为这些算法并不在互联网上运行,因此他们和其他代码是不同的,Google还把其他两个设备相关的操作系统源代码,Android和Chrome,进行了单独的版本控制管理。不过对于绝大多数代码,Google把他们存成了一个整体,工程师可以使用它进行构建模块,提出创新以及实现解决方案。

机器人因素

Lamber指出,构建和运行一个这样的系统不仅仅需要知道基本知识,还要意识到这个系统庞大的计算能力。Piper涵盖85T数据(8500G),Google的25000名工程师每天会完成45000次提交操作。这种强度可不是开玩笑。Linux开源操作系统一共有40000个文件,1500万行代码,而Google工程师每周就会修改25000个文件,1500万行代码。

同时,Piper还需要兼顾降低程序人员的负担的任务,让程序员可以埋头修改自己的程序,而又不至于踩了别人的脚。程序员要能够把不适用的或有问题的代码移除代码库。这个任务非常困难,所以不能完全靠人工来处理这项工作。现在Google已经把把之前所用的Perforce版本控制系统切换到了Piper上,Piper使用了自动机器人来处理大多数的用户提交。

当然这不是让机器人来写代码,而是让机器人自动生成当大量的数据和配置文件,来协助用户运行软件。“为了让你的代码维持健壮,你需要做很多具体的工作”,Potvin说,“然后我们的办法是让机器人帮助你去分担这些工作,而不是只让人来做。”

人人都能用的 Piper

那么其他厂商能不能从Piper这种系统中收益呢?当然可以,并且他们正在这样做。Facebook应用的总代码量也已经达到了2亿行之多,而且Facebook也是将整个代码看成一个整体工程的。其他的企业也在这么做,只是规模上稍微小了一些。对于那些与Google或者Facebook规模差不多的公司来讲,都可以采用这样的形式。不过现在Google和Facebook正在探索新的方法,从而让每个人都能从中获益。

两大IT巨头目前都在研究,如何让超大规模的开源版本控制系统可供所有人使用。这项研究是基于已经存在的Mercurial系统开展的。“我们正在尝试,是否能够把Mercurial系统扩展到Google代码仓库的规模。”,Potvin指出。目前Google正在和编程大师Bryan O’Sullivan以及其他Facebook的程序员们通力合作,争取在这方面取得突破。

这看上去也许有点儿极端。毕竟目前大多数公司对代码的操作都达不到Google或者Facebook的那个级别。但是在不久的将来,他们就会变成那样。

目录
相关文章
|
弹性计算 监控 数据安全/隐私保护
阿里云ECS云监控界面
阿里云ECS云监控界面
1320 2
|
存储 缓存 人工智能
玄铁 E906处理器简介|学习笔记
快速学习玄铁 E906处理器简介
2997 0
玄铁 E906处理器简介|学习笔记
|
6月前
|
人工智能
使用CodeBuddy实现网页自动连点器
CodeBuddy 能够迅速理解复杂功能要求,精准生成自动连点器代码。无论是游戏场景里对技能释放点击频率的精确控制,还是办公场景中对特定单元格点击位置的灵活设定,它都能高效满足。
169 6
|
5月前
|
机器学习/深度学习 数据采集 数据可视化
基于YOLOv8的PCB缺陷检测识别项目|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!
本项目基于YOLOv8实现PCB缺陷检测,提供一站式解决方案。包含完整训练代码、标注数据集、预训练权重及PyQt5图形界面,支持图片、文件夹、视频和摄像头四种检测模式。项目开箱即用,适合科研、工业与毕业设计。核心功能涵盖模型训练、推理部署、结果保存等,检测类型包括缺孔、鼠咬缺口、开路、短路、飞线和杂铜。项目具备高性能检测、友好界面、灵活扩展及多输入源支持等优势,未来可优化模型轻量化、多尺度检测及报告生成等功能。
基于YOLOv8的PCB缺陷检测识别项目|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!
|
网络安全 开发工具 git
拉取 gitee 代码,配置SSH,Please make sure you have the correct access rights
拉取 gitee 代码,配置SSH,Please make sure you have the correct access rights
259 1
|
Web App开发 Linux Windows
解决Markdown文件上传至CSDN无法显示本地图片问题-白嫖版,分享给别人的md文件图片不显示的解决方案
解决Markdown文件上传至CSDN无法显示本地图片问题-白嫖版,分享给别人的md文件图片不显示的解决方案
665 3
|
容器 Docker 项目管理
【Docker项目实战】使用Docker部署tududi个人任务管理工具
【6月更文挑战第2天】使用Docker部署tududi个人任务管理工具
631 5
|
开发工具 git 开发者
【GitHub】如何在github上提交PR(Pull Request) + 多个pr同时提交、互不干扰
【GitHub】如何在github上提交PR(Pull Request) + 多个pr同时提交、互不干扰
4007 6
|
JSON 小程序 JavaScript
一分钟教你学会微信小程序的页面刷新
本文指导如何在微信小程序中实现页面刷新功能。首先,在页面JSON配置开启刷新,然后在JS的`onPullDownRefresh`方法中重置数据并调用数据加载函数。在数据请求方法中,使用`wx.showLoading`显示加载提示,请求完成后用`wx.stopPullDownRefresh`结束刷新并更新数据。监听`onPullDownRefresh`事件触发数据获取。最后,自定义下拉刷新样式,并总结关键在于使用`wx.startPullDownRefresh`启动和`wx.stopPullDownRefresh`停止刷新。
1547 2
|
分布式计算 并行计算 数据处理
NumPy的并行与分布式计算实践
【4月更文挑战第17天】本文探讨了如何使用NumPy进行并行和分布式计算以提升效率。介绍了利用`numexpr`加速多核CPU计算,设置`NUMPY_NUM_THREADS`环境变量实现多线程,并通过Dask和PySpark进行分布式计算。Dask允许无缝集成NumPy,而PySpark则将NumPy数组转换为RDD进行并行处理。这些方法对处理大规模数据至关重要。