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的那个级别。但是在不久的将来,他们就会变成那样。