Google Search、Google Maps、Google Docs、 Google+、Google Calendar、Gmail、YouTube ......,实现所有Google服务的全部20亿行代码统统放到一个代码库进行管理,这也许是全球在用的最大的单一代码库了。
Google有多大?我们可以用收入、用股票价格、客户规模,或者用虚的影响力来回答这个问题。不过这些并不是全部。Google还是一个软件帝国。因此我们可以用代码来回答这个问题。
在几天前出席@Scale大会时,Google的Rachel Potvin 给出了一个相当接近的答案。她估计运行Google所有互联网服务(搜索、Gmail、Google Maps等)所需的软件大概相当于20亿行代码。相比之下,自1980年代开始就一直研发的微软Windows操作系统(有史以来最复杂的单机软件之一)大概是5000万行。
也就是说Google的开发量相当于Windows的40倍。
更令人吃惊的是,供Google 25000位工程师使用的这20亿行代码全部都放在了一个代码库。在公司内部,Google把它的代码当作了一个巨大的操作系统。“虽不能证明,”Potvin说:“但我估计这是全世界在用的最大的单一代码库。”
Google是一个极端的例子。但它的例子显示出在互联网时代我们的软件已经发展到何等复杂的地步—同时还显示了我们是如何变革代码工具和哲学来适应这种增加的复杂性的。Google的庞大代码库仅面向内部使用,但是从某种程度来看,它相当于大家在互联网上共享海量代码的开源代码托管工具GitHub。我们正在快速走向大规模代码协作的世界。这是我们跟上快速演变的互联网服务的唯一办法。
GitHub系统总监Sam Lambert说:“像Google这样拥有25000名开发者,就意味着有着各种不同技能的人一起分享代码。但是作为小公司你一样可以利用GtHub和开源获得其中的一部分优势。也就是老话所谓的‘水涨船高。’”
不好的一面是开发运营20亿行规模的巨无霸并非简单的任务。
GitHub实现的是让写代码的人很容易就能分享代码和协作。不过GitHub托管的不是一个软件项目,而是数百万。Google则走得更远,把许多项目组合成了一个。由于要在那么多的工程师间协调如此庞大规模的代码,这听起来似乎有点疯狂。但Potvin说他们做到了。
Piper在弹奏
实际上,Google开发了自己的“版本控制系统”来管理这些代码,这个系统叫做Piper,Piper跑遍了Google搭建的运行其所有在线服务的所有基础设施,覆盖了Google的10个数据中心。
当然,这个系统并不是装了20亿行代码让公司内部人人都能访问那么简单。它还赋予了Google工程师非同寻常的自由去使用和组合来自无数项目的代码。Potvin说:“这样的话做新项目的时候手上就有了海量的库。几乎所有事情都干完了。”此外,工程师的一次代码变更可以马上部署到所有Google服务。也就是说一次更新就完成了全部升级。
这套系统也有一些限制。Potvin说一些高度机密的代码—如Google的PageRank搜索算法是放在单独的库里面,仅供特定员工访问的。此外,Google的设备操作系统Android和Chrome由于不在网上跑,而且跟其他服务有很大的不同,所以也是单独存放在独立的版本控制系统里面的。但大部分Google代码都是可以让软件模块、创意和解决方案进行自由流动的一个整体。
机器人助手
正如Lambert所言,开发运营这样一套系统需要的不仅仅是技术诀窍,更包括海量的计算能力。Piper的数据量大概有85TB,Google的25000名工程师每天要进行45000次提交(变更)。这种数据规模和活动频度是蔚为壮观的。我们可以比较一下,Linux操作系统大概有1500万行代码,分布在40000个文件上,而Google的工程师每周就要修改1500万行代码,而且是分散在250000份文件上。
与此同时,Piper还必须减轻人类编码者的大部分负担。它必须确保编码者代码中添加了所有必要的文件头;确保代码变更时不会互相踩踏;确保可以方便地排除错误和没用的代码。这些事情都非常棘手,棘手到其中的部分工作已经不是人可以干的了。所以Google已经从原来的版本控制系统Perforce迁移到Piper,现在大部分的commit都是由机器人自动完成了。
这不是说机器人去写代码。它们的工作是生成软件运行所需的大量数据和配置文件。“需要齐心协力才能保持代码健康,”Potvin说:“而这不仅仅是人的工作,也包括机器人的。”
Piper为人人
其他人是否也能受益于类似的系统?当然。而且的确也有人这么做了。Facebook的主应用大概有2000万行代码,他们也是把这些代码当作一个项目。还有的也在做类似的事情,只是规模要小一些。但是一旦那些公司接近Google或Facebook这样的规模,那后勤保障可能就会出问题。好消息是Google和Facebook正在探索改变这一点—替所有人改变这一点。
这两家巨头目前正在合作一款开源版本控制系统,让所有人都可以进行大规模的代码处理。其基础是Mercurial。“我们在尝试看能不能让Mercurial达到Google代码库的规模,”Potvin说。她表示,Google正在监管Facebook类似工作的编程大牛Bryan O’Sullivan等人密切合作。
这种做法似乎有些极端。从现在来看,没有几家公司的代码能做到Google或者Facebook的规模。但在不久的将来,会的。因为软件正在蚕食世界。