GitHub 與社會化編程
[核心提示] 社會化的浪潮正席卷整個互聯網,在軟件開發領域也是如此。社會化是如何改變傳統軟件開發的?同時,版本控制的理念與開源的精神正通過 GitHub 這樣的社會化平臺向更多的行業擴展,其未來的影響將不僅僅局限在開發領域。
I want to live in a world where it’s easier to work together than to work alone… where every part of the software development process is a joy, And I think GitHub can help make that happen.
在我理想的世界里,協同工作將比獨立工作簡單的多。在那個世界中,軟件開發會是一個充滿欣喜的過程,我認為 GitHub 正在推進這一愿景的實現。
— GitHub CEO Wanstrath
最近 GitHub 因為兩件事成為了媒體的焦點,其一是 Wired 的一篇關于 Github 的文章以 Github 上的 Repository 的形式進行了發行,這讓人對 GitHub 未來更廣泛的應用充滿了期待。其二是一名俄羅斯黑客通過 Ruby on Rail 的漏洞獲得了 GitHub 的頂級權限,可以對進入的項目進行隨意的操作甚至徹底清空,這在開發者界造成了一場大恐慌,GitHub 的流行度也可見一斑。
作為一個非程序員的我,第一次開始接觸到 GitHub 與版本控制的概念大概是在 1 年多以前。那會兒我正熱衷于研究 Firefox 插件 Pentadactyl 的各種設置,而網上能找到的眾多插件和配置文件大都托管在一個名為 GitHub 的網站上。為了能夠跟蹤最新的插件更新,我關注了眾多 GitHub 上的項目和開發者,為了管理方便,我開始學著將自己的插件和配置文件放到這個平臺上。這不僅為我的配置文件在云端免費進行了備份,同時需要的時候我還能夠 方便的回滾到過去某個時間的某段配置代碼。經歷過幾次數據丟失慘劇的我當時的想法是:“如果早知道這個網站該多好。”我當時認識到的,僅僅是 GitHub 的冰山一角…
GitHub - 不僅僅是版本控制
版本控制這個概念本身對于程序員來 說并不新鮮,從 1982 年的 RCS,到 CVS、SVN,再到現在流行的 Git、Mercurial 等,但凡有規模的軟件項目都會采用某種版本控制系統來追蹤文件的變化、處理軟件分支、避免版本混亂。只要擁有一臺主機,任何人都能很容易的搭建自己的版本 控制服務器。如果僅僅是提供一個支持版本控制的代碼托管服務的話,那么其本身并無任何特色可言,但 GitHub 并不局限于此。
GitHub 的理念非常簡單:社會化編程。像 推ter 一樣,每個人都可以在 GitHub 上發布自己的各種代碼,以時間流的形式展現自己的開發進展,可以關注自己感興趣的項目和開發者,發表評論,了解其最新的開發動態。但所謂的社會化,還不僅 僅局限于此,GitHub 最重要的特征是以一種社交化、民主化的形式進行代碼協作。
GitHub 的社會化編程理念可以說將開源的概念發揮到了極致:由于采用了 Git 這種分布式版本控制系統,所有人都可以對任意一個公共項目簡單的進行分支開發,而不會對原項目有任何的影響;可以將自己對于項目的功能改進、漏洞修復、或有價值的代碼提交給原開發者,一起對項目進行完善。
項目的派生(Fork)和拉拽請求(Pull Request)構成了 GitHub 最獨具一格的工作模式,對提交代碼的逐行評注及 Pull Request 構成了 GitHub 特色的代碼審核。
GitHub 擁有一個非常鼓勵合作的社區氛圍。這一方面源于 GitHub 的付費模式:私有項目需要付費,而公共項目完全免費。這意味著 GitHub 上的大多數項目都是開源的,任何用戶都有海量的開源項目選擇可用來分支學習和貢獻代碼。GitHub 的項目關注、開發者關注、@回復、個人頁面的工作項目信息等社交功能可謂完全為開源項目量身打造,大大的促進了用戶之間代碼的交流,非常適合于開源項目的 溝通和管理。一個意外的發現是,在很多程序員的簡歷上,GitHub 的個人頁面也已經成為了其一個重要的技能標志,這也鼓勵了更多的人積極的加入 GitHub 的開源項目中。
對于大多數開源協作項目來說,這無疑是發揮大眾認知盈余的 最好工具。從 Ruby on Rail 框架、Linux 內核、jQuery 腳本、Homebrew 包管理系統、Bootstrap CSS 框架,在眾多明星項目的吸引力作用下, GitHub 已經成為最為活躍的開源社區,就連 推ter、非死book 等公司也選擇了 GitHub 作為其開源項目的首選平臺。
社會化如何改變編程
The power of GitHub I believe is that it allows programmers to share their work with their colleagues, learn from others, and work together with others.
GitHub 的最大優勢在于程序員可以與他人分享各自的項目,彼此互相學習,并協同合作。
這段對于 GitHub 最大優勢的描述在我看來正好總結了社會化對軟件編程帶來的最大變化。
-
更好的分享已有的代碼和算法:
很多時候,我們并不需要從頭去重建一套問題的算法,開放的社會化網絡為我們尋求現有的解決方案提供了一個極佳的發現渠道。像 jQuery、PhoneGap、Appcelerator’s Titanium 等這樣的框架為 Web、App 開發帶來了無比的便利,而它們就是從 GitHub 這樣的社會化平臺上成長起來的。
-
為開發者提供一個最好的成長平臺:
像所有成功的社交網絡一樣,GitHub 上早期聚集的眾多優秀的項目產生了一種網絡效應,吸引到更多的項目加入 GitHub 中來。對于入門者來說,這是一個最好的提高自己技能的平臺。GitHub 的開放、社會化屬性讓用戶傾向于關注更多的項目、查看更多的代碼,看到一個優秀項目是如何一步步成熟的,而這正是開發者成長中相當重要的一個環節:查看優 秀的代碼,學習其他開發者如何解決特定的問題,了解一個項目該如何擴展。
就像一本好書一樣,查看其他開發者如何解決某個問題的代碼可以給我們帶來很多啟示,為我們提供很多我們也許都沒有意識到的解決方案。GitHub 這樣的社會化編程平臺能夠不斷為我們帶來驚喜。
-
民主化的代碼分支與派生:
在傳統的開源項目中,對代碼進行分支并不是一件得到鼓勵的事,Linux、Unix、Android 都是分支過多造成系統分裂的典型例子。在很多項目中,要想對項目進行某個分支,必須征得項目管理者的正式同意才能進行。
而在 Git 這樣的分布式版本管理系統中,每個用戶在本地都可以擁有項目的全部代碼和修改歷史,開發者無需任何批準即可實際進行代碼分支開發并 Push 到自己的分支項目中去。如果自己的分支取得了預想的效果,用戶可以將變動的代碼向原始開發者進行提交請求,而原始開發者可以對這一分支的實際效果進行評 估,確定代碼的有效性后合并入主開發線,而不用擔心第三方的無組織分支會對項目本身造成危害(這一過程被成為 Pull Request)。這使 GitHub 上的第三方開發者用戶對修改和分支現有項目的積極性得到了大大的提高。
如果我想增加一個新功能,或者想修改代碼,我會將代碼 Push 到一個新分支,并且新建一個 Pull Requests。如果我的代碼會影響我同事的代碼,或者他們對我的代碼感興趣,或者他們時間充裕的話,他們可以查看我的代碼。這時我們可以將那個分支發 布到其他機器上,調試新功能,如果一切正常的話,就可以將這個分支合并到主分支去。
— GitHub 員工 Zach Holman
社會化編程 - 不僅僅是程序員的福音
對于包括 Linux 創始人 Linus Torvalds 等開發者來說,他們的項目對于代碼的質量要求非常苛刻,在他們看來 GitHub 帶來的更多的是垃圾代碼的劇增,并不具有太大的價值。但對于更多資源有限的開源項目來說,更民主化的社會化開源運動為其帶來的則更多的是優秀程序員的更大 的貢獻。
如果認為 GitHub 這樣的版本控制及社會化平臺僅僅是程序員的福地,那我們又錯了,人們已經開始發掘出 GitHub 能夠用于的其他創造性用途。在本文開始提到的 Wired 雜志于 GitHub 上的實驗文章項目里,讀者可以自由的進行代碼分支、內容更新、翻譯,并把結果向 Wired 進行提交;Scott Chacon 在 GitHub 上托管了一本關于 Git 的書籍 Progit, 在發布的一個月內就開始有分支出現,三年后的現在,這本書已經擁有 647 個分支,被翻譯成 10 種語言,另有 10 種語言的譯本正在進行中。(有趣的是,作者提到這本書一半以上的流量來自于中國,“無數的中國人因為這本書的中文譯本開始學習 Git。而這一切之所以可能,也是因為有人利用 GitHub 的分支提供了本書的中文翻譯。”)
版本控制的理念與開源的精神正意外的通過 GitHub 這樣的社會化編程平臺向更多的行業擴展,其未來的影響必將遠遠超越其起源的開發領域。