日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Google 为什么把几十亿行代码放在一个库

發(fā)布時(shí)間:2024/8/23 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Google 为什么把几十亿行代码放在一个库 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

《ACM通信》有一篇論文《為什么 Google 要把幾十億行代碼放在一個(gè)庫(kù)?》,作者是谷歌基礎(chǔ)設(shè)施小組的工程師。作者詳細(xì)講述了Google的代碼為什么全部放在一個(gè)庫(kù)里面。


一、概述

谷歌最早使用 CVS 進(jìn)行代碼管理,1999年改為 Perforce。那時(shí)是一臺(tái) Perforce 主機(jī),加上各種緩存機(jī)。

當(dāng)時(shí),全公司的代碼就在一個(gè)倉(cāng)庫(kù)里面,后來一直沿用這種做法。由于規(guī)模不斷增長(zhǎng),Perforce 已經(jīng)無法滿足需求,谷歌就開始使用自己開發(fā)的版本管理系統(tǒng) Piper。

Piper 架設(shè)在谷歌自己的分布式數(shù)據(jù)庫(kù)系統(tǒng)(以前叫 Bigtable,現(xiàn)在改名 Spanner)之上,分布在全世界10個(gè)數(shù)據(jù)中心,保證世界各地的谷歌員工都有良好的訪問速度。

目前,這個(gè)代碼倉(cāng)庫(kù)包含10億個(gè)文件、3500萬次提交記錄,大小為86TB,用戶達(dá)到幾萬人。工作日每秒有50萬次請(qǐng)求,高峰時(shí)80萬次,大部分來自自動(dòng)構(gòu)建和測(cè)試系統(tǒng)。

谷歌90%以上的代碼,放在 Piper 里面。對(duì)于那些開源的、需要外部協(xié)作的項(xiàng)目,代碼放在 Git,主要是 Android 項(xiàng)目和 Chrome 項(xiàng)目。Git 的特點(diǎn)是,所有歷史記錄都會(huì)復(fù)制到用戶的本地機(jī)器,所以不適合大型項(xiàng)目,必須拆分成更小的庫(kù)。以 Android 為例,該項(xiàng)目一共包含800多個(gè)獨(dú)立的倉(cāng)庫(kù)。

二、Piper 的設(shè)計(jì)


2.1 結(jié)構(gòu)

整個(gè)倉(cāng)庫(kù)采用樹狀結(jié)構(gòu)。每個(gè)團(tuán)隊(duì)有自己的目錄。目錄路徑就是代碼的命名空間。每個(gè)目錄都有負(fù)責(zé)人(owner),他負(fù)責(zé)批準(zhǔn)該目錄的文件變動(dòng)。

2.2 權(quán)限控制

Piper 支持文件級(jí)別的權(quán)限控制。99% 的代碼對(duì)所有用戶可見,只有少部分重要的配置文件和機(jī)密的關(guān)鍵業(yè)務(wù),設(shè)有訪問限制。

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

2.3 工作流

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

開發(fā)者先創(chuàng)建文件的本地拷貝,這叫做”工作區(qū)”(workspace)。完成開發(fā)后,工作區(qū)的快照共享給其他開發(fā)者進(jìn)行代碼評(píng)審。只有通過了評(píng)審,代碼才能合并到中央倉(cāng)庫(kù)。

2.4 客戶端

大多數(shù)開發(fā)者通過一個(gè)叫做 CitC 的客戶端,訪問 Piper。開發(fā)者通過 CitC 瀏覽和同步 Piper 上的文件,但是編輯和修改是在自己工作區(qū),里面只保存有變動(dòng)的文件(一個(gè)工作區(qū)一般不超過10個(gè)文件)。CitC 帶有云儲(chǔ)存機(jī)制,每個(gè)工作區(qū)就是云上的一個(gè)目錄。通過代碼評(píng)審以后,這些文件才從 Citc 合并進(jìn) Piper。

2.5 主干開發(fā)

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

“主干開發(fā)”避免了合并分支時(shí)的麻煩。谷歌一般不采用分支開發(fā),分支只用來發(fā)布。大多數(shù)時(shí)候,發(fā)布分支是主干某個(gè)時(shí)點(diǎn)的快照。以后的除錯(cuò)和功能增強(qiáng),都是提交到主干,必要時(shí) cherry-pick 到發(fā)布分支。與主干長(zhǎng)期并行的開發(fā)分支,在谷歌極少見。

由于不采用"分支開發(fā)",谷歌引入新功能,一般在代碼中使用開關(guān)控制。這避免了另起一個(gè)分支,也使得通過配置切換功能變得容易,一旦新功能發(fā)生故障,很容易切換回舊功能。等到新功能穩(wěn)定,再?gòu)氐讋h除舊代碼。谷歌有類似A/B測(cè)試的路由算法,評(píng)估代碼的表現(xiàn),由于存在配置開關(guān),這種測(cè)試很容易實(shí)現(xiàn)。


2.6 代碼評(píng)審


所有代碼合并進(jìn)倉(cāng)庫(kù)之前,都必須進(jìn)行代碼評(píng)審。大部分評(píng)審對(duì)所有人開放,任何谷歌員工都可以對(duì)代碼提意見或者提交變動(dòng)。

