從 Facebook 的 GitHub 帳戶中能夠看到,Facebook 已經開源的開源項目有近 300 個,領域涉及移動、前端、Web、後端、大數據、數據庫、工具和硬件等。Facebook 開源項目負責人 James Pearce 曾在 OSCON 解釋過 Facebook 究竟爲什麼要使用、支持和發佈開源項目。具體以下:php
共享 Facebook 的代碼(一般是軟件「棧」,偶爾也包括硬件設計)促進了這個世界的創新。這些代碼幫助他人更快地開發軟件。由於 Facebook 不是一家軟件公司,因此它在開源過程當中沒有面臨競爭對手的威脅,相反,開源帶來的價值在逐漸顯現。用戶使用 Facebook 的開源代碼能夠更快地構建應用,而他們也樂於回饋代碼,使 Facebook 從中受益。
擁抱開源,意味着 Facebook 必須一開始就寫出更優秀的軟件。若是他們知道某個軟件從誕生起就要公開,那就必需要好好作,提升可用性和可靠性,由於未來外面的人都會用它。這種壓力也會給公司內部帶來更多的價值。
開源帶來了共享挑戰的機會。開源項目面臨的難題會吸引一些外部的優秀人員,而結果是,他們也帶動了公司內部人員的能力提高。天天 Facebook 都承載了超過一億人的溝通互聯,何以能作到?惟有開源的力量。前端
下面是我整理的 Facebook 現有的比較活躍的開源項目列表,歡迎交流討論。java
移動開發框架:React Nativereact
React Native 是 Facebook 在 2015 年開源的基於 React.js 的移動開發框架,它的設計理念是讓移動應用既擁有 Native 的用戶體驗,同時又能夠保留 React 的開發效率,提升代碼的複用率。React Native 的宗旨是,學習一次,高效編寫跨平臺原生應用。開發者可使用 JavaScript 編寫應用,並利用相同的核心代碼就能夠建立 Web、iOS 和 Android 平臺的原生應用,目前已經實現了對 iOS 和 Android 兩大平臺的支持。git
GitHub 主頁:https://github.com/facebook/react-native github
Star 數量:33108web
數據查詢語言:GraphQL算法
GraphQL 是 Facebook 開源的數據查詢語言。Facebook 在構建移動應用程序時,須要用 API 獲取足夠強大的數據來描述全部的臉譜,同時簡單易學易用,因而開發了 GraphQL,並支持天天千億級的調用。GraphQL 不是像 MySQL 或 Redis 這樣直接面向數據的接口,而是面向已經存在的應用代碼的接口。你能夠把 GraphQL 看做是爲了調用應用服務器上的方法的一些內嵌的 RPC。sql
GitHub 主頁:https://github.com/facebook/graphql數據庫
Star 數量:2902
大數據查詢引擎:Presto
Presto 是 Facebook 開發的一款分佈式 SQL 引擎,主要用於針對各類大小的數據源(從 GB 到 PB)來運行交互式分析查詢。Facebook 建立 Presto 的主要目的在於幫助他們更快地分析數據,由於 Facebook 的數據量一直在持續增加,產品週期的節奏也變得愈來愈快。自從 2013 年 11 月開源後,Presto 的用戶量呈現了爆發式增加。諸如 Airbnb、京東、Dropbox 以及 Netflix 等公司都將 Presto 做爲本身的交互式查詢引擎。
GitHub 主頁:https://github.com/prestodb/presto
Star 數量:4792
PHP 執行引擎:HHVM
HHVM(HipHop Virtual Machine)是 Facebook 於 2013 年開源的 PHP 執行引擎。它採用一種 JIT(just-in-time)的編譯機制實現了高性能,同時又保持對 PHP 語法的充分支持。HHVM 經常用做獨立的服務器,用於替代 Apache 與 mod_php,旨在執行使用 Hack 與 PHP 所編寫的程序。它使用了即時編譯方法來實現超高的性能,同時又保持了 PHP 開發者所習慣的靈活性。
GitHub 主頁:https://github.com/facebook/hhvm
Star 數量:13652
JavaScript 庫:React
React 是 Facebook 開發的用於構建用戶界面的 JavaScript 庫,現已爲不少公司所用,由於它採用了一種不一樣的方式來構建應用:藉助於 React,開發者能夠將應用分解爲彼此解耦的獨立組件,這樣就能夠獨立維護並迭代各類組件了。2015 年,React 有兩個主要的發佈,同時還發布了 React Native,而且發佈了新的開發者工具。如今已經有愈來愈多的公司(包括 Netflix 與 WordPress)開始使用 React 構建本身的產品了。
GitHub 主頁:https://github.com/facebook/react
Star 數量:43146
鍵值存儲系統:RocksDB
RocksDB 是 Facebook 開源的嵌入式、可持久化鍵值存儲系統,它基於 Google 的 LevelDB,但提升了擴展性能夠運行在多核處理器上,能夠有效使用快速存儲,支持 IO 綁定、內存和一次寫負荷。過去一段時間,RocksDB 在社區很是流行,Facebook 分析其緣由在於它可以對因爲網絡延遲等緣由形成的慢查詢響應時間起到消除的做用,RocksDB 很是靈活,徹底能夠針對各類新興的硬件發展趨勢進行定製。LinkedIn 與 Yahoo 都是 RocksDB 的重度使用者。
GitHub 主頁:https://github.com/facebook/rocksdb
Star 數量:5418
人工智能硬件平臺:Big Sur
近些年,人工智能和機器學習方向取得了長足的發展。據 Kevin Lee 透露,Facebook 的 AI 軟件已經可以閱讀故事、回答相關場景的問題、玩遊戲以及經過一些例子來學習非指定的內容。做爲計算密集型的應用,AI 軟件的性能與數據集規模/硬件性能密切相關。尤爲是硬件方面,高性能微處理器、存儲器以及圖形處理器(Graphics Processing Unit,GPU)的發展爲 AI 算法的快速運行提供了堅實基礎。爲了進一步更好地服務大規模 AI 計算,Facebook 推出了基於 GPU 的、用於訓練神經網絡的「Big Sur」硬件系統。
瞭解更多:http://www.infoq.com/cn/news/2015/12/Facebook-BigSur-OpenSource
網絡模擬測試工具:ATC
Augmented Traffic Control(ATC)可以利用 Wi-Fi 網絡模擬 2G、2.5G(Edge)、3G 以及 LTE 4G 移動網絡環境,測試工程師們能夠快速在各類不一樣的模擬網絡環境中切換,從而實現對智能手機和 App 在不一樣國家地區和應用環境下的性能表現進行測試。ATC 是 Facebook 內部團隊在 2013 年的一次 Hackathon 活動上開發出來的工具,其原理實際是利用了 Linux 流量控制系統,經過純 Python 的網絡庫 pyroute2 調用 netlink 的 API 控制,而開發其的目的是爲了確保更多的用戶得到最好的應用體驗。
GitHub 主頁:https://github.com/facebook/augmented-traffic-control
Star 數量:2962
開源數據庫:HydraBase
HydraBase 是 HBase 數據庫的升級版。Facebook 是 HBase 的重度用戶,Facebook 的 HBase 數據庫系統存儲着 Facebook 的不少關鍵業務數據,包括內部監控系統、搜索索引、流數據分析以及數據抓取等。HydraBase 相比 HBase 穩定性和可用性更高,能夠減小服務器宕機時間。HydraBase 可以讓一個數據域分佈在多個域服務器中,域服務器之間能相互備份,所以可以大大減小數據恢復所用的時間。Facebook 聲稱 HydraBase 能將 Facebook 整年的宕機時間縮減到不到 5 分鐘。
Facebook 已經將 HydraBase 捐贈給 Apache,目前不少代碼都已經被合併到 HBase 中。
關係型數據庫:WebScaleSQL
WebScaleSQL 是基於 MySQL 5.6 社區版本改編的 MySQL 通用分支,基於 GPL 開源協議發佈。WebScaleSQL 目前已經作了不少性能改進工做,包括:客戶端異步協調、邏輯預讀、查詢限流、服務端線程池優化、InnoDB 大頁支持等等。WebScaleSQL 上的功能都是很「Web Scale」和接地氣的。好比線程池優化,WebScaleSQL 基於 Mariadb 的線程池實現進行重寫並優化,對讀寫隊列進行分離,從新設計隊列優先級策略,避免了餓死現象。要知道線程餓死在有些場景下是很嚴重的。尤爲是在併發鏈接數每每很大的互聯網應用裏面。
Star 數量:2940
代碼審查工具 Phabricator
代碼審查方面,Facebook 開源了可視化工具 Phabricator。工程師能夠在頁面上很是方便的針對每一段(單行或者多行)代碼進行交互討論;負責審查的工程師能夠接受代碼改變,能夠提出疑問要求原做者繼續修改,能夠提出本身不適合以推出該代碼審查,等等。只有代碼被明確接受以後才能被工程師提交到服務器端的代碼庫,這一點集成到提交工具中強制執行。
GitHub 主頁:https://github.com/phacility/phabricator
Star 數量:7022
C語言事件框架:libPhenom
libPhenom 是 Facebook 發佈的一個C語言事件框架,用於構建高性能和高可擴展的系統。支持多線程、提供內存管理和經常使用數據結構、JSON 處理。特性以下:
Star 數量:1334
C++HTTP 框架:Proxygen
Proxygen 是一款 Facebook 開源的支持 SPDY 3.1 的 HTTP 框架。其目的不是替換 Apache,而是有能力建立一個專用的高性能 Web 服務器,使其能夠嵌入到 Facebook 提供 Web 服務的現有應用中。Facebook 從 2011 年開始構建一款代理服務器(Proxygen 這個名字也是由此而來),在該項目演進並在生產環境中測試了數年以後,Facebook 將其代碼開源了。 Facebook 內部作的基準測試代表,在一個 Proxygen echo 服務器上,每秒能夠支撐多達 304 197 次基於 SPDY 3.1 的內存 GET 請求。
GitHub 主頁:https://github.com/facebook/proxygen
Star 數量:3961
開源動畫庫:Pop
Pop 是 Facebook 推出的一個可擴展的 iOS 和 OS X 動畫庫,其新聞聚合閱讀應用 Paper 背後的核心技術就是由 Pop 支持。除了增長基本的靜態動畫外,還支持 Spring 和衰變更態動畫,可很是方便的構建現實的、基於物理的交互。Pop 動畫庫的動畫效果很是流暢,由於它使用了 CADisplayLink 來刷新畫面(幀),一秒鐘刷新幀數爲 60 幀,接近於遊戲開發引擎。Pop 動畫的自成體系,與系統的 CoreAnimation 有很大的區別,但使用上很是類似。
GitHub 主頁:https://github.com/facebook/pop
Star 數量:15468
Memcached 協議路由器:Mcrouter
Mcrouter 是一個基於 Memcached 協議的路由器,它是 Facebook 緩存架構的核心組件,在峯值的時候,它可以處理每秒 50 億次的請求。Memcached 服務的客戶端都會使用標準 ASCII 編碼的 Memcached 協議,因此對於客戶端來講,Mcrouter 就像一個 Memcached 服務器;而對於服務器端來講,Memcached 卻又像一個普通的 Memcached 客戶端。Mcrouter 主要使用 C++ 開發,且使用C開發了功能庫部分,使用 Ragel 開發了協議解析部分,使用開源庫 Folly 和 Fbthrift 處理異步網絡。
GitHub 主頁:https://github.com/facebook/mcrouter
Star 數量:1473
靜態代碼分析工具:Infer
Infer 是 Facebook 的開發團隊在代碼提交內部評審時,用來執行增量分析的一款靜態分析工具,在代碼提交到代碼庫或者部署到用戶的設備以前找出 bug。由 OCaml 語言編寫的 Infer 目前能檢測出空指針訪問、資源泄露以及內存泄露,可對C、Java 或 Objective-C 代碼進行檢測。Facebook 使用 Infer 自動驗證 iOS 和安卓上的移動應用的代碼,bug 報告的正確率達 80%。Infer 經過捕獲編譯命令,把要被編譯的文件轉換爲可用於分析潛在錯誤的中間語言格式。整個過程是增量進行的,意味着一般只有那些有修改過並提交編譯的文件纔會被 Infer 分析。Infer 還集成了大量的構建或編譯工具,包括 Gradle、Maven、Buck、Xcodebuild、clang、make 和 javac。
GitHub 主頁:https://github.com/facebook/infer
Star 數量:5259
操做系統監控工具:osquery
osquery 是一款面向 OSX 和 Linux 的操做系統檢測框架。它將操做系統暴露爲一個高性能的關係型數據庫,容許用戶編寫 SQL 查詢查看操做系統數據。在 osquery 中,SQL 表表明像下面這樣的抽象概念:
正在運行的進程
已加載的內核模塊
打開的網絡鏈接
雖然 osquery 利用了很是底層的操做系統 API,但它容許用戶在 Ubuntu、CentOS 和 Mac OS X 上構建並使用它。osquery 性能極高,內存佔用小,支持用戶在整個基礎設施上執行查詢。
GitHub 主頁:https://github.com/facebook/osquery
Star 數量:6209
JavaScript 靜態類型檢查工具:Flow
Flow 是 Facebook 出品的一個 JavaScript 代碼的靜態類型檢查工具,該工具採用開放源碼的 OCaml(Objective Caml)語言開發,。Flow 可以幫助開發人員查找出 JavaScript 代碼中的類型錯誤,從而提升開發效率和代碼質量。Flow 已經可以捕獲 JavaScript 代碼中的常見問題,如靜態類型轉換不匹配、空指針引用等問題。同時,Flow 還爲 JavaScript 新增了類型語法,如類型別名。
GitHub 主頁:https://github.com/facebook/flow
Star 數量:7510
Haskell 庫:Haxl
Facebook 開源了 Haxl,一個爲高效併發數據訪問而開發的庫。這個庫
一方面利用了 Haskell 的傳統優點,好比表達力很強的類型系統、對正確性和安全性的保障,另外一方面也受益於 GHC(Haskell 編譯器)的高性能運行時庫,解決煩人的隱式併發數據訪問的問題。Haxl 簡化了對遠程數據的訪問,好比數據庫或網站服務。對同一數據源的多個訪問請求,或同時從不一樣的數據源請求數據,它都能批量處理,而且緩存上一次的結果。
GitHub 主頁:https://github.com/facebook/Haxl
Star 數量:2257
Web 應用架構:Flux
Facebook 認爲 MVC 沒法知足他們的擴展需求,所以他們決定使用另外一種模式:Flux。因爲 Facebook 很是巨大的代碼庫和龐大的組織,因此 MVC 真的很快就變得很是複雜,因而他們得出結論,認爲 MVC 不適合於大規模應用。
每次 Facebook 工程師努力增長一項新特性時,系統的複雜性成級數增加,代碼變得「脆弱和不可預測」。對於剛接觸某個代碼庫的開發人員來講,這正成爲一個嚴重的問題。Flux 是一個 Facebook 開發的、利用單向數據流實現的應用架構,用於 React。Flux 應用有三個主要的部分組成:調度程序、存儲和視圖(React 組件)。
GitHub 主頁:https://github.com/facebook/flux
Star 數量:11616
JavaScript 單元測試工具:Jest
Jest 是一個開源的、基於 Jasmine 框架的 JavaScript 單元測試工具。Jest 源於 Facebook 兩年前的構想,用於快速、可靠地測試 Web 聊天應用。它吸引了公司內部的興趣,Facebook 的一名軟件工程師 Jeff Morrison 半年前又重拾這個項目,改善它的性能,並將其開源。
在最基礎層面,Jest 被設計用於快速、簡單地編寫地道的 JavaScript 測試。Jest 自動模擬 require ()返回的 CommonJS 模塊,並提供了包括內置的測試環境 Dom API 支持、合理的默認值、預處理代碼和默認執行並行測試在內的特性。經過在並行進程中同時運行測試,Jest 讓測試更快地結束。
GitHub 主頁:https://github.com/facebook/jest
Star 數量:4119
基於 Atom 的開發工具集:Nuclide
Nuclide 是 Facebook 推出的一套基於 Atom 的開發工具集,用於開發基於 Hack 的 Web 應用,提供自動完成和 JavaScript 類型檢查,內建 React 開發支持,並支持 Facebook 最新的 React Native 庫,支持 Facebook 的 Flow JavaScript 類型檢查器。Nuclide 的設計目是爲了在整個公司爲工程師提供一套標準的開發者經驗——不管他們從事純 iOS 應用,React 和 React Native 代碼,或者在 Hack 運行咱們的 HHVM 網絡服務。
GitHub 主頁:https://github.com/facebook/nuclide
Star 數量:4412
Android 調試工具:Stetho
Stetho 是一個 Android 應用的調試工具。當 Android 應用集成 Stetho 時,開發者能夠經過訪問 Chrome,在 Chrome Developer Tools 中查看應用佈局、網絡請求、sqlite、preference 等等,可視化一切應用操做(更重要的是不用 root)。開發者也可經過它的 dumpapp 工具提供的命令行接口來訪問應用內部。
GitHub 主頁:https://github.com/facebook/stetho
Star 數量:5079
Android 編譯工具:Buck
Buck 受到了 Google Blaze 的啓發,建立它是爲了處理與多個 Android 庫有複雜關聯的應用程序,從而減小構建時間。引入 Buck 以後,Facebook 開發的四種本地 Android 應用程序中使用了單一的代碼樹和構建工具,這讓開發更簡單、更流暢,錯誤更少。最初的 38 個庫在四種應用程序之間共享了 500 個模塊。使用 Buck 替換了最初基於 Ant 的系統以後,第一次針對代碼樹運行時,構建時間就從 3 分 40 秒降到 1 分 30 秒。
相比傳統的 Android 編譯工具,Buck 憑藉多核及並行技術,極大加速了 Android 工程的編譯速度。同時,屢次編譯過程當中,它會對未變更的模塊進行標記,以增量式編譯的方式進一步提升速度。Buck 自帶編譯腳本生成功能,並提供編譯過程當中單元測試的代碼覆蓋率等數據表單,還爲沒法用 Ant 工具編譯的模塊提供了便捷的編譯方式。Buck 跟 IntelliJ 結合緊密,可經過簡單的編譯腳本生成該 IDE 可用的工程,極大下降了本地 IDE 開發後向服務器遷移的成本。
GitHub 主頁:https://github.com/facebook/buck
Star 數量:2686
彈簧模型 Java 庫:Rebound
Rebound 是一個彈簧模型 Java 庫,由 Facebook 於 2013 年 10 月在 Mobile@Scale 大會上發佈,旨在應用中引入真實的物理世界,建立讓人感受很接近天然的動畫。Rebound 不是通用物理庫,可是,彈簧模型可以驅動各類各樣的動畫。Rebound 的簡單特性使它很容易被集成,以及做爲構建塊建立如呼叫、滾動條和切換開關等複雜組件。
GitHub 主頁:https://github.com/facebook/rebound
Star 數量:3455
移動應用交互設計工具:Origami
如今 App 的原型設計愈來愈複雜,之前使用 PhotoShop 製做靜態圖的方式不能知足各類交互效果的展現,Paper 的首席設計師 Mike Matas 在加入 Facebook 之初就推薦你們使用 Quartz Composer 來快速構建應用原型,而 Facebook 的設計團隊也很快接收並喜歡上了這個工具,在隨後的應用,他們遇到了一個問題:對於產品設計師來講,Quartz Composer 的學習曲線過高。
因而 Mike 就帶頭開發了 Origami。2013 年 12 月,Facebook 開源了基於 Quartz Composer 的插件 Origami,設計師能夠經過 Origami 可以快速構建移動應用交互原型,隨後交付給工程師實現,值得注意的是 Origami 無需編程背景,新發布的 Paper 從項目設計之初全部的原型設計都是採用 Origami 來實現。
GitHub 主頁:https://github.com/facebook/origami
Star 數量:3186
UI 測試工具:huxley
Huxley 是一個基於 Python 用於 Web 應用 UI 測試的工具,Huxley 能夠錄下 UI 操做過程,並回放自動測試。自動測試時和 UI 基準對比,UI 不符合預期時,會保存變化的 UI 並警告你。
Star 數量:3891
Facebook iOS UI 工具:ComponentKit
ComponentKit 使用功能性和聲明性(declarative)的方法來進行建立界面,和以往不一樣的是,ComponentKit 使用單向數據流的形式從不可變的模型映射到不可變的組件來肯定視圖的顯示方式。ComponentKit 的 declarative 看上去和 declarative UI (QML) 差很少,其實差得遠。QML 更偏向於 UI 設計的描述性,而 ComponentKit 則是作好基本 UI 和事件之間的聯繫,讓事件設計和 UI 設計能夠分開單獨完成。
GitHub 主頁:https://github.com/facebook/componentkit
Star 數量:3095
iOS 內存監測工具:FBMemoryProfiler
FBMemoryProfiler 是 Facebook 開源的一款用於分析 iOS 內存使用和檢測循環引用的工具庫。
手機設備的內存是一個共享資源。應用程序可能會不當的耗盡內存、崩潰,或者遭遇大幅度的性能下降。當分配了一塊內存,並設置了對象以後,若是在使用完了以後忘記釋放,這就會發生內存泄露。這意味着系統是沒法回收內存並交予他人使用,這也最終意味着咱們的內存將會逐漸耗盡。
在 Facebook,有不少工程師在代碼庫的不一樣部分上工做。這不可避免的會發生內存泄露。當發生內存泄露以後,工程師須要儘快找到並修復它們。一些工具已經能夠找到內存泄露,可是它們須要大量的人工干預。自動化能夠在不須要更多開發者的狀況下,更快的找到內存泄露。爲了解決這個問題,Facebook 作了一套工具來自動化的處理和修復代碼庫中的一些問題,這個工具就是 FBMemoryProfiler。
Star 數量:1657