七牛首席架構師李道兵:在開源世界裡逼自己成長

盼盼姐發表於2015-07-24

李道兵,七牛雲端儲存首席架構師。他曾是北大化學專業博士研究生,中途毅然轉行至自己喜歡的網際網路行業。2007年加入金山實驗室,2010年加入盛大創新院, 曾先後參與了盛大網盤專案和盛大雲專案。2013年,李道兵加入七牛雲端儲存,任職至今。他熱愛開源,曾先後擔任維基百科中文管理員,Debian Developer,協助維護 iso-codes 等開源軟體。他喜歡架構,參與了不少高壓力專案的結構設計,推崇高可用,可伸縮,低耦合的架構設計。

問:你是從什麼時候開始程式設計的?為什麼沒有堅持自己原來的化學專業?

我高中才開始接觸到電腦,大學的時候興趣大增,還找了一份幫人做網站的兼職。研究生階段專業是計算化學,所以不僅有大量程式設計的工作(我的課題演算法需要自己寫,沒有現成的軟體),還要幫課題組維護一個由幾十臺Linux伺服器組成的叢集,所以也積攢了一些 Linux 運維的經驗。離開學校後沒有繼續做化學的一個原因是我沒能正常畢業(文章發表不太順利),最後拿了肄業證照走人;另外一個原因是興趣轉移了,自己的職業規劃就是要往軟體行業走,所以是否有一份化學的學位證照對我影響不大,所以就沒有堅持下去。

問:你認為現在的開源社群環境跟你當初成為Debian Developer時的環境有哪些差別?是否仍然鼓勵今天的程式設計師為開源軟體做貢獻?

差別挺大的,當時開源軟體的最大威脅還是來自大公司的一些不實攻擊(特別是微軟的一些FUD策略),而現在的最大挑戰可能是來自開源軟體的主導權問題。主導權是留在社群還是會慢慢變成由公司來主導?GNU組織的影響力也在逐漸下降,大家對開源主導權繼續保留在社群的信心也在逐步下降。

我覺得程式設計師參與開源是好事。一方面開源世界有很多問題需要解決,解決這些問題能倒逼自己快速成長。對於我來講,如果沒有參與開源的話,我的水平會比現在差很多。另一方面是理念方面的原因,我覺得能夠貢獻一點時間給全人類謀點福利是值得的,特別是在那些可以沉澱下來的事務上。所以我也在維基百科、翻譯等專案上貢獻過自己的時間。

問:有人認為大量的開源軟體其實都是閉源軟體公司的廣告而已,請問社群主導開發的開源專案和公司主導開發的開源專案有什麼本質的區別?這兩種方式各有哪些優勢?

作為一個開源軟體的使用者,開源軟體給我們提供了一種可能,讓我們很方便地使用、研究、改善我們日常的軟體,大部分我們的必備軟體都算是社群主導的,比如作業系統(Linux), 命令列環境(bash等),編輯器(Vim, Emacs),編譯器(GCC),圖形介面(GNOME, KDE), 瀏覽器(Firefox),音影片播放(MPlayer) 等都應該算是社群主導的。只是現在很多新興的技術逐漸掌握在大公司的手上,比如 Xen, OpenStack, Docker等。

作為一個軟體的主導者,我覺得開源提供了一種全新的合作模式,這個合作模式能讓軟體的發展更順利,包括 Python, Emacs, Debian 這類的軟體都從這個模式獲益匪淺。

公司的優勢在於可以集中人力,所以在推進方面比較給力(比如 Chromium/Chrome)。開源能夠讓很多想法充分競爭,最後最有生命力的想法會自然冒出來。比如在命令列環境這個領域,開源方就出現過 sh, bash, ksh, tcsh, zsh 等軟體,互相競爭,互相借鑑想法,發展得很好。另外一個優勢就是參與感帶來的巨大激勵,比如開源社群的人更願意去報告bug,修復bug。相比之下,微軟的命令列工具出於保護目的,同時也有投資、改進動力不足等原因,所以一直很難用。

