以Facebook為案例剖析科技公司應有的工具文化
編者按:本文由 @王淮 Harry 哥 撰寫,摘自他即將出版的新書。王淮是 Facebook 早期員工,中國藉第二位工程師第一位研發經理。
前言
前段時間和大眾點評的 CEO 張濤聊天的時候碰到內部工具這個話題,我們都非常推崇一個優秀的技術公司應有有一個非常強勢的工具文化。在工具上,我有很深的體會,我說那不如我把我的理解通過 Facebook 的一些實踐例子來闡述一下,希望對科技公司有些幫助。
不斷發展、改進公司的內部工具,可以極大提高每個員工的工作效率,可以減少運營人員的數目;這樣既改善了整體協調,又減少了整體開支。
為了幫助工程師更好地進行產品開發,Facebook 對于內部工具(Tools)是非常非常關注的。招聘我進公司的總監黃易山,就是這方面一個最有力的倡導者,他極度建議,公司要把最好的人才放到工具開發那一塊,因為工具做好了,可以達到事半功倍的效果,所有人的效率都可以得到提高,而不僅僅是工程師。
Facebook 有兩個工具組。一個叫研發工具組(Dev Tools),專門負責研發工具的開發和維護,所有有助于工程師開發速度和質量的工具,主要服務對象是內部工程師。另外一個叫網站支持和工具組(Site Support and Tools),主要負責公司里面所有的通用工具的開發和維護,關注的主要是方便用戶和 Facebook 的交流以及 Facebook 內部的溝通,主要都是通訊工具,服務對象是用戶和所有員工。
研發工具有哪些呢?
一開始新的工程師加入 Facebook,需要分配自己的開發服務器,Facebook 就做了一個工具來管理分配所有的開發專用服務器。在一個頁面上你可以很清晰的看到所有的開發服務器,包括哪些人是現在的使用者,什么時候申請分配的,服務器的操作系統版本,配置信息等等;對于空余的服務器,你可以一鍵申請,并自動初始化該服務器。這讓剛加入的菜鳥們可以迅速的獲得自己的研發活動空間。
工程師最重要的工作就是寫代碼。針對代碼管理,Facebook 做了很多工具,這里解釋部分工具供參考。Facebook 的代碼庫管理是通過一種叫 GIT 的開源管理系統,為此開發了一些工具來集成 GIT。比如,一個工具是在提交代碼之前自動的檢測所修改的代碼是否符合公司代碼規范,如果不符合,該工具會自動警告,但把決定權交給工程師。Facebook 提倡對修改的代碼寫測試案例,在代碼提交時會自動檢測是否存在覆蓋這些修改的測試案例,如果沒有,會警告,但工程師仍然可以強制提交。但這種情況下代碼若出錯給網站帶來巨大危害的話,工程師可能會被嚴厲批評,因為這本是可以避免的錯誤,是人性的狂傲忽視了工具的提醒。在代碼審查(Code Review)方面,Facebook 做了一個可視化的工具,現已開源,叫 Phabricator;工程師可以在頁面上非常方便的針對每一段(單行或者多行)代碼進行交互討論;負責審查的工程師可以接受代碼改變,可以提出疑問要求原作者繼續修改,可以提出自己不適合以推出該代碼審查,等等。只有代碼被明確接受之后才能被工程師提交到服務器端的代碼庫,這一點集成到提交工具中強制執行。基本理念就是凡是被很多人不斷重復的好的習慣,要將其自動化,綁定到工具之中。以“Don’t make me think”的方式來推廣好的 practice。
Facebook 的代碼發布是灰度發布,所以做了一個方便設計灰度發布的工具。在這個工具中,工程師和產品經理(也可以授權給其他非研發人員)可以設計新產品發布的目標人群特點(比如年齡,性別,地域,教育,等等方面做出限制)及發布的人群比例(在0-100% 之間自由調整),所有的改變不需要代碼的改變,只需要在工具頁面上點擊鼠標即可,讓灰度發布變得很輕松。
發布的過程由一個利用點對點(BitTorrent)算法實現的工具進行多線程同時發布,對于更新幾十萬臺機器只需要幾十分鐘。由于是不間斷的發布,對公眾的服務不可以停,所以 Facebook 會將一部分的機器從公眾服務狀態中拿下來,更新之后再放回,然后繼續下一批,直到所有機器都被更新。這樣就可以保證在任意狀態都有足夠多的機器來支持用戶訪問。整個工程都是通過工具來自動實現。而監控這個發布工程的進展,也有一個工具檢測并且將其進度可視化,你可以很方便的看到哪些服務器更新了,現在正在更新哪些服務器,整個網站的進度是百分之幾,等等。
發布之后的數據監測更是重點。Facebook 做了很多工具讓數據監測變得容易。數據收集只要1-2行代碼即可完成,數據的整理分類存儲皆在后臺的上萬臺服務器上自動完成,數據的可視化報表只需要通過一個頁面工具點點鼠標設置即可即時生成,而不需要任何代碼;數據波動的自動警報也可以設置,可以自動發郵件發短信,可以要求 24 小時全球輪班的站點穩定工程部門(Site Reliability Engineering)按照你既定的反應方案,直到最后打電話給你,直接把你從床上拽起來。在 4 年半內這樣的事件發生在我身上至少有 10 次了。
還有一種工具是人為的,我們組經常用。就是把最最重要的目標及相關的任務,目標日期,負責人等信息寫到白板上掛到我們最近的墻。每天一抬頭就可以看到,每次開會都會路過,時刻提醒我們最最重要的事情是什么。這種工具對我們組非常有效。
網站支持和內部通訊工具有哪些呢?
在所有通訊工具以上,是處理用戶和 Facebook 之間通訊的工具。 針對常見的問題(尤其是關于如何使用某項功能的問題),Facebook 在用戶提交的時候,嘗試將其引導到網站幫助或 FAQ 的網頁。但這無法滿足所有人,尤其是和個人特殊情況相關的問題,仍然有很大一批的用戶會堅持提交問題,這時候 Facebook 內部的處理工具做得最重要的事情就是把相關問題自動分配到最相關的運營組(routing),比如和支付欺詐相關的問題應當自動分配到反欺詐運維組的那十幾個人那邊。然后工具會提供常見的通用解決方案,比如如果是選擇退款,可以做到一鍵退款,絕大多數的回信內容自動產生(用戶姓名,原問題等個體信息都會自動嵌入),運維人員可以選擇要不要修改內容,然后選擇發送。如果針對某一個功能的問題突然多起來,工具會自動發現,并提醒運維人員手動查看;運維人員可以根據實際情況決定要不要工程師介入尋找并修復可能的問題根源。所有用戶問題的回復率,回復滿意度,交互次數等等都會被統計或抽樣統計,以保證客服服務的質量。
另外一個重要的工具就是招聘的工具。Facebook 有一套專門的做題系統(Puzzle System)嘗試去篩選可靠的工程師。這套系統是一個專門的 Recruiting Engineering 組做的,包括題庫的管理和更新,自動提交系統和打分系統等等。如果在解題這個環節脫穎而出的話公司獵頭(Recruiter)會給工程師打電話安排下一步的電話面試。另外一種活動電話面試的途徑是通過內部推薦。所有的內部推薦都是通過專門的人才提交工具來上傳簡歷,這個工具和整個招人系統結合,并注明這是一個內部推薦,誰是推薦人。而整個面試,包括誰應該參與面試,誰參與了面試,每一步面試官對應聘者的評價和打分,都在工具里被很好的記錄和顯示出來,當然還有必不可少的權限控制 – 只有參加面試的人員才能夠看到關于應聘者整個流程的所有資料。最后,該工具允許打印所有的相關資料以幫助決策委員會討論該應聘者時擁有所有相關數據。
還有一個重要工具就是每六個月一次的業績評價工具。這個工具要允許員工自己對自己評價,員工互相評價,員工和老板之間互評,等等;還要考慮權限的管理。并不是一個很容易開發的工具。這個工具一開始是內部開發,但后來還是決定使用 Rypple 來提供專業的業績評價工具。
關于工具的一些思考
在 Rypple 的例子中要強調一點,Facebook 是一個工具驅動的公司,但這并不表示所有的工具都要自己開發。工具開發是手段,而不是目的,Facebook 的目的是打造一個最好的社交網站。因此,如果某個需要的工具有其他更專業的人做得更好的話,Facebook 非常樂意付費買他們的服務,而把自己的精力集中在核心產品上。這就是為什么 Facebook 花大筆錢購買數據庫軟件 MySQL 的支持服務,購買 Rypple 的工具的原因。
還有很多其他的工具。Facebook 希望通過工具的方式來解決所有可能想到的問題,比如要請假有相應的工具,你可以說明休息多長時間,你需要讓哪些人知道這些情況等;所有新的想法的提出,討論,讓在線頭腦風暴變成了可能;各種電子設備如電腦,手機等 IT 服務的請求和處理,也通過工具來解決……能夠想到的地方就盡可能用工具。與物理工具不同,計算機工具可以實現“杠桿效應”的反復累積,通過組合這些“杠桿效應”可以達到更高的層級。
因此,公司的工作效率,影響到你需要雇用的員工數,公司的成本究竟是多少,并將直接影響到公司內部產品的獨創性。黃易山就認為,工具團隊不應該是一個由二線員工組成的“事后諸葛亮”的后勤部門,公司里最有才華的工程師應該用公司自己的工具來工作,并且企業文化里要優先反映這些。當公司過了最一開始開發原型證明概念的萌芽階段之后,開發出優秀的工具并繼續加以改善、更新,這比尋找下一個偉大的創意更重要。
我最近跟國內一些技術公司的高管們討論過有關工具的話題,有些人非常贊同,也想通過工具來解決很多工程性的問題。比如,你要在公司里推廣一些規范性方面的規則,一種傳統的方法就是反反復復地強調,另一種就是開發出好用的工具,把這些東西固化在里面,借助工具進行強制性地推廣,就解決了很多問題。像 Facebook 沒有專門的軟件質量測試人員,都是工程師自己進行,公司也有這方面的工具,把測試過程中重復性的工作集中起來,自動化實現,只有一些必須要個性化處理的由工程師具體再去做。再比如我在開發反欺詐系統時,將欺詐案例識別直接拋給人工處理當然是最簡單的方式,但我們希望通過自動處理來解決大部分的欺詐案例,而把精力則放在那些確實需要單獨處理的特殊案例上,最后決定的方向是“進行自動處理”和“建立反饋機制”,設計出用于用戶報告(外部工具)和案例審查(內部工具)的工具。這樣一來,我們也可以自動采集客戶支持部門的處理意見,并集成到下一輪的機器學習中去,工具會越加精確和聰明且與時俱進。
在 Facebook 2005~2006年的發展中,公司根據不斷增長的用戶數量,聘請了成比例的客戶服務人員。當后來有1,000萬用戶時,公司的客戶服務人員不到 20 個。到 Facebook 的用戶數量達到 1 億時,很明顯,公司不能用相同的速度來增加員工數量,所以公司讓內部方案團隊與客戶服務分析師的工作配合得更加緊密,建立了更具創新性的工具和用戶界面,極大地提高了客戶服務部門的工作效率。通過內部工具團隊的產品,他們分析了目前已完成建立的工作并創建了定制方案來提高效率,方法是讓電腦去做可自動化處理的部分并優化用戶體驗,這樣客戶服務分析師就可以專注于人工最擅長處理的事務。
不斷發展、改進公司的內部工具,可以減少運營人員的雇用,讓每個員工的效率更高,這樣既改善了整體協調(員工數量少意味著協調更容易進行),又減少了整體開支。如今,Facebook 的每一位工程師服務的用戶數超過 100 萬,雖然用戶數量的持續增長,這種效率優勢更加明顯。
工具文化的最大挑戰
不過有一個現實的最大挑戰是,工具團隊要招聘新員工有一定的難度。Facebook 的用戶已經達到數億,而且還在不斷增長,如果你開發的是直接面向用戶的產品,每天有那么多人在使用,那帶來的成就感非常棒。而你要說服新員工去開發內部工具,說這樣可以帶給工程師以及其他同事更高的效率、最終幫助公司做出更好的產品,相對是間接并缺乏吸引力的。 所以,工具團隊在招聘上花了很多工夫,想各種辦法找到合適的人。
一種方式是用一些具體的工具提高效率的案例和數據來做理性說服;這需要在開發工具的同時要檢測工具使用前后的效率變化。當你有確確實實的數字來告訴最好的工程師,來吧,我們對公司的貢獻不比做產品的那些人差,正是我們的工具讓他們的效率提高了這么多,所以所有人的工作成果都有我們的一部分功勞。當然,為了吸引內部最好的人才愿意到工具團隊,企業文化中也一定要著重反映出這一點:在不同的公開場合私下會面都不斷的強調其重要性,讓所有人都清楚,公司將內部工具視為持續的重要投資。另外一個可供參考的竅門就是集中精力努力說服幾位整個工程部門認同的頂尖工程師加入工具組,具有很好的示范效果和磁鐵效應。如果真正做到如此重視,最優秀的工程師是愿意加入工具團隊的,可以大大提升同事們的效率,從而更好地服務于用戶,這也是一種外部用戶所感受不到的成就感。