揭秘Facebook是如何開發(fā)軟件的
Facebook的工作方式讓我著迷。那是一個非常獨特的工作氛圍,無法復制(也并不適用于其它公司)。下面是我從很多在Facebook工作的朋友那里搜集到的關于這個公司如何開發(fā)和發(fā)布軟件的只言片語。
看起來對Facebook感興趣的大有人在。這個公司以程序員為主導的企業(yè)文化受到人們的極大關注,很多公司都在努力實現(xiàn)這樣的企業(yè)文化。盡管Facebook對于其內(nèi)部的開發(fā)過程諱莫如深,但他們的技術團隊還是會對其新功能和一些內(nèi)部系統(tǒng)做一些公開的說明,可這些說明通常是關于“是什么”之類的文章,而不是關于“如何做”的…
所以,作為一個外人,你很難知道Facebook是如何做到比其他公司更有效的對其產(chǎn)品進行改進和優(yōu)化。我作為一個外部人士,嘗試著去了解更多的關于Facebook內(nèi)部是如何運轉(zhuǎn)的信息,我把這幾個月的觀察收獲進行了匯編。出于對于信息來源者的隱私保護,我刪除了所有涉及到的人名和特定產(chǎn)品特征/產(chǎn)品名稱。而且我把這篇文章延遲了6個多月才對外發(fā)布,所以,文章中所涉及的內(nèi)容都不會太新太敏感。
我希望這篇文章能給那些試圖看清Facebook如何做到?jīng)Q策權“下放”而不引起管理混亂的人增加一些亮光。你很難評論Facebook這種做法的好壞,以及Facebook的產(chǎn)品質(zhì)量跟這種做法的關系。我想、也希望如此多的互聯(lián)網(wǎng)消費型公司都能從Facebook公司的例子中學到有用的知識。
非常感謝那些在Facebook內(nèi)部工作、幫助我得到這些信息的人,同時也感謝像epriest 和fryfrog這樣對本文進行校正和修改的人。
語錄:
◆ 截止到2010年六月,這個公司的員工已經(jīng)接近2000名,而在此10個月之前只有大概1100名。一年內(nèi)幾乎翻了一番!
◆ 公司最大的兩群人是技術開發(fā)人員和實施人員(Ops),各自有400~500人。這兩部分人占去了公司構成的50%。
◆ 產(chǎn)品經(jīng)理跟技術人員的比例大概是1:7到1:10。
◆ 所有的技術人員都要通過4到6周的“新兵訓練營”培訓,培訓中他們通過修改bug來了解Facebook系統(tǒng),聽資深/終身司職技術人員做演講。每次訓練營培訓大概會有10%的學員不能通過考核,會被淘汰出公司。
◆ 新兵訓練營后,所有的技術人員都要接觸真實現(xiàn)場數(shù)據(jù)庫(先會有個專門的講座,關于“責任越大,能力越大”,還有一個明確的“違反即開除”的清單,例如泄漏私人信息)。
[感謝fryfrog的修改]”公司有很多非常有效的防護措施來防止內(nèi)部擁有這種能力的人做出各種恐怖的事情,”,如果你不幸成為需要做這種危險操作的人,你需要登記原因,而且會被密切的審查。一點疏忽都不能有,否則你完了。
◆ 任何技術人員都可以修改Facebook代碼庫里的任何一段代碼,并按自己的意愿提交回代碼庫里。
◆ 非常強勢的技術人員為主導的文化?!爱a(chǎn)品經(jīng)理在這里基本上沒有什么用處?!?—— 引自一位開發(fā)人員的話。程序員人員可以在中途修改產(chǎn)品規(guī)格文檔,重新調(diào)整要做哪個項目,隨時都可以按自己的想法加入新的功能特征。
[編輯評論]這篇博客的作者是一位產(chǎn)品經(jīng)理,所以這段文字著實讓我意外。你會在余下的語錄里看到,F(xiàn)acebook的企業(yè)文化對產(chǎn)品的管理工作是十分重視的。所以,產(chǎn)品管理這個角色并不是可有可無的。并且,這個公司的企業(yè)文化是讓“每一個員工”都感到對產(chǎn)品有責任。
◆ 在每月的跨團隊會議中,進度報告由開發(fā)人員提交。產(chǎn)品市場和產(chǎn)品管理部門會出席這些會議,但如果在會上他們說了太多的話,會后領導會收到會議反饋“產(chǎn)品部門在會上說的話太多了?!彼麄冋娴南M_發(fā)人員能公認的完全控制產(chǎn)品,成為公司開發(fā)的產(chǎn)品的主要主導成分。
◆ 每個項目的人力調(diào)配完全是根據(jù)自愿。
◆ 產(chǎn)品經(jīng)理要游說開發(fā)人員,讓他們對自己的想法感興趣。
◆ 開發(fā)人員選擇他們聽起來感興趣的任務。
◆ 開發(fā)人員會對他們的經(jīng)理說:“本周我打算做這5塊工作?!?/P>
◆ 技術經(jīng)理會盡可能的由著各程序員的喜好行事,但有時會要求某項工作必須先做。
◆ 程序員自己把握所有的技術特征 —— 前端的javascript,后端的數(shù)據(jù)庫腳本,以及所有這之間的東西。如果他們需要設計人員的幫助(只有少數(shù)幾個專職設計人員),那他需要找到一個對他們的項目感興趣的設計師。找架構師也是如此。但通常,程序員會自己處理所有所需。
◆ 一個功能特征是否值得做,通常的判斷方法是用一周快速實現(xiàn),然后在抽樣用戶里測試它,例如找1%的內(nèi)華達州用戶進行測試。
◆ 開發(fā)人員通常喜歡關于基礎架構,系統(tǒng)擴展性,“難題”等的任務 —— 這些都是能產(chǎn)生威望的地方。你很難讓一個程序員對前端項目或用戶界面工作提起興趣。這跟你在一些面向客戶的業(yè)務公司里發(fā)現(xiàn)的現(xiàn)象正好相反,那些公司里所有人都喜歡干客戶能接觸到的東西,他們會指著某一個界面功能說:“這是我做的”。在Facebook,后端的工作,例如新聞feed算法,廣告定位算法,memcache優(yōu)化工作等,都是程序員們的搶手工作。
◆ 對某項具有高優(yōu)先級的功能有影響的修改(例如新聞feed),在代碼提交合并前要經(jīng)過代碼審查。新聞Feed非常的重要,任何的改動都要經(jīng)過Zuckerberg(Facebook創(chuàng)始人,總裁)親自審查,但也有例外的時候。
[糾正——感謝epriest]“任何的代碼的修改都必須進行強制性的代碼審查(由一個或多個技術人員執(zhí)行)”。我想這篇文章中說的是Zuck 本人并不會親自審查每一處變動?!?/STRONG>
[更正感謝fryfrog]”所有的代碼的變更都會經(jīng)過至少一個人的審查,這套系統(tǒng)讓其他人很容易的查看、審查你的代碼——即使你沒有邀請他。想讓未經(jīng)審查的代碼進入代碼庫屬于一種蓄意的不良行為。”
◆ 沒有QA的事兒,完全沒有。開發(fā)人員完全負責代碼的測試,bug修改,后期維護。有一些單元測試和集成測試的框架,但很少人會用它們。
[更正感謝fryfrog]”我要說的是,我們實際上是有QA的,只是不是一個正式的QA團隊。每一個在辦公室或能連接到VPN的員工都能看到一個包含所有的變更內(nèi)容的、下次將要對外發(fā)布的網(wǎng)站版本。這一版本的網(wǎng)站更新的十分頻繁,你能比世界上其他人提前1~12小時看到這個即將發(fā)布的版本。公司鼓勵所有員工積極的報告發(fā)現(xiàn)的任何問題,對于問題會做出快速的應變?!?/STRONG>
回復:很吃驚這里沒有QA和自動單元測試——“大部分的開發(fā)人員都有能力寫出沒有bug的代碼。只是在大多數(shù)的公司里他們沒有動機主動去達到這種境界。當有QA部門存在時,你會輕松的把代碼拋給他們,讓他們?nèi)グl(fā)現(xiàn)錯誤?!盵編輯:請注意,這只是一種主觀論斷,我之所以把這樣的話語收錄到這篇文章里,是因為它跟我們其他公司里標準軟件開發(fā)方法形成鮮明的對比。]
[更正感謝epriest] ”我們有自動化測試,包括每次軟件發(fā)布前必須通過的“push-blocking“測試。我們根本不相信所謂的”大部分的開發(fā)人員都有能力寫出沒有bug的代碼“的說法,更別說一個公司會接受這種觀點了。”
回復:很吃驚產(chǎn)品經(jīng)理會沒有影響力/控制權——產(chǎn)品經(jīng)理有很大的獨立性和自由度。影響力的產(chǎn)生關鍵在于和技術經(jīng)理建立好良好的關系。需要有足夠的技術知識來避免自己提出愚蠢的建議。除此之外,產(chǎn)品經(jīng)理建立開發(fā)路線/Backlog不需要任何的批準或通過任何的審查。產(chǎn)品經(jīng)理的數(shù)量相當較少,但他們都認為對公司里非常重要的、自己感興趣的一個區(qū)域負有重要的責任。
◆ 一般情況下,所有提交的代碼會每周一次的打包發(fā)布(周二)。
◆ 如果努力些,本周做的修改也可以在同一天發(fā)布。
◆ 周二程序發(fā)布時,所有在本周有提交過代碼的程序員都要求在現(xiàn)場留守。
◆ 在發(fā)布開始前,所有的開發(fā)人員的需要在特定的IRC頻道里等候“點名“,如果沒到的話,將會得到一次公開的批評。
◆ 實施組發(fā)布程序上線是一個逐步的過程
◆ Facebook大概有6萬臺服務器
◆ 程序的發(fā)布有9個集中操作的規(guī)模級別
[更正感謝epriest]”有幾個級別的發(fā)布并不是集中式的。有三個階段是集中部署的(階段1 = 內(nèi)部發(fā)布,階段2 = 小規(guī)模外部發(fā)布,階段3 = 完整外部發(fā)布)。其它6個階段是輔助操作,包括內(nèi)部工具部署,視頻部署等?!?/P>
◆ 最小層級的部署只涉及6臺服務器
例如,周二的新版本發(fā)布會從6臺服務器開始(級別1),實施組觀察這6臺服務器,確保它們都能正常工作,才能推進到下一級別發(fā)布。
◆ 如果發(fā)布過程中出現(xiàn)問題(例如,拋出錯誤信息等),發(fā)布會終止。提交這些導致錯誤的程序的程序員會被叫來修正問題。然后發(fā)布會重新從級別1開始。
所以,發(fā)布有可能會反復重復幾個級別: 1-2-3-修復?;赝说?1. 1-2-3-4-5-修復。回退到 1. 1-2-3-4-5-6-7-8-9。
◆ 實施組訓練有素,令人敬佩的,公司很重視。他們的服務器測評是基于常見錯誤日志、負載&內(nèi)存使用統(tǒng)計——包括用戶行為統(tǒng)計。例如,如果新推出的發(fā)布導致了用戶使用Facebook功能特征的百分比下降,實施組能在他們的統(tǒng)計工具里看到這種變化,他們會停止這一版的發(fā)布,調(diào)查其中的原因。
◆ 發(fā)布過程中,實施組使用以IRC為基礎的調(diào)度系統(tǒng),用它可以在需要的時候通過Facebook, email, IRC, IM, 以及短信找到相應的人。對實施組的呼叫不響應的會受到公開批評。
◆ 一旦程序部署到級別9,穩(wěn)定下來,這周的發(fā)布就是完成了。
◆ 如果在特定的周期里沒有足夠的時間把功能開發(fā)出來,這個問題不大(除非有硬性的外部依賴)——功能會在完全完成后打包發(fā)布。
◆ 受到svn相關批評,公開批評,或經(jīng)常的誤工期會導致開發(fā)人員被辭退。“執(zhí)行力非常的強“。沒有效率或不是非常有才的人會非常的扎眼。經(jīng)理通常會對低效能的員工觀察6個月,然后說”我們無能為力,你不能很好的接受公司的文化?!皩靖鱾€級別的人都是如此,即使是C級別和VP級別的人,如果他們不能做到非常的有效率,也會被迅速的辭退。
[更正感謝epriest]“員工不會因為制造了bug而被開除。他們只會因為當有他們的代碼被發(fā)布,有問題需要他在現(xiàn)場出現(xiàn),但卻沒有出現(xiàn)來提供支持時被開除(還沒有發(fā)現(xiàn)有人遇到這種情況)?!?/STRONG>
[更正感謝epriest]“被批評不會導致你被開除。對這樣的事情我們受到了極大的寬容,大多數(shù)的資深程序員都曾干過至少一件恐怖的事,包括我。據(jù)我所知,沒有人因為犯這樣自然的錯誤而被開除?!?/STRONG>
[更正感謝fryfrog]我也沒有聽說過有任何人像本文中提到的那樣因為犯錯誤而被開除的。我知道有人曾疏忽的把網(wǎng)站給弄癱了。他們努力的修復遇到的問題,每個人都從中學到經(jīng)驗。被公開批評要比被開除恐怖的多,我的感覺。
觀察Facebook的軟件開發(fā)文化發(fā)展過程是一件非常有趣的事情——特別要注意的是隨著公司的迅猛擴展,這種文化發(fā)展能否跟得上步伐。
你有什么樣的想法?這“以程序員為主導的企業(yè)文化”在你的公司里也適用嗎?
原文:http://www.aqee.net/how-facebook-ships-code-facebook/
【編輯推薦】