Go 部落格
貢獻者工坊
活動概覽
作者: Steve
在 GopherCon 的社群日期間,Go 團隊舉辦了兩次工坊,與大家一起工作,幫助他們向 Go 專案提交首次貢獻。這是 Go 專案首次嘗試此類活動。我們有大約 140 名參與者和大約 35 名志願者擔任導師。導師不僅因幫助他人而感到溫暖和欣慰,還獲得了一頂非常時尚的 Go 導師卡車帽。我們有來自北美和南美、非洲、歐洲、亞洲和澳大利亞的各個年齡段和經驗水平的貢獻者。這確實是世界各地的 Gophers 在 GopherCon 齊聚一堂的全球性努力。
舉辦此次工坊的原因之一是希望它成為一種推動力,促使我們改進貢獻者體驗。為了準備工坊,我們重寫了貢獻者指南,包括增加了“故障排除”部分,並構建了一個工具 go-contrib-init
,該工具自動化了設定能夠為 Go 貢獻的開發環境的過程。
對於工坊本身,我們開發了一個簡報 “Contributing to Go”,以及一個在活動期間展示的儀表板/記分板。記分板旨在鼓勵大家共同努力,朝著提高集體得分的共同目標前進。參與者在執行註冊賬戶、建立變更列表(也稱為 CL,類似於 pull request)、修改 CL 或提交 CL 等操作時,會為總得分增加 1、2 或 3 分。

Brad Fitzpatrick 今年沒有參加 GopherCon,但他隨時準備並等待審查所有提交的 CL。他審查得如此之快,以至於許多人認為他是一個自動化機器人。在我們團隊內部,現在都稱他為“BradBot”,主要是因為我們既敬畏又有點嫉妒。


影響
參加工坊的人員總共提交了 65 個 CL(在工坊結束一週內)。其中,有 44 個來自此前從未對 Go 專案中任何倉庫貢獻過的貢獻者。這些貢獻中有一半(22 個)已經合併。許多其他的正在等待程式碼庫解凍,因為我們正處於即將釋出的 1.9 版本的凍結期。除了 CL 外,許多人還透過 bug 報告、程式碼維護任務 以及其他型別的貢獻為專案做出了貢獻。
最常見的貢獻型別是用於文件中的示例函式。Go 使用者調查發現我們的文件顯著缺乏示例。在演示中,我們要求使用者找到他們喜歡的包並新增示例。在 Go 專案中,示例以 Go 檔案中的程式碼形式編寫(具有特定的命名),並且 go doc
工具會將它們與文件一起顯示。這是一個完美的首次貢獻,因為它可以在凍結期間合併,對我們的使用者至關重要,而且它的範圍相對較窄。
新增的示例之一是關於建立 Stringer,它是 Go 中更廣泛使用的介面之一。CL 49270
除了示例之外,許多人還貢獻了關鍵的 bug 修復,包括
有些人甚至讓我們感到驚訝,他們是帶著想要修復的 bug 來的。Nikhita 到場時已經準備好解決 issue #20786,她確實提交了 CL 48871,之後她在 Twitter 上發文說

不僅做出了一些重大的改進,更重要的是,我們縮小了核心 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 導師以及我的各位夥伴,是他們讓這成為了我在 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 change
和 git mail
,它們將分別取代你通常的 git commit
和 git push
工作流程。
好了,安裝過程已經完成。現在在這裡設定你的 Gerrit 賬戶,然後簽署適合你的 CLA(貢獻者許可協議)(我簽署了一份適用於所有 Google 專案的個人 CLA,但請選擇適合你的選項。你可以在 cla.developers.google.com/clas 檢視所有已簽署的 CLA)。
搞定。你已經準備就緒了 (隨時可以開始了)!但是往哪裡貢獻呢?
貢獻
在工坊中,他們讓我們進入 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 說得沒錯,這可能是第一個包含 emoji 的貢獻 ✌️。


真正開始貢獻
練習倉庫很有趣,但這只是小試牛刀,有很多深入 Go 包並回饋專案的方式。這時我開始四處檢視各種可用的包,看看有什麼我感興趣的。所謂“四處檢視”,我的意思是嘗試找到包列表,然後到我的原始碼目錄下看看 go/src/
資料夾裡有什麼

