為什麼 Google 單一代碼倉庫,提倡透明開放? 幾十億行代碼放在一個庫

2021-02-25 程式設計師技術精選

一、概述

二、Piper 的設計

三、單一代碼倉庫的優點

單一代碼倉庫的缺點

總結

《ACM通信》有一篇論文《為什麼 Google 要把幾十億行代碼放在一個庫?》,作者是谷歌基礎設施小組的工程師。作者詳細講述了Google的代碼為什麼全部放在一個庫裡面。

img一、概述

谷歌最早使用 CVS 進行代碼管理,1999年改為 Perforce。那時是一臺 Perforce 主機,加上各種緩存機。

當時,全公司的代碼就在一個倉庫裡面,後來一直沿用這種做法。由於規模不斷增長,Perforce 已經無法滿足需求,谷歌就開始使用自己開發的版本管理系統 Piper。

Piper 架設在谷歌自己的分布式資料庫系統(以前叫 Bigtable,現在改名 Spanner)之上,分布在全世界10個數據中心,保證世界各地的谷歌員工都有良好的訪問速度。

目前,這個代碼倉庫包含10億個文件、3500萬次提交記錄,大小為86TB,用戶達到幾萬人。工作日每秒有50萬次請求,高峰時80萬次,大部分來自自動構建和測試系統。

谷歌90%以上的代碼,放在 Piper 裡面。對於那些開源的、需要外部協作的項目,代碼放在 Git,主要是 Android 項目和 Chrome 項目。Git 的特點是,所有歷史記錄都會複製到用戶的本地機器,所以不適合大型項目,必須拆分成更小的庫。以 Android 為例,該項目一共包含800多個獨立的倉庫。

二、Piper 的設計

2.1 結構

整個倉庫採用樹狀結構。每個團隊有自己的目錄。目錄路徑就是代碼的命名空間。每個目錄都有負責人(owner),他負責批准該目錄的文件變動。

2.2 權限控制

Piper 支持文件級別的權限控制。99% 的代碼對所有用戶可見,只有少部分重要的配置文件和機密的關鍵業務,設有訪問限制。

如果機密信息不小心放上了 Piper,文件可以被快速清除。並且,所有的讀寫都有日誌,管理員能夠查到誰讀過這個文件。

2.3 工作流

Piper 的工作流(workflow)如下圖。

img

開發者先創建文件的本地拷貝,這叫做」工作區」(workspace)。完成開發後,工作區的快照共享給其他開發者進行代碼評審。只有通過了評審,代碼才能合併到中央倉庫。

2.4 客戶端

大多數開發者通過一個叫做 CitC 的客戶端,訪問 Piper。開發者通過 CitC 瀏覽和同步 Piper 上的文件,但是編輯和修改是在自己工作區,裡面只保存有變動的文件(一個工作區一般不超過10個文件)。CitC 帶有雲儲存機制,每個工作區就是雲上的一個目錄。通過代碼評審以後,這些文件才從 Citc 合併進 Piper。

2.5 主幹開發

Google 採用」主幹開發」(trunk-based development)。代碼一般提交到主幹的頭部。這樣保證了所有用戶看到的都是同一份代碼的最新版本。

「主幹開發」避免了合併分支時的麻煩。谷歌一般不採用分支開發,分支只用來發布。大多數時候,發布分支是主幹某個時點的快照。以後的除錯和功能增強,都是提交到主幹,必要時 cherry-pick 到發布分支。與主幹長期並行的開發分支,在谷歌極少見。

由於不採用"分支開發",谷歌引入新功能,一般在代碼中使用開關控制。這避免了另起一個分支,也使得通過配置切換功能變得容易,一旦新功能發生故障,很容易切換回舊功能。等到新功能穩定,再徹底刪除舊代碼。谷歌有類似A/B測試的路由算法,評估代碼的表現,由於存在配置開關,這種測試很容易實現。

2.6 代碼評審

所有代碼合併進倉庫之前,都必須進行代碼評審。大部分評審對所有人開放,任何谷歌員工都可以對代碼提意見或者提交變動。

代碼評審的依據是《Google 代碼風格指南》。谷歌有一個叫做 Critique 的工具,可以查看每一行代碼的歷史演變。

2.7 自動測試

評審完成後,會自動運行測試。通過測試以後,代碼就合併進了 Piper 倉庫,整個過程不需要人工幹預。

三、單一代碼倉庫的優點

(1)統一的版本

整個公司的代碼,有統一的版本和路徑,不存在找不到文件的最新版本這樣的問題。

(2)廣泛的代碼共享和復用

任何人都可以瀏覽和使用全公司的代碼,這大大促進了代碼的共享和復用。

(3)簡化的依賴管理

