谷歌高效開發的秘密:來自谷歌前員工的軟體開發工具指南

2020-12-22 InfoQ技術實驗室

谷歌的內部開發工具是世界領先的,其針對大規模軟體開發的多方面痛點提供了解決方案。但幾乎所有工具均與谷歌獨有的內部生態系統緊密耦合,無法在其它環境中使用。本文介紹了如何在軟體開發中引入好的開發工具,提高自己和團隊成員的生產力,進而在大規模軟體開發中傳播有效的最佳實踐,為公司帶來工程化效率提升。

本文最初發表於about.sourcegraph.com(《An ex-Googler's guide to dev tools》),經原作者授權,由 InfoQ 翻譯並分享。

多年前我曾在谷歌短期任職。儘管此後歷經滄海桑田,但在谷歌期間接觸其內部開發工具的經歷,對我產生了長遠的影響。從很多方面看,谷歌的內部開發人員工具是世界最領先的。谷歌不僅在自身軟體系統的擴張上走在了前列,而且在大規模軟體的高效構建方法上也是領先的。谷歌針對代碼庫規模、代碼可發現性、組織知識的分享以及多服務部署等方面的問題提供了解決方案,達到了大多數企業尚未企及的高度。作為參考,推薦《谷歌軟體工程》(「Software Engineering at Google」)一書。

但從另一方面看,谷歌的內部工具是非常有局限的。事實上,幾乎所有此類工具均與谷歌獨有的內部生態系統緊密耦合。這意味著人們一旦離職,很不幸就無法在其它環境中使用這些工具。

儘管如此,這些才華橫溢的谷歌離職人員汲取了在世界領先技術組織工作中的經驗教訓,進而為其他許多組織注入了新的動力。但適應谷歌之外的編程開發環境並非易事,尤其是他們已經形成依賴的一些工具沒辦法在使用了。

這些年來,我從自身以及許多其他離職谷歌的人身上學到了不少。Sourcegraph 的許多早期客戶,就是因為離職谷歌后想念原公司的代碼搜索功能而找到了我們。通過與客戶的緊密合作,我們了解到他們迫切需要填補的空白,進而去構建 Sourcegraph 的功能來滿足他們的需求。谷歌前員工正在探索如何在當前組織中使用新開發工具的模式。這一工作的靈感源自於他們使用谷歌開發工具而具備的經驗。當然,一些探索是成功的,也有些折戟沉沙。

就此問題,我認為撰寫一份著眼於實操和實用的外部開發工具指南是非常有意義的。能將谷歌的內部開發工具生態系統直接克隆到新公司中,無疑是不少谷歌前員工的願望,但也應切忌好高騖遠。下面我就會談談我的看法,講一講前谷歌員工如何開始尋找讓他們和他們的新團隊儘可能高效工作的工具。

軟體開發的生命周期

對於剛離職谷歌並加入其他公司的人而言,可能一時難以適應大不如前的工作效率。儘管大家都覺得需要做出一些改進,但應從何入手呢?第一步需要認真考慮的,是如何從日常工作中發現真正的痛點所在。

無論對於谷歌內部還是其他組織來說,軟體開發的生命周期基本都是這個樣子:

列出需構建的特性,或是需要修正的軟體缺陷;通過大量閱讀代碼和文檔,以及與同事開展交流,建立對問題的認識,並給出一個大體適合現有系統的解決方案;著手編程工作。首先做出來能運行的東西,期間可能需要反覆地查看文檔及部分代碼。一旦代碼達到能運行的程度,這時不要急於交付。做代碼測試,修復缺陷並做進一步測試。進而重構代碼,生成整潔並便於接手者理解的代碼。將代碼推送到代碼庫生成分支,等待運行持續集成。期間的代碼可能實現了一些額外修復和小部分改進。提交供審核的代碼補丁,根據團隊成員給出的評論進行更改。這一過程可能需反覆數輪,直至代碼審核人員通過更改。歸併補丁,並做部署。監控已部署系統的運行情況,判定生產環境中是否存在問題。如果新打的補丁導致系統宕機,負責修復問題。這一過程中的每個階段,都需要在適用的開發工具輔助下開展。開發工具引導開發人員按章行事,主導著工作流程,控制著工作效率。

選定適合的工具,才能提高開發效率。我推薦一個 Github 代碼庫,地址為https://github.com/jhuangtw/xg2xg。其中列出了近乎所有的谷歌內部工具,以及具備對應功能的外部工具。列表非常詳盡,但是略為冗長。

開始階段:熟悉現有工具,不要引入新工具

我們在剛參與到一個項目中時,不要試圖對現狀做任何改變,只需蕭規曹隨。

做為一名團隊中的新人,不太可能有權或能影響整個團隊去迎合你個人對工具的喜好。此外,你也缺少對團隊做事方式和事情前因後果的了解。生搬硬套谷歌那一套,也許並不適用於新團隊。因此,首先是要領悟新團隊的工作方式和禁忌。

從易於改進之處著手

我認為首先可加以改進的,就是代碼搜索功能。鑑於我本身就是一家代碼搜索企業的聯合創始人,當然會這麼認為。同時,下面給出更具說服力的原因。如果讀者並不認同,大可跳過此節。

代碼搜索是谷歌離職員工通常缺失的日常工具之一。你可以自己嘗試各種代碼搜尋引擎,找出確實好用的選項再給別人推薦。也就是說你不需要得到領導的許可,也不用冒搭上自己人品的風險去說服他人嘗試你自己都沒用過的工具。大多數團隊尚未使用代碼搜索工具,因此不存在強迫別人改變現有習慣的問題。如果團隊已經在頻繁使用很好的代碼搜索工具,盡可跳過本節!新公司中可能有多個團隊,這時我們難免會處理超出個人合理能力範圍的代碼。即使在一家規模較小的公司工作,我們也有可能會通過依賴項獲取大量的開原始碼。在構建新功能時,或是追蹤某些嚴重錯誤的來源時,一些情況下需要深入研究所有這些代碼。

考慮到當前幾乎所有開發人員需面對的代碼規模,無疑低效的代碼搜索會嚴重阻礙開發的進度,導致步步維艱。

選擇代碼搜尋引擎時,需考慮如下因素:

查詢語言:正則表達式是標配。確保代碼搜索查詢語言具有很好的表達力,並易於使用。提供直觀的按詞搜索,並提供高級的模式匹配功能。擴展性:確保代碼搜尋引擎適合代碼庫當前的規模。如果代碼庫規模達數個GB,需考慮搜尋引擎是否支持三元詞索引技術。該技術適用於大規模代碼庫中的正則表達式匹配。代碼瀏覽:使用過Google Code Search的人都明白,搜索只完成了部分工作。查看搜索結果時,類似於在IDE開發環境中查看代碼一樣,需要支持跳轉到定義功能,並便於查找引用。如果代碼瀏覽功能不夠強大,那麼就需在編輯器和搜尋引擎之間頻繁切換。權限:如果企業強制了代碼庫的權限,需考慮代碼搜尋引擎對權限的適配性。整體代價:需考慮部署代碼搜尋引擎的代價,以及在線使用的整體維護代價。當前人們使用的主要代碼搜尋引擎包括:

OpenGrok:Oracle的產品,最具歷史,也一直在用。Hound:一款由Etsy工程人員創建並開源的代碼搜尋引擎。Livegrep: 由Stripe的Nelson Elhage創建的代碼搜尋引擎。當然,還有我們的Sourcegraph。良好的監控

監控是另一個需要考慮儘早改進的方面。工程師有時候必須去處理生產環境中出現的問題。但生產是與開發截然不同的,無法通過設置斷點或直接添加 printf 而在數秒內看到效果。從計算資源、開發人員時間、以及最糟糕的是給用戶和客戶帶來痛苦等多個方面看,生產環境中做更新的代價尤其高昂。

部署在過去的五到十年間發生了巨大的改變。微服務、Kubernetes、雲端遷移等技術,極大地改進了企業的軟體部署方式。很多企業採用了這些新方式和新技術,但尚未相應地更新監控架構來方便地調試新的生產環境。

好消息是現在已經有了一些很好的開源工具和企業,極大地改進了谷歌之外的監控和可觀察性現狀。

Prometheus:一款對標Borgmon的時序度量追蹤和可視化工具。為用戶提供儀錶盤顯示的應用追蹤度量,例如CPU使用、錯誤率、p90延遲等隨時間變化的情況。Grafana:一款對標Viceroy的儀錶盤工具。常用場景是連接到Prometheus,構建在單頁上顯示一系列關鍵指標的視圖,展示應用的整體健康情況。分布式追蹤是日益普及的多服務架構的必備工具,對此,Google Dapper居於領先地位。Lightstep是由Dapper的創建者之一Ben Sigelman推出的項目。分布式追蹤已是許多監控系統提供的特性,包括付費工具Honeycomb和Sentry等,以及Uber工程師推出的開源工具Jaeger等。考慮到監視必須集成到生產環境中,因此要比引入代碼搜索更具難度。引入監視需更改部署環境,這意味著要說服管控部署環境的團隊。監視還可能需要添加儀錶盤代碼,這涉及向所有儀錶盤代碼相關團隊提交補丁。但引入此類新工具並不需要任何人改變現有的習慣,從某種意義上說也並非不可為之。人們可以自由選擇是否使用新工具,這可避免在推行新工具時面對強烈的反對意見。

步步為營:代碼審查

引入代碼搜索和監控,並不會更改其他團隊人員現有的工作流程。但是改進代碼審核工具,則需大家配合。

對於具有谷歌工作經驗的人而言,很有可能不太適應谷歌之外的代碼審查方式。對於常用的代碼審核工具 GitHub Pull Request(PR),抱怨集中於以下幾點:

不夠直觀,有時無法查看自上一輪審核以來所做的更改。簡單路徑僅支持查看顯著差異;不支持積壓的更改請求(Stacked CR);在同一頁中整體顯示所有文件的全部差異,難以追蹤已審核項;GitHub PR的審核實現方式毫無特點(unopinionated)。如果不額外添加第三方集成,審核過程松松垮垮。即便添加了第三方集成,依然缺乏強制的細粒度審核和籤出策略功能;儘管對部分語言提供對模糊「跳轉到定義」(jump-to-def)和「查找參考引用」(find-references)的有限支持,但遠未達到谷歌內部使用的Critique的水平。與 Critique 最接近的谷歌之外工具是 Gerrit。Gerrit 最早是 Rietveld 的一個分支,而 Rietveld 本身是谷歌最初代碼審核工具 Mondrian 的一個開源分支。因為工具線的傳承,二者看上去非常相似,設計用於創建谷歌支持的代碼審核方式。

Phabricator 是谷歌前員工喜歡替代 Github PR 的另一款工具。Phabricator 一開始是 Facebook 的代碼審核工具,隨後開源並對外發布。該工具由Phacility公司支持,為不想自己維護實例的用戶提供託管實例和服務支持。

由谷歌前員工 Piotr Kaminski 創建的 Reviewable 是另一款值得推薦的工具。不同於 Gerrit 和 Phabricator,Reviewable 僅用於雲端,提供類似於谷歌內部的代碼審核體驗。

要向團隊其他成員推薦 Gerrit、Phabricator或 Reviewable 的優點,重要的是指出團隊現有代碼審核工具在使用上的痛點。下面給出由 Github PR 類工具轉向類 Gerrit 工具所解決的部分痛點:

Gerrit提供明確的籤發(sign-off),有助於審核過程更加結構化。如果系統擴大團隊並在整個組織中強制更嚴格的審核策略,該特性非常好用;Gerrit便於審核大量差異,支持對逐個文件、上一輪審核後的更改以及積壓CR的審核,提供更快、更全面的審核。Gerrit、Phabricator 和 Reviewable 可實現類似谷歌內部的審核流程,但都尚未提供可對標的代碼智能功能。如果當前代碼審核工具中並不具備代碼智能,或是發現 GitHub PR 中缺失代碼智能,可嘗試Sourcegraph的瀏覽器擴展。它連接 Sourcegraph 實例,為代碼審核提供工具幫助、跳轉到定義和交叉引用,支持 GitHub PR、Phabricato 和 Bitbucket 伺服器,正實現對 Gerrit 的支持。

準備屠龍大招

軟體開發生命周期中最棘手的部分,通常是持續集成和構建系統。因為要理解構建,通常需要細緻理解整個代碼庫的每一部分。加快構建速度是所有人的願望,因此大家在構建代碼中越來越多地使用了一些技巧和優化措施,進而導致真正能確保當前進展中所做更改不會產生任何負面影響的人數屈指可數。

簡而言之,構建系統通常千頭萬緒(giant hairball)。在尊重底層開發人員提高開發效率的做法的同時,需慎重地逐一釐清。想要早發現苗頭早解決的話,Blaze 是最好的工具,谷歌甚至為 Blaze 的衍生產品 Bazel 開源提供幫助。但 Bazel 終究並非 Blaze,谷歌外部環境也並非適用谷歌的工具。舉一個例子,Blaze 中缺少在 Bazel 中打包提供的大規模分布式構建集群功能。

Bazel 也並非靈丹妙藥(silver bullet)。在 Bazel 首次發布時,Go 社區中的很多開源項目出於對標準 Go 構建工具的喜愛而紛紛轉向使用 Bazel。但在一年內,面對 Bazel 的複雜性和難以上手的缺陷(並且看上去使用 Bazel 的構建速度也較慢),很多項目又轉回 Go 社區。雖然當前 Bazel 對 Go 的支持已做了很大的改進,但在轉向使用它時,還是需要對所獲得的改進做出認真的評估。

開展嚴格的評估,需要手頭有一些好用的開發工具。尤其需要很好的代碼搜索工具,這樣才能切實深入研究代碼庫各個部分的構建腳本,理解它們的來龍去脈。還需要很好的代碼審查工具,因為更改構建系統是一項複雜的事情,需要多個不同工程團隊的支持。

一旦準備好屠龍,在 Bazel 之外還有其它一些從設計上支持大規模代碼庫中可擴展構建的工具。包括:

Facebook提供的Buck;Java領域廣為使用的Gradle;Pants,由一名谷歌前員工為Twitter和Foursquare開發;Please,也是由谷歌前員工新推出的構建工具,主要借鑑了Blaze。還有同是谷歌前員工 Yves Junqueira 推出的YourBase。YourBase 本身並非構建工具,而是一款持續集成工具,獨立於後臺使用的具體構建工具,在谷歌之外提供快速、可擴展的構建。

總結

谷歌獨樹一幟地提供了優先考慮開發人員經驗和開發人員工具,使得谷歌員工和前員工能受益於使用一流開發工具而獲得的一手經驗。這些工具極大地影響著他們的天賦和能力。

一旦離開谷歌,對這些經驗的利用就成為一種競爭優勢。人們可以將出色的新開發工具帶入新組織,提高自己和團隊成員的生產力。通過使用這些工具,在大規模軟體開發中傳播有效的最佳實踐,可為新公司帶來組織的有效工程化,這是谷歌的一項主要競爭優勢。

誠然,大規模軟體構建絕非易事。正如《人月神話》(The Mythical Man Month knows)一書所說,好的軟體並非通過僱傭更多開發人員就能實現。鑑於軟體是最終用戶生產率的倍增器,而開發工具是軟體構建人員生產率的倍增器,我們需要更好的工具。如果你認可新企業的理念,那麼就發揮做為谷歌前員工的獨到見解,為新企業帶來最好用的開發人員工具。

原文連結:

An ex-Googler's guide to dev tools

https://about.sourcegraph.com/blog/ex-googler-guide-dev-tools/

關注我並轉發此篇文章,私信我「領取資料」,即可免費獲得InfoQ價值4999元迷你書,點擊文末「了解更多」,即可移步InfoQ官網,獲取最新資訊~

相關焦點

  • 谷歌與蘋果對於開發移動AR技術的影響
    關鍵詞:增強現實;SDK;蘋果;谷歌  1 蘋果與谷歌的增強現實SDK  2017年第三季度,為了履行通過移動平臺支持增強現實(AR)技術的承諾,蘋果與谷歌分別發布了各自的AR軟體開發工具包(SDK):ARKit與ARCore。此外,AR還是2019年十大戰略科技發展趨勢之一。
  • 谷歌建遊戲工作室 聘前索尼遊戲開發負責人運營
    來源:新浪科技谷歌Stadia工作室新浪科技訊 北京時間3月5日上午消息,據國外媒體報導,谷歌宣布該公司聘請了前索尼遊戲開發負責人香農·斯塔德斯蒂爾(Shannon Studstill),她將運營谷歌位於洛杉磯的Stadia遊戲和娛樂工作室
  • 谷歌:全球16個國家和地區已推出搭載谷歌與蘋果開發技術的新冠接觸...
    路透社8月1日消息,谷歌周五表示,約佔45%全國人口的美國20個州和地區正使用公司與蘋果開發的工具,「探索」開發針對新冠病毒的接觸追蹤應用。另據谷歌,美國以外的16個國家和地區的公共衛生部門已推出搭載蘋果與谷歌工具的應用程式,較此前的12個有所增加。這些國家和地區包括奧地利、巴西、加拿大、克羅埃西亞、丹麥、德國、直布羅陀、義大利、愛爾蘭、日本、拉脫維亞、北愛爾蘭、波蘭、沙烏地阿拉伯、瑞士和烏拉圭。該技術可以讓用戶通過藍牙信號追蹤與其他人的接觸情況。
  • 促進Golang雲開發谷歌推出Go Cloud
    在程式語言界,谷歌的Golang語言可以說是當下最流行的語言之一,據官方數據全球約有100萬活躍碼農在使用Golang開發。同時雲計算也是目前技術發展最快的一個領域,並且改變了我們的基礎IT架構:大量的網站、應用開始遷移到雲上。
  • 谷歌收購AppSheet 將無代碼開發帶入谷歌雲
    原標題:谷歌收購AppSheet 將無代碼開發帶入谷歌雲谷歌今天宣布將收購AppSheet,這是一個有八年歷史的無代碼行動應用程式構建平臺。根據PitchBook的數據,該公司以6000萬美元的估值融資超過1700萬美元。
  • Uber和谷歌用2.45億握手言和,打車軟體為何要搶谷歌的生意?
    Waymo 起訴 Uber 是第一場關於自動駕駛汽車的法律大戰,在(當地時間)周五早上以一個和解協議結束:Uber向Waymo提供了0.34%的股份(價值2.45億美元或1.63億美元,具體取決於你如何計算Uber的價值),並保證不在自家車輛中使用任何Waymo的軟體或硬體。
  • 谷歌將關閉物聯網開發平臺 Android Things
    據 XDA 報導,谷歌將於明年年初開始逐步關閉物聯網開發平臺項目 Android Things 。
  • 谷歌發布新效率工具Tables
    SaaS效率軟體明星公司AirTable剛宣布融資還沒幾天,谷歌就正式發布了一個相當有野心的競爭產品:Tables。Tables由谷歌內部創業孵化器Area120推出,是一個無代碼的表格式自動化效率工具。
  • 三星發布Game Driver App 與谷歌、高通和ARM聯合開發_華強北軟體...
    這款應用是三星聯合谷歌、高通、ARM 聯合開發的。由於三星在同一型號手機使用不同的處理器(驍龍 865、Exynos 990),因此推出了兩個軟體版本,分別支持高通 Adreno GPU 以及三星 Exynos 處理器的 Mali GPU。這款 App 大小僅為 51MB 至 61MB。現在最新的 GPU 驅動支持《使命召喚》、《堡壘之夜》、《Black Desert Mobile》三款遊戲,未來將支持更多的遊戲。
  • 谷歌的拍照算法大牛跳槽Adobe,要開發一款你的手機也能用的超強...
    谷歌出品的這款相機應用之所以能夠受到大家的追捧,無非就是它能夠帶來類似於Pixel系類上的拍照體驗。除了部分刷榜的機型之外,Pixel 4的相機表現和iPhone 11 Pro Max還是挺接近的Adobe今天宣布,原本歸屬於谷歌Pixel手機相機應用團隊的技術大牛Marc Levoy已經正式入職Adobe,工作就是要開發一款通用的相機應用。
  • 谷歌公布 GitHub 最新開源庫 androidx:開發 AOSP Jetpack
    IT之家7月29日消息 谷歌開發者宣布,正式推出 GitHub 上最新的一個開源庫 (和開源組織) —— androidx!這是 Android Jetpack 各種組件庫的源碼和開發環境,與 AOSP 的主分支代碼同步。
  • 谷歌的人工智慧軟體能將你繪畫的醜陋塗鴉變成合適的圖片
    你不再需要擔心你的繪畫水平多麼糟糕,因為谷歌的神經網絡會幫助你彌補繪畫缺陷——至少有時候會這樣。谷歌剛剛推出一款新工具AutoDraw,你可以把它看作Microsoft Paint(微軟畫圖軟體)。別看它界面簡單,它卻擁有一顆複雜的人造大腦。
  • 研究:約67%惡意安卓軟體來自谷歌Play商店
    11月12日 消息:在最近的一項學術研究中顯示,谷歌 Play商店被確認為是Android設備上安裝惡意軟體的主要來源。站長之家了解到,研究人員利用NortonLifeLock提供的遙感數據,分析了2019年6月到9月的四個月時間期間多達1200多萬安卓設備上安裝的應用程式的來源。
  • 谷歌發布TensorFlow,用於測試人工智慧模型的隱私保護
    >近日,谷歌發布了隱私保護TensorFlow工具包,可以評估各種機器學習分類器的隱私屬性。當前,各種人工智慧隱私技術仍然是社區內爭論的話題,但還沒有一個規範的指南來建立一個私有模型。而越來越多的研究表明人工智慧模型可以洩露訓練數據集的敏感信息,從而產生隱私風險。
  • 索尼聖莫尼卡工作室換帥 前領導加盟谷歌Stadia
    原標題:索尼聖莫尼卡工作室換帥前領導加盟谷歌Stadia來源:3DMGame 今天早些時候,谷歌宣布一個全新的遊戲工作室在加州Playa Vista成立,為Stadia開發獨佔遊戲。為了領導這個新工作室,谷歌挖來了索尼聖莫尼卡工作室領導兼前《戰神》執行製作人Shannon Studstill。對於聖莫尼卡工作室,索尼公布了新的工作室領導。
  • 他們如何靠為餐飲公司開發外賣配送軟體月入700萬?
    我們當時不知道的是市場還沒有準備好,回到南佛羅裡達後,手裡拿著一個軟體平臺,以為沒有人會想要一款餐前準備配送的軟體,要用這些代碼做什麼?但我們大錯特錯了。幾個月過去了,我們的開發團隊開始開發一個可以在美國市場運行的原型。讓人完全難以置信的是,僅僅兩天之後,就有 4 家公司想要這個系統,但有一個陷阱……至少有 50 多個功能。我們就是這樣開始的。
  • 2020谷歌開發者大會:AR軟體工程總監介紹ARCore最新動態
    Google 開發者大會 (Google Developer Summit) 是谷歌面向開發者展示最新產品和平臺的年度盛會。2020 Google 開發者大會於 11 月 16 日 至 21 日舉行,這是谷歌首次以全線上大會的形式與中國開發者相聚。
  • 谷歌推出AI羅塞塔石碑:首款古埃及象形文字翻譯工具,快來跟法老玩...
    經過三年的研發,谷歌藝術與文化推出了全球首個基於機器學習的埃及象形文字的數字翻譯工具Fabricius。 這個工具的發布是為了紀念羅塞塔石碑(Rosetta Stone)出土221周年。
  • 谷歌將資助10萬個在線認證獎學金以及1000萬美元就業培訓補助
    首頁 > 見聞 > 關鍵詞 > 谷歌最新資訊 > 正文 谷歌將資助10萬個在線認證獎學金以及1000萬美元就業培訓補助
  • 谷歌相機為什麼那麼優秀?手持小米mix2s如何安裝谷歌相機?
    谷歌相機可以說是手機攝影愛好者的神級軟體了,其實淺行也不知道谷歌相機好在哪裡,對於只用手機掃碼的男人,日常打開相機是不存在的!好了,言歸正傳,谷歌相機為什麼一直受到玩機愛好者的追捧呢?那麼,了解了谷歌相機的過人之處,我們來了解下,如何安裝谷歌相機吧!一、谷歌相機不同於其他應用,要走手機上運行谷歌相機,必須要找到適合自己機型的相機版本,不然會發生APP閃退的尷尬處境。二、國產手機需要安裝谷歌服務才能運行谷歌相機,而華為的處理器不能安裝谷歌相機。