代碼評(píng)審的依據(jù)是《Google 代碼風(fēng)格指南》。谷歌有一個(gè)叫做 Critique 的工具,可以查看每一行代碼的歷史演變。

2.7 自動(dòng)測(cè)試

評(píng)審?fù)瓿珊?#xff0c;會(huì)自動(dòng)運(yùn)行測(cè)試。通過測(cè)試以后,代碼就合并進(jìn)了 Piper 倉(cāng)庫(kù),整個(gè)過程不需要人工干預(yù)。

三、單一代碼倉(cāng)庫(kù)的優(yōu)點(diǎn)


(1)統(tǒng)一的版本

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

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


任何人都可以瀏覽和使用全公司的代碼,這大大促進(jìn)了代碼的共享和復(fù)用。

(3)簡(jiǎn)化的依賴管理


如果你是庫(kù)文件或者 API 的作者,因?yàn)樗腥说拇a都在一個(gè)庫(kù)里面,所以很容易找到依賴你的所有下游代碼。

每當(dāng)代碼變動(dòng),所有依賴你的代碼都會(huì)自動(dòng)構(gòu)建。如果有大量的構(gòu)建失敗,那么系統(tǒng)會(huì)自動(dòng)撤銷這次提交。這樣也保證了所有代碼依賴的都是最新版本,避免依賴不同的版本所導(dǎo)致的沖突。

另外,由于代碼的邊界很清楚,所以不會(huì)發(fā)生循環(huán)依賴。而且,API的作者也很容易發(fā)現(xiàn),別人怎么使用他的API。


(4)原子性變動(dòng)


由于每次代碼變動(dòng)所導(dǎo)致的影響,都在一個(gè)倉(cāng)庫(kù)里面,所以都屬于原子性的變動(dòng)。因此,很容易撤銷,或者預(yù)先測(cè)試它所造成的影響。


為了防止錯(cuò)誤提交,谷歌引入了”預(yù)提交”(即在提交之前,先分析一下依賴它的代碼是否會(huì)構(gòu)建失敗)。

(5)大規(guī)模代碼析構(gòu)

單一代碼倉(cāng)庫(kù)為查找和分析代碼,提供了巨大的方便。

Google的靜態(tài)分析引擎 Tricorder 定時(shí)運(yùn)行,對(duì)代碼進(jìn)行分析。比如,C++ 11 標(biāo)準(zhǔn)公布以后,很容易找到所有需要改進(jìn)的變量聲明語句,進(jìn)行性能優(yōu)化。該引擎還對(duì)許多錯(cuò)誤提供"一鍵修正"的功能,同時(shí)產(chǎn)出大量的統(tǒng)計(jì)數(shù)據(jù)。


此外,編譯器團(tuán)隊(duì)也會(huì)對(duì)不同語言的所有代碼進(jìn)行分析,找出不合理的代碼和過時(shí)的API。


單一代碼倉(cāng)庫(kù)的缺點(diǎn)


單一代碼倉(cāng)庫(kù)的主要缺點(diǎn)是,所有工具都必須自己寫,因?yàn)槭袌?chǎng)上沒有能夠管理這種規(guī)模的代碼倉(cāng)庫(kù)的軟件。

總結(jié)


單一代碼倉(cāng)庫(kù),適合提倡透明開放的大型軟件公司,不適合小公司和有大量私密代碼的公司。

原文:

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

————

編輯?∑Gemini

?來源:算法愛好者

?泰勒定理的奇聞?shì)W事

?丘成桐:漫談微分幾何

?Leibniz 如何想出微積分?(一)

?線性相關(guān)和秩的物理意義

?數(shù)學(xué)史上你認(rèn)為最丑陋的公式是什么?

?陶哲軒談什么是好的數(shù)學(xué)

?田淵棟:數(shù)學(xué)的用處(下篇)

?你絕對(duì)沒想過原來數(shù)學(xué)家這么流氓,一言不合就進(jìn)行暴力證明

?世界上最牛的五篇博士論文

?數(shù)學(xué)中有哪些巧合讓人眼前一亮?

?算法立功!清華畢業(yè)教授美國(guó)被搶車,警察無能為力自己用“貪心算法”找回

?學(xué)術(shù)史上的奇文:怎樣用數(shù)學(xué)抓獅子

?臺(tái)大教授的反思:最難的一課 我們卻沒教給學(xué)生

?麻省理工學(xué)院(MIT)研究生學(xué)習(xí)指導(dǎo)—— 怎樣做研究生

?分享 數(shù)學(xué),常識(shí)和運(yùn)氣 ——投資大師詹姆斯·西蒙斯2010年在MIT的講座


算法數(shù)學(xué)之美微信公眾號(hào)歡迎賜稿

稿件涉及數(shù)學(xué)、物理、算法、計(jì)算機(jī)、編程等相關(guān)領(lǐng)域,經(jīng)采用我們將奉上稿酬。

投稿郵箱:math_alg@163.com

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的Google 为什么把几十亿行代码放在一个库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。