如果你是庫文件或者 API 的作者,因為所有人的代碼都在一個庫裡面,所以很容易找到依賴你的所有下遊代碼。

每當代碼變動,所有依賴你的代碼都會自動構建。如果有大量的構建失敗,那麼系統會自動撤銷這次提交。這樣也保證了所有代碼依賴的都是最新版本,避免依賴不同的版本所導致的衝突。

另外,由於代碼的邊界很清楚,所以不會發生循環依賴。而且,API的作者也很容易發現,別人怎麼使用他的API。

(4)原子性變動

由於每次代碼變動所導致的影響,都在一個倉庫裡面,所以都屬於原子性的變動。因此,很容易撤銷,或者預先測試它所造成的影響。

為了防止錯誤提交,谷歌引入了」預提交」(即在提交之前,先分析一下依賴它的代碼是否會構建失敗)。

(5)大規模代碼析構

單一代碼倉庫為查找和分析代碼,提供了巨大的方便。

Google的靜態分析引擎 Tricorder 定時運行,對代碼進行分析。比如,C++ 11 標準公布以後,很容易找到所有需要改進的變量聲明語句,進行性能優化。該引擎還對許多錯誤提供"一鍵修正"的功能,同時產出大量的統計數據。

此外,編譯器團隊也會對不同語言的所有代碼進行分析,找出不合理的代碼和過時的API。

單一代碼倉庫的缺點

單一代碼倉庫的主要缺點是,所有工具都必須自己寫,因為市場上沒有能夠管理這種規模的代碼倉庫的軟體。

總結

單一代碼倉庫,適合提倡透明開放的大型軟體公司,不適合小公司和有大量私密代碼的公司。

原文:http://m.cacm.acm.org/magazines/2016/7/204032-why-google-stores-billions-of-lines-of-code-in-a-single-repository/fulltext

