不斷發展、改進公司的內部工具,可以極大地提高每個員工的工作效率,可以減少運營人員的數量。這樣既改善了整體協調,又減少了整體開支。
為幫助工程師更好地進行產品開發,Facebook對內部工具(Tools)是非常非常關注的。招聘我進公司的總監黃易山,就是這方麵一個最有力的倡導者。他極力強調,公司要把最好的人才放到工具開發那一塊,因為工具做好了,可以達到事半功倍的效果,所有人的效率都可以得到提高,而不僅僅是工程師。
Facebook有兩個工具組。一個叫研發工具組(Dev Tools),專門負責研發工具的開發和維護,包括所有有助於工程師開發速度和質量的工具,主要服務對象是內部工程師。另外一個叫網站支持和工具組(Site Support and Tools),主要負責公司裏所有通用工具的開發和維護,關注的主要是如何方便用戶和Facebook的交流以及Facebook內部的溝通,主要都是通信工具,服務對象是用戶和所有員工。
研發工具有哪些呢?
新的工程師剛加入Facebook時,需要分配自己的開發服務器,公司就做了一個工具來管理分配所有的開發專用服務器。在一個頁麵上,你可以很清晰地看到所有的開發服務器,包括哪些人是現在的使用者、什麼時候申請分配的、服務器的操作係統版本、配置信息等。對於空餘的服務器,你可以一鍵申請,並自動初始化該服務器。這讓剛加入的菜鳥們可以迅速地獲得自己的研發活動空間。
工程師最重要的工作就是寫代碼。針對代碼管理,公司也開發了很多工具。我在這裏介紹部分工具供參考。Facebook的代碼庫管理是通過一種叫GIT的開源管理係統,為此開發了一些工具來集成GIT。比如有一個工具是在提交代碼之前自動檢測所修改的代碼是否符合公司代碼規範,如果不符合,該工具會自動警告,但把決定權交給工程師。Facebook提倡對修改的代碼寫測試案例,在代碼提交時自動檢測是否存在覆蓋這些修改的測試案例,如果沒有則會警告,但工程師仍然可以強製提交。但這種情況下,代碼若出錯給網站帶來巨大危害的話,工程師可能會被嚴厲批評,因為這本是可以避免的錯誤,是人性的狂傲忽視了工具的提醒。在代碼審查(Code Review)方麵,Facebook做了一個可視化的工具,現已開源,叫Phabricator。工程師可以在頁麵上非常方便地針對每一段(單行或者多行)代碼進行交互討論;負責審查的工程師可以接受代碼改變,可以提出疑問要求原作者繼續修改,可以提出自己不適合以退出該代碼審查,等等。隻有代碼被明確接受後,才能被工程師提交到服務器端的代碼庫,這一點被集成到提交工具中強製執行。這些工具的基本理念就是,凡是被很多人不斷重複的好習慣,要將其自動化,綁定到工具之中。以“Don’t Make Me Think”(別讓我多想)的方式來推廣好習慣。
Facebook的代碼發布是灰度發布,所以開發了一個方便設計灰度發布的工具。在這個工具中,工程師和產品經理(也可以授權給其他非研發人員)可以設計新產品發布的目標人群特點(比如對年齡、性別、地域、受教育程度等方麵的限製)及發布的人群比例(在0%~100%之間自由調整),所有的改變都不需要修改代碼,隻需要在工具頁麵上點擊鼠標即可,讓灰度發布變得很輕鬆。
發布過程由一個利用點對點(Bit Torrent)算法實現的工具進行多線程同時發布,更新幾十萬台機器隻需要幾十分鍾。由於是不間斷地發布,對公眾的服務不可以停,所以Facebook會將一部分機器從公眾服務狀態中拿下來,更新之後再放回,然後繼續下一批,直到所有機器都被更新。這樣就可以保證在任意狀態下都有足夠多的機器來支持用戶訪問。整個過程都是通過工具自動實現的。而監控這個發布過程的進展,也有一個工具用於監測並且將其進度可視化,你可以很方便地看到哪些服務器更新了,現在正在更新哪些服務器,整個網站的進度是百分之幾,等等 。