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