Go 部落格
貢獻工作坊
活動概觀
由 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 change
和 git mail
,它們分別會取代你平常的 git commit
和 git 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 change
和 git 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 已釋出
上一篇文章:參與者高峰會
部落格索引