Google 如何管理其 20 億行程式碼?

作者 | 發布日期 2015 年 09 月 22 日 8:50 | 分類 Big Data , Google , 網路 follow us in feedly

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 作業系統(有史以來最複雜的單機軟體之一)大概是 5,000 萬行。

也就是說 Google 的開發量相當於 Windows 的 40 倍。

更令人吃驚的是,供 Google 25,000 名工程師使用的這 20 億行程式碼全部都放在了一個程式庫。在公司內部,Google 把它的程式碼當作了一個巨大的作業系統。「雖不能證明,」Potvin 說:「但我估計這是全世界在用的最大的單一程式庫。」

Google 是一個極端的例子。但它的例子顯示出在網路時代,我們的軟體已經發展到何等複雜的地步──同時還顯示了我們是如何變革程式碼工具和哲學來適應這種增加的複雜性的。Google 的龐大程式庫僅對內部使用,但是從某種程度來看,它相當於大家在網路上共用海量程式碼的開原始程式碼託管工具 GitHub。世界正在快速走向大規模程式碼協作,這是我們跟上快速演變的網路服務的唯一辦法。

GitHub 系統總監 Sam Lambert 說:「像 Google 這樣擁有 25,000 名開發者,就意味著有著各種不同技能的人一起分享程式碼。但是做為小公司你一樣可以利用 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 的 25,000 名工程師每天要進行 45,000 次提交(變更)。這種資料規模和活動頻繁度是相當壯觀的。我們可以比較一下,Linux 作業系統大概有 1,500 萬行程式碼,分布在 40,000 個檔案上,而 Google 的工程師每週就要修改 1,500 萬行程式碼,而且是分散在 250,000 份檔案上。

同時,Piper 還必須減輕人類程式編寫者的負擔。它必須確保編寫者程式碼中添加了所有必要的檔頭;確保程式碼變更時不會互相衝突;確保可以方便地排除錯誤和沒用的程式碼。這些事情都非常棘手,棘手到其中的部分工作已經不是人可以幹的了。所以 Google 已經從原來的版本控制系統 Perforce 遷移到 Piper,現在大部分的 commit 都是由軟體自動完成了。

這不是說自動軟體去寫程式碼。它們的工作是生成軟體執行所需的大量資料和設定檔。「需要齊心協力才能保持程式碼健康,」Potvin 說:「而這不僅僅是人的工作,也包括自動軟體的。」

 

Piper 為人服務

其他人是否也能受益於類似的系統?當然。而且的確也有人這麼做了。Facebook 的主應用程式大概有 2,000 萬行程式碼,他們也是把這些程式碼當作一個專案。還有的也在做類似的事情,只是規模要小一些。但是一旦那些公司接近 Google 或 Facebook 這樣的規模,那後勤保障可能就會出問題。好消息是 Google 和 Facebook 正在探索改變這一點──替所有人改變這一點。

這兩家巨頭目前正在合作一款開源版本控制系統,讓所有人都可以進行大規模的程式碼處理。其基礎是 Mercurial。「我們在嘗試看能不能讓 Mercurial 達到 Google 程式庫的規模,」Potvin 說。她表示,Google 正在監管 Facebook 類似工作的程式設計大咖 Bryan O’ Sullivan 等人密切合作。

這種做法似乎有些極端。從現在來看,沒有幾家公司的程式碼能做到 Google 或者 Facebook 的規模。但在不久的將來,會的。因為軟體正在蠶食世界。

(本文由 36Kr 授權轉載) 

關鍵字: , , , ,

發表迴響