Go 部落格

貢獻研討會

Steve Francia, Cassandra Salisbury, Matt Broberg, and Dmitri Shuralyov
2017 年 8 月 9 日

活動概述

作者:Steve

在 GopherCon 的社群日期間,Go 團隊舉辦了兩次研討會,我們與人們一起幫助他們首次為 Go 專案做出貢獻。這是 Go 專案首次嘗試這樣的活動。我們有大約 140 名參與者和大約 35 名志願者導師。導師們不僅因幫助他人而感到心情舒暢,還獲得了一頂非常時尚的 Go 導師卡車帽。我們有來自北美、南美、非洲、歐洲、亞洲和澳大利亞的各個年齡段和經驗水平的貢獻者。這確實是 Gophers 在 GopherCon 匯聚的全球性努力。

我們舉辦研討會的原因之一是希望它能作為一種強制手段,促使我們改進貢獻者體驗。為準備研討會,我們重寫了貢獻者指南,包括增加了一個“故障排除”部分,並構建了一個名為 go-contrib-init 的工具,該工具自動化了設定開發環境以貢獻 Go 的過程。

對於研討會本身,我們開發了一個名為“為 Go 貢獻”的簡報,以及一個在活動期間展示的儀表板/記分板。記分板的設計旨在鼓勵我們所有人朝著共同的目標——看到我們的集體分數增加——共同努力。當參與者執行註冊賬戶、建立變更列表(也稱為 CL,類似於拉取請求)、修改 CL 或提交 CL 等操作時,他們會為總分增加 1、2 或 3 分。

Brad Fitzpatrick 今年缺席了 GopherCon,但他已準備就緒,等待審查所有提交的 CL。他審查的速度如此之快,以至於許多人認為他是一個自動機器人。在內部,我們的團隊稱他為“BradBot”,主要是因為我們敬畏且有點嫉妒。

影響

在研討會結束後的一週內,參與者共提交了 65 個 CL。其中,44 個來自以前從未為 Go 專案中的任何儲存庫做出過貢獻的貢獻者。其中一半(22 個)貢獻已經合併。其他許多 CL 正在等待程式碼庫解凍,因為我們正處於 1.9 版本釋出的凍結期。除了 CL 之外,許多人還以錯誤報告、園藝任務和其他型別的貢獻形式為專案做出了貢獻。

最常見的貢獻型別是為文件新增示例函式。Go 使用者調查(Go User survey)指出,我們的文件嚴重缺乏示例。在簡報中,我們要求使用者找到他們喜歡的包並新增一個示例。在 Go 專案中,示例是以 Go 檔案(帶有特定名稱)中的程式碼編寫的,go doc 工具會與文件一起顯示它們。這是完美的首次貢獻,因為它可以在凍結期間合併,對我們的使用者至關重要,並且是範圍相對較窄的新增。

新增的示例之一是建立 Stringer,這是 Go 中使用最廣泛的介面之一。CL 49270

除了示例之外,許多人還貢獻了關鍵的錯誤修復,包括

有些人甚至透過帶著他們想要修復的錯誤來到現場,讓我們感到驚喜。Nikhita 準備好解決 issue #20786,並且她確實提交了 CL 48871,之後她發推說:

不僅取得了一些了不起的改進,更重要的是,我們縮小了 Go 核心團隊與更廣泛社群成員之間的差距。Go 團隊的許多人都表示,社群成員教會了他們關於 Go 專案的一些東西。社群中的人們(親自或在 Twitter 上)表示,他們感到歡迎參與該專案。

未來

本次活動取得了超出我們預期的成功。Go 團隊經理 Sameer Ajmani 表示:“貢獻者研討會對 Go 團隊來說非常有趣且富有教育意義。我們看到使用者在使用我們的流程時遇到了困難,並在他們在儀表板上取得進展時歡呼。當小組分數達到 1000 時,全場的歡呼聲非常棒。”

我們正在研究如何使本次研討會更容易在未來的活動(如見面會和會議)中舉辦。我們最大的挑戰是提供足夠的指導,讓使用者感到受到支援。如果您有任何想法或想在此過程中提供幫助,請告知我