我決定看看我能在 regexp
包裡做些什麼,也許是出於對正則表示式的愛與懼。這時我切換到網站上的包檢視(很高興知道每個標準包都可以在 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 change
和 git mail
傳送給 Gerrit!
我必須說,Steve Francia 挑戰我“找一個不是公開 issue 的問題並修復它”,所以我將一些 QuoteMeta
的文件修改包含在了我的補丁中。考慮到範圍擴大,這個補丁會開放更長時間,但我認為這很值得。
我彷彿已經聽到你的問題了:我怎麼驗證它是否有效?老實說,這並不容易。執行 go test example_test.go -run QuoteMeta -v
是行不通的,因為我們在 $GOPATH 之外工作。我一直努力摸索,直到 Kale Blakenship 寫了一篇關於 Go 中測試的精彩文章 才搞明白。請把這篇文章收藏起來,以後會用到。
你可以在這裡看到我的完整貢獻。我還希望你看到的是,進入貢獻流程是多麼簡單。如果你像我一樣,你可能會擅長在文件中找到小的拼寫錯誤或缺失的示例,以此來熟悉 git codereview
工作流程。之後,你就可以著手解決一個公開的 issue,最好是標記為即將釋出版本的 issue,然後嘗試解決它。無論你選擇做什麼,一定要去嘗試。Go 團隊向我證明了他們是多麼關心幫助我們所有人回饋社群。我迫不及待地想進行下一次 git mail
了。
我的導師經歷
作者: Dmitri
我一直很期待作為導師參加貢獻者工坊活動。我對這次活動抱有很高的期望,並且在活動開始前就認為這是一個很棒的主意。
我在 2014 年 5 月 10 日提交了我的首次 Go 貢獻。我記得從我想要貢獻的那一刻起,到我真正傳送我的第一個 CL,大約花了四個月。建立勇氣並全身心投入去摸索這個過程花了我這麼長時間。那時我是一名經驗豐富的軟體工程師。儘管如此,Go 的貢獻過程感覺很陌生——與我熟悉的所有其他流程都不同——因此顯得令人生畏。不過它有很好的文件,所以我知道這只是一個找到時間、坐下來去做的問 題。那個“未知”因素讓我遲遲沒有嘗試。
幾個月後,我想“夠了”,決定在即將到來的一個週末裡騰出整整一天來搞清楚這個流程。我把整個週六都留出來做一件事:向 Go 提交我的第一個 CL。我打開了貢獻指南,從頭開始一步步跟著做。不到一個小時,我就完成了。我提交了我的第一個 CL。我既感到敬畏又震驚。敬畏是因為我終於向 Go 提交了貢獻,並且被接受了!震驚是因為,我為什麼等了這麼久才做這件事?按照貢獻指南 中的步驟非常簡單,整個過程進行得非常順利。如果有人早告訴我不到一個小時就能完成,並且不會出錯,我肯定會更早去做!
這就引出了這次活動,以及我為何認為它是個好主意。對於任何曾經想為 Go 做出貢獻,卻被不熟悉且看似漫長的過程嚇退的人(就像我那四個月一樣),這是他們的機會!參加活動不僅可以讓你下定決心去摸索,還有 Go 團隊和樂於助人的志願者導師會在一旁協助你。
儘管我對這次活動已經抱有很高的期望,但實際結果還是超出了我的預期。首先,Go 團隊準備得非常充分,投入了大量精力使活動對每個人來說都更加愉快。有一個非常有趣的演示,快速講解了所有貢獻步驟。還為活動專門製作了一個儀表板,每個人成功完成的步驟都會獲得積分,計入總分。這讓活動變得非常有協作性和社交性!最後,也是最重要的一點,幕後有像 Brad Fitzpatrick 這樣的 Go 團隊成員,他們迅速地幫助審查 CL!這意味著提交的 CL 得到了快速的審查,並給出了可操作的下一步指示,這樣大家都能繼續前進,學到更多。
我原本以為這次活動會有點無聊,因為貢獻的步驟非常簡單易循。然而,我發現並非總是如此,我能夠利用我在 Go 方面的專業知識,幫助那些在各種意想不到的地方卡住的人。事實證明,現實世界充滿了邊緣情況。例如,有人有兩個 git 郵箱,一個個人郵箱,一個工作郵箱。工作郵箱簽署 CLA 時出現了延遲,所以他們嘗試使用個人郵箱代替。這意味著每次提交都必須修改以使用正確的郵箱,這是工具沒有考慮到的。(幸運的是,貢獻指南中有一個故障排除部分涵蓋了這個問題!)還有一些人遇到了其他的細微錯誤或環境配置問題,因為擁有多個 Go 安裝有點不尋常。有時,需要臨時顯式設定 GOROOT 環境變數,以便讓 godoc 顯示正確標準庫中的更改(我說出這些話時,正開玩笑地回頭看看 Dave Cheney 在不在)。
總的來說,我協助了幾位新的 gopher 提交了他們的首次 Go 貢獻。他們傳送了 CL,回覆了審查反饋,進行了修改,反覆迭代直到大家滿意,最終他們的首個 Go 貢獻被合併到了 master 分支!看到他們臉上的快樂,真是非常有成就感,因為做出第一個貢獻的喜悅是我自己也能感同身受的。能夠幫助他們,解釋他們有時遇到的棘手情況,也非常棒。據我所知,許多開心的 gopher 離開了活動現場,包括我自己!
活動照片








攝影:Sameer Ajmani & Steve Francia
下一篇文章:Go 1.9 已釋出
上一篇文章:貢獻者峰會
部落格索引