Will Larson:Digg的開發實踐和流程

發表於2012-09-06

鄭柯譯註曾經風靡一時、估值一度達到2億美元的Digg,因為兩年前一次失敗的改版,人氣大跌,並失去公眾對它的關注,創始人Kevin Rose也無奈離開。前不久,更是以50萬美元的價格被 Betaworks 收購剩餘資產。

Will Larson曾經擔任Digg的工程總監,他在一篇部落格中,回顧了 Digg 從 2010 年 5 月到 2012 年 5 月公司的研發團隊架構和流程。

團隊架構

一開始,Digg的組織架構很傳統,產品、運維和工程團隊各自獨立。產品團隊只有4名成員,8個工程師構成運維團隊,QA有6個人,研發團隊有大約20人。

Will Larson:Digg的開發實踐和流程

研發團隊本身分為4個水平團隊:前端、API、平臺和基礎設施,兩個垂直團隊:廣告、分析。產品團隊在功能上掌控垂直團隊,與多個水平研發團隊協調。

Will Larson:Digg的開發實踐和流程

此後,由於人員流失,組織結構變得更為簡單。運維團隊只有3個人,工程團隊7個人,廣告工程團隊4個人。

程式碼評審和持續部署等實踐

Digg的核心開發實踐讓他們的開發人員一度達到40個人,後來降到14個人。

Will Larson:Digg的開發實踐和流程

他們使用Git管理原始碼,Gerrit做程式碼評審。所有的程式碼都要得到同事的評審和通過,並通過所有的單元測試。

有程式碼補丁提交到Gerrit等待評審時,Jenkins會自動執行單元測試,並將測試結果更新到Gerrit中,也就是說評審程式碼的人不會浪費時間去看失敗的補丁程式碼,這樣的程式碼也無法進入Git程式碼庫中。

一旦Gerrit中補丁程式碼通過測試和評審,它們就會被合併如Git的master分支,Puppet會將其自動部署到alpha環境中,在其中成功通過整合測試後,這些新的補丁程式碼會合併到Git的生產環境(production)分支。

向生產環境的部署是手工構建Jenkins方式完成的,接下來會使用Puppet一起部署更新程式碼。

開始時,他們使用了持續部署的方式向生產環境部署,但是出現一系列問題後,他們決定還是先讓人工方式參與進來。

Will這樣說道:

如果我們當時堅持使用持續部署,我們最終會改善我們的測試,使得錯誤程式碼很難通過,但在當時,我們覺得投入那麼多時間做這個並不值得。

Will認為這個評審、測試和部署系統是Digg當時最重要、最成功的開發流程系統,足以讓40個人的團隊開發出高質量和一致性的程式碼,也不會讓14個人的團隊被流程拖慢效率。

在不斷的實踐中,Digg慢慢湧現出一些新的實踐,雖然未經詳細研究,但它們確實來自日常實踐。

剛開始,他們的單元測試覆蓋率非常高,隨著團隊人員所見,他們寫的單元測試就非常少了。雖然沒有人明說,但是他們相信:單元測試並不能減少他們遇到的絕大部分問題:在高負載下,生產環境多個元件出現問題,最終導致系統故障;前端呈現問題。此後幾年中,單元測試還一直可以提供價值,但是Selenium測試在沒有人主動維護之後,很快就過時了,而且很快退出舞臺。

他們使用Thrift定義前端和平臺團隊之間的介面,因此團隊之間的溝通和協調非常直接。

他們很少變更已有Thrift介面的行為,如果需要新功能,他們會推出新的介面,更新客戶端來使用這些功能,然後移除舊的介面。雖然這個流程貌似奇怪,但是由於他們的前端和後端程式碼各自獨立部署(部署所有的前端或後端伺服器只要幾分鐘),這種做法理智、安全。

新的前端變更只會推送給一部分使用者,如果有問題就會禁用。雖然他們一開始想用這種方法來完成新功能的A/B測試,但是其最大的價值在於管理版本釋出,並從一小部分可信使用者那裡獲得反饋。

在釋出可能會影響效能或負載的後端功能時,他們都使用不當機的方式。

康威定律下的“架構”

在Will看來,對比下他們的v4版本架構和他們設計這個版本時的組織架構,這基本上就是康威定律(Conway’s Law【注】)的直接表現。

Will Larson:Digg的開發實踐和流程

他們當時的構成是:一個API團隊和一臺API伺服器、一個前端團隊和一臺前端伺服器、一個平臺團隊和一臺後端伺服器、一個廣告團隊和一臺廣告伺服器、由基礎設施團隊管理的一大堆資料儲存,以及一個分析團隊使用的Hadoop叢集。前端團隊使用無狀態的PHP、HTML和JavaScript開發,狀態和儲存由後端伺服器管理,訊息佇列用來處理長時間執行和非事務處理。

他們最不一般的做法,是用基於gevent的Thrift伺服器作為後端伺服器,因此在gevent和開發gevent安全的客戶端池上耗費了很多時間。

我可能再也不會用Thrift作為Python伺服器了,因為再也不想維護一個類似的伺服器。

他們同時使用Tonardo、Apache+mod_wsgi+Pylons、gevent伺服器作為後端服務,雖然讓Will有點不爽,但是在實際工作中,整個團隊並沒有多大困擾,主要原因是使用了Jenkins和Puppet來部署系統。

在總結中,Will認為:

我們的流程和結構還是比較合理的,而且也很有效。如果今天重頭來過,我們當然會有不一樣的方式,或者要是我們的團隊沒有那麼快減員,或者要是我們沒有同時應對那麼多技術債務,包括遺留系統、API和程式碼契約等等。

Will還想再談談Digg的資料庫和技術方面的不斷擴充套件,他們用過的技術包括:Cassandra、MySQL、Redis、Memcache、HDFS、Hive、Hadoop、Tornado、Thrift伺服器、PHP、Python、Pylons、Gevent等等。請關注InfoQ中文站的後續報導。

注:

康威定律:Conway’s Law,由電腦科學家Melvin Conway在1968年提出,其內容是:設計系統的組織,最終產生的設計等同於組織之內、之間的溝通結構。

 

 

 

相關文章