我已邀請幾位活動參與者分享他們的體驗,如下文所示。

我的貢獻體驗

作者:Cassandra

當我聽說 go-contrib 研討會時,我非常興奮,然後感到非常畏懼。我被 Go 團隊的一名成員鼓勵參加,所以我想“有什麼大不了的”。

當我走進房間時(老實說,我差點跑進房間,因為我遲到了),我很高興看到房間裡擠滿了人。我環顧四周尋找戴著 Gopher 帽的人,那是他們是老師的主要標誌。我坐到 16 張圓桌中的一張,上面有兩頂帽子和三頂沒帽子。開啟我的螢幕,準備開始……

Jess Frazelle 起身開始演示,並向大家提供了連結,方便大家跟隨。

低語聲從深沉的潛流變成了響亮的旋律,人們正在設定 Go 環境,他們跳到前面確保 GOPATH 設定正確,並且……等等,Gerrit 是什麼?

我們大多數人都需要對 Gerrit 有一點介紹。我不知道它是什麼,但幸運的是,有一張很有用的幻燈片。Jess 解釋說,它是 GitHub 的一個替代品,具有更高階的程式碼審查工具。然後我們學習了 GitHub 和 Gerrit 的術語,以便更好地理解過程。

好的,現在是成為一名**該死的 Go 貢獻者**的時候了。

為了讓這次體驗比已經很令人興奮的更刺激,Go 團隊設定了一個遊戲,我們可以根據 Gerrit 的評分系統集體跟蹤我們能獲得多少分數。

看到自己的名字出現在記分板上,並聽到大家的興奮之情是令人陶醉的。它還喚起了一種團隊合作感,帶來了一種歸屬感,讓我們覺得自己是 Go 社群真正的一份子。

在 6 個步驟中,房間裡的約 80 人在不到一個小時的時間裡學會了如何為 Go 做出貢獻。這是一項壯舉!

它不像我預期的那麼難,對於完全的新手來說也並非超出範圍。它以一種積極而有形的方式培養了社群感,同時也讓我們感覺到被納入了 Go 貢獻的輝煌過程。

我個人想感謝 Go 團隊、戴著帽子的 Gopher 導師以及我的 fellow 參與者,讓他們成為我在 GopherCon 最難忘的時刻之一。

我的貢獻體驗

作者:Matt

我一直覺得程式語言很嚇人。正是程式碼使世界能夠編寫程式碼。考慮到其影響力,肯定有比我更聰明的人在從事這項工作……但這種恐懼是需要克服的。因此,當有機會參加一個為我最喜歡的程式語言做出貢獻的研討會時,我很高興能看到我能如何提供幫助。一個月後,我現在確信任何人(和每個人)都可以(也應該)為 Go 做貢獻。

以下是我從 0 到 2 次為 Go 做出貢獻的非常詳細的步驟。

設定

鑑於 Go 使用 Gerrit,我開始為它設定我的環境。Jess Frazzelle 的指南是一個很好的起點,可以確保不遺漏任何步驟。

真正的樂趣從克隆 Go 儲存庫開始。諷刺的是,您不會在 $GOPATH 下進行 Go 開發,所以我將其放在我的另一個工作區(即 ~/Develop)。

cd $DEV # That's my source code folder outside of $GOPATH
git clone --depth 1 https://go.googlesource.com/go

然後安裝方便的輔助工具 go-contrib-init

go get -u golang.org/x/tools/cmd/go-contrib-init

現在您可以從上面克隆的 go/ 資料夾執行 go-contrib-init,看看我們是否準備好做出貢獻。但如果您正在跟進,請等等,您還沒有準備好。

接下來,安裝 codereview,以便您可以參與 Gerrit 程式碼審查。

go get -u golang.org/x/review/git-codereview

此包包含 git changegit mail,它們將分別替換您正常的 git commitgit push 工作流程。

好的,安裝已完成。現在在此處設定您的Gerrit 帳戶,然後簽署適合您的 CLA(我為所有 Google 專案簽署了個人 CLA,但請選擇適合您的選項。您可以在 cla.developers.google.com/clas 檢視您簽署的所有 CLA)。

