从 Facebook 的 GitHub 账户中可以看到,Facebook 已经开源的开源项目有近 300 个,领域涉及移动、前端、Web、后端、大数据、数据库、工具和硬件等。Facebook 开源项目负责人 James Pearce 曾在 OSCON 解释过 Facebook 究竟为何要使用、支持和发布开源项目。具体如下:

  共享 Facebook 的代码(通常是软件“栈”,偶尔也包括硬件设计)促进了这个世界的创新。这些代码帮助他人更快地开发软件。因为 Facebook 不是一家软件公司,所以它在开源过程中没有面临竞争对手的威胁,相反,开源带来的价值在逐渐显现。用户使用 Facebook 的开源代码可以更快地构建应用,而他们也乐于回馈代码,使 Facebook 从中受益。

  拥抱开源,意味着 Facebook 必须一开始就写出更优秀的软件。如果他们知道某个软件从诞生起就要公开,那就必须要好好做,提高可用性和可靠性,因为将来外面的人都会用它。这种压力也会给公司内部带来更多的价值。

  开源带来了共享挑战的机会。开源项目面临的难题会吸引一些外部的优秀人员,而结果是,他们也带动了公司内部人员的能力提升。每天 Facebook 都承载了超过一亿人的沟通互联,何以能做到?唯有开源的力量。

  下面是我整理的 Facebook 现有的比较活跃的开源项目列表,欢迎交流讨论。

  移动开发框架:React Native

  React Native 是 Facebook 在 2015 年开源的基于 React.js 的移动开发框架,它的设计理念是让移动应用既拥有 Native 的用户体验,同时又可以保留 React 的开发效率,提高代码的复用率。React Native 的宗旨是,学习一次,高效编写跨平台原生应用。开发者可以使用 JavaScript 编写应用,并利用相同的核心代码就可以创建 Web、iOS 和 Android 平台的原生应用,目前已经实现了对 iOS 和 Android 两大平台的支持。

  数据查询语言:GraphQL

  GraphQL 是 Facebook 开源的数据查询语言。Facebook 在构建移动应用程序时,需要用 API 获取足够强大的数据来描述所有的脸谱,同时简单易学易用,于是开发了 GraphQL,并支持每天千亿级的调用。GraphQL 不是像 MySQL 或 Redis 这样直接面向数据的接口,而是面向已经存在的应用代码的接口。你可以把 GraphQL 看作是为了调用应用服务器上的方法的一些内嵌的 RPC。

  大数据查询引擎:Presto

  Presto 是 Facebook 开发的一款分布式 SQL 引擎,主要用于针对各种大小的数据源(从 GB 到 PB)来运行交互式分析查询。Facebook 创建 Presto 的主要目的在于帮助他们更快地分析数据,因为 Facebook 的数据量一直在持续增长,产品周期的节奏也变得越来越快。自从 2013 年 11 月开源后,Presto 的用户量呈现了爆发式增长。诸如 Airbnb、京东、Dropbox 以及 Netflix 等公司都将 Presto 作为自己的交互式查询引擎。

  PHP 执行引擎:HHVM

  HHVM(HipHop Virtual Machine)是 Facebook 于 2013 年开源的 PHP 执行引擎。它采用一种 JIT(just-in-time)的编译机制实现了高性能,同时又保持对 PHP 语法的充分支持。HHVM 常常用作独立的服务器,用于替代 Apache 与 mod_php,旨在执行使用 Hack 与 PHP 所编写的程序。它使用了即时编译方法来实现超高的性能,同时又保持了 PHP 开发者所习惯的灵活性。

  JavaScript 库:React

  React 是 Facebook 开发的用于构建用户界面的 JavaScript 库,现已为很多公司所用,因为它采用了一种不同的方式来构建应用:借助于 React,开发者可以将应用分解为彼此解耦的独立组件,这样就可以独立维护并迭代各种组件了。2015 年,React 有两个主要的发布,同时还发布了 React Native,并且发布了新的开发者工具。现在已经有越来越多的公司(包括 Netflix 与 WordPress)开始使用 React 构建自己的产品了。

  键值存储系统:RocksDB

  RocksDB 是 Facebook 开源的嵌入式、可持久化键值存储系统,它基于 Google 的 LevelDB,但提高了扩展性可以运行在多核处理器上,可以有效使用快速存储,支持 IO 绑定、内存和一次写负荷。过去一段时间,RocksDB 在社区非常流行,Facebook 分析其原因在于它能够对由于网络延迟等原因造成的慢查询响应时间起到消除的作用,RocksDB 非常灵活,完全可以针对各种新兴的硬件发展趋势进行定制。LinkedIn 与 Yahoo 都是 RocksDB 的重度使用者。

  人工智能硬件平台:Big Sur

  近些年,人工智能和机器学习方向取得了长足的发展。据 Kevin Lee 透露,Facebook 的 AI 软件已经能够阅读故事、回答相关场景的问题、玩游戏以及通过一些例子来学习非指定的内容。作为计算密集型的应用,AI 软件的性能与数据集规模/硬件性能密切相关。尤其是硬件方面,高性能微处理器、存储器以及图形处理器(Graphics Processing Unit,GPU)的发展为 AI 算法的快速运行提供了坚实基础。为了进一步更好地服务大规模 AI 计算,Facebook 推出了基于 GPU 的、用于训练神经网络的“Big Sur”硬件系统。

  了解更多:​​javascript:void(0)​

  网络模拟测试工具:ATC

  Augmented Traffic Control(ATC)能够利用 Wi-Fi 网络模拟 2G、2.5G(Edge)、3G 以及 LTE 4G 移动网络环境,测试工程师们可以快速在各种不同的模拟网络环境中切换,从而实现对智能手机和 App 在不同国家地区和应用环境下的性能表现进行测试。ATC 是 Facebook 内部团队在 2013 年的一次 Hackathon 活动上开发出来的工具,其原理实际是利用了 Linux 流量控制系统,通过纯 Python 的网络库 pyroute2 调用 netlink 的 API 控制,而开发其的目的是为了确保更多的用户获得最好的应用体验。

  开源数据库: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 的线程池实现进行重写并优化,对读写队列进行分离,重新设计队列优先级策略,避免了饿死现象。要知道线程饿死在有些场景下是很严重的。尤其是在并发连接数往往很大的互联网应用里面。

  代码审查工具 Phabricator

  代码审查方面,Facebook 开源了可视化工具 Phabricator。工程师可以在页面上非常方便的针对每一段(单行或者多行)代码进行交互讨论;负责审查的工程师可以接受代码改变,可以提出疑问要求原作者继续修改,可以提出自己不适合以推出该代码审查,等等。只有代码被明确接受之后才能被工程师提交到服务器端的代码库,这一点集成到提交工具中强制执行。

  C语言事件框架:libPhenom

  libPhenom 是 Facebook 发布的一个C语言事件框架,用于构建高性能和高可扩展的系统。支持多线程、提供内存管理和常用数据结构、JSON 处理。特性如下:

  1. 带有计数器的内存管理——记录应用程序正使用的内存类型的次数
  2. 工作——分解你的应用程序并用调度管理来搞定它们
  3. 带缓冲的I/O流
  4. 常用的数据结构(哈希表、列表、队列)
  5. 数据类型的变种来使能 JSON 的序列化和反序列化
  6. 带有注册对象格式的 printf 的实现

  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 请求。

  开源动画库:Pop

  Pop 是 Facebook 推出的一个可扩展的 iOS 和 OS X 动画库,其新闻聚合阅读应用 Paper 背后的核心技术就是由 Pop 支持。除了增加基本的静态动画外,还支持 Spring 和衰变动态动画,可非常方便的构建现实的、基于物理的交互。Pop 动画库的动画效果非常流畅,因为它使用了 CADisplayLink 来刷新画面(帧),一秒钟刷新帧数为 60 帧,接近于游戏开发引擎。Pop 动画的自成体系,与系统的 CoreAnimation 有很大的区别,但使用上非常相似。

  Memcached 协议路由器:Mcrouter

  Mcrouter 是一个基于 Memcached 协议的路由器,它是 Facebook 缓存架构的核心组件,在峰值的时候,它能够处理每秒 50 亿次的请求。Memcached 服务的客户端都会使用标准 ASCII 编码的 Memcached 协议,所以对于客户端来说,Mcrouter 就像一个 Memcached 服务器;而对于服务器端来说,Memcached 却又像一个普通的 Memcached 客户端。Mcrouter 主要使用 C++ 开发,且使用C开发了功能库部分,使用 Ragel 开发了协议解析部分,使用开源库 Folly 和 Fbthrift 处理异步网络。

  静态代码分析工具: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。

  操作系统监控工具:osquery

  osquery 是一款面向 OSX 和 Linux 的操作系统检测框架。它将操作系统暴露为一个高性能的关系型数据库,允许用户编写 SQL 查询查看操作系统数据。在 osquery 中,SQL 表代表像下面这样的抽象概念:

  • 正在运行的进程
  • 已加载的内核模块
  • 打开的网络连接

  虽然 osquery 利用了非常底层的操作系统 API,但它允许用户在 Ubuntu、CentOS 和 Mac OS X 上构建并使用它。osquery 性能极高,内存占用小,支持用户在整个基础设施上执行查询。

  JavaScript 静态类型检查工具:Flow

  Flow 是 Facebook 出品的一个 JavaScript 代码的静态类型检查工具,该工具采用开放源码的 OCaml(Objective Caml)语言开发,。Flow 能够帮助开发人员查找出 JavaScript 代码中的类型错误,从而提高开发效率和代码质量。Flow 已经能够捕获 JavaScript 代码中的常见问题,如静态类型转换不匹配、空指针引用等问题。同时,Flow 还为 JavaScript 新增了类型语法,如类型别名。

  Haskell 库:Haxl

  Facebook 开源了 Haxl,一个为高效并发数据访问而开发的库。这个库 