相關焦點

  • Google 為什麼把幾十億行代碼放在一個庫
    Google 要把幾十億行代碼放在一個庫?》作者詳細講述了Google的代碼為什麼全部放在一個庫裡面。一、概述谷歌最早使用 CVS 進行代碼管理,1999年改為 Perforce。那時是一臺 Perforce 主機,加上各種緩存機。當時,全公司的代碼就在一個倉庫裡面,後來一直沿用這種做法。
  • Google 的代碼管理
    我一直很困惑,為什麼要這樣做,不同語言的項目放在一個庫有什麼好處?最新一期的《ACM通信》(59卷第7期)有一篇論文《為什麼 Google 要把幾十億行代碼放在一個庫?》,作者是谷歌基礎設施小組的工程師,可以看作官方對這個問題的詳細解答。我讀後感到收穫很大,下面就是摘錄。一、概況谷歌最早使用 CVS 進行代碼管理,1999年改為 Perforce。
  • 管代碼 | 谷歌的代碼管理
    以下內容來自:藍橋雲課精選谷歌和 Facebook 都只有一個代碼倉庫,全公司的代碼都放在這個庫裡。
  • 谷歌的代碼管理
    >谷歌和 Facebook 都只有一個代碼倉庫,全公司的代碼都放在這個庫裡。我一直很困惑,為什麼要這樣做,不同語言的項目放在一個庫有什麼好處?最新一期的《ACM通信》(59卷第7期)有一篇論文《為什麼 Google 要把幾十億行代碼放在一個庫?》,作者是谷歌基礎設施小組的工程師,可以看作官方對這個問題的詳細解答。我讀後感到收穫很大,下面就是摘錄。
  • Github部分代碼及整個倉庫刪除
    GitHub是一個面向開源及私有軟體項目的託管平臺,因為只支持git 作為唯一的版本庫格式進行託管,故名GitHub
  • Google 工程師一天需要寫多少行代碼?
    (點擊上方公眾號,可快速關注)轉自:開源中國www.oschina.net/news/88231/ode-get-written-at-google-each-day
  • 使用 Google AutoValue 自動生成代碼
    雖然現在 IDE 可以很好的幫我們生成這些樣板代碼,但是如果看到一個模型類裡面有這麼一堆的方法,總覺是會覺得不夠清晰。普通的 Java 模型我們這裡舉個故事(Story)的例子,一個故事模型擁有一個id,以及一個title。下面我們來看下用Java代碼來表示該模型的寫法。不太嚴謹的寫法我們先來看下一般情況下我們是怎麼定義這個 POJO 的業務模型的。
  • 10行Python代碼實現語音識別
    本文向大家講解如何方便地調用百度AI開放平臺提供的API方便地實現語音識別技術。要調用百度AI開放平臺的API,首先需要一個百度帳號。我想註冊百度帳號的過程應該不用向大家詳細介紹了,大家應該在這邊都是沒啥問題的。需要注意的是,百度帳號的安全性挺差的,不知為啥本人的帳號開通了異地登錄保護也經常被盜,貼吧帳號也因被人盜號發廣告被永封了,申訴也沒用_(¦3」∠)_。
  • 代碼倉庫服務之 GitLab
    GitLab 是一個優秀的協作代碼倉庫服務,擁有幾乎所有 GitHub 的功能,可以當作後者的開源實現。不同於純 git 倉庫服務, GitLab 主打社區和自動化 Pipeline 功能,擁有眾多優秀擴展如 CI/CD,Pages,Issue board 等。
  • 23 個代碼倉庫在Github上被刪除了!
    就像你的項目沒有了心跳一樣的感覺知名遊戲設計師傑森羅勒經歷了糟糕的一周,他發現本人的15年開發代碼和社區貢獻代碼共23個代碼倉庫在
  • 4 行代碼實現批量、快速安裝 Python 第三方庫
    1、實現批量安裝的幾行代碼基礎版:4 行代碼搞定,直接上代碼:import os # 導入os庫libs = {"flask","jieba","django","pymysql","pypdf2"} # 將需要安裝的庫名稱放到列表中for lib in libs: os.system("pip3 install -i https
  • Google Ads轉化代碼怎麼安裝?
    「全局網站代碼」,對於不懂代碼的小夥伴來說不知道如何來選擇,根本就搞不清自己的網站上有沒有安裝什麼全局網站代碼。對於新網站,這個你應該清楚有沒有安裝google全局代碼。不懂的小夥伴,教你一個非常簡單的方法:A. 打開你的網站首頁,元素審查(快捷鍵Ctrl+U);B.
  • 30行Python代碼來繪製一個微信圖標
    微信經典綠色logo這裡小編的作業系統是Windows7,編程軟體為Anaconda 2019.10版,所有庫均為Anaconda自帶,這次主要使用matplotlib繪圖庫來進行繪製。首先還是導入各種需要的庫。
  • 前端100萬行代碼是怎樣的體驗?
    近年來,阿里數據中臺產品發展迅速。
  • GitHub 全部原始碼被洩露...
    GitHub 忽然 「開源」 了自己代碼的一部分,還將它放在了 GitHub 上。
  • 10行內Python代碼實現語音識別
    本文分享如何調用百度AI開放平臺實現語音識別技術。要調用百度AI開放平臺的API,首先需要一個百度帳號。登錄https://ai.baidu.com/,註冊用戶,然後創建應用。使用Python調用該接口之前,需要安裝一個外部庫,pip install baidu-aip -i https://pypi.tuna.tsinghua.edu.cn/simple 接下來進行進行客戶端的創建,在Python編輯器中輸入以下語句:from
  • C++開原始碼項目匯總
    sparsehash  -  An extremely memory-efficient hash_map implementationGoogle Sparse Hash 是 Google 一個很節省內存的 hash map 實現 gflags  -  Commandline flags module for C++Google GFlags 是一個命令行標記的處理庫
  • 果殼網專訪Iordanov:透明桌面確實用了我的代碼
    在接受科技日報採訪時,張堯學提供了一個視頻連結,展示了基於透明計算的「透明桌面」項目的運行狀況。但是,網友很快發現其中一段幫助文本是英文。經搜索發現這段文本來自加拿大軟體工程師約丹·約丹諾夫(Iordan Iordanov)的遠程桌面客戶端bVNC,這是一個「開源軟體」,原始碼是公開的。視頻截圖。
  • 這7個開源的Python庫,讓你輕鬆代碼分析
    ,但是,在代碼庫中保持一致的樣式和測試標準是減少維護負擔的重要部分,這樣可以確保未來的開發人員能夠快速了解最新的項目情況維持項目可維護性的一個好方法是使用外部庫來檢查您的代碼運行狀況。這些是我們最喜歡的一些用於linting代碼的庫(檢查PEP 8和其他樣式錯誤),強制執行一致的樣式,以及測試覆蓋率的庫。檢查代碼規範PEP8 是Python官方推出編碼約定,它為行長度,縮進,多行表達式和命名約定等內容制定了一系列規則,主要是為了保證 Python 編碼的風格一致,提高代碼的可讀性。1.
  • 零代碼入門GitHub,圖形化交互讓你輕鬆存代碼 | 附Git GUI推薦
    其實,GitHub早已貢獻了一份入門Git的學習教程,藉助GitHub,不寫代碼,無需命令行,甚至不需要安裝Git,就能輕鬆邁出Git旅程裡的第一步。不寫代碼用Git雖然不需要寫代碼,但是在教程開始前,你還是需要一個GitHub帳戶。話不多說,直接開始第一步,創建倉庫。想要放代碼,就得先有一個庫。