問:你曾先後在金山、盛大創新院、七牛工作,你的足跡和老許基本相同,同時你們也是工作上的好搭檔,請問他是否對你造成了某些影響?

那是當然。老許是我認識的人裡技術鑽研最深的一位,包括 C++, Erlang, Golang 等語言,以及各種高併發模型,還有我們的各個業務的底層模型。我跟老許的選擇有一定的互補性,比如我更關注於專案本身,比如專案管理、質量控制、持續整合、持續交付、網路安全這些方面的東西。

問:七牛在2011年成立,而你在2013年才加入七牛,請問你當時是如何加入七牛的?

我2012年離開盛大,加入了一家小公司。大約過了一年,老許請我吃飯,問我是否有興趣加入七牛,我就直接答應了。畢竟跟老許合作過多次,也知道老許在做一些很酷的事情,所以能加入七牛也是求之不得的事。

問:你曾在一個“七牛為什麼要做雲端儲存”的slide中提出過一條理由是“很酷”,請問這種“酷”體現在哪些方面?

對我來講,儲存很酷的原因在於儲存之外的其他模組已經逐步平凡化了。Nginx+業務邏輯層+資料庫+快取層+訊息佇列這種模型幾乎能解決所有的業務,再加上最近又從語言層面逐步把高併發的問題解決了,所以只要不涉及到大規模檔案上傳,大家的架構都會比較類似。

但一旦開始涉及到大規模檔案上傳,儲存就馬上轉變成架構中最重要的一部分。畢竟對於結構化資料的持久化,我們已經能很熟練地使用資料庫、分庫、分表、表外索引等技術來支撐數十數百億的記錄,但對於非結構化資料的持久化(即檔案儲存問題),手邊能用的元件都有這樣那樣的缺點,要麼容量不足,要麼運維成本太高,要麼不支援高可用,要麼效能太差。儲存作為架構設計中最難啃的一塊,能夠用雲的方式來解決是一個非常漂亮的主意。

常規的 IaaS 平臺傾向於把所有東西都放在一朵雲上,我覺得應該充分結合不同雲的優勢。比如把資料庫和業務邏輯的部分放在網路覆蓋好的8線BGP機房,靜態檔案和使用者上傳的檔案則要放在流量成本低的普通機房,這樣做才更合理。

問:七牛開源了不少專案在Github上,也有很多人在為這些專案做貢獻。廣泛地參與開源專案為七牛的技術氣氛和團隊建設帶來了哪些好處?

主要是思路的活躍。對於每一個場景,大家都對現有已有的開源解決方案比較熟悉,知道這些專案的優缺點,於是就可以合理利用這些軟體。如果是隻能用自己寫的軟體,要麼不停地重複造輪子,要麼適配上很彆扭,降低了元件效率,同時也增加了bug。

問:七牛內部是否有人在鼓勵和推進對開源專案的參與(比如你或許式偉)?你們又是如何推進的?

招人是很重要的一環,我們招的人很多都是在 GitHub 有過不少貢獻的,這些人已經瞭解到參與開源專案的好處了,很多人也會持續參與。

另外,我們也鼓勵大家把發現的 bug 和引入的補丁回饋到開源社群,特別是我們用的多的 Go 語言、MemCache、MongoDB、FFmpeg這類元件。

當然,控制工作節奏也是很重要的,合理安排工作時間,不僅讓大家工作效率高、bug少,也能給大家更多的機會去鑽研技術,而參與開源就是鑽研技術很重要的一個手段。

問:七牛在持續交付方面有哪些經驗可以分享?從持續整合到持續交付,有哪些重要的問題需要解決?

我們的方案算是比較常見的。首先我們用 GitHub 來放我們的程式碼,用 Travis 來做 merge 前的單元測試。之後又用 Jenkins 來做完整的整合測試,最後是一套我們自己寫的部署系統(如果規模小的話,這套部署系統用 Puppet+Capistrano 替代沒有任何問題)。

