硅谷盛行的“工具文化”
不斷發(fā)展、改進公司的內(nèi)部工具,可以極大地提高每個員工的工作效率,可以減少運營人員的數(shù)量。這樣既改善了整體協(xié)調(diào),又減少了整體開支。
為幫助工程師更好地進行產(chǎn)品開發(fā),F(xiàn)acebook對內(nèi)部工具(Tools)是非常非常關(guān)注的。招聘我進公司的總監(jiān)黃易山,就是這方面一個最有力的倡導者。他極力強調(diào),公司要把最好的人才放到工具開發(fā)那一塊,因為工具做好了,可以達到事半功倍的效果,所有人的效率都可以得到提高,而不僅僅是工程師。
Facebook有兩個工具組。一個叫研發(fā)工具組(DevTools),專門負責研發(fā)工具的開發(fā)和維護,包括所有有助于工程師開發(fā)速度和質(zhì)量的工具,主要服務對象是內(nèi)部工程師。另外一個叫網(wǎng)站支持和工具組(SiteSupport andTools),主要負責公司里所有通用工具的開發(fā)和維護,關(guān)注的主要是如何方便用戶和Facebook的交流以及Facebook內(nèi)部的溝通,主要都是通信工具,服務對象是用戶和所有員工。
研發(fā)工具有哪些呢?
新的工程師剛加入Facebook時,需要分配自己的開發(fā)服務器,公司就做了一個工具來管理分配所有的開發(fā)專用服務器。在一個頁面上,你可以很清晰地看到所有的開發(fā)服務器,包括哪些人是現(xiàn)在的使用者、什么時候申請分配的、服務器的操作系統(tǒng)版本、配置信息等。對于空余的服務器,你可以一鍵申請,并自動初始化該服務器。這讓剛加入的菜鳥們可以迅速地獲得自己的研發(fā)活動空間。
工程師最重要的工作就是寫代碼。針對代碼管理,公司也開發(fā)了很多工具。我在這里介紹部分工具供參考。Facebook的代碼庫管理是通過一種叫GIT的開源管理系統(tǒng),為此開發(fā)了一些工具來集成GIT。比如有一個工具是在提交代碼之前自動檢測所修改的代碼是否符合公司代碼規(guī)范,如果不符合,該工具會自動警告,但把決定權(quán)交給工程師。Facebook提倡對修改的代碼寫測試案例,在代碼提交時自動檢測是否存在覆蓋這些修改的測試案例,如果沒有則會警告,但工程師仍然可以強制提交。但這種情況下,代碼若出錯給網(wǎng)站帶來巨大危害的話,工程師可能會被嚴厲批評,因為這本是可以避免的錯誤,是人性的狂傲忽視了工具的提醒。在代碼審查(CodeReview)方面,F(xiàn)acebook做了一個可視化的工具,現(xiàn)已開源,叫Phabricator。工程師可以在頁面上非常方便地針對每一段(單行或者多行)代碼進行交互討論;負責審查的工程師可以接受代碼改變,可以提出疑問要求原作者繼續(xù)修改,可以提出自己不適合以退出該代碼審查,等等。只有代碼被明確接受后,才能被工程師提交到服務器端的代碼庫,這一點被集成到提交工具中強制執(zhí)行。這些工具的基本理念就是,凡是被很多人不斷重復的好習慣,要將其自動化,綁定到工具之中。以“Don’tMake Me Think”(別讓我多想)的方式來推廣好習慣。
Facebook的代碼發(fā)布是灰度發(fā)布,所以開發(fā)了一個方便設(shè)計灰度發(fā)布的工具。在這個工具中,工程師和產(chǎn)品經(jīng)理(也可以授權(quán)給其他非研發(fā)人員)可以設(shè)計新產(chǎn)品發(fā)布的目標人群特點(比如對年齡、性別、地域、受教育程度等方面的限制)及發(fā)布的人群比例(在0%~100%之間自由調(diào)整),所有的改變都不需要修改代碼,只需要在工具頁面上點擊鼠標即可,讓灰度發(fā)布變得很輕松。
發(fā)布過程由一個利用點對點(BitTorrent)算法實現(xiàn)的工具進行多線程同時發(fā)布,更新幾十萬臺機器只需要幾十分鐘。由于是不間斷地發(fā)布,對公眾的服務不可以停,所以Facebook會將一部分機器從公眾服務狀態(tài)中拿下來,更新之后再放回,然后繼續(xù)下一批,直到所有機器都被更新。這樣就可以保證在任意狀態(tài)下都有足夠多的機器來支持用戶訪問。整個過程都是通過工具自動實現(xiàn)的。而監(jiān)控這個發(fā)布過程的進展,也有一個工具用于監(jiān)測并且將其進度可視化,你可以很方便地看到哪些服務器更新了,現(xiàn)在正在更新哪些服務器,整個網(wǎng)站的進度是百分之幾,等等。
發(fā)布之后的數(shù)據(jù)監(jiān)測更是重點,F(xiàn)acebook做了很多工具使之變得容易。數(shù)據(jù)收集只要1~2行代碼即可完成,數(shù)據(jù)的整理、分類和存儲皆在后臺的上萬臺服務器上自動完成,數(shù)據(jù)的可視化報表只需要通過一個頁面工具點點鼠標設(shè)置便可即時生成,不需要任何代碼。數(shù)據(jù)波動的自動警報也可以設(shè)置,可以自動發(fā)郵件、發(fā)短信,可以要求24小時全球輪班的站點穩(wěn)定工程部門(SiteReliabilityEngineering)按照你既定的反應方案去解決。如果還不行,最后會打電話給你,直接把你從床上拽起來。在Facebook工作的四年半時間里,這樣的事件至少在我身上發(fā)生了10次。
還有一種工具是人為的,我們組經(jīng)常用,就是把最最重要的目標及相關(guān)的任務、目標日期、負責人等信息寫到白板上,掛在離我們最近的墻上。每天一抬頭就可以看到,每次開會都會路過,時刻提醒我們最最重要的事情是什么,這種工具對我們組非常有效。
網(wǎng)站支持和內(nèi)部通信工具有哪些呢?
在如何處理用戶和Facebook之間通信這個問題上,針對常見的問題(尤其是關(guān)于如何使用某項功能的問題),F(xiàn)acebook在用戶提交時,嘗試將其引導到網(wǎng)站幫助或FAQ的頁面。但這并不能滿足所有人的需求,尤其是和個人特殊情況相關(guān)的問題,仍然有很大一批用戶會堅持提交問題,這時候Facebook內(nèi)部處理工具就要把問題自動分配(Routing)到最相關(guān)的運營組,比如,和支付欺詐相關(guān)的問題應當自動分配給反欺詐運維組的那十幾個人。然后,工具會提供常見的通用解決方案,比如,若選擇退款,可以做到一鍵退款,絕大多數(shù)回信內(nèi)容自動產(chǎn)生(用戶姓名、原問題等個體信息都會自動嵌入),運維人員可以選擇要不要修改內(nèi)容,然后發(fā)送。如果針對某一個功能的問題突然多起來,工具會自動發(fā)現(xiàn)并提醒運維人員手動查看,運維人員可以根據(jù)實際情況決定要不要工程師介入尋找并修復可能的問題根源。所有用戶問題的回復率、回復滿意度、交互次數(shù)等信息都會被統(tǒng)計或抽樣統(tǒng)計,以保證客戶服務的質(zhì)量。
另外一個重要工具是招聘工具。Facebook有一套專門的做題系統(tǒng)(PuzzleSystem)嘗試去篩選可靠的工程師。這套系統(tǒng)是一個專門的招聘工程(RecruitingEngineering)組做的,包括題庫的管理和更新、自動提交系統(tǒng)和打分系統(tǒng)等。如果在解題這個環(huán)節(jié)脫穎而出的話,公司獵頭(Recruiter)會給工程師打電話,安排他下一步的電話面試。另外一種獲得電話面試的途徑是通過內(nèi)部推薦。所有的內(nèi)部推薦都是通過專門的人才提交工具上傳簡歷,這個工具和整個招聘系統(tǒng)結(jié)合,并注明這是一個內(nèi)部推薦、誰是推薦人。而整個面試過程里,包括誰應該參與面試,誰實際參與了面試,每一步面試官對應聘者的評價和打分,都在工具里被很好地記錄和顯示出來。當然還有必不可少的權(quán)限控制——只有參加面試的人員才能夠看到關(guān)于應聘者整個流程的所有資料。最后,該工具允許打印所有的相關(guān)資料以幫助決策委員會在討論該應聘者時擁有全部的相關(guān)數(shù)據(jù)。
還有一個重要的工具,就是每六個月一次的業(yè)績評價工具。這個工具允許員工對自己評價、員工互相評價、員工和老板之間互評等,還要考慮權(quán)限的管理。這并不是一個很容易開發(fā)的工具,一開始是內(nèi)部開發(fā),但后來還是決定使用Rypple來提供專業(yè)的業(yè)績評價工具。
從這些工具可以看出,F(xiàn)acebook是一家工具驅(qū)動的公司,但這并不表示所有工具都要公司自己開發(fā)。必須清楚的是:工具開發(fā)是手段,而不是目的,F(xiàn)acebook的目的是打造一個最好的社交網(wǎng)站。因此,對于某個需要的工具,如果有更專業(yè)的人做得更好的話,F(xiàn)acebook非常樂意付費購買他們的服務,而把精力集中在核心產(chǎn)品上。這就是為什么Facebook會花大筆錢購買數(shù)據(jù)庫軟件MySQL的支持服務。
還有很多其他工具。Facebook希望通過工具來解決所有可能想到的問題,比如,要請假有相應工具,你可以說明休息多長時間,需要讓哪些人知道這些情況等;所有新想法的提出、討論,讓網(wǎng)絡(luò)頭腦風暴變成了可能;各種電子設(shè)備如電腦、手機等IT服務的請求和處理,通過工具來解決……能夠想到的地方就盡可能用工具。與物理工具不同,計算機工具可以實現(xiàn)“杠桿效應”的反復累積,通過組合這些“杠桿效應”可以達到更高的層級。
因此,公司的工作效率,影響到你需要雇用的員工數(shù),影響到公司的成本究竟是多少,并將直接影響到公司內(nèi)部產(chǎn)品的獨創(chuàng)性。黃易山就認為,工具團隊不應該是一個由二線員工組成的“事后諸葛亮”的后勤部門,公司里最有才華的工程師應該用公司自己的工具來工作,并且企業(yè)文化里要優(yōu)先反映這些。編寫出優(yōu)秀的工具并繼續(xù)加以改善、更新,這比尋找下一個偉大的創(chuàng)意更重要。
我最近跟國內(nèi)一些技術(shù)公司的高管們討論過有關(guān)工具的話題,有些人非常贊同,也想通過工具來解決很多工程性問題。比如你要在公司里推廣一些規(guī)范性的規(guī)則,一種傳統(tǒng)的方法是反復強調(diào),另一種是開發(fā)出好用的工具,把這些東西固定化在里面,借助工具進行強制性推廣,就能解決很多問題。Facebook沒有專門的軟件質(zhì)量測試人員,都是工程師自己進行。公司就有這方面的工具,把測試過程中重復性的工作集中起來,自動化實現(xiàn),只有一些必須要個性化處理的部分由工程師具體再去做。我在開發(fā)反欺詐系統(tǒng)時,將欺詐案例識別直接拋給人工處理當然是最簡單的方式,但我們希望通過自動處理來解決大部分欺詐案例,而把精力放在那些確實需要單獨處理的特殊案例上,最后決定的方向是“進行自動處理”和“建立反饋機制”,設(shè)計出用于用戶報告(外部工具)和案例審查(內(nèi)部工具)的工具。這樣一來,我們也可以自動采集客戶支持部門的處理意見,并集成到下一輪的機器學習中去,工具會越加精確、聰明,且與時俱進。
Facebook在2005~2006年的發(fā)展中,公司根據(jù)不斷增長的用戶數(shù)量,聘請了成比例的客戶服務人員。當后來有1000萬用戶時,公司的客戶服務人員還不到20個。到Facebook的用戶數(shù)量達到1億時,很明顯,公司不能用相同的速度來增加員工數(shù)量,所以公司讓內(nèi)部方案團隊與客戶服務分析師更加緊密地配合,推出了更具創(chuàng)新性的工具和用戶界面,極大地提高了客戶服務部門的工作效率。通過內(nèi)部工具團隊研發(fā)的產(chǎn)品,客戶服務部分析了目前已完成建立的工作并創(chuàng)建了定制方案,方法是讓電腦去做可自動化處理的部分并優(yōu)化用戶體驗,這樣客戶服務分析師就可以專注于人工最擅長處理的事務。
不斷發(fā)展、改進公司的內(nèi)部工具,可以減少招聘運營人員的費用,讓每個員工的效率更高,這樣既改善了整體協(xié)調(diào)(員工數(shù)量少意味著協(xié)調(diào)更容易進行),又減少了整體開支。如今,F(xiàn)acebook每一位工程師服務的用戶數(shù)均超過100萬人,隨著用戶數(shù)量的持續(xù)增長,這種效率優(yōu)勢將更加明顯。
不過有一個現(xiàn)實問題是,工具團隊要招聘新員工有一定難度。Facebook的用戶已經(jīng)達數(shù)億,而且還在不斷增長,如果你開發(fā)的是直接面向用戶的產(chǎn)品,每天有那么多人在使用,那成就感顯然非常棒。而你要說服新員工去開發(fā)內(nèi)部工具,稱這樣可以帶給工程師以及其他同事更高的效率、最終幫助公司做出更好的產(chǎn)品,這個理由顯然缺乏吸引力。所以,工具團隊在招聘上花了很多工夫,想各種辦法找到合適的人。
一種方式是用一些通過提高效率的具體案例和數(shù)據(jù)來做理性說服,這需要在開發(fā)工具的同時檢測工具使用前后的效率變化。當然,為了吸引內(nèi)部最好的人才愿意到工具團隊,企業(yè)文化中也一定要著重反映出這一點:公司將內(nèi)部工具視為持續(xù)的重要投資,以保持公司的領(lǐng)先地位。集中精力努力說服幾位頂尖工程師加入工具組,具有很好的示范效果和磁鐵效應。如果真正做到如此重視,最優(yōu)秀的工程師是愿意加入工具團隊的,這樣可以大大提升同事們的效率,從而更好地服務于用戶,這也是一種外部用戶所感受不到的成就感。
第四節(jié) Facebook的招聘標準:只和最好的人合作
一流人才只愿意和與自己水平相當?shù)娜斯彩拢麄兙墼谝黄饡兊酶谩R涣魅瞬艧o法容忍二流人才。
在招人的標準上堅持一點,讓面試官明白他們需要招到比他們更強(在某些方面),至少不會拖后腿的人,如果不是,那就拒絕平庸,不要妥協(xié)。
Facebook就是希望通過這樣的程序能找到一流的、合適的人才,這樣才能做出最好的產(chǎn)品,成就偉大事業(yè)。面試中的技術(shù)性問題就是解決“是否一流”的問題,文化性問題就是解決“是否合適”的問題。
一流人才只愿意和與自己水平相當?shù)娜斯彩拢麄兙墼谝黄饡兊酶谩R涣魅瞬艧o法容忍二流人才。那什么是“最好的人”?我個人的理解是能夠盡其所知,用其所長,學其所不能,從而迅速完成目標并遠超期望的人。他們的本能是挑戰(zhàn)自我,超越別人的期望,超越自己的期望。對他們來說,僅僅“足夠好”是不夠的。
全部由一流人才組成的團隊有很多好處。
1.這讓你更加愿意被委以重任。從我的經(jīng)驗來看,他們不會輕易信任不熟悉的人。如果你還沒有證明自己和他們一樣出色甚至更出色,他們寧愿獨立辛苦工作也不愿接受你的幫助,因為他們擔心你會搞砸。但當你證明自己之后,他們會信任你,放心把事情交給你一起合作。一個互幫互助的一流團隊才能真正做到1+1遠大于2。
2.通過完成艱巨任務,一流人才互設(shè)榜樣。你會想“真牛啊,這哥們兒竟然能把這玩意兒做出來,我得加油了”,對這種同伴帶來的壓力進行合理利用,可以大幅度提高工作表現(xiàn),并在團隊中形成良性循環(huán)。Facebook鼓勵不同項目間公開分享他們的苦與樂、成果與教訓,從不吝嗇對好項目的公開贊美,這樣才能讓榜樣的影響傳播開來。
3.一流人才喜歡互相挑戰(zhàn)。我記得有一位工程師總監(jiān)曾立下賭約——如果在規(guī)定時限之前完成網(wǎng)站翻譯平臺所需的代碼修改,他將把頭發(fā)染成藍色。這樣的挑戰(zhàn)把“枯燥”的工作變成了具有挑戰(zhàn)性的游戲。在玩游戲中寫程序比純粹地寫程序要有趣得多。當然公司里也有很多更加認真的挑戰(zhàn)。Facebook有個很知名的開源項目,公開叫HipHop,它是將PHP的代碼重寫成C++,然后再編譯成二進制代碼,可節(jié)省CPU資源40%以上。這個項目一開始沒有人相信能完成,但推動這個項目的華人工程師趙海平堅持了下來,并做到了。趙海平后來被美國《快公司》(FastCompany)雜志評為2010年度全世界最具創(chuàng)新精神的50人之一。這種高難度的挑戰(zhàn)在Facebook并不罕見。因為一流人才天生容易對挑戰(zhàn)上癮,不管是挑戰(zhàn)別人還是接受新的挑戰(zhàn)。
4.一流人才可以相互學到很多。每個一流人才都有自己“牛”的地方,彼此有很多可以互補之處。如果Facebook沒有這種學習的環(huán)境,我就可能不會在那兒待四年多。對缺乏經(jīng)驗的人來說,這點很有用。我們雇用非常聰明的畢業(yè)生(潛在的一流人才),這些人希望“引爆”自己來證明他們“牛”在何處,他們不愿到一個舒適、無挑戰(zhàn)的公司過日復一日的生活,他們希望通過不斷學習來豐富自己的經(jīng)驗,完成不可能完成的任務,并在職業(yè)生涯中前進,證明“我行”。毫無疑問,和一流人才在一起,才能更容易地實現(xiàn)這些目標。
那如何才能遠離非一流人才呢?首先,慢點招人(HireSlow)。在招人的標準上堅持一點,讓面試官明白他們需要招到在某些方面比他們更強,至少不會拖后腿的人。如果不是,那就拒絕平庸,不要妥協(xié)。我曾好幾次在招聘決策會議上發(fā)現(xiàn)履歷看起來很漂亮的應聘者無法拿到Offer,只因為某個面試官覺得這個人沒給他留下深刻的印象,沒有讓他“驚訝”。而有些獲得一致通過的候選人仍被放棄,因為大家都只是覺得他僅僅“符合要求”而已,沒有出彩的地方。在招人問題上,絕大多數(shù)情形下,要小心,不要冒進。Facebook也會雇用那些沒有全票通過、但有一兩票是“強烈推薦”的應聘者,或者這種應聘者本來就是通過內(nèi)部推薦而開始面試的,因為對于已有員工的“強烈推薦”不應輕易忽視,這時可以適度冒險。
其次,炒魷魚要快(FireFast)。使用非一流人才就像服用慢性毒藥,遲早會出事。Facebook要求所有的經(jīng)理人員對員工的表現(xiàn)要特別敏感,經(jīng)理如果發(fā)現(xiàn)員工所分配的任務經(jīng)常沒有完成或者答應的事情經(jīng)常沒有做到,如果是客觀原因,一定要盡力幫助解決;如果判斷為能力問題,那就通過合法的程序迅速將人炒掉。我見過幾次比較慢的解雇,對團隊造成了極大的負面影響。
這里講一個合作的組里發(fā)生的故事。我們組做的很大一部分工作是設(shè)計機器學習模型以對支付欺詐做自動判斷,所以對數(shù)據(jù)分析要求非常高。因此,我們在和我們合作的運營組中設(shè)立了機器運行數(shù)據(jù)專家的職位。2010年時,面試了一個劍橋大學畢業(yè)的博士,年紀比較大,他在面試中展露出非常淵博的關(guān)于機器學習的理論知識。光他展示出的論文就有5厘米厚,當然我也懶得看。通過他做實際的編程題目,我感覺他的工程實現(xiàn)能力并沒有達到我所希望的、能和我們組順利配合的標準。所以在那次面試中就我給了“不推薦”,但由于我只是幫合作的運營組招人,而且職位也不是工程師,對工程能力的要求相對要低,所以我沒有堅持反對招這個人。但后來發(fā)現(xiàn),我其實應該堅持。因為這位學究式的人物最適合待在研究所,他只知道不斷地提出一個又一個新辦法,卻不會把一個不完美的辦法不斷地實現(xiàn)出來,加以工程化,然后通過實際數(shù)據(jù)不斷完善。我覺得他的表現(xiàn)應該被注意到,并給予適當?shù)膲毫θジ倪M。于是向他的老板反映了這個情況,但他的老板不夠重視,沒有馬上采用我的意見。那我只能單方面地采取自己力所能及的措施——將他和我們組的項目隔離,因為我們組的工程師不希望他繼續(xù)參與這些項目——我們開始不邀請他到我們的項目會議中來,自己在工程師部門內(nèi)部去尋找相關(guān)的機器學習專家、有很強的編程實現(xiàn)能力的專家。此人后來在運營組內(nèi)部也造成了各種不作為和損失之后,終于離開了公司。我覺得他早幾個月就應該離開。倒不是說他不夠聰明,只是他想做的是研究,而公司想要的是把想法迅速地、高質(zhì)量地實現(xiàn)出來,然后在實踐中不斷改進,這種文化上的巨大差異和期望上的截然不同導致了必然的悲劇。