Google 如何管理其 20 億行程式碼?
Posted on Tuesday, September 22nd, 2015 and under 其他.Warning: Undefined variable $before in /home3/myrunners/public_html/itudia.com/share/wp-content/themes/sim/single.php on line 19
Warning: Undefined variable $sep in /home3/myrunners/public_html/itudia.com/share/wp-content/themes/sim/single.php on line 19
Warning: Undefined variable $after in /home3/myrunners/public_html/itudia.com/share/wp-content/themes/sim/single.php on line 19
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 的規模。但在不久的將來,會的。因為軟體正在蠶食世界。