關于開源的思考 開源如何影響程序員?
Apple 核心系統高級工程師 Asta 謝(謝孟軍)就《開源如何影響程序員》這一主題,結合自身經歷、從開源中得到的自我提升,詳細闡述了自己對開源的理解,如何在國內做開源,并成為 GitHub 上 Go 語言領域中國排名第一,以及如何同國內外開源者一起參與開源的過程。
什么是開源?
我們都喜歡開源,在國內一提到開源也都認為是好事情。但到底什么是開源,也許大部分人對開源理念都不夠清晰。
國內多數軟件公司或開發者對于開源的熱情,僅僅局限以下兩方面:免費的代碼;深入參與的開源活動。對開源,我們用的多,貢獻少。國內發起的有一定影響力的開源項目,也是鳳毛麟角。好的現象是貌似 Apache 基金會上,逐漸能見到很多國內公司貢獻的代碼,成為頂級項目。
我曾聽過自由軟件精神領袖理查德 · 馬修 · 斯托曼(Richard Matthew Stallman)的演講,演講中他特別強調 “Free is not free”,對這句話我的個人解釋是 “自由,而不是免費”。free 開源是自由,但不等于免費。開源是一種商業行為。試想一下,我們平日用谷歌百度做搜索,表面是免費,背后隱藏的是商業廣告給他們帶來的巨大利潤。我們在盡情享用那些開源的免費大餐時,已然完全忘記開源的真正力量——開源是自由的,但不是免費的。
除此之外,對開源定義的理解,也可以借用先魯迅先生所說的 “拿來主義”。把資本主義的資源拿來,給我們社會主義用。而拿來主義并非是不好的,原因是只有當你去用了這個產品,你才能去了解開源,了解他開源的產品到底是什么樣的。live 開始前,一個同學問我怎樣參與到一個開源項目之中。我的回答是,先拿來主義,把一個開源項目拿過來,自己先用起來。事實上這個觀點可能和多數人不同。多數人的感覺是開源就需要貢獻進去,需要付出。直白地說,拿來主義是第一步。不使用又如何參與?
但拿來主義并非一概而論。 只做個 “hello word”,寫一個 demo,就半途而廢說這個東西不過如此,這樣的態度是無法真正參與進去。真正貢獻一個開源產品,需要做到以下幾點:
-
理解一個開源產品的應用場景是什么;
-
想明白當初這個作者為什么會設計它,設計這個產品當初是為了解決哪一些問題;
-
原作者解決的這些場景問題,是否符合我的場景問題?
-
基于 [3] 的判斷,如果你們處在同樣的場景同樣的問題。才可以使用“拿來主義”。應用也不是淺嘗輒止,要進行深入研究。至少做到把他們的文檔讀一遍。
-
使用之后發現一些功能不能滿足自己的需求,此時你可以說,這個開源有缺失,再貢獻進去自己的代碼。把這個功能完善。
以上是我認為的開源的使用方式和路徑,很多開源項目也都是這樣發展起來的。
我認為的理想開源,及國內現狀
首先,開放的源代碼。很多國內開源項目,也僅實現了這第一步。比如,公司開源某項目的源代碼,直接扔到 github 上,即認為自己開源了。真正的開源,開源源代碼,是最小的一步。
其次,有詳細的文檔。任何一個好的開源項目,都該有一個新手入門、詳細的文檔類東西。國內多數開發者,在這部分同樣做得相對較差。
再次,是一個活躍的社區。國內開發者社區,比如我在國內做 beego 時,使用較多的是 qq 群、微信群。國外使用較多的是 Google Groups , iris , slack。slack 目前也已經建立,Google Groups 回復時間相對較少,通過 github 交流相對較多。在 github 上進行一些開源問題的交流相對較好。
最后,是持續改進。吐槽一個阿里的例子。阿里已經開源了很多項目。但其實一開源后你會感覺,完全是為了一個 KPI。在阿里,想要從 P7 升 P8,P8 升 P9,是需要開源的。開源后才有資格申請等級晉升。如此開源,后續的改進力度上,難免有一定程度的缺失。
綜上,我對開源的理解可能首先是一個社區。如自由軟件精神領袖創始人所說 “free is not free”,影響開源最重要的因素是以怎樣的精神心態去開源。所謂自由,是開發者、測試者、貢獻者、用戶,可以自由使用、自由交流,以及自由離開。這樣的狀態使得所有人都感覺舒適自由,在此程度上舒服地做事,進而有一個好的 idea 去改進。
目前國內開源存在不好的狀態是,一言不合就動口,看到不爽就開罵,開發者做開源,需要用戶的一些吐槽。更好的交流方式是,吐槽諸如某功能如何,哪里做的不好,又如何去改進。而不是去埋怨吐槽這個代碼有多爛。從大學開始做開源直到現在,我碰過各種各樣的人。當然久而久之心態會變得非常好,讀者的負面評論并不會傷及到我的內心。
其次,開源也是一種商業模式。好的現象是現在也有很多成功的開源公司,他們把開源的商業模式做的非常非常成熟。例如 redhat 是開源的操作系統,也要用到商業的支持。MySQL 被 ORacle 收購以后也是這樣。以上兩個例子應該是在商界模式上做開源做的非常好的公司。
云計算領域,做的比較好的如 openstack、docker、kubernetes,開源項目非常成熟,背后的商業模式也已經逐步做起來。尤其 openstack 在私有云領域,已然做的非常完善。前天(1 月 10 日晚),OpenStack 開源云計算企業 EasyStack 宣布完成 5000 萬美元 C 輪融資,這也說明了開源并不表示免費。我們可以去提供很好的商業支持和商業模式去發家致富。OpenResty 和 BigBang 是開源項目。沒有商業運作。
一個好的開源項目,如果要做的更加成功,背后需要有一個更好的商業模式去支持他。因為開源并不等于免費。這是從商業模式角度。思考,開源是一種營銷模式,它使得以往封閉的需要很長周期技術驗證的項目,以開源的方式可以很快進行驗證。
如何做開源?
首先,要有一個能解決問題的 idea。無論是工作,做產品,根本上是怎樣解決別人的某一個痛點。不管這個痛點多大多小。創業也是為了解決某一批的一個痛點。有了能解決問題痛點的東西,才能拿出來說,自己要去創業了,要寫項目了。因而開源的前提,是解決某些人一個痛點的東西。
其次,善用身邊的小工具。很多時候我們身邊的一些小工具,是可以鍛煉出來,做一些開源的東西。例如,我在我開源的一個東西 bat (github.com/astaxie/bat) 下,忘記原來是 java 還是 python 寫的了,有一個叫 httpIE 的命令行工具,開源測試 lastfor 的 api 的。
于是 go 語言,自己重新寫一個。這個就是結合我自己的 beego, 因為里面有很多 api,然后用 bat 測這些 api。后面,我又考慮,用 bat 是不是可以寫一個 desl 的語言。就是我要測的。寫一個 json,然后 request 應該怎么樣。response 應該怎么樣。也就說類似黑盒測試一樣的東西。你只要寫那個我的請求是什么,返回是什么。你用 bat 運行下。是不是就可以測試結果出來了。
這是比較容易入手的。因為你能解決你自己的那些問題,同時大家可能同事之間也好,圈子里面也好。大家平常的時候是怎么去處理這些問題的。然后這個問題,我怎么樣把它做的更好。很多時候,我們都是說,更好。那怎么樣才能更好呢?我們用某一個東西的時候,感覺它不是很好或者不是我想要的東西。我怎么樣讓它變得更好?當你有一個想法的時候,其實,你已經有一個 idea 了。有了一個 idea 時候,怎么樣變得更好。變得更好的過程,其實是已經產生了一個開源項目了。
再次是完善的文檔。開源項目做好之后,你的文檔要跟上。因為只有有了完善的文檔,才能把各方面的人才給聚起來。我現在記得非常清楚的一句話,大學時候,教我電路原理的一個老師,他說過的一句話 “你要記住你做的任何東西,你的用戶都是小白。只有把你的用戶當做小白, 你的文檔才能寫的非常好,每一步才會清晰易懂。每一步處理下來是不是可以行得通?你只有這樣直白的文檔,才能讓最沒有編程技術的人也能看得懂。
這樣的文檔才是好文檔。這樣的話,人家才能看了你的文檔,感覺你這個人好有水平。同時,在寫文檔的時候,也能提升你的技術。如果感覺步驟非常多,就可以思考如何進行簡化?這同時也是一種提升。我們應該思考,我們怎么與社區中的其他人進行很好的交流。后面,我會講到,如果,你做開源做多了,這個能力就自然地上升了。
再然后,就是開始把你的東西推廣到全球,能夠鏈接全世界的開發者交流這個東西。那怎么做到這一步呢?對我們程序員來說,現在是最好的年代。因為我們有了 github,github 是給我們程序員一個交流平臺。因為,很多人說,“Talk is cheap, show me the code.” 把代碼放在那里,文檔也有了。這個時候,github 的星星也就一顆兩顆,沒人來理睬。
這個時候,你需要去一定的圈子里面,做一定的宣傳。現在確實是一個信息爆炸的時代。再好的酒也怕巷子深了。所以,你要去社區里面進行宣傳。比如說 go 語言的開源項目,去 Google 的 Groups 里面去宣傳。或者萊推特瑞或者 prezi 或者 非死book 的群組去宣傳。當大家看到這個東西,是我們想要的,那么一切自然行云流水了。
最后,就是我們要去找到目標人群。時間長了,還是會積累起來一部分用戶。這一部分用戶就是我們所說的目標用戶。看看這批用戶,他們的分級。有開發者,有 CTO, 有架構師。他們都是為了什么,用你的這個東西的。每個人的目的是什么?一整個的過程,又可以促使你項目急速發展。相當于社區反饋的過程。同時,在這整個過程中,我們就可以了解,我們的開源項目是為了解決哪些人的哪些問題。一旦你這個開源項目做成功了,類似 Apache 麒麟、TiDB 這樣。那你就具備了可以創業的資本了。
為什么?因為我們已經找到目標人物了。這些目標人物需要我的支持和我的產品。進一步,他們需要我的產品,也需要商業支持。一開始,會可能項目的維護升級跟不上,可有了商業支持就會不一樣的。付錢了,才會享受更好的服務,才會有一整套的商業模式。對于你的將來來說,你的創業目標也就找到了。
總結 tips:首先我們要找到一個痛點。從小開始做起。如果痛點能夠解決一個問題,那么就把這個問題給解決好。你熟悉哪個語言,你就用這個語言把這個東西給弄出來。弄出來之后,首先自己滿意吧。然后,弄一定的文檔,做一定的宣傳,看大家的反饋,依照反饋持續改進。
如果,有了一定的規模了,是不是可以改進?然后,看可不可以拿出去創業用。實際上,就相當于是建立了一整個社區。你不僅僅是一個開放源代碼的過程。開源實際上是開放源代碼,文檔,貢獻者使用者的交互,然后交流,持續改進。這個才是開源所表達的含義。
我的開源成長之路
我在 Github 上做的一些事
做開源做了好多年。目前的狀況是:在 github 所有的 user 里面,全球排名 16。go 語言領域里面,中國排名第一。世界排名第六,前五位排名均為組織。在 Github(github.com/astaxie)上,我分享了一本書, 一個 beego,一些工具。希望寫一本書。目前在準備一個秘密項目,之后會開源出來。同時也參與了一些其他的開源組織。剛剛說的 TiDB 的開源,也會去改一下代碼,貢獻一下么。貢獻是一個享受的過程。
始于大二的開源生涯
最早做開源,是從大二接觸世界上最好的語言 PHP 著手的。那時候接觸了 PHP3、fleaphp。一直在研究這些東西。機緣巧合的情況下,認識的庫比較多一些,庫積累的多了,就開始用一些框架。那時候,國內有一個框架,叫 fleaphp。與此同時,我參與到了 fleaphp 框架組里面。
同樣用之前提到的方式,如果你要參與一個項目,首先,你就要去用它。大學給別人做兼職做好多個網站。基本都是用 fleaphp 做的。所以對 fleaphp 幾個源碼級別的東西,已經掌握的非常熟練了,也知道哪一些方面可以改進,哪一方面做的不是很好。參與開源先使用,拼命的用它,到崩潰為止。只有把它用到崩潰為止,你才能找到他痛點在哪里。
我做開源 fleaphp 框架時,好像沒有 github,基本上我們就是通過一些 qq 群直接交流。哪一塊代碼不對,要修改一下,然后直接修改了。那時代碼還是托管在 Google 的 code 上,協作也通過它。之后基于此做了很多視頻教程,寫了很多熱門教程。fleaphp 應該怎么去用?現在用的比較多的是 thinkphp。其實 thinkphp 剛開始的時候,抄襲了我們很多的理念。然后,當年 fleaphp,我們沒有繼續做下去,也是因為我們幾個創始人開源方向不一樣,我去了 go 領域,離開 php 界。
這里想分享大家的是,開源是誰主導并不重要,重要的是,你要怎么參與進去。就參與的過程,我給作者提供了一個 PR。然后那個作者把 PR 給 Merge 進去了,然后成了 Contributor,已經貢獻進去了。我覺得我的思路和作者的思路,其實是一樣的,都是在思考修改一個問題,都是為了改進一個東西。
當然,好的作者的話。比如說,你提供一個 PR, 過去有時候,人家會拒絕你。在整個交流過程中,其實,也是可以學到很多東西的。有時候,他為什么會拒絕這個東西?Code Review 的時候,為什么會是這個樣子?我覺得,這才是開源社區的一個氛圍。只有參與進去了,你才能學到更多的東西。
再之后,做過一些邊邊角角的東西,比如寫教程、做視頻教程。再后來,才去思考做一些工具類,怎么樣用一個腳本語言快速去生成一個我要的東西(基于 fleaphp 的),例如自動化生成結構。這些思想會影響我自己做 beego,很多的東西其實都是自動化。怎么樣自動化也是有歷史淵源的。我以前做過這個東西,我知道這個的好處,可以生成我想要的東西。自動化都是為了節省我們的時間嘛。
為了讓代碼自動化,做工具類的嘗試
代碼自動化可以讓我們有更多的時間做更多的事情。這個思想,促進了我做 beego。文檔和工具都是寫 beego 的時候,腦子里立馬生成的東西。如果我沒有參與到 fleaphp 這整個開源過程的話,我不可能說,在做 beego 的時候,是一步而就的。所以說,所有的經歷,就像喬布斯在斯坦福做畢業典禮的時候說的,人生是有各個點串起來的。你之前做某件事的時候,是不經意做的,但是你后面做另一件事的時候,其實你前面已經做了很多的鋪墊。也就說人生的經驗累積到一定的步驟,你就會爆發。所以這也就是一個由量變到質變的過程。
那這之后呢,我就去了盛大云,做 CDN 的開發。那個時候,也只是做一些管理系統(用 PHP 的)。那個時候,認識了老徐,開始接觸一些 go 語言的東西。那個時候,go 語言是 R60 版本,還沒有正式的 release 版本之前。就開始嘗試寫一些 go 語言的東西。為了嘗試用 go 語言去寫呢,因為 php 確實折磨了我好長一段時間。
特別是我加入盛大珈學院之前,我在百事通也是用 php 做我們自己的 TBIB 系統,遇到很多的性能問題。我記得有次熬通宵熬了兩個通宵。為了把那個并發從 300 提高到 400,整個熬了兩個通宵。但是大家想,從 300 到 400,性能呢沒有提升多少,但是你就花了好長時間做這個。每一個小細節都需要花心思去優化。
后來,接觸了 go 語言之后,就感覺,隨便一寫都是 php 的好幾倍。當然,現在 php7 出來之后,也是性能提升了好多。那是你相比于 go 語言,go 語言畢竟是靜態語言,性能還是天生的比較好。就開始接觸了 go 語言,就開始寫我們自己的應用大文件分發系統、調度系統,然后短域名啊,就發現 go 語言寫起來就有一個非常好的好處:就是我只要編譯過后(前提邏輯通暢),跑到線上,性能非常好。
所以那個時候就開始深入的學習 go 語言起來。那個時候,我們組里還有一個小伙子李輝,他是做 C++ 的么,會了解到很多底層的東西。所以很多底層的東西,我會和他交流,在交流當中就開始不斷的學習。也是那個時候,自己每天回家就利用業余的時間,不斷地把我自己學習 go 語言的整個過程來全部寫下來。然后,才有了這個《goWeb 編程》這本書。其實,寫了很長時間的。我估計,那個時候,是第一本有關于 go 語言的第一本書。應該肯定是。
被編輯一句話打動,寫了一本書
這本開源之后呢,大家反饋比較好。然后,出版社就開始聯系我,問我要不要出版?我的理念是,開源嘛,知識是要共享的,是要幫助到其他人的。因為,我剛剛和大家說過,我在做 fleaphp 的時候,做過以及寫過很多的教程,教大家怎么去學習。在寫這個《goWeb 編程》的時候,也是懷著一份讓大家怎么樣更好學習 go 語言的心事編寫的。
當出版社來找我的時候,我就感覺,我又不賺錢,我為什么要出版。然后,我被一句話打動了。他說,其實有些人是熱愛看書的,看書也是知識傳播的一種渠道。我想了想,也對。確實有些人是這樣的。上廁所的時候,可能就是喜歡看書。在不同的場景下,有需求在么,多一個渠道,何樂而不為呢?然后就答應了他們,但是說實在的,出版很復雜。要審稿,審計。要各種英文字正規范。就不符合我這閑慣了的心。
在寫這本的時候,也是在盛大做了好幾個下午。把那些基礎的組件抽取出來之后,在寫書的過程中,在最后兩章,我就思考著,給大家介紹下,怎么教大家寫出一個框架來。所以,才有了 beego 框架的原型。在寫 beego 之前,我用的是 python 的 Tornado。所以 beego 的最初版本就是 Tornado 的 go 實現。大家現在還可以看到保留了那個風格。
我覺得 control 里面對應的就是(萊斯特 for)的 post,get 方法。那后面的就是逐步地增加才有了現在的很多的模塊。當然了,今天我也是打算做 beego 的 2.0 版本。也是經過這么多年,也是積累了一些很多用戶的需求吧。也是打算直接來一個 2.0 版本吧。
開源對技術人的影響
影響一:眼界
我們自己在寫這個東西的時候,就是為了給自己解決事情的。當你把他開源出去,你的眼界就會開拓很多。你想我的用戶群里面,其實他們有各種的需求。這各種各樣的需求哪里來呢?很多情況下,我自己都沒有想到,他們還沒有這么用。然后,我們機會可以一起來改進它。這就是開源社區。他們能夠讓我看得到,我在工作當中遇不到的問題。讓我的眼界放的更闊。設計的時候,項目就可以更 flexible。特別是,像我以前寫的時候,就會猶豫導出還是不導出,都無所謂么。
但是,現在很多時候,我都不大敢導出,因為導出的時候,用戶用了,就會很麻煩。現在就實現最小化導出。思考思考再思考。一旦要導出,就會思考 2 遍,到底需不需要導出,因為后面再撤掉,影響就會比較大。
第二個眼界,就是你把這個項目,放到 github 上面。那 github 上,有全世界各個地方的人。你會接觸到各種各樣的人,90% 的人都是很 nice 的人。他們也很愿意和你交流,愿意得到我們的幫助。或者說,他們的需求是什么樣子的。我覺得他們各種各樣的信息,對我來說都是一個輸入吧。這里面各種各樣的信息,對我也是一個很好地學習方式。
影響二:心態
做開源的時候,剛開始就是從一個年輕小伙子,年輕氣盛。和別人對噴,到后來無所謂。其實,是越來越享受這個開源的過程了。而不是愿意花時間和別人對噴。人家去罵你的時候,你可以欣然接受。ok。也無所謂。你覺得心情不好就罵幾句。實際上,你就講道理的和別人講。如果說那個人是在沒辦法講道理講得通。ok. 那我們就沒必要理睬這樣的人就好了。這個也不是你的用戶群,對吧。你也不應該把你的時間浪費在這些人身上,應該把你的時間花在喜歡你的人以及你的開源項目的人身上。服務好他們,這才是我們應該真正做的事。
影響三:個人提升
這是最多的方面。例如,我寫出來的代碼是不是很好,高質量的代碼。當然是盡量好一點。沒有說,我一寫出來的,就是非常完美的。很多時候,你就回看發現,半年前的代碼,怎么會這么爛呢。因為你個人是在不斷提升,很多時候,他開源代碼都是會選擇做出接近完美的代碼,才會公開。這個也是個人的平衡,就是說做完美了才公布呢,還是小步快跑呢?我個人喜歡小步快跑,趕快實現原型。然后持續的去改進他。因為我想知道,當用戶用了之后,這個東西是不是他們想用的東西。
影響四:溝通能力
你需要去寫文檔們需要去 github 回復,需要去 qq 群、微信群里去溝通交流。那怎么樣,很好的去和用戶溝通交流,把你自己的信息直接通過最短的時間傳遞你最明確的意思。其實這是非常鍛煉人的。到底,怎么樣一個好信息?怎么樣一個直接傳達的方式,這是非常鍛煉一個人溝通能力的。
影響五:team work 團隊精神
你單兵作戰,是可以做一個好項目。但是你持續要有一個團隊是很有必要的。像 beego,有很多人可以維護的,像小黑同學,余雙棋同學,有一個貌似意大利的很牛的。只有你很積極地參與進來,我才會認可你,才會把你納為 contributor,才會是團隊的人。那團隊的人要怎么樣一起工作,怎么樣相互的 review,怎么樣把代碼做好,怎么樣去完善它,協調好各方面。
作者介紹
謝孟軍,Go技術專家,目前就職于Apple,Gopher China 創始人,著名開源框架 beego 開發者,暢銷書《Go Web編程》作者,國內Go發展的主要推動者之一。
來自: InfoQ 公眾號 謝孟軍