谷歌程式碼庫已超過 20 億行程式碼,他們是如何管理的?

黃小非發表於2015-09-18

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的那個級別。但是在不久的將來,他們就會變成那樣。

打賞支援我翻譯更多好文章,謝謝!

打賞譯者

打賞支援我翻譯更多好文章,謝謝!

谷歌程式碼庫已超過 20 億行程式碼,他們是如何管理的?

相關文章