从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硬件系统。

了解更多: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控制,而开发其的目的是为了确保更多的用户获得最好的应用体验。

开源数据库: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处理。特性如下:

  • 带有计数器的内存管理——记录应用程序正使用的内存类型的次数

  • 工作——分解你的应用程序并用调度管理来搞定它们

  • 带缓冲的I/O流

  • 常用的数据结构(哈希表、列表、队列)

  • 数据类型的变种来使能JSON的序列化和反序列化

  • 带有注册对象格式的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性能极高,内存占用小,支持用户在整个基础设施上执行查询。

  • GitHub主页:https://github.com/facebook/osquery

  • Star数量:6209

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。