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