Google Search、Google Maps、Google Docs、 Google+、Google Calendar、Gmail、YouTube ......,實(shí)現所有Google服務(wù)的全部20億行代碼統統放到一個(gè)代碼庫進(jìn)行管理,這也許是全球在用的最大的單一代碼庫了。
Google有多大?我們可以用收入、用股票價(jià)格、客戶(hù)規模,或者用虛的影響力來(lái)回答這個(gè)問(wèn)題。不過(guò)這些并不是全部。Google還是一個(gè)軟件帝國。因此我們可以用代碼來(lái)回答這個(gè)問(wèn)題。
在幾天前出席@Scale大會(huì )時(shí),Google的Rachel Potvin 給出了一個(gè)相當接近的答案。她估計運行Google所有互聯(lián)網(wǎng)服務(wù)(搜索、Gmail、Google Maps等)所需的軟件大概相當于20億行代碼。相比之下,自1980年代開(kāi)始就一直研發(fā)的微軟Windows操作系統(有史以來(lái)最復雜的單機軟件之一)大概是5000萬(wàn)行。
也就是說(shuō)Google的開(kāi)發(fā)量相當于Windows的40倍。
更令人吃驚的是,供Google 25000為工程師使用的這20億行代碼全部都放在了一個(gè)代碼庫。在公司內部,Google把它的代碼當作了一個(gè)巨大的操作系統?!皻q雖不能證明,”P(pán)otvin說(shuō):“但我估計這是全世界在用的最大的單一代碼庫?!?/p>
Google是一個(gè)極端的例子。但它的例子顯示出在互聯(lián)網(wǎng)時(shí)代我們的軟件已經(jīng)發(fā)展到何等復雜的地步—同時(shí)還顯示了我們是如何變革代碼工具和哲學(xué)來(lái)適應這種增加的復雜性的。Google的龐大代碼庫僅面向內部使用。但是從某種程度來(lái)看,它相當于大家在互聯(lián)網(wǎng)上共享海量代碼的開(kāi)源代碼托管工具GitHub。我們正在快速走向大規模代碼協(xié)作的世界。這是我們跟上快速演變的互聯(lián)網(wǎng)服務(wù)的唯一辦法。
GitHub系統總監Sam Lambert說(shuō):“像Google這樣擁有25000名開(kāi)發(fā)者,就意味著(zhù)有著(zhù)各種不同技能的人一起分享代碼。但是作為小公司你一樣可以利用GtHub和開(kāi)源獲得其中的一部分優(yōu)勢。也就是老話(huà)所謂的‘水漲船高?!?/p>
不好的一面是開(kāi)發(fā)運營(yíng)20億行規模的巨無(wú)霸并非簡(jiǎn)單的任務(wù)。
GitHub實(shí)現的是讓寫(xiě)代碼的人很容易就能分享代碼和協(xié)作。不過(guò)GitHub托管的不是一個(gè)軟件項目,而是數百萬(wàn)。Google則走得更遠,把許多項目組合成了一個(gè)。由于要在那么多的工程師間協(xié)調如此龐大規模的代碼,這聽(tīng)起來(lái)似乎有點(diǎn)瘋狂。但Potvin說(shuō)他們做到了。
Piper在彈奏
實(shí)際上,Google開(kāi)發(fā)了自己的“版本控制系統”來(lái)管理這些代碼,這個(gè)系統叫做Piper,Piper跑遍了Google搭建的運行其所有在線(xiàn)服務(wù)的所有基礎設施,覆蓋了Google的10個(gè)數據中心。
當然,這個(gè)系統并不是裝了20億行代碼讓公司內部人人都能訪(fǎng)問(wèn)那么簡(jiǎn)單。它還賦予了Google工程師非同尋常的自由去使用和組合來(lái)自無(wú)數項目的代碼。Potvin說(shuō):“這樣的話(huà)做新項目的時(shí)候手上就有了海量的庫。幾乎所有事情都干完了?!贝送?,工程師的一次代碼變更可以馬上部署到所有Google服務(wù)。也就是說(shuō)一次更新就完成了全部升級。
這套系統也有一些限制。Potvin說(shuō)一些高度機密的代碼—如Google的PageRank搜索算法是放在單獨的庫里面,僅供特定員工訪(fǎng)問(wèn)的。此外,Google的設備操作系統Android和Chrome由于不在網(wǎng)上跑,而且跟其他服務(wù)有很大的不同,所以也是單獨存放在獨立的版本控制系統里面的。但大部分Google代碼都是可以讓軟件模塊、創(chuàng )意和解決方案進(jìn)行自由流動(dòng)的一個(gè)整體。
機器人助手
正如Lambert所言,開(kāi)發(fā)運營(yíng)這樣一套系統需要的不僅僅是技術(shù)訣竅,更包括海量的計算能力。Piper的數據量大概有85TB,Google的25000名工程師每天要進(jìn)行45000次提交(變更)。這種數據規模和活動(dòng)頻度是蔚為壯觀(guān)的。我們可以比較一下,Linux操作系統大概偶1500萬(wàn)行代碼,分布在40000個(gè)文件上,而Google的工程師每周就要修改1500萬(wàn)行代碼,而且是分散在250000份文件上。
與此同時(shí),Piper還必須減輕人類(lèi)編碼者的大部分負擔。它必須確保編碼者代碼中添加了所有必要的文件頭;確保代碼變更時(shí)不會(huì )互相踩踏;確??梢苑奖愕嘏懦e誤和沒(méi)用的代碼。這些事情都非常棘手,棘手到其中的部分工作已經(jīng)不是人可以干的了。所以Google已經(jīng)從原來(lái)的版本控制系統Perforce遷移到Piper,現在大部分的commit都是由機器人自動(dòng)完成了。
這不是說(shuō)機器人去寫(xiě)代碼。它們的工作是生成軟件運行所需的大量數據和配置文件?!靶枰R心協(xié)力才能保持代碼健康,”P(pán)otvin說(shuō):“而這不僅僅是人的工作,也包括機器人的?!?/p>
Piper為人人
其他人是否也能受益于類(lèi)似的系統?當然。而且的確也有人這么做了。Facebook的主應用大概有2000萬(wàn)行代碼,他們也是把這些代碼當作一個(gè)項目。還有的也在做類(lèi)似的事情,只是規模要小一些。但是一旦那些公司接近Google或Facebook這樣的規模,那后勤保障可能就會(huì )出問(wèn)題。好消息是Google和Facebook正在探索改變這一點(diǎn)—替所有人改變這一點(diǎn)。
這兩家巨頭目前正在合作一款開(kāi)源版本控制系統,讓所有人都可以進(jìn)行大規模的代碼處理。其基礎是Mercurial?!拔覀冊趪L試看能不能讓Mercurial達到Google代碼庫的規模,”P(pán)otvin說(shuō)。她表示,Google正在監管Facebook類(lèi)似工作的編程大牛Bryan O’Sullivan等人密切合作。
這種做法似乎有些極端。從現在來(lái)看,沒(méi)有幾家公司的代碼能做到Google或者Facebook的規模。但在不久的將來(lái),會(huì )的。因為軟件正在蠶食世界。
聯(lián)系客服