Go 部落格

貢獻工作坊

Steve Francia、Cassandra Salisbury、Matt Broberg 和 Dmitri Shuralyov
2017 年 8 月 9 日

活動概觀

Steve 提供

在 GopherCon 的社群日間,Go 團隊舉辦了兩個工作坊,協助參與者為 Go 專案提出自己的首次貢獻。這是 Go 專案首次嘗試這樣的活動。我們總計有 140 名參與者和 35 位自願擔任導師的人員。導師們不僅能享受協助他人的成就感,還能獲得設計非常時尚的 Go Mentor 卡車司機帽。來自北美洲和南美洲、非洲、歐洲、亞洲和澳洲的貢獻者不論年齡和經驗,都一同參與了這個活動。這真的是 GopherCon 全球 Gopher 共同努力的成果。

我們開設工作坊的原因之一是,我們希望它能作為強制力,促使我們改善貢獻者體驗。在準備工作坊時,我們重新編寫了我們的貢獻者指南,包括增訂「故障排除」區段,並製作工具「go-contrib-init」,讓程式開發環境的設定過程自動化,進而能對 Go 做出貢獻。

針對工作坊本身,我們開發了一個簡報「貢獻到 Go」,以及在活動期間呈現的儀表板或計分板。計分板的設計目標是,鼓勵我們共同努力,朝提升我們共同成績的目標邁進。當參與者執行註冊帳戶、執行變更清單(也被稱為 CL,類似於合併請求)、修改 CL 或提交 CL 等動作時,他們便可以將 1、2 或 3 分加入總分。

Brad Fitzpatrick 今年並未參加 GopherCon,但他已準備好等著審閱所有提交的 CL。他審閱的速度非常快,以致於許多人都認為他是一個自動化機器人。現在,我們團隊內部稱他為「BradBot」,這大多是因為我們敬畏他,也有一點羨慕嫉妒。

影響力

在工作坊上,總共有 65 個 CL 獲得出席工作坊的參與者提交(在工作坊舉辦後的一週內)。其中,44 個來自於先前未曾經為 Go 專案中的任何存放區做出貢獻的貢獻者。這些貢獻之中有一半(22 個)已經合併。許多其他貢獻正在等待程式碼庫解除凍結狀態,因為我們目前正處於 1.9 版未來的凍結狀態中。除了 CL 之外,還有許多人以回報錯誤、園藝任務和其他類型的貢獻,為專案做出貢獻。

最常見的貢獻類型,是可用於文件中的範例函數。Go 使用者調查指出,我們的文件顯著欠缺範例。在簡報中,我們要求使用者尋找自己喜愛的套件並新增範例。在 Go 專案中,範例是用 Go 檔案中的程式碼撰寫的(有特定的命名方式),而 go doc 工具會在文件旁顯示範例。這是一個完美的第一次貢獻,因為這是可以在凍結期間合併的東西,對我們的使用者而言至關重要,而且是一個範圍相對較窄的附加內容。

新增的範例之一,是建立字串產生器,字串產生器是 Go 中使用較廣泛的介面之一。CL 49270

除了範例之外,還有許多人做出重要的錯誤修正,包括

有些人甚至到了現場,讓我們驚訝的是他們心裡已經有一個想要修正的 bug。Nikhita 準備好要解決 第 20786 號議題,並提交了 CL 48871 ,她後來在推文中寫道

不但有一些很重要的改善,更重要的是,我們縮短了核心 Go 團隊與更廣大的社群成員之間的距離。Go 團隊的許多人都表示,社群成員教會了他們很多關於 Go 專案的事。社群人員(親自參加和在 Twitter 上發言)表示,他們覺得很歡迎他們來參與這個專案。

未來

這次的活動遠遠超出了我們的預期。Go 團隊經理 Sameer Ajmani 表示:「對 Go 團隊而言,本次的貢獻者工作坊不僅非常有趣,而且極具教育意義。當使用者在我們的流程中遇到難關時,我們感到很不安,而當他們順利通過時,我們則感到非常開心。當小組分數達到 1000 分時,大家歡呼,場面十分振奮。」