搞定!您已經準備就緒(可以出發)!但要為哪裡做出貢獻呢?

Contributing

在研討會上,他們將我們引導到 scratch 儲存庫,這是一個可以隨意試驗以掌握工作流程的安全地方。

cd $(go env GOPATH)/src/golang.org/x
git clone --depth 1 [[https://go.googlesource.com/scratch][go.googlesource.com/scratch]]

第一站是 cd 進入並執行 go-contrib-init,以確保您已準備好做出貢獻。

go-contrib-init
All good. Happy hacking!

從那裡,我建立了一個以我的 GitHub 帳戶命名的資料夾,運行了 git add -u,然後試用了 git change。它有一個跟蹤您工作的雜湊值,這是您不應更改的一行。除此之外,它感覺就像 git commit。一旦我讓提交訊息匹配 package: description(描述以小寫字母開頭)的格式,我就使用 git mail 將其傳送到 Gerrit。

此時有兩個要點:git change 也像 git commit --amend 一樣工作,所以如果您需要更新您的補丁,您可以 add 然後 change,它們將連結到同一個補丁。其次,您始終可以從個人 Gerrit 儀表板檢視您的補丁。

經過幾次往返,我正式為 Go 做出了一項貢獻!如果 Jaana 說得對,這可能是第一個包含表情符號的貢獻 ✌️。

真正地貢獻

scratch 儲存庫很有趣,但是有很多方法可以深入 Go 的包並回饋。此時,我瀏覽了許多可用的包,看看有什麼可用且對我來說很有趣。所謂“瀏覽”,我是指嘗試找到一個包列表,然後檢視原始碼,看看 go/src/ 資料夾下有什麼。

我決定看看我在 regexp 包中能做什麼,也許是出於對 regex 的熱愛和恐懼。在這裡,我切換到了該包的網站檢視(要知道,每個標準包都可以在 https://godoc.org/$PACKAGENAME) 找到)。在那裡我注意到 QuoteMeta 缺少與其他函式相同的詳細示例(而且我可以使用 Gerrit 的練習)。

我開始檢視 go/src/regexp 來查詢新增示例的位置,但我很快就迷失了。幸運的是,Francesc那天就在那裡。他向我介紹了所有示例實際上都是在 example_test.go 檔案中的內聯測試。它們遵循測試用例格式,然後是註釋掉的“Output”以及測試的答案。例如:

func ExampleRegexp_FindString() {
    re := regexp.MustCompile("fo.?")
    fmt.Printf("%q\n", re.FindString("seafood"))
    fmt.Printf("%q\n", re.FindString("meat"))
    // Output:
    // "foo"
    // ""
}

很酷,對吧?我跟著 Francesc 的腳步,添加了一個名為 ExampleQuoteMeta 的函式,並添加了一些我認為有用的函式。從那裡開始,只需 git changegit mail 到 Gerrit!

我不得不說,Steve Francia 挑戰我“找到一個不是開放性問題並修復它”,所以我在這份補丁中包含了一些對 QuoteMeta 的文件更改。考慮到額外的範圍,它可能需要更長時間才能開啟,但我認為這值得。

我聽到您的問題了:我是如何驗證它是否有效的?說實話,這並不容易。執行 go test example_test.go -run QuoteMeta -v 無效,因為我們正在處理 $GOPATH 之外的檔案。我很難弄清楚,直到 Kale Blakenship 寫了這篇關於 Go 測試的精彩文章。以後請收藏這篇文章。

您可以在此處檢視我完成的貢獻。我希望您也能看到,很容易就能融入貢獻的流程。如果您和我一樣,您會擅長找到小的拼寫錯誤或文件中缺失的示例,以便開始熟悉 git codereview 工作流程。之後,您就可以找到一個開放性問題,最好是標記為即將釋出的版本,然後嘗試解決它。無論您選擇做什麼,都一定要繼續前進並去做。Go 團隊向我證明了他們多麼關心幫助我們所有人做出貢獻。我迫不及待地等待我的下一個 git mail

我的指導體驗

作者:Dmitri

我一直很期待作為導師參加貢獻者研討會。我對這次活動寄予厚望,並在它開始之前就認為這是一個很棒的主意。

我第一次為 Go 做出貢獻是在 2014 年 5 月 10 日。我記得從我想貢獻的那一刻起,直到我實際傳送我的第一個 CL,大約花了四個月時間。花了這麼長時間才建立起勇氣並全力投入去弄清楚這個過程。當時我是一名經驗豐富的軟體工程師。儘管如此,Go 的貢獻過程仍然感覺很陌生——與我當時熟悉的所有其他過程都不同——因此似乎令人生畏。但是,它有很好的文件記錄,所以我知道這只是找到時間,坐下來,然後去做的問題。“未知”因素阻止了我嘗試。

幾個月過去了,我想“受夠了”,並決定將一個即將到來的週末的一整天都用於弄清楚這個過程。我把整個星期六都用於做一件事:將我的第一個 CL 傳送到 Go。我打開了貢獻指南,並從頭開始遵循所有步驟。不到一個小時,我就完成了。我發出了我的第一個 CL。我既敬畏又震驚。敬畏是因為我終於為 Go 貢獻了一份力量,而且它被接受了!震驚是因為,為什麼我等了這麼久才最終去做這件事?遵循貢獻指南中的步驟非常簡單,整個過程都進行得很順利。如果有人告訴我,我會在一個小時內完成,而且一切都會順利,我早就去做了!

這就引出了這次活動,以及為什麼我認為它是一個好主意。對於任何曾經想為 Go 做出貢獻,但又對不熟悉且看似冗長的過程感到畏懼(就像我那四個月那樣)的人來說,這就是他們的機會!參加活動不僅可以輕鬆地投入其中,還可以獲得 Go 團隊和樂於助人的志願者導師的幫助。

儘管我對活動已經抱有很高的期望,但我的期望還是得到了超額滿足。首先,Go 團隊準備得非常充分,並投入了大量精力使活動對每個人來說都更加愉快。有一個非常有趣的簡報,簡要介紹了所有貢獻步驟。為活動製作了一個儀表板,其中每個人的成功完成的步驟都將獲得積分,計入全球總分。這使其成為一個非常協作和社交化的活動!最後,也是最重要的,後臺有 Brad Fitzpatrick 這樣的 Go 團隊成員,他們及時幫助審查 CL!這意味著提交的 CL 得到了快速的審查,並有可行的後續步驟,以便每個人都能繼續前進並學到更多。

我原本預計這次活動會有點沉悶,因為貢獻步驟非常簡單易懂。然而,我發現情況並非總是如此,我能夠利用我在 Go 方面的專業知識來幫助那些卡在各種意想不到的地方的人。事實證明,現實世界充滿了邊緣情況。例如,有人有兩個 git 電子郵件,一個是個人郵箱,另一個是工作郵箱。工作郵箱的 CLA 簽署出現了延遲,因此他們嘗試改用個人郵箱。這意味著每個提交都必須進行修改才能使用正確的電子郵件,這是工具沒有考慮到的。(幸運的是,貢獻指南中有一個故障排除部分涵蓋了這個問題!)有些人遇到了其他微妙的錯誤或環境配置問題,因為安裝多個 Go 版本有點不尋常。有時,必須顯式設定 GOROOT 環境變數,臨時設定,以便 godoc 顯示標準庫中的更改。(我開玩笑地回頭看 Dave Cheney,一邊說出這些話。)

總的來說,我監督了幾位新的 Gophers 首次為 Go 做出貢獻。他們傳送了 CL,響應了審查反饋,進行了編輯,進行了迭代,直到每個人都滿意,並最終看到了他們的第一個 Go 貢獻被合併到 master!看到他們臉上的幸福感非常有回報,因為做出第一次貢獻的喜悅是我自己也能體會到的。能夠幫助他們,並解釋他們有時遇到的棘手情況,這也很好。據我所知,許多快樂的 Gophers 離開了活動,包括我自己!

活動照片

照片由 Sameer Ajmani & Steve Francia 拍攝

下一篇文章:Go 1.9 釋出
上一篇文章:貢獻者峰會
部落格索引