謝孟軍:開源如何影響程序員?

斯達克學院合力知乎 Live 為程序員策劃的知識分享課「 StuQ 公開課 」首場分享。Apple 核心系統高級工程師 Asta 謝(謝孟軍)就《開源如何影響程序員》這一主題,結合自身經歷、從開源中得到的自我提升,詳細闡述了自己對開源的理解,如何在國內做開源,併成為 github 上 Go 語言領域中國排名第一,以及如何同國內外開源者一起參與開源的過程。本文為 Live 分享文字稿整理。

什麼是開源?

我們都喜歡開源,在國內一提到開源也都認為是好事情。但到底什麼是開源,也許大部分人對開源理念都不夠清晰。

國內多數軟件公司或開發者對於開源的熱情,僅僅侷限以下兩方面:免費的代碼;深入參與的開源活動。對開源,我們用的多,貢獻少。國內發起的有一定影響力的開源項目,也是鳳毛麟角。好的現象是貌似 Apache 基金會上,逐漸能見到很多國內公司貢獻的代碼,成為頂級項目。

我曾聽過自由軟件精神領袖理查德 · 馬修 · 斯托曼(Richard Matthew Stallman)的演講,演講中他特別強調 “Free is not free”,對這句話我的個人解釋是 “自由,而不是免費”。free 開源是自由,但不等於免費。開源是一種商業行為。試想一下,我們平日用谷歌百度做搜索,表面是免費,背後隱藏的是商業廣告給他們帶來的巨大利潤。我們在盡情享用那些開源的免費大餐時,已然完全忘記開源的真正力量——開源是自由的,但不是免費的。

除此之外,對開源定義的理解,也可以借用先魯迅先生所說的 “拿來主義”。把資本主義的資源拿來,給我們社會主義用。而拿來主義並非是不好的,原因是隻有當你去用了這個產品,你才能去了解開源,瞭解他開源的產品到底是什麼樣的。live 開始前,一個同學問我怎樣參與到一個開源項目之中。我的回答是,先拿來主義,把一個開源項目拿過來,自己先用起來。事實上這個觀點可能和多數人不同。多數人的感覺是開源就需要貢獻進去,需要付出。直白地說,拿來主義是第一步。不使用又如何參與?

但拿來主義並非一概而論。 只做個 “hello word”,寫一個 demo,就半途而廢說這個東西不過如此,這樣的態度是無法真正參與進去。真正貢獻一個開源產品,需要做到以下幾點:

  1. 理解一個開源產品的應用場景是什麼;
  2. 想明白當初這個作者為什麼會設計它,設計這個產品當初是為了解決哪一些問題;
  3. 原作者解決的這些場景問題,是否符合我的場景問題?
  4. 基於 [3] 的判斷,如果你們處在同樣的場景同樣的問題。才可以使用“拿來主義”。應用也不是淺嘗輒止,要進行深入研究。至少做到把他們的文檔讀一遍。
  5. 使用之後發現一些功能不能滿足自己的需求,此時你可以說,這個開源有缺失,再貢獻進去自己的代碼。把這個功能完善。

以上是我認為的開源的使用方式和路徑,很多開源項目也都是這樣發展起來的。

我認為的理想開源,及國內現狀

首先,開放的源代碼。很多國內開源項目,也僅實現了這第一步。比如,公司開源某項目的源代碼,直接扔到 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 或者 facebook 的群組去宣傳。當大家看到這個東西,是我們想要的,那麼一切自然行雲流水了。

最後,就是我們要去找到目標人群。時間長了,還是會積累起來一部分用戶。這一部分用戶就是我們所說的目標用戶。看看這批用戶,他們的分級。有開發者,有 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發展的主要推動者之一。

謝孟軍:開源如何影響程序員?

i4CN(工業4.0中國-簡稱)www.i4cn.com,是中國最系統化、最全面的華為IPD、ISC+體系,以及工業4.0、工業互聯網、智能製造領域的第三方諮詢公司。

謝孟軍:開源如何影響程序員?


分享到:


相關文章: