Facebook 的 CTO,他們的辦公室,和一流的創(chuàng)業(yè)文化
標(biāo)簽:
編者按:對(duì)于一家創(chuàng)業(yè)公司來說,一個(gè)合格優(yōu)秀的 CTO 絕對(duì)是可遇不可求的:需要對(duì)技術(shù)有前瞻,對(duì)產(chǎn)業(yè)格局有判斷,對(duì)管理有心得,情商還不能低。這篇文章整理自峰瑞資本組織的內(nèi)部創(chuàng)業(yè)公司 CTO 交流會(huì),峰瑞資本技術(shù)合伙人、前 Facebook 工程師覃超,以及神州專車 CTO、前 Facebook 工程師徐萬(wàn)鴻,向創(chuàng)業(yè)者講述創(chuàng)業(yè)公司應(yīng)該如何創(chuàng)造自己的工程師文化,以及 Facebook 的看家產(chǎn)品 News Feed 背后的原理。本文經(jīng)授權(quán)轉(zhuǎn)載自峰瑞資本(freesvc),歡迎交流討論。
一、Facebook 的 CTO 都在做些什么?
覃超:峰瑞資本技術(shù)合伙人,前 Facebook 工程師。
我在 2010-2014 年在 Facebook 工作,主要負(fù)責(zé)前端移動(dòng)開發(fā),從 Facebook Phone 到 iOS/Android Facebook App 和 Messager 等做過很多功能。同時(shí)我之前做過 PHP 后端的東西。
Facebook 第一特點(diǎn)就是重視技術(shù)兼設(shè)計(jì)。不像蘋果純?cè)O(shè)計(jì)而谷歌純技術(shù),F(xiàn)acebook 是各占 50%。公司整體裝飾有意外多的藝術(shù)元素,而新的總部大樓更是由巨擘 Frank Gehry 設(shè)計(jì)的。
公司內(nèi)部的彩虹樣式裝修,是美國(guó)高院宣布同性戀合法時(shí)加上的,也體現(xiàn)公司對(duì)于不同事物的包容和尊重。產(chǎn)品的活力和企業(yè)文化包容有很大的關(guān)系,所以我建議創(chuàng)業(yè)公司不妨都包容開放一點(diǎn),比如放一個(gè)無(wú)人機(jī)或者 Oculus VR 的眼鏡就很棒。
公司里還有很多 Poster,其實(shí)我覺得這 Branding 和企業(yè)的 “政治教育” 內(nèi)容。這些海報(bào)并不是專門一個(gè)人做,公司每個(gè)人都做,且公司有一個(gè)房間是專門造這些東西的材料,只要你把你的設(shè)計(jì)交給他們,最后海報(bào)就會(huì)制作出來。
Facebook 另一個(gè)特點(diǎn)就是開放,沒有嚴(yán)格的權(quán)限控制,例如 iOS 可以看到后端代碼,PHP 可以看安卓的代碼。任何員工只要在公司的內(nèi)網(wǎng)里,就可以隨時(shí)打開數(shù)據(jù)展示的頁(yè)面,然后看到公司的 MAU(Monthly Active User-月活),DAU(Daily Active Users-日活)以及其他按照地區(qū)和功能切分的細(xì)節(jié)數(shù)據(jù)。這樣可以節(jié)省工作的管理開支,每個(gè)人也不會(huì)覺得束手束腳。
另外我們的工作空間就是網(wǎng)吧式的結(jié)構(gòu)。這樣有兩個(gè)特點(diǎn),好交流也鬧哄哄。最重要是有 Peer Pressure,比如你遲到或者打游戲,都會(huì)被別人看到。比起其他很多美國(guó)的好處是,在 Facebook 工作刷 News Feed 或者微博和知乎是不會(huì)被限制的。
公司另一特點(diǎn)是默認(rèn)給予員工最大程度的信任(按照老美的話說:trust by default),這也是美國(guó)文化的特點(diǎn)之一。一進(jìn)公司就默認(rèn)對(duì)你信任和尊重。它的相對(duì)應(yīng)面是絕對(duì)強(qiáng)的執(zhí)法能力,如果你泄露公司機(jī)密,則立馬把你開除。歷史上出現(xiàn)過幾次 Zuck 在 QA 的會(huì)議上說的公司機(jī)密被泄露的事件,那些泄密者最后基本都被開除。
一個(gè)公司最重要的是氣氛的和諧。不僅是程序猿之間,還有和設(shè)計(jì)師、PM,他們也會(huì)參加一些討論,且我們一定要坐在一起,這樣類似 UI 上細(xì)節(jié)的問題,比如顏色、像素對(duì)齊等,都可以當(dāng)面溝通。即使 Facebook 的遠(yuǎn)程會(huì)議系統(tǒng)和線上溝通工具都已經(jīng)很健全了,但公司還是鼓勵(lì)坐在一起工作。
Facebook 項(xiàng)目的人員配比:一個(gè)項(xiàng)目一般是兩三個(gè)設(shè)計(jì)師、5-10 個(gè)工程師 2-3 個(gè)產(chǎn)品經(jīng)理。每個(gè)月一波推進(jìn)(Scrum 里強(qiáng)調(diào)的 sprint),包括 2-3 個(gè)功能,按每個(gè)功能分一小組來做,但設(shè)計(jì)師可能會(huì)同時(shí)做多個(gè)設(shè)計(jì)。Facebook 的流程其實(shí)比較傳統(tǒng),但又夾雜很多敏捷開發(fā)的元素:一般是設(shè)計(jì)師先進(jìn)行設(shè)計(jì),然后工程師來開發(fā),但整個(gè)過程中雙方又經(jīng)常有交互。整個(gè)產(chǎn)品研發(fā)過程中,所有人都互相尊重、互相合作,從一開始設(shè)計(jì)師、工程師、PM 都會(huì)在一起討論,做出來之后還會(huì)坐在一起討論,會(huì)馬上給一些反饋,然后馬上修改好。
工程師寫代碼的時(shí)候也會(huì)跟設(shè)計(jì)師一起交流,交流用的是 IRC 外加 Facebook Chat。但這些我覺得比較過時(shí),比起微信來說,它們算難用的,甚至還沒 QQ 好用。任務(wù)管理方面,F(xiàn)acebook 有自己的 Inhouse Task 系統(tǒng),可惜沒有開源。類似的工具,現(xiàn)在國(guó)內(nèi) Trello 、Tower、Teambition 或者 Jira 就很好用,可以用來做產(chǎn)品上的規(guī)劃,開發(fā)進(jìn)度管理和 bug tracking。
最后我們的 IC 、release、monitoring 這些全部都是內(nèi)部工具,開發(fā)花了不少人力,對(duì)于創(chuàng)業(yè)公司不是特別適用。對(duì)持續(xù)繼承來說,我覺得最經(jīng)典的是 Jenkins,但是它的問題就是功能繁復(fù)、界面像 80 年代的軟件。如果你們用 Github 的話,我也推薦 Travis CI 和 Drone。
在硅谷公司里,在開發(fā)流程上我覺得最重要的就是:Code Review。Facebook、Google、Uber 到現(xiàn)在的 Airbnb,無(wú)一不是強(qiáng)制要求 Code Review。Code review 過程中,不僅是可以互相檢查對(duì)方的代碼,還可以自動(dòng)跑 lint 和 unit test,對(duì)于代碼質(zhì)量的提高和去除沒必要的 bug 非常有幫助。
這里重點(diǎn)推薦一下 Facebook 的 Phabricator。它是個(gè)開源的代碼審核和任務(wù)管理工具;它的其他功能也極其豐富;還可以搭在私有的服務(wù)器上,使其代碼和數(shù)據(jù)不會(huì)被盜用。另外我們基金已經(jīng)把它進(jìn)行了漢化,變成中文的一個(gè)定制版本,并且擴(kuò)展到其他功能上。比如對(duì) BP 的審核工作:我們自建了機(jī)器人來監(jiān)控我們 BP 郵箱的內(nèi)容,然后對(duì)于每一個(gè)進(jìn)來的 BP,自動(dòng)在系統(tǒng)中建立 Deal Review Task;然后我們的 BP 審核人員和投資經(jīng)理們跟進(jìn)。
最后一點(diǎn) Facebook 讓我覺得印象深刻的是它對(duì)于工程師技術(shù)能力的高要求和提供的一整套培訓(xùn)。另外就是在硅谷公司工作,要學(xué)會(huì)有效地描述表達(dá)一個(gè)觀點(diǎn),逼自己去學(xué)和反復(fù)復(fù)習(xí)。我覺得反復(fù)的一個(gè)過程很重要。反復(fù)的過程中,看似在做重復(fù)的事情,但是每次我都會(huì)意外地迸發(fā)出新的靈感。最后對(duì)于設(shè)計(jì)這一塊,我們有一個(gè)特別強(qiáng)大的設(shè)計(jì)工具 Origami,可以很方便做交互設(shè)計(jì),并且支持直接生成特效的代碼。
二、Facebook 的 News Feed(新聞流)是怎么做的?
徐萬(wàn)鴻:神州專車 CTO,前 Facebook 工程師
新聞流(News Feed)是 Facebook 最重要的產(chǎn)品,有 10 億用戶,平均每個(gè)用戶每天會(huì)收到他關(guān)注的朋友 / 主頁(yè)所推送的 2000 個(gè)以上 stories。
實(shí)時(shí)發(fā)布,不漏掉重要的 story
從發(fā)出 story 到其他人接受 story 的時(shí)間在 1 秒之內(nèi),其中排序所花的時(shí)間在 200 毫秒之內(nèi)。Data loss 要小于 1E-6,實(shí)現(xiàn)這一點(diǎn)的關(guān)鍵在于系統(tǒng)架構(gòu)。
把最好的內(nèi)容放在前面
用戶更傾向于與頁(yè)面前面的內(nèi)容互動(dòng),所以把更好的內(nèi)容放在前面會(huì)帶來用戶在 Facebook 上更大的參與度。實(shí)現(xiàn)這一點(diǎn)的關(guān)鍵在于 Ranking 部分。
系統(tǒng)架構(gòu)部分
Push model 和 Pull model 這兩種模型都是可行的。
Push model 寫入多次,讀取一次。如果有 1W 粉絲,發(fā)布一條消息,會(huì)存儲(chǔ)在每個(gè)粉絲那里,存儲(chǔ) 1W 次。這個(gè)模型速度比較快,但是需要存儲(chǔ)比較多。Pull model 寫入一次,讀取多次。發(fā)布的都寫在一個(gè)庫(kù)里,然后每個(gè)用戶都來讀這個(gè)數(shù)據(jù)。
Facebook 內(nèi)部更傾向于 Pull model,因?yàn)?Pushmodel 需要太多的存儲(chǔ)空間。
Ranking 部分
如何確定哪些是更好的 stories?我們需要給每一個(gè) story 打分。我們賦予不同類型的行為不同的權(quán)重。比如 click, like, comment。這幾種行為中,comment 需要更多的代價(jià)。click 的代價(jià)很小,而 comment 意味著用付出更多的時(shí)間來互動(dòng),所以我們會(huì)給 comment 更高的權(quán)值。
對(duì)于每一個(gè) story,我們需要預(yù)測(cè)這個(gè) story 被推送給用戶后點(diǎn)擊、點(diǎn)贊、評(píng)論的概率。這里會(huì)用到機(jī)器學(xué)習(xí)(machine learning)的算法。先要實(shí)時(shí)地生成 features,然后要利用數(shù)據(jù)來 train models,最后 publish models,得到每個(gè)用戶對(duì)每個(gè) story 的每種行為的概率。
關(guān)于個(gè)性化的部分,采用的是通用的模型和個(gè)性化的信息。如果能針對(duì)每個(gè)用戶做不同的 model,效果會(huì)更好。但是用戶數(shù)目太多,這部分的工作量過大。
同時(shí)這也是一個(gè)實(shí)時(shí)反饋的系統(tǒng)。用戶對(duì)每個(gè) story 的行為會(huì)實(shí)時(shí)反饋到這個(gè)模型里面,重新訓(xùn)練模型,讓效果越來越好。