今天主題是講研發(fā)團(tuán)隊(duì)高效秘訣,我想說,我要講的很多Facebook團(tuán)隊(duì)的特點(diǎn),都是跟它的歷史是有關(guān)系的。我會(huì)講(Facebook)這個(gè)團(tuán)隊(duì)怎么樣的從小到大,一點(diǎn)一點(diǎn)起來,才慢慢形成自己的風(fēng)格。這個(gè)團(tuán)隊(duì)我其實(shí)并沒有系統(tǒng)的研究過,我就簡單的講幾個(gè)大的方面,一個(gè)是公司文化,還有就是整個(gè)內(nèi)部組織結(jié)構(gòu),最后可以講一講Facebook的人,他的思維的方式是什么樣子的。Facebook公司文化:Hack
第一個(gè)講講公司的文化。這個(gè)文化特別明顯,叫Hack,它不是說黑客,而是很快的把事情攢出來,攢出來之后不一定特別好,第一個(gè)版本往往很差,但是不要緊,可以后續(xù)再迭代改進(jìn)。在Facebook早期的時(shí)候,總共就三四十人,每個(gè)人負(fù)責(zé)的事情很多,一個(gè)人要負(fù)責(zé)網(wǎng)頁上的一大塊內(nèi)容,你其實(shí)沒有很多時(shí)間把事情想清楚再做產(chǎn)品,你肯定是急急忙忙把它攢出來的。
于是慢慢形成這樣一個(gè)情況,做任何一個(gè)產(chǎn)品的時(shí)候,第一個(gè)版本不在乎是不是做的好,它可能漏洞百出,但是我可以確定兩三天或者三五天就可以上線,做出來后放到網(wǎng)頁上馬上就得到反饋,來自用戶和周圍同事的反饋,或者你自己看出毛病,然后你就知道朝哪個(gè)方向改,然后第二個(gè)版本就好一點(diǎn),第三個(gè)版本更好一點(diǎn)。這個(gè)思路就是,我不求這個(gè)迭代很快達(dá)到我最終想要的那個(gè)樣子,但要求每次迭代速度很快,這樣很快我就朝著正確的產(chǎn)品方向走了。因?yàn)楹芸赡苣慊撕芏鄷r(shí)間精力,坐那兒想了兩三個(gè)星期,覺得這個(gè)東西不錯(cuò),想的特好,然后推出去,結(jié)果用戶發(fā)現(xiàn)這個(gè)東西不是他想要的。尤其我們在做面向用戶的服務(wù)或者產(chǎn)品,經(jīng)常有一種現(xiàn)象,你自己覺得不錯(cuò),自我感覺特別良好,但是拿到外面,用戶反映完全不是那回事。Facebook就是這些年從小到大,摸爬滾打中漸漸總結(jié)出這樣的經(jīng)驗(yàn)。
還有一點(diǎn),恰好Facebook用的語言是PHP,PHP早年在公司爭議特別大,我一進(jìn)公司的時(shí)候大家就討論說,PHP這個(gè)語言太有問題了,咱們要形容特別好的語言,說它像花一樣,PHP簡直就是草嘛(笑)。PHP的設(shè)計(jì)也有問題,或者某些方面很欠思考,結(jié)果就會(huì)發(fā)生很多奇奇怪怪的事情。但是,PHP非常適合Facebook早期發(fā)展的特點(diǎn),就是特別容易去Hack,三五行代碼就把一件事情做完了,當(dāng)然這三五行代碼深究一下都不完美,你可能用JAVA把這三五行代碼寫完是三五十行,會(huì)包裝的很完美,但花的功夫也要遠(yuǎn)遠(yuǎn)超出。
公司早期說Hack這個(gè)詞很少,那時(shí)候大家都忙著攢網(wǎng)頁,攢這個(gè)那個(gè),后來大家慢慢意識(shí)到Facebook的文化就是Hack文化。后來我們搬了很多次家,到最后搬到現(xiàn)在這個(gè)最大的樓,我們就在大的水泥地上寫了四個(gè)大大的字母“HACK”。這個(gè)真的是一個(gè)公司多年文化的結(jié)晶。
即使到后來公司發(fā)展壯大,有了團(tuán)隊(duì)區(qū)分的時(shí)候,大家還是講究這個(gè),要Hack,不要擔(dān)心自己的第一個(gè)版本不完美。因?yàn)槿说乃季S永遠(yuǎn)是有局限性的,你就是坐那兒想十天,也不會(huì)說那個(gè)完美的程度達(dá)到十倍,想十天可能達(dá)到兩倍的完美,這是不值得的,萬一你產(chǎn)品更改方向,你不是白白坐那十天嗎?所以說Hack文化是一個(gè)特別有效的手段。尤其我覺得公司還小的時(shí)候這招還是挺管用的,因?yàn)樾」緵]有那么多人力物力,不太容易把一個(gè)產(chǎn)品搞的那么完美,所以你可以Hack一下。
我還想說Hack是可以傳染的,既然你Hack我也Hack。如果你Hack的話,我不用Hack就比你慢,這個(gè)人花三天時(shí)間就推出來,我不用就要十天。一旦形成Hack文化,它會(huì)慢慢波及公司各個(gè)方面,大家都開始Hack。但是大家不要覺得Hack是不敬業(yè),或者對產(chǎn)品不追求完美,它只是說把對產(chǎn)品完美的追求分成多步去走。像是說你看我們公司都是什么什么學(xué)校畢業(yè),都是能人什么的,但是我們不求把自己做的東西搞的很神秘很高大上,說要推出一個(gè)震驚世界的產(chǎn)品。初期的產(chǎn)品不用特別好,只要你做出來就行了。
Facebook早年的產(chǎn)品都是這樣的,早年的照片分享功能看著就是一個(gè)很爛的東西,但是慢慢的發(fā)展到最后越變越好,現(xiàn)在非常受歡迎。每個(gè)產(chǎn)品都是給我這樣的感覺——這樣的產(chǎn)品也敢往上放,但是這些產(chǎn)品經(jīng)過迭代也逐漸變好了。然后所有產(chǎn)品匯總起來,發(fā)現(xiàn)一些共性和特性,就成了社交網(wǎng)絡(luò)Facebook。所以Facebook不是說一上來有一個(gè)人坐在這兒,說我要開始創(chuàng)建一個(gè)社交網(wǎng)絡(luò)產(chǎn)品,發(fā)展方向是如何如何等等。而是從Hack一個(gè)個(gè)小項(xiàng)目發(fā)展起來的,每個(gè)人都從自己角度看這個(gè)社交網(wǎng)站是什么樣的,Hack之后匯總再看,原來我們是要做這個(gè),然后你在更高的層次上再推出產(chǎn)品,因?yàn)樗羞@個(gè)基礎(chǔ)。
公司的文化在很大程度上就是這樣一個(gè)詞所總結(jié)的。其實(shí)我剛剛進(jìn)公司的時(shí)候,并不是說我完全接受這樣的文化,因?yàn)槲沂峭昝乐髁x者,我的東西我一定要做的超級(jí)完美才拿得出手,但是跟這些同事一起共事,漸漸就領(lǐng)略到Hack的高效,它實(shí)際上有一個(gè)非常堅(jiān)實(shí)的理論基礎(chǔ),我們也很幸運(yùn),在Facebook早年的時(shí)候,就吸取這么一個(gè)公司產(chǎn)品開發(fā)的一個(gè)做法。這是公司文化上一個(gè)很大的特點(diǎn)。
組織結(jié)構(gòu):去中心化,避免依賴
再有一個(gè)我想講一下這個(gè)公司的組織結(jié)構(gòu)。Facebook說白了,它就是一個(gè)非常去中心化的組織,并且盡量避免對別人的依賴。一個(gè)團(tuán)隊(duì)只管自己的事情,不但如此,在做自己事情的時(shí)候,盡量不依賴別人。這個(gè)也跟公司里邊的人工作方式有關(guān)系,很多小孩他們一直工作到夜里三四點(diǎn)鐘,中午睡到十二點(diǎn),下午一點(diǎn)才到公司。假如夜里三四點(diǎn)工作遇到問題,你讓他找誰?所以他不愿意自己有依賴性,不愿意他團(tuán)隊(duì)做的工作對公司有依賴性。
這不意味著公司不愿意分享Code Base,事實(shí)上Facebook只有一個(gè)Code Base,任何人都有權(quán)限修改。有時(shí)候代碼有可能會(huì)搞壞,但是搞正確的可能性更大。如果說搞壞損失十萬塊錢,但是搞對了對我們今后一直是有好處的,F(xiàn)acebook一直不斷地在靠這個(gè)創(chuàng)造收入。所以最后平衡下來,衡量下來還是要去改的。
在Facebook經(jīng)常說的一句話,就是我不怕失敗,我不怕把這個(gè)事情搞砸了。這個(gè)是真的,在Facebook歷史上搞砸的次數(shù)太多了。有一個(gè)高中畢業(yè)的學(xué)生,被Facebook直接錄用來了,原因很簡單,非常有才華,寫代碼又快又好。來Facebook看這兒不好那兒不好要改,這么一個(gè)有激情的男孩兒,你怎么讓他不改呢?那是不對的。所以他就改了,改了第二天就出事了,整個(gè)網(wǎng)站都被他弄宕機(jī)了。我們來了以后都面面相覷,原來那哥們兒把網(wǎng)站的header-cache改了。那時(shí)候大家把他嘲笑一頓,說你怎么能夠把自己的網(wǎng)站搞宕掉呢?他自己也很害羞,自己去喝悶酒。但是不會(huì)有人說,不應(yīng)該這么做,這個(gè)我覺得特別的關(guān)鍵。
你要鼓勵(lì)他去失敗,這樣的話他才會(huì)意識(shí)到自己是主人翁,才會(huì)讓每個(gè)人都覺得,整個(gè)code base,每件事情都是我來管,這樣的話我才對其他的團(tuán)隊(duì)沒有依賴性,在沒有依賴性的情況下你的團(tuán)隊(duì)才走的最快。你自己應(yīng)該很明確自己要干什么事情,任何阻擋我把這件事情完成的東西都要排除掉,這樣的話才能真的很快把這個(gè)東西做出來。只有你養(yǎng)成這種習(xí)慣后才能影響周圍的人這樣做。只有大家都這樣做的話,公司才會(huì)很快速的發(fā)展。所以07-09年,F(xiàn)acebook任何的產(chǎn)品都是以飛速的,甚至大家覺得是不是有點(diǎn)太快了的速度在發(fā)展。
不過,每個(gè)人都可以改代碼庫造成一個(gè)問題,最后我們的PHP的Code Base變得五花八門,因?yàn)槊總€(gè)人都有自己的想法和主張,就把整個(gè)代碼改的亂七八糟的。這個(gè)時(shí)候就需要有一個(gè)Key Person,這個(gè)人非常強(qiáng),他站出來說不行,同學(xué)們,這個(gè)代碼被你們改成這樣了,我要重寫一下。Facebook早期的員工真的是有這樣有才華的員工,他可以花幾天幾夜時(shí)間把Code Base重新寫一下。
所以在實(shí)行Hack文化的時(shí)候,一定要有特別重要的人,他讓你在亂中還有一些靜,能夠重構(gòu)和梳理公司的代碼,因?yàn)镠ack出來的代碼肯定是很亂的。大家看到他把我的混亂的代碼處理好了,特別感激他,然后下一次我就遵守他制定的規(guī)則。這種情況在Facebook屢見不鮮,總有人站出來說這個(gè)不行,我要來樹立一個(gè)章法。在樹立章法的時(shí)候,也是一個(gè)民主的過程,不是說靠獎(jiǎng)金什么的,而是靠技術(shù),這樣的話,在技術(shù)的引領(lǐng)下,很多工作就這樣慢慢展開了。
當(dāng)時(shí)我做PHP Profiling的時(shí)候,也有人提出其它的看法,要不然咱們干脆停下來把網(wǎng)站改成Java,也有說要不然就把PHP改了,這些路不是沒走過,但是都不通。因?yàn)槟阕鲞@些事情就對其它團(tuán)隊(duì)造成依賴性了,實(shí)際上你在央求別人停下來去做你讓他們做的事情,這個(gè)在Facebook是行不通的。在后來2011年、2012年有個(gè)很厲害的人總結(jié)過一次,他跟整個(gè)Facebook的人說,我看了一下,F(xiàn)acebook所有成功的項(xiàng)目都有一個(gè)特點(diǎn),就是真的不對其他任何團(tuán)隊(duì),不對其他任何人有依賴性,只要是透明化項(xiàng)目,只要你這個(gè)項(xiàng)目做出來不需要太多其他人參與的,做出來對大家都是有益的,這些項(xiàng)目是容易成功的。在這么紛繁復(fù)雜的組織里,不是說他不認(rèn)可你的想法,他有自己的本職工作,所以你不能依賴他,他說我很忙,我把你這個(gè)事安排在下個(gè)月,漸漸這個(gè)事就泡湯了。
不過,我把這個(gè)(去中心化)講的特別好,并不是說它沒有弊端,其實(shí)有時(shí)候它是很有弊端的。舉一個(gè)特別極端的例子,扎克(馬克·扎克伯格)向大家抱怨,他說,你知道嗎,本來我想做一件事,可是我找不著任何人幫我做這件事,因?yàn)榇蠹沂诸^都有自己的事情。他說我想做這個(gè),為什么沒有人幫我做這個(gè)事情。他就在那兒哭訴這個(gè)事情,我們大家都笑了,就是沒人理他。這種事情在早年發(fā)生的特別特別多,到后來公司的人多了,公司有大的項(xiàng)目的方向,人也多了,可能扎克就能找到人幫他做這件事了。
再講一個(gè)極端的例子,好還是不好,我也不知道。就是我們沒有一個(gè)小組去幫助其他的團(tuán)隊(duì)去QA,沒有專門的QA團(tuán)隊(duì)。因?yàn)榇蠹也幌Ma(chǎn)生這種依賴性,怎么依賴?你說他是QA團(tuán)隊(duì),難道我的產(chǎn)品發(fā)布之前還要征求他的同意?QA也不愿意依賴你的團(tuán)隊(duì),我今天在這兒QA了,明天你就把這個(gè)方案改了,我的工作還沒有完成。QA會(huì)在公司造成一種依賴性,這個(gè)依賴性在某種意義上來講會(huì)讓產(chǎn)品減速。當(dāng)然,這個(gè)問題仁者見仁,智者見智。Facebook一直灌輸這樣的思想,不能用QA,用的話我這個(gè)產(chǎn)品怎么才能第二天就可以推出來?就是在這樣的文化下,QA很難產(chǎn)生。
所以到后來,即使公司這么大了,我們現(xiàn)在去看整個(gè)Facebook,還是每一個(gè)團(tuán)隊(duì)負(fù)責(zé)自己整個(gè)的Stack,前端用什么,手機(jī)上是什么樣,后端用什么,是不是用C++,全是這個(gè)團(tuán)隊(duì)來操作,如果出現(xiàn)了問題,自己團(tuán)隊(duì)來看。如果研發(fā)一個(gè)產(chǎn)品所有的工作,全是自己的團(tuán)隊(duì)來負(fù)責(zé),這樣就把依賴性很好地約束在自己管轄的范疇內(nèi),甚至所有的成員都在一個(gè)桌子之內(nèi),這樣基本沒有溝通成本。Hack文化和這個(gè)組織結(jié)構(gòu)是息息相關(guān)的。在Hack文化下,工程師就不想要一個(gè)有依賴性的組織結(jié)構(gòu)。在誰也不管誰,誰也不服誰的情況下,他可以隨心所欲寫Code,真的不在乎code的質(zhì)量或者規(guī)范。真的有依賴的話,可能QA的人要QA我了,還要小心點(diǎn)(笑)。
思維方式:善于爭論,用數(shù)據(jù)說話
第三個(gè)我講的是思維方式,思維方式其實(shí)跟文化有一些類似的地方,F(xiàn)acebook的人有才華,他有自己的思想和主見,他對很多產(chǎn)品的方向,對很多的事情都有很強(qiáng)的想法。強(qiáng)到什么程度,強(qiáng)到員工之間經(jīng)常爭論不休,這個(gè)在早年的時(shí)候特別嚴(yán)重,到2010年的時(shí)候,公司說不行了,同學(xué)們,這樣爭論太傷感情了,大家互相之間還是要有同情之心,畢竟我們在一起工作了這么些年,還是要有一份愛在這兒的。這從另外一個(gè)角度來解讀,就是Facebook人之間的爭論,有的時(shí)候真的特別激烈。
但是爭論歸爭論,我們很明確的知道,將來怎么解決這個(gè)爭論。怎么解決?就是用數(shù)據(jù)去說話。你可以有你的想法,你說這個(gè)網(wǎng)頁必須按照你的設(shè)計(jì),我也可以有我的想法,我說網(wǎng)頁是這樣的。你可以爭論,但是是騾子是馬拉出去遛遛。
最后就是大家爭論太多了,發(fā)展出來一個(gè)非常完善的AB測試系統(tǒng)。所以看Facebook軟件系統(tǒng)真正的功能性的code寫的可能有20%、30%,但還有40%的code都是去幫助這百分之二三十去搜集數(shù)據(jù),去印證它好還是不好。它花了我們很多精力到網(wǎng)頁上搜集數(shù)據(jù),去反過來看我們這個(gè)運(yùn)行情況是怎么樣的。無論是UI的,還是整個(gè)流程,還是整個(gè)非常大的產(chǎn)品也好,實(shí)際上都是這樣的,都是去試出來的。這個(gè)試出來的背后多多少少都是有爭論在里面,因?yàn)檎娴氖谴蠹艺l也不服誰。
甚至公司的這種思維方式有時(shí)候會(huì)非常極端,極端到什么地步?Facebook的人這樣認(rèn)為,任何事情我都可以評論,我都可以發(fā)表我的見解。大家認(rèn)為我們公司的愿景啊這些,無論任何的事情,我們都是可以拿出來討論的。
最逗的一件事情是差不多2008年時(shí)候,那個(gè)時(shí)候公司開始完善了,公司說,員工們,其實(shí)我們真的是一個(gè)公司,我們是有假期的。我們有三個(gè)星期的年假——HR的人說三個(gè)星期的假是指三五十五天的假。他發(fā)郵件的時(shí)候是說三個(gè)星期的假,但是很多人都理解三七二十一天。等公司公布的時(shí)候大家就開始爭論,說這個(gè)不對,應(yīng)該按二十一天,有人說你太可笑了,明明是十五天。結(jié)果你猜Facebook后來做了什么?Facebook把這個(gè)HR炒了,說你連郵件都不會(huì)寫,讓大家有這么大的爭論。與此同時(shí),F(xiàn)acebook直到今天也是每個(gè)人有21天的年假。這個(gè)雖說是一個(gè)可笑的故事,就是這么一個(gè)事情被Facebook爭論成這樣了,更不用說有理有據(jù)的爭論。
這個(gè)思維方式就是這樣,他認(rèn)為我跟你爭論是Ok的,我跟你爭論并不是我不尊敬你。大家最常說的,就是我特別尊敬你的,但我不同意你的想法,我認(rèn)為這個(gè)事情是這樣,然后列出一二三四五。其實(shí)大家都在爭論當(dāng)中成長,達(dá)到共識(shí),慢慢形成同樣的思維方式。所以我覺得,如果說公司還小,真的可以花一些時(shí)間和精力去開發(fā)一批這樣的工具,讓公司內(nèi)部員工可以很好的有一個(gè)地方去爭論這些事情,而且不要怕大家爭論,不要怕大家有不同的意見,這才是真正的公司員工,這是把心思放在你這個(gè)公司上的表現(xiàn)。
你可以去控制一下場面,讓大家在爭論的時(shí)候不傷和氣,但是最后還是要鼓勵(lì)員工百花齊放,百家爭鳴的氛圍。這個(gè)氛圍其實(shí)Facebook到后來的時(shí)候是越來越弱了。要說2013、2014年大家都非常非??蜌?,就沒有表面的沖突,別人要說一件什么事,要說有不同意見的人的話,他可能只是小小的,弱弱地問一句,再不然的話,就是底下很禮貌地講一句話,你覺得這樣好嗎?其實(shí)這表面看起來很平靜,但是沒有把尖銳的問題拿到桌面上。
公司很小的時(shí)候,或者說需要一個(gè)高效研發(fā)團(tuán)隊(duì)的時(shí)候,你必須要把很多的問題拿到桌面來探討,而且希望大家在爭論的過程中,大家真正地意識(shí)到自己才是那個(gè)主人公,自己不是幫公司打工的那個(gè)人,自己正兒八經(jīng)用大腦真正思考公司面臨的問題。
創(chuàng)業(yè)公司要招強(qiáng)人
最后如果強(qiáng)調(diào)的話,就像我剛才提到的,F(xiàn)acebook早期的員工有一批人非常杰出,就像我剛才提到的那個(gè)高中畢業(yè)的小孩,他沒有上過大學(xué),但是他寫代碼的能力很強(qiáng),是可以挑大梁的任務(wù)。早期至少有五六個(gè)人把這個(gè)團(tuán)隊(duì)的技術(shù)水平帶到一個(gè)新的高度上,因此雖然用Hack文化,但代碼質(zhì)量并不特別差。所以在雇人的時(shí)候真的要做到寧缺毋濫,就是說我寧可花更長時(shí)間雇人,但是雇進(jìn)來的人一定是一個(gè)特別強(qiáng)的人,因?yàn)樗傻暮玫脑?,他?huì)在無形中帶動(dòng)周圍的同事。如果雇工作效率不是很高的人,這個(gè)團(tuán)隊(duì)就會(huì)跑偏了。所以剛開始的人還真是挺重要的。
我現(xiàn)在回想起來,我加入的時(shí)候有四五十人,這四五十人都是強(qiáng)手?,F(xiàn)在即使回過頭來,他們有人說,海平,你們這批人早期進(jìn)來是Facebook的員工,是不是你們這幫人有運(yùn)氣?只是沾了早進(jìn)公司的光,而后面進(jìn)來的人比早期進(jìn)來的人要強(qiáng)。我說這是毫無疑問的,后面會(huì)有更強(qiáng)的人,但是比例上來講,后面的強(qiáng)人往多了算有20%就不錯(cuò)了,但是我們說早期的四五十人,強(qiáng)的至少在90%以上,這是一個(gè)很高的數(shù)字。90%的這些人甚至到六七年以后,能很輕松地負(fù)責(zé)一個(gè)大的團(tuán)隊(duì)產(chǎn)品開發(fā)。這些人具備快速學(xué)習(xí)的能力,他會(huì)迅速地把自己轉(zhuǎn)化成所需要的那個(gè)領(lǐng)域的專業(yè)人士。早期的時(shí)候有了這批人,才能夠把這個(gè)公司的文化給定住。如果說90%的人都是這樣的話,那么剩下的10%的人形不成氣候,而這90%的人把公司高效運(yùn)轉(zhuǎn)起來了,到了有五六百人的時(shí)候,有百分之五六十的人很強(qiáng),以至于這個(gè)公司到后來越來越強(qiáng)。早期的員工在最后見面的時(shí)候,都有一種惺惺相惜的感覺,因?yàn)槟愦騼?nèi)心里是很佩服他的,你知道他確實(shí)很強(qiáng)。我不知道別人怎么看我,我就是很自信,大言不慚地分享自己的感想,我們這批人互相見面,就覺得我們就應(yīng)該是那批成功的團(tuán)隊(duì),我們當(dāng)年就是做了很強(qiáng)的事情。
所以早期做的時(shí)候就要抓住這點(diǎn),使自己的團(tuán)隊(duì)有這樣很強(qiáng)的人,你可以花很長時(shí)間去招一個(gè)人,或者接觸的人稍微有點(diǎn)弱,就不要他了。說實(shí)話,一般的人可能做某些事情很熟練,看起來快,但很強(qiáng)的人給他一點(diǎn)點(diǎn)時(shí)間,也能把事做了,并且從整體上會(huì)做的更好。所以當(dāng)公司開始起來的過程中,招到強(qiáng)人是很重要的。
本文作者:
趙海平,2007年加入只有不到50個(gè)軟件工程師的Facebook,致力于軟件性能和架構(gòu)分析,在此期間創(chuàng)建了HipHop項(xiàng)目,重新編寫和實(shí)現(xiàn)PHP語言,使其速度提高5到6倍,為公司節(jié)約數(shù)十億美元。HipHop項(xiàng)目之后,致力于“用異步處理來優(yōu)化分布式系統(tǒng)”的設(shè)計(jì)理念中,并為此做了多項(xiàng)分布式數(shù)據(jù)庫的優(yōu)化研究,在PHP語言中加入了yield和generator的新功能,來幫助日趨復(fù)雜的Facebook 網(wǎng)頁設(shè)計(jì)。