我們正在尋求方法,讓未來活動(例如見面會和研討會)能夠更輕鬆地舉辦這個工作坊。我們最大的挑戰是提供充足的指導,讓使用者感到有支持。如果您有任何想法或想要協助這個流程,請 告訴我

我請了幾個活動參加者分享他們的心得,如下所示

我的貢獻經驗

Cassandra 撰寫

當我聽到 go-contrib 工作坊時,我非常興奮,但隨後又感到非常緊張。Go 團隊的成員鼓勵我參與,所以我心想,管他的。

當我走進會議室(說真的,我是衝進會議室,因為我遲到了),我看到會議室裡座無虛席,感到很開心。我在尋找戴著地鼠帽的參加者,因為這是我認出指導員的主要特徵。我坐在 16 張圓桌中的一張,那張桌子上有 2 頂帽子,有 3 人沒有戴帽子。我打開電腦,準備開始…

Jess Frazelle 站起來開始簡報,並提供 連結 給小組,讓大家能夠輕鬆地跟進。

竊竊私語聲從低沉的暗流變成響亮的聲浪,大家都在設定他們的電腦使用 Go,他們跳過某些步驟,確認他們的 GOPATH 已設定好,並且…等等,Gerrit 是什麼?

我們大多數都需要稍微了解 Gerrit。我完全不知道那是什麼,但很幸運地,有一張投影片派上了用場。Jess 解釋說,它是 GitHub 的替代方案,進階的程式碼檢閱工具稍多一些。我們接下來探討了 GitHub 和 Geritt 的術語,以便更了解這個流程。

好的,現在是時候成為一個 他媽的 Go 貢獻者 了。

為了讓這件事變得更加令人興奮,Go 團隊設立了一場遊戲,讓我們可以根據 Gerrit 評分系統追蹤我們獲得多少點數。

看到你的名子出現在排行榜上,聽著大家的興奮之情,這令人陶醉。它還促成了一種團隊合作精神,帶來包容感,並讓你真切感受到自己是 Go 社群的一份子。

在 6 個步驟中,一間約有 80 人的房間得以在 1 小時內學會如何為 go 做貢獻。這是項了不起的成就!

這一點也不像我預期的那麼困難,對於一個完全的新手來說,這並不超出能力範圍。它以一種積極而具體的方式促進了社群感,以及在顯赫的 Go 貢獻過程中產生的包容感。

我個人要感謝 Go 團隊、戴帽子的 Gopher 指導員,以及我的夥伴,因為他們讓這成為我在 GopherCon 最難忘的時刻之一。

我的貢獻經驗

作者:Matt

我總是覺得程式語言令人畏懼。它是讓世界得以編寫程式碼的程式碼。鑑於其影響力,應該是由比我更聰明的人來從事這項工作才對……但這種恐懼是可以克服的。因此,當我有機會加入一個工作坊,為我最愛的程式語言做出貢獻時,我十分期待能看出自己可以如何提供協助。一個月後,我現在確信,任何人和所有人(都可以而且)應該為 Go 做出貢獻。

以下是我的冗長步驟,從 0 個 Go 貢獻增加到 2 個

設定

鑑於 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)。

而且 BAM。你可以開始進行了(前往)!但要貢獻到何處?

貢獻