首先,測試方面問題都不大,部署稍微有點麻煩,我們的做法是用一套獨立的測試叢集實現軟體的預釋出。其次就是灰度部署的問題,灰度部署完成後如何讓開發人員能清晰地判定新版本是否存在bug,這個方面需要很多輔助工具。最後就是多機房、大量機器的程式分發問題。

問:能否詳細解釋一下你曾提出過的機房雲?機房雲是否就是七牛現在的一站式資料平臺?

機房雲是我的一個不太成熟的想法,跟一站式資料平臺有點聯絡,但不是一個東西。機房雲的想法主要是針對PaaS平臺的一些缺點提出的。PaaS平臺試圖接管客戶的所有業務,但對於大客戶來講,一個沒法線上 debug,線上檢測效能瓶頸的平臺是很難接受的。我很希望一些獨立的功能模組能夠外包出去,比如資料庫、佇列、快取、圖片處理、音影片處理、語音識別等。對於這些模組,我希望實現高速訪問,那麼就不能用簡單的 SaaS 平臺來滿足,而一個貼著機房部署的服務就比較合適了。

對於七牛一站式資料平臺,最主要的作用是幫助客戶解決如何方便地使用資料的問題。比如圍繞圖片,就有縮放、裁剪、水印這類常規需求,也有監黃、廣告識別等很個性化也很有技術門檻的需求。七牛不會自己來完成每個需求,因為我們首先沒有這麼多開發力量,也缺少對應領域的技術積累,而且如果每個需求都由七牛來做的話,更妨礙這方面最優秀的服務商的成長。我覺得七牛的最佳做法就是撮合擁有資料的人和能處理好資料的人,我們的目標是降低資料服務的使用門檻,減少接入資料服務的溝通成本,讓資料擁有方和資料服務方都能更快地發展。

問:七牛的一站式資料平臺的開發現在處於什麼階段?一站式資料平臺的技術難點在哪裡?

我們已經在針對種子服務商逐個接入了,這個階段主要還是在摸清接入中可能會遇到的阻礙,以及需要我們調整平臺來解決的問題。這個平臺的技術難點在於對各個語言的支援、程式的隔離、快速伸縮,以及如何確保客戶資料的安全性。

問:為了實現一站式資料平臺的願景,未來還有哪些需要做的?

除了繼續改善和穩定平臺,還要接入更多的供應商來滿足不同客戶的需求,設定更靈活的計費方式,建立更多的 demo來降低大家的接入成本,等等。

問:七牛最近推出的鑑黃服務是和圖譜科技合作完成的,兩個團隊各自的分工是什麼?在未來七牛還會和什麼樣的團隊繼續合作?

圖譜科技主要是提供監黃技術,我們的接入平臺提供了計算能力支援、伸縮性支援、計費支援。當然,整合的工作量不低,這也是未來我們的重要努力方向,努力讓整個接入過程更加自動化,從而加快接入的速度。未來我們會接入更多的處理團隊,比如語音識別、面部識別、圖片深度壓縮、影片指紋、影片深度壓縮等等。

問:你很喜歡演算法,並且曾經在Topcoder上很活躍,請問你是否推薦其他程式設計師參與Topcoder或類似社群組織的活動?

我在Topcoder上算不上活躍,成績也只能算是勉強,不過 Topcoder 對我的幫助很大。在Topcoder上玩,最重要的一個層面在於思路的嚴密性,你少考慮一個環節,就一點分數都拿不到。當然,在那裡我的建模能力,還有視野都得到了很大的提高。我也很喜歡玩過 Topcoder 或者其他演算法競賽的同事,他們的程式碼出 bug 的機率很小,而且很多地方寫得很巧妙,我經常能發現一些對我很有啟發的程式碼。

相關文章