一方面利用了 Haskell 的传统优势,比如表达力很强的类型系统、对正确性和安全性的保障,另一方面也受益于 GHC(Haskell 编译器)的高性能运行时库,解决烦人的隐式并发数据访问的问题。Haxl 简化了对远程数据的访问,比如数据库或网站服务。对同一数据源的多个访问请求,或同时从不同的数据源请求数据,它都能批量处理,并且缓存上一次的结果。

  Web 应用架构:Flux

  Facebook 认为 MVC 无法满足他们的扩展需求,因此他们决定使用另一种模式:Flux。由于 Facebook 非常巨大的代码库和庞大的组织,所以 MVC 真的很快就变得非常复杂,于是他们得出结论,认为 MVC 不适合于大规模应用。

  每次 Facebook 工程师努力增加一项新特性时,系统的复杂性成级数增长,代码变得“脆弱和不可预测”。对于刚接触某个代码库的开发人员来说,这正成为一个严重的问题。Flux 是一个 Facebook 开发的、利用单向数据流实现的应用架构,用于 React。Flux 应用有三个主要的部分组成:调度程序、存储和视图(React 组件)。

  JavaScript 单元测试工具:Jest

  Jest 是一个开源的、基于 Jasmine 框架的 JavaScript 单元测试工具。Jest 源于 Facebook 两年前的构想,用于快速、可靠地测试 Web 聊天应用。它吸引了公司内部的兴趣,Facebook 的一名软件工程师 Jeff Morrison 半年前又重拾这个项目,改善它的性能,并将其开源。

  在最基础层面,Jest 被设计用于快速、简单地编写地道的 JavaScript 测试。Jest 自动模拟 require ()返回的 CommonJS 模块,并提供了包括内置的测试环境 Dom API 支持、合理的默认值、预处理代码和默认执行并行测试在内的特性。通过在并行进程中同时运行测试,Jest 让测试更快地结束。

  基于 Atom 的开发工具集:Nuclide

  Nuclide 是 Facebook 推出的一套基于 Atom 的开发工具集,用于开发基于 Hack 的 Web 应用,提供自动完成和 JavaScript 类型检查,内建 React 开发支持,并支持 Facebook 最新的 React Native 库,支持 Facebook 的 Flow JavaScript 类型检查器。Nuclide 的设计目是为了在整个公司为工程师提供一套标准的开发者经验——无论他们从事纯 iOS 应用,React 和 React Native 代码,或者在 Hack 运行我们的 HHVM 网络服务。

  Android 调试工具:Stetho

  Stetho 是一个 Android 应用的调试工具。当 Android 应用集成 Stetho 时,开发者可以通过访问 Chrome,在 Chrome Developer Tools 中查看应用布局、网络请求、sqlite、preference 等等,可视化一切应用操作(更重要的是不用 root)。开发者也可通过它的 dumpapp 工具提供的命令行接口来访问应用内部。

  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 开发后向服务器迁移的成本。

  弹簧模型 Java 库:Rebound

  Rebound 是一个弹簧模型 Java 库,由 Facebook 于 2013 年 10 月在 Mobile@Scale 大会上发布,旨在应用中引入真实的物理世界,创建让人感觉很接近自然的动画。Rebound 不是通用物理库,但是,弹簧模型能够驱动各种各样的动画。Rebound 的简单特性使它很容易被集成,以及作为构建块创建如呼叫、滚动条和切换开关等复杂组件。

  移动应用交互设计工具:Origami

  现在 App 的原型设计越来越复杂,以前使用 PhotoShop 制作静态图的方式不能满足各种交互效果的展示,Paper 的首席设计师 Mike Matas 在加入 Facebook 之初就推荐大家使用 Quartz Composer 来快速构建应用原型,而 Facebook 的设计团队也很快接收并喜欢上了这个工具,在随后的应用,他们遇到了一个问题:对于产品设计师来说,Quartz Composer 的学习曲线太高。

  于是 Mike 就带头开发了 Origami。2013 年 12 月,Facebook 开源了基于 Quartz Composer 的插件 Origami,设计师可以通过 Origami 能够快速构建移动应用交互原型,随后交付给工程师实现,值得注意的是 Origami 无需编程背景,新发布的 Paper 从项目设计之初所有的原型设计都是采用 Origami 来实现。

  UI 测试工具:huxley

  Huxley 是一个基于 Python 用于 Web 应用 UI 测试的工具,Huxley 可以录下 UI 操作过程,并回放自动测试。自动测试时和 UI 基准对比,UI 不符合预期时,会保存变化的 UI 并警告你。

  Facebook iOS UI 工具:ComponentKit

  ComponentKit 使用功能性和声明性(declarative)的方法来进行创建界面,和以往不同的是,ComponentKit 使用单向数据流的形式从不可变的模型映射到不可变的组件来确定视图的显示方式。ComponentKit 的 declarative 看上去和 declarative UI (QML) 差不多,其实差得远。QML 更偏向于 UI 设计的描述性,而 ComponentKit 则是做好基本 UI 和事件之间的联系,让事件设计和 UI 设计可以分开单独完成。

  iOS 内存监测工具:FBMemoryProfiler

  FBMemoryProfiler 是 Facebook 开源的一款用于分析 iOS 内存使用和检测循环引用的工具库。

  手机设备的内存是一个共享资源。应用程序可能会不当的耗尽内存、崩溃,或者遭遇大幅度的性能降低。当分配了一块内存,并设置了对象之后,如果在使用完了之后忘记释放,这就会发生内存泄露。这意味着系统是无法回收内存并交予他人使用,这也最终意味着我们的内存将会逐渐耗尽。

  在 Facebook,有很多工程师在代码库的不同部分上工作。这不可避免的会发生内存泄露。当发生内存泄露之后,工程师需要尽快找到并修复它们。一些工具已经可以找到内存泄露,但是它们需要大量的人工干预。自动化可以在不需要更多开发者的情况下,更快的找到内存泄露。为了解决这个问题,Facebook 做了一套工具来自动化的处理和修复代码库中的一些问题,这个工具就是 FBMemoryProfiler。