清風:豆瓣神組小組長,日式萌神程序員
文:Gracia,攝影:周振邦
導語:本期采訪對象清風, 前豆瓣技術總監。豆瓣以小清新風格,和獨特的工程師文化在國內技術圈獨樹一幟。過去四年半里,清風親身經歷了這家創業公司的高速發展,從 30 多人小團隊,成長為近 500 人的成熟企業。這期間,他主導了一項重要變革:用開源項目運作方式打造出豆瓣內部代碼協作平臺 CODE,推動開發流程成功從 SVN 轉向 Git。版本系統遷移是牽一發而動全身的大工程,涉及圍繞 SVN 的整個生態系統遷移,工程師技能轉型,以及管理流程及文化適應。其難度和工作量巨大,即使是豆瓣這樣極客范兒的公司,也花了兩年時間才完成。
誕生于開源世界的版本控制系統 Git,由 Linux 之父 Linus Torvalds 親自設計和開發,以實現對龐大復雜的 Linux 內核項目的高效管理。這個分布式版本控制系統具有強大的分支管理能力,無須操心數據備份,并能有效避免因代碼的頻繁提交而中斷工作。Git 高效的協作模式帶來開發效率的極大提升,以及團隊成員之間的有效溝通。憑借這些明顯強于 SVN 的特點,Git 迅速在開源界流行開來。
基于 Git 的代碼托管平臺 GitHub 應運而生,不僅有 Eclipse、jQuery、Ruby 在內眾多知名開源項目遷移至 GitHub,并且孕育出 BootStrap、Node.js、PhoneGap、Docker 等大量明星項目。新工具普及帶來生產力解放,開源世界的大門從此敞開,賦予普通人自由使用和修改代碼的權利。協同成本大大降低,任何人都可以 Fork 代碼、創建分支,用 Pull request 方式參與開源項目的貢獻。這場代碼民主化運動,是去中心化的互聯網力量對核心智力生產流程的一次滲透,借助社交化傳播渠道,讓每個優秀創意,都能帶來整個 領域的機會提升。
清風說自己身體里流著創業的血液,凡事喜歡折騰,而且都做得有模有樣:在豆瓣白手起家倒騰出一堆新部門,參與國內最早的比特幣項目,就連玩豆瓣小組,也能玩出一個 30 多萬粉絲的“吃喝玩樂在北京” (什么!真的沒有聽說過!那你玩陌陌嗎?)。在以貼標簽文化著稱的豆瓣,吃喝組組長清風喜歡在自己“白羊座”的標簽之前加上“純潔”這個形容詞,同事的標 簽則是“表面純潔的白羊座”、“萌神”、“卡卡西”。清風是野路子出身的非典型程序員,早在 18 歲那年就見識了互聯網泡沫的瘋狂和幻滅,于是在他典型的白羊座式的萌里,還看得到過盡千帆。
技術人攻略:你在豆瓣工作的時候做了開源代碼協作平臺 CODE,能講講當時做這件事的背景嗎?
2009 年我離開工作了四年半的新浪,想去一家技術范兒特別重的公司,其實心里只有一個目標,就是去豆瓣。作為豆瓣的深度用戶,我非常喜歡這個網站。05 年在 Python User Group 聚會上,聽阿北介紹過豆瓣的技術架構,豆瓣是國內第一家,也是惟一一家大規模用 Python 搭建主體業務的公司,我希望能在 Python 上鉆得更深入。加入豆瓣時,我剛好是它的第 36 名員工。
我在豆瓣待了四年半,眼睜睜看著它從 30 多人變成了 400、500 人的公司(技術團隊超過 300 人)。發展的每一個階段,管理方式都會有相應的變化。在豆瓣的第一年,技術部總共才十來個工程師,當時采用接單式工作法:所有工程師在一個池子里,任何產 品要做新功能,就看哪個工程師有時間,整個管理很輕。
公司接近 100 人規模時,這種方式的弊端出來了,工程師和產品沒有關聯,缺乏歸屬感,溝通效率極低。于是改用產品線管理方式,每條產品線配備一個包括產品、運營、開發和 測試在內的全編制團隊。同時期還誕生了幾個公共部門,如 Anti-Spam、商務支持、公共服務、平臺組和算法組。
組織結構的變化影響著開發流程和工程師文化。歸屬感的問題解決了,但技術的橫向交流變少,時間長了不免出現重復造輪子的問題。
為了解決這個問題,一開始是想辦法把工程師聚到一起,例如豆瓣 Happy Day 活動:每個季度騰出一天工作日,讓所有工程師放下手里的工作,一起來寫代碼。這個活動搞了好幾屆,分了不同的主題,包括類似 ACM 的算法大賽,Hackson 大賽,還攢過一次 3D 打印機。這個活動要求所有人停下工作,成本非常高,缺乏持續性。
后期我們希望用一套流程和工具來幫助工程師溝通。豆瓣的工程師 Geek 范兒很足,發明一套流程他們絕對不會用,于是自然而然想到了 GitHub。GitHub 在開源界廣受歡迎,開源文化也和豆瓣的一貫氣質最為符合。GitHub 嚴格意義上不只是個代碼托管平臺,而是一個程序員社交平臺,它那套機制之所以運轉得好,真正原因是讓工程師實現了順暢的交流。按豆瓣工程師人數 算,Github 企業版的服務一年下來得花 50 萬人民幣,關鍵當時它很不穩定。于是只好下決心自己開發一套,這就有了后來的豆瓣 CODE。
技術人攻略:做豆瓣 CODE 的過程中,最大的困難在什么地方?
從立項到整個開發流程都轉到 CODE 上,前后一共用了兩年。需要完成兩件事,一是搭建一個類似于 GitHub 的代碼平臺,二是把整個開發流程從 SVN 轉到 Git。回想起來,這個過程真不是特別容易。
第一個比較大的困難是沒有人手。我被耿老(耿新躍)和洪教授(洪強寧)趕鴨子上架,做了這個項目的 Leader,但卻是個光桿司令,手下一個專職的人也沒有。2012 年情人節,我寫下了 CODE 的第一行代碼,和洪教授帶著兩個實習生,用了一個星期,基于 Python 開源問題跟蹤系統 Trac 改出了一個 demo。界面巨丑無比,但功能都有了,于是咬著牙開始用。
推廣第一步,先從自己的產品線開始用。我帶的產品線很多,例如 Anti-Spam,商務開發、東西產品線,另外洪教授的平臺組也在用。當時的做法是邊做邊遷移,邊加功能,完全是配合著需求,邊走邊造輪子的過程。
那段時間我幾乎把 50% 的精力都放在 CODE 上,貢獻了大量代碼。但一個人力量有限,不可能實現所有功能,于是開始忽悠更多同事參與開發。GitHub 當時正好拿了一筆融資,估值到了 7 億,我于是見人就畫餅:你們想參與一個價值 7 億美金的項目嗎?當然并不是完全山寨 GitHub。最后統計共有 48 人參與了項目,完全按著開源軟件的節奏,大家見縫插針,憑著熱情和愛好,把 CODE 成功地做了出來。
做這件事的第二大難點,是統一大家的思想。SVN 轉向 Git 不僅涉及使用習慣的變化,更重要的是,圍繞 SVN 構建的整個生態系統都需要隨之而變。豆瓣很早就開始用 SVN,并圍繞它打造了很多工具,包括上線系統、持續集成系統、任務管理系統都和 SVN 綁定,相當于所有這些代碼都要重寫,涉及巨大的工作量。
Git 的學習曲線比 SVN 高很多,要想上手,除了需要掌握百條左右的 Git 命令,還得了解 GitHub 這套流程規范。即使在豆瓣這樣 Geek 范兒的公司,也并不是所有人都參與過開源項目的開發,熟知 Pull Request 那套流程。一些積極性不高的員工難免會產生抵觸心理,這時候就需要借助公司的力量,從上到下推動這件事。一方面在產品線內部培養積極分子,另一方面提供相 關的培訓,再有就是采取一定強制措施,從公司層面強制規定使用 Git。
技術人攻略:豆瓣的工程師文化,對做成 CODE 這件事有多大幫助?
國內號稱有工程師文化和氛圍的公司,豆瓣真得算一個。在豆瓣,工程師文化不是形而上的概念,而是落實到通過工具,而不是通過制度去解決問題的行為方式。創始人阿北是技術背景,包括洪教授在內的頭幾個員工,有非常優秀的工程意識,他們一開始樹立的高度,決定了整個公司延續下來的文化。
我到現在都還記得,剛進豆瓣的第一天,我的工作不是開發產品,而是和同事做一個方便前端工作的框架。豆瓣很早就已經有一套上線系統,即使當時公司的規模還那么小,而且即使在那么早期,大家都會主動寫單元測試。
CODE 之所以能做成,是全豆瓣所有人的功勞。幾乎每個人都愿意去做過程改進這件事,只要環節中有浪費,有不爽的地方,大家就會想辦法解決。各個技術公司都在強調 工程師文化,但要真正把這件事做起來,不能空談,需要有一些形式和具體可執行的東西。比如每周的技術分享、促進工程師溝通的工具,甚至晚上的吉他班。什么 是工程師文化?代碼才是最重要的!一家不重視代碼的公司何談工程師文化。
技術人攻略:根據你的觀察,國內公司和程序員對 Git 的接受程度如何?
國內的 Geek 程序員已經開始用 GitHub,但仍然有大量的人從沒接觸過開源。找我做咨詢的一些公司,程序員還在用 Windows 做開發,即使在豆瓣這樣的 Geek 公司,到后期也至少有一半的技術人沒有參與開源。所以開源這件事,在中國還僅限于小部分人。我和國內互聯網及傳統軟件公司的人都交流過,豆瓣轉到 Git 尚且用了整整兩年,對于那些規模大得多,Geek 比例低得多的公司,推廣難度更不可估量。
國內的互聯網公司很缺人,但缺的是A類和B類人才,這類人才不可能通過大學教育教出來,只能靠開源文化的傳承去熏陶。GitCafe、技術社區,以 及國內做黑客馬拉松的公司,大家都在做一件事:通過這些活動和產品,讓更多人接觸到開源文化,幫助國內工程師盡快成長,變成那種更加 Geek 的程序員,這將是個很漫長的過程。
2003 年我加入新浪,跟著老黃(黃冬)推 SVN,那時候還沒有公司用版本控制工具,都是每天復制一份文件夾,用 FTP 上傳到服務器。那會兒大家的疑問是:為什么要用版本控制工具?十年過去了,新的問題變成:應該要用版本控制工具,可為什么要用 Git?這個變化在我看來已經是進步了。再舉個例子,原來很少有公司寫單元測試,現在這個比例雖然仍不高,但起碼有人愿意開始寫了。過去京東、大眾點評都 是基于 .NET 架構,而現在都在轉向開源架構,阿里這樣的公司更是為開源做了很多貢獻,去 IOE 就是阿里發起的。這些在我看來都是好現象。
技術人攻略:你經歷過豆瓣比較完整的發展過程,解決了開發流程問題之后,還遇到哪些問題?
2012 年業界開始興起 O2O 概念,豆瓣那會兒的整體方向是接點地氣,所以也開始涉足這個領域,例如賣電影票,做電子書,參與音樂節等。線上業務一旦和線下掛鉤,就得鋪人。例如賣電影 票得做交易系統,對接所有的電影院平臺和取票機,每家的平臺都不一樣,業務復雜度很高。除了技術,還得鋪大量的運營人員,給運營同事開發管理后臺、便利工 具等等,都需要人,于是公司開始大規模擴張。
擴張期招來的人,不可能都是 Geek,校招又進來了很多小白。新人直接下放產品線后,出現了很多問題。于是設計了一個新人訓練營,在一個月培訓期里,做集中式的工具講授和開源文化的普及,效果好了很多。
回頭看豆瓣這兩年的戰略發展,移動客戶端和 O2O 這兩波浪潮都沒抓住。這兩個領域有個共同點,恰巧是豆瓣不太擅長的地方。PC 互聯網時代,不用投錢推廣,通過 SEO 就能從搜索引擎獲取大量流量。而移動互聯網時代,免費流量沒了,需要鋪人做渠道,才能把下載量做上去。O2O 也類似,不可能借助免費的渠道起來,必須要鋪人、鋪渠道。
時代變了,但我們沒有順應去變,所以在這兩個關鍵點上豆瓣都做得不太好。這其實是個后知后覺的事,做的時候對情況估計不足,比如豆瓣電影的口碑很 好,本想著賣電影票是順利成章的事,但真正推起來的時候,才發現影院并不買帳。雖然豆瓣在擴張,但總體人數和團購網站比還是小得多,在地推的時候并不占優 勢。
技術人攻略:聽說你比較早就進了互聯網行業,還經歷過 2000 年互聯網泡沫,當時是什么情況?
我出生在北京,接觸電腦非常早,小時候就經常去中關村買軟盤,眼睜睜看著這條街一點點變化,從這里感受到 IT 前沿的力量。中關村誕生了許多牛人,劉強東當初就在那開柜臺,愛國者的馮軍也是從賣鍵盤、鼠標這樣的小生意起家,還有王志東、王江民這樣的傳奇人物,我們 都聽著這些人的傳說長大。
高一開始上網之后,不知怎么就莫名其妙買了本雜志,跟同學一起學 HTML。當時正好有一些海歸回國創業,依靠 HTML 這個“高級技能”,我們接了些兼職工作,一天能掙 150 塊錢。當時小,能掙這么多錢非常開心,于是決定退學。結果自然是沒退成,只好偷摸著搞網站。我們喜歡玩游戲,手上也有很多相關資源,就做了個游戲資訊網 站。
高考結束當天,我和同學就在潘家園租了一房,開始折騰自己的事。當時主要的收入來源,是給大網站的游戲版塊提供資訊和下載資源。沒想到自由的日子沒 過幾天,慘痛馬上就隨之而來。2000 年互聯網泡沫破滅,大批公司倒閉,許多人頭天還上著班,第二天桌上就放一信封,里頭結了一月工資,被裁員了。我們自然也失業了,那時候剛 18 歲,以為這行業就跨了,特別迷茫。那種感受特別深刻,以至于我到現在也忘不了,經常告誡初入職場的同事,要隨時做好明天公司就倒閉的準備。
回想那段經歷,唯一比較幸運的是比較早接觸了技術。當時沒有人指點,就是純野路子,各種瞎學。創業這事黃了之后,我也沒去上大學,繼續搗鼓編程。我算是被互聯網傷過的人,后面找工作一直很糾結,直到 2003 年底進了新浪,才算是真正成為了正規軍。
技術人攻略:如果不考慮現實因素,你想做什么事?你的興趣愛好是什么?
無論是否考慮現實,我都會做和技術相關的事。中學時期學了 6 年日語,深受日本文化影響。日本人強調工匠精神,我很欣賞把一個東西從無到有,并且很精細地做出來那種過程,這可能是我喜歡做技術的原因。但嚴格說來,我不是死摳技術的人,因為技術始終要服務于產品。
我是野路子出身,屬于非典型程序員,喜歡折騰各種各樣的新鮮事物。在豆瓣的時候,就喜歡攬事兒,公司自由度也高,往往白手起家倒騰出一個部門,例如 CODE、商務開發、東西、Anti-Spam,包括豆瓣讀書最早的 Kindle 版本,都是從無到有做出來的。
除了工作,業余時間我還摻和了很多外界的閑事,搞出了“吃喝玩樂在北京”豆瓣小組,參與國內最早的比特幣項目,幫搞藝術的朋友做 3D。我身上流著創業的血液,根本閑不住,凡事只要新鮮、好玩,我就愿意做。
我的興趣愛好很廣泛,喜歡踢球、寫代碼、參加各種線下活動。我非常喜歡生人社交,可能莫名在哪兒看見一個帖子組織聚會,就會去看看。我很愿意認識完全陌生的人,了解完全沒有關注過的領域。因為這個原因,交了很多跨界的朋友。我始終覺得,人需要對外界保持一定的新鮮感和敏感度,廣泛接觸的新事物反芻回來能幫你做好現有的事。
技術人攻略:你興趣愛好這樣廣泛,怎么平衡深度和廣度的問題?
我一直覺得人的發展是廣廣深深的過程,廣度打不開,深度也會受限制。因為可能挖著挖著就遇到一個特別硬的石頭,這時候需要往旁邊走,把眼界拉開,才知道應該如何去深。深度這件事在我看來,不是你把 MySQL 的源碼研究得特別透,就叫有深度。我所理解的深度是對整個行業和生活的看法,先要廣泛地接觸這個世界,然后再討論更深層的東西。
我們的時代發展得太快,有可能你今天研究的所謂深度,就是明天要淘汰的東西。還是舉 MySQL 的例子,很多公司確實缺資深 DBA,把 MySQL 研究得特別深當然很好,但你能研究到多深首先是個問題。其次,這個時代光會 MySQL 也不夠用了,還需要了解分布式計算和云計算,停留在原先那個深度上顯然是不夠的。如果你早知道 Hadoop 是下一個時代的數據計算框架,就應該把精力花在新時代的事物上。當然想把 Hadoop 研究得深,也離不開廣度,例如你需要知道如何把一個算法切成所謂的 MapReduce 計算方式。反正在我看來,不能一味研究深度,必須得廣廣深深地往前走。
我自己一直不太敢談深度,因為始終覺得人外有人。我會的這點東西很皮毛,所謂深度也就是做了多年技術,對于如何寫出好的代碼,和如何讓一堆工程師一塊兒寫出好的代碼這件事,有淺淺的研究,就算是現在的小優勢吧。
技術人攻略訪談是關于技術人生活和成長的系列訪問,由獨立媒體人 Gracia 創立和維護。報道內容以“人”為核心,通過技術人的故事傳遞技術夢想;同時以小見大,見證技術的發展和行業的變遷。在這個前所未有的變革時代下,我們的眼 光將投向有關:創造力、好奇心、冒險精神,這樣一些長期被忽略的美好品質上。相信通過這樣一群心懷夢想,并且正腳踏實地在改變世界的技術人,這些美好的東 西將重新獲得珍視。
聯系方式 gracia@devlevelup.com
微博: @技術人攻略
訂閱:微信搜“技術人攻略”或“dev-levelup”
<span id="shareA4" class="fl">
</span>
</div>