在工作坊中,他們將我們送到 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 套件中做些什麼,可能是出於對正規表示法的愛與恐懼。以下是切換到 該套件的網站查看方式(需要知道每個標準套件都可以從 https://godoc.org/$PACKAGENAME) 找到)。在其中,我注意到 QuoteMeta 缺少其他函式所具有的相同詳細範例(而且我可以利用 Gerrit 練習)。

我開始檢視 go/src/regexp 來嘗試找出新增範例的放置位置,而且很快地就迷路了。幸運的是,Francesc 那天剛好就在場。他向我說明所有範例其實都是 example_test.go 檔案中的內聯測試。它們遵循測試案例的格式,然後是「輸出」註解以及測試答案。例如

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

我期待以指導者的身份參加「貢獻工作坊」活動。我對這個活動抱有很高的期許,並在活動開始前便認為這是一個好主意。

我在 2014 年 5 月 10 日做出了對 Go 的第一次貢獻。我還記得從想要做出貢獻,到實際發送第一個 CL,中間大概經過了四個月。我花費了很長一段時間來累積勇氣,並下定決心搞清楚這個流程。當時的我已經是一位經驗豐富的軟體工程師。儘管如此,Go 貢獻流程卻讓我感到陌生,它不像我之前熟悉的其他流程,因此看起來令人望而生畏。雖然它有良好的文件說明,所以我知道只要找出時間親自坐下來執行,就一定可以。但是這個「未知」因素讓我猶豫不前。

過幾個月後,我想「夠了」,並決定撥出一個即將到來的週末,來弄清楚這個流程。我預留了星期六一整天,只做一件事:發送我的第一個 Go 編譯列表 (CL)。我打開 貢獻指南,從頭開始進行所有步驟。一小時內,我就完成了。我已發送信件第一個編譯列表。我既敬畏又震驚。敬畏,因為我終於為 Go 貢獻一份力量,而且被接受了!震驚,因為,我為什麼拖了這麼久才終於這麼做?遵循 貢獻指南 中的步驟非常容易,整個過程非常順利。只要有人告訴我,我可以在一小時內完成,而且不會出錯,我就會早點這麼做了!

這讓我想到這個活動,以及我為什麼認為這是一個好主意。對於任何想要為 Go 貢獻,卻對這不熟悉且看似漫長的過程感到畏懼的人來說(就像我那四個月一樣),他們有了機會!不僅可以參加活動來承諾找出問題,而且 Go 團隊和熱心的志工導師會在過程中協助您。

儘管我對這個活動已經有很高的期待,但我的期待還是超出了。首先,Go 團隊準備得很好,並投入很多心力,讓活動對每個人來說更加愉快。有一個非常有趣的簡報,快速介紹了所有貢獻步驟。為這個活動製作了一個儀表板,讓每個人成功完成的步驟都能獲得積分,以計算全球分數。這讓它成為一個非常具有協作性和社會性的活動!最後,也是最重要的,他們在幕後像 Brad Fitzpatrick 等 Go 團隊成員,幫忙迅速檢閱編譯列表!這表示,提交的編譯列表會迅速獲得檢閱,並提供可執行的後續步驟,因此每個人都可以繼續前進並學習更多。

我原先預期這場活動可能會有點沉悶,因為參與步驟非常簡單易懂。然而,我發現事情並非總是如此,我得以運用我在 Go 中的專業知識幫助卡在各種意外狀況中的人們。事實證明,真實世界中充滿了邊界案例。例如,某人有兩個 git 電子郵件,一個是個人的,另一個是工作用的。簽署工作電子郵件的 CLA 延誤了,所以他們試著使用個人的電子郵件代替。這表示必須修正每個 commit 以使用正確的電子郵件,而這是工具沒有考慮到的。(幸運的是,參與指南的疑難排解區涵蓋了這個問題!)還有一些較為細微的錯誤或環境設定錯誤是某些人碰到的問題,因為安裝一個以上的 Go 有點不尋常。有時,必須明確設定 GOROOT 環境變數,暫時讓 godoc 能在正確的標準程式庫中顯示變更(我在說這些話的時候,心裡暗忖著戴夫·切尼會不會在我身後)。

總而言之,我監督了幾位新加入的 Go 使用者完成了他們的第一筆 Go 參與。他們傳送了 CL、回應檢閱意見回饋、編輯、反覆測試直到所有人都滿意,最後看到他們的第一筆 Go 參與與 master 合併!看到他們臉上的喜悅真是非常有成就感,因為做出第一筆參與的喜悅是我也可以感同身受的。能幫助他們,並解釋他們有時會碰到的棘手情況,我也感到非常榮幸。據我所知,許多快樂的 Go 使用者離開了這場活動,包括我在內!

活動照片

照片提供:Sameer Ajmani 及 Steve Francia

下一篇文章:Go 1.9 已釋出
上一篇文章:參與者高峰會
部落格索引