这篇 How Facebook Ships Code 提供了大量的细节信息,之前已经有朋友提供了一个翻译版本,阅读之后发现有些许错误,并且原文有更新,所以基于前面的翻译版本我重新翻译了一个(完整的)版本。一并谢过。希望这个版本对大家也有所参考。
我对 Facebook 的运作方式着迷。这是个非常独特的环境,很难被复制(这个方式并不适合所有的公司,即使有些公司尝试过这么做)。下面这些笔记来自我和Facebook的许多朋友的交谈,关于他们开发、运维与软件发布等方面。
好像很多人都对 Facebook 感兴趣... 这家公司的工程师驱动文化(Developer-driven culture)已经被公众大加研究,并且其它其它公司也在探求是否/如何实现工程师驱动文化。Facebook 的内部流程实在够神秘,当然,工程师团队也会发布一些关于新功能以及部分内部系统公开备忘,不过这些大多数是"说明"类的文章(What),而非讲述"机制"(How)... 所以,外部人员很难明白 Facebook 的创新以及如何比其它公司做到更有效的对服务进行优化。我作为外部人员尝试深入理解 Facebook 的运作,汇集了几个月来的这些观察信息。出于对信息来源的隐私保护,我去掉了特定功能/产品的名字。我又等了6个月以后才发布这些记录,所以,有些信息肯定过时了。我希望发布这些信息会有助于了解 Facebook 的管理机制如何在组织中进行决策的推行而非逐步陷入混轮...很难说这与 Facebook 的成败或是 Facebook 的产品协作相关。我相信很多面向消费者的互联网公司会从 Facebook 这个案例受益。
*非常*感谢那些帮助我整理这篇文章的 Facebook 内部的朋友们。也要感谢项 epriest 和fryfrog 这样的朋友,他们协助我进行对本文进行校正、编辑。
记录:
截止到2010年6月,Facebook有将近2000名员工,10个月前只有大约1100人,一年之间差不多翻了一番!
工程部和运维部是两个最大的部门,每个大概都有 400-500人。这两个部门人数大约占了公司的一半。
产品经理(PM)与工程师的比例大约为1-7到1-10。
每个工程师入职时,都要接受 4 到 6 周的 "Boot Camp" 培训,通过修复Bug 和听更资深的工程师的课程来熟悉 Facebook 系统。每次 Boot Camp 大约有 10% 的人无法完成课程而被淘汰。
培训结束后,每个工程师都可以访问线上的数据库【标准课程"能力越大,责任越大" ( "with great power comes great responsibility") 对此有阐释,另有一份明晰的"不可触犯的天条",比如共享用户的隐私数据】。
[修改, 感谢 fryfrog] "Facebook 有非常牢靠的安全保障,以免有人(你可以想象内部有人有这个权限的)不小心/故意做了些糟糕的的事。如果你已经"成为"了需要别人支持的人,事由将被记录,并且有谨慎的审计。这里不允许钻空子。
任何工程师都可以修改Facebook的代码库,签入(Check-in)代码。
浓厚的工程师驱动文化。"产品经理基本可以被忽略",这是Facebook一名员工的话。工程师可以修改流程的细节,重新安排工作任务,随时植入自己的想法。[评论] "本文的作者是一个产品经理,所以这个论断引起里我的注意。你看完整篇文章后会发现,很显然,Facebook 的文化实际上是拥抱产品经理的实践的,所以,不是产品经理的角色被忽略,而是,这家公司的文化看上去是想让"每个人"感受到对产品的责任"。
在每月的跨部门会议上,由工程师来汇报工作进度,市场部和产品经理会出席会议,也可以做些简短的发言,但如果长篇大论的话,将如实反馈给他们的主管,"产品人员在上次会议说的太多"。他们确实想让工程师来主导产品的开发,对自己的产品负责。
项目需要的资源都是自发征集的:
某个产品经理把工程师们召集起来,让他们对自己的想法产生兴趣。
工程师们决定开发那些让他们感兴趣的特性。
工程师跟他们的经理说:"我下周想开发这5个新特性"。
经理会让工程师独立开发,可能有时会让他优先完成一些特性。
工程师独立完成所有的特性 -- 前端 JavaScript/后端数据库,等等所有相关的部分。如果需要得到设计人员的帮助,需要先让设计人员对你的想法产生兴趣(专职的设计师很少)。请架构师帮忙也是如此。但总体来说,工程师要独立完成所有的任务。
对于某个特性是否值得开发的争执,通常是这么解决的:花一个星期的时间实现,并在小部分用户中(如1%的内华达的用户)进行测试。
工程师通常乐衷致力于架构、扩展性以及解决"难题",那样能获得声望和尊敬。他们很难对前端项目或用户界面产生太大的兴趣。这跟其他业务为导向的公司可能正好相反,那些公司人人都想做客户能直接接触到的东西,然后会指着某个特定的用户体验说,"那是我做的"。在 Facebook,后端的东西,比如 News Feed 算法、广告投放算法、Memcache 优化等等,是工程师真正倾慕的项目。
News Feed 因为太重要了,扎克会亲自审查任何变动。这是个特例。
[更正, 感谢 epriest ]"所有的代码变更都要经过强制性的代码审查(比如一个或者多个工程师)。我相信这篇文章只是说 扎克并不自己审查每一个变更"。
[更正, 感谢 fryfrog ]"所有的修改至少要被一个人审查,而且这个系统可以让任何人很方便地审核其他人的代码,即使你没有邀请他。提交未经审查的代码,将被视为恶意行为"。
工程师负责测试、Bug 修复以及启动对自己项目的维护。有单元测试和集成测试的框架可用,但很少使用。
[更正, 感谢 fryfrog ] "补充一下,我们是有 QA 的,只是没有正式的 QA 组而已。每个办公室或通过VPN连接的员工会使用下一版的 Facebook,这个版本的 Facebook 会经常更新,通常比公开的早 1-12 小时。所有的员工被强烈建议提交 Bug,而且通常会很快被修复"。
回复:很奇怪只有很少的 QA 或自动测试 -- "大部分工程师都能写出基本没有bug的代码,只是在其他公司他们不需要这么做。如果有 QA 部门,他们只要把代码写完,扔给他们就行了" [编辑:请注意这是很主观的,我选择包括这部分内容是因为这和那些其它公司的标准开发实践完全相反]
回复:很奇怪,缺少产品经理的影响和控制 -- 产品经理是很独立的和自由的。产生影响力的关键是与工程师和工程师的管理者搞好关系。需要大致了解技术,不要提一些愚蠢的想法。
默认情况下,所有提交的代码每打包一次(周二)。
只要多一分努力,终于一天会发生改变。
星期二的代码发布,需要所有提交过代码的工程师在场。
发布开始前,工程师必须在一个特定的 IRC 频道上候命,否则将会被公开问责。
运维团队通过逐步滚动的方式进行代码发布:
Facebook 有大约 60000 台服务器。
有9个代码发布级别。
[更正 感谢 eriest] "九个级别并非同轴的(concentric)。有三个同轴的阶段(p1=内部发布, p2=小范围外部发布, p3=完整的外部发布),其余六个阶段是辅助层,比如内部工具、视频上传主机等等"。
最小的级别只有6台服务器。
比如,星期二的代码发布会先发布到 6 台服务器上(第一级),运维组会观测这 6 台服务器,保证代码正常工作,然后再提交到下一级。
如果发布出现了问题(如报错等等),那么就停止下一级的部署,提交出错代码的工程师负责修复问题,然后从头继续发布。
所以一次发布可能会经历几次重复:1-2-3-修复,回到 1, 1-2-3-4-5-修复, 回到1, 1-2-3-4-5-6-7-8-9。
运维团队受过严格训练,很受尊敬,而且极具有业务意识。他们的工作指标不止包括分析错误日志,负载和内存使用状态等等,还包括用户行为。比如,如果一个新的发布导致一定比例的用户对 Facebook 功能进行声讨,运维团队将查看相关指标,可能基于他们的调查停掉该次发布。
在发布过程中,运维组使用基于 IRC 的通知系统,可以通过 Facebook、Email、IRC、IM SMS 通知每一个工程师,如果需要他们注意的话。对运维组不做回应会被公开问责。
代码一旦发布到第9级,并且稳定运行,本周的发布宣告结束 。
如果一个特性没有按时完成,也没什么大不了的(除非外部依赖严重),下次完成时一并发布即可。
如果被 SVN-blamed(应该指没按照规范提交代码会受到的惩罚)、公开问责(Public shamed, 示众?还是通告批评?)或工作经常疏忽就很可能被开除。"这是一个高效的文化"。不够高效或者不够聪明的员工会被剔除。管理层会在 6 个月的时间里观察你表现,"你不能适应这种文化,只能说再见"。每一级都是这个待遇,即使是 C 级别和 VP 级别,如果不够高效,也会被开除。
[更正, 感谢 epriest ] "人们不会因为导致 Bug 而被解雇,只有在发布他们的代码时导致问题,而他们恰恰又不在场(也找不到其他可以替代的人)"。
[更正, 感谢 epriest] "被问责不会导致解雇。我们特别尊重别人,原谅别人。大部分高级工程师都或多或少犯过一些严重的错误,包括我。但没有人因此被解雇"。
[更正, 感谢 fryfrog] "我也没有遇到过因为上面提到过的犯错而被解雇。我知道有人不小心将整个网站宕掉过。一旦有人犯错,他们会竭尽全力修复问题,也让其他人得到了教训。就我来看,这种公然蒙羞与被解雇的恐惧相比更为奏效"。
分析 Facebook 的研发文化如何随着时间演化是件非常有趣的事。特别是当公司发展壮大到数千员工的时候,这种文化是否还能够延续?
你觉得如何?在你公司里,"开发者驱动(developer-driven)文化" 将会可行么?
译者后记:很多时候是管中窥豹也是非常有趣的,而且,应该细致一点儿。另外,或许我们更应该关注为什么 Facebook 能够形成这样的文化。你说呢?
译者后记续:Facebook 能形成工程师主导的文化,应该和 Facebook 的产品形态有很大关系。毕竟 Facebook 人人都会用 Facebook ... 换言之,如果是 Ama
分享到:
相关推荐
适用于 Android 的 Facebook SDK 的代码和示例可在 GitHub 上找到。一种安全便捷的方式,方便用户使用 Facebook 凭据登录您的应用或网站。允许用户通过您的应用发帖到 Facebook。用户可以共享、发送消息和共享到快拍...
HipHop VM(HHVM)是Facebook推出的用来执行PHP代码的虚拟机,它是一个PHP的JIT(Just-In- Time)编译器,同时具有产生快速代码和即时编译的优点。Facebook表示,HHVM将替代HPHPi,用于所有的PHP执行。根据 Facebook...
Infer 是 Facebook 最新开源的静态程序分析工具,用于在发布移动应用之前对代码进行分析,找出潜在的问题。目前 Facebook 使用该工具来分析 Facebook 的 App,包括 Android 、iOS、Facebook Messenger 和 Instagram ...
Facebook在新发布的论文《Billion-scale similarity search with GPUs》中表示,可在GPU 上实现十亿规模级的相似性搜索,并且已开源该方法。在处理图像或视频等复杂数据时会涉及专用数据库系统,而相似性搜索...
这是Thrift的内部分支机构,Facebook于2014年2月重新发布到开源社区。FacebookThrift最初是紧跟Apache Thrift发行的,但现在朝着新的方向发展。 特别是,编译器是从头开始重写的,新的实现具有完全异步的Thrift...
Google跟踪代码管理器(GTM)已发布了对支持的支持,可直接从广告商的服务器与分析合作伙伴共享客户操作。 该存储库包含广告客户可以在其GTM的标记服务器上安装并发送到Facebook的Conversions API的模板(客户端和...
Muse基于AIR平台,其目的是让设计师把精力放在设计上,让那些不懂代码的设计师也可以制作、发布网站。 Muse主要包括四大功能: 网站规划:Muse提供网站地图、主页面、以及覆盖整个网站的工具,你可以很快完成网站...
社交媒体应用程序克隆(Instagram,Facebook,链接等)+ Node.js套接字聊天+呼叫+直播 使用的技术 Flutter- iOS android app PHP -管理面板和其他API Nodejs for chat(socket.io) Firebase -用于推送通知 AWS -...
Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...
这是Facebook,Instagram和Twitter自动发布的脚本,当有新帖子添加到您的网站时 我这样做是出于我自己的目的。 这是一项基本功能,甚至组织得不好。 也许以后再做 对于此代码,您需要安装twitter OAuth( )和...
之后,它在2015年的React.js大会上公开发布。 2018年晚些时候,Facebook将这个GraphQL项目转移到一个名为GraphQL基金会的新成立的基金会,该基金会由非营利的Linux基金会托管。 GraphQL是由Facebook的团队创建的,...
flint :Facebook的C ++ Linter flint是Facebook开发和使用的针对C ++的开源lint程序。 flint在Github上发布,网址为 ; 为了进行讨论,在有一个Google。 有两种版本的flint 。 主代码( flint/*.d )是用D编程语言...
使用来自Open Graph(Facebook)和Twitter的Web标准生成针对社交媒体,SEO和移动设备最佳HTML代码,以提供最佳结果。 还生成社交媒体帖子。 产品特点 :robot: 为您的单页应用程序生成最适合社交媒体,SEO和移动...
一个NodeJS机器人,用于从Facebook页面重新发布Wordpress博客文章。 需要 WordPress 3.4或更高版本 Facebook专页和Facebook App NodeJS(在0.12.x上测试)或IOJS 安装 从git或zip文件下载源代码。 npm install ...
React 是由 Facebook 软件工程师 Jordan Walke 创建,React 的第一个版本在七年前问世,现在,Facebook 负责维护。React框架自首次发布以来,React 的受欢迎程度直线飙升,热度不减。 2020 年 10 月,React 17 发布...
首先,新版本发布后,一切都恢复正常。 有人在Chrome商店中入侵了最受欢迎的扩展程序,并能够通过恶意软件进行更新,恶意软件将用户重定向到糟糕的广告网站,从而迅速获利。 真的有人能够做到这一点,但我们已经删除...
自述文件 DIC任务(2/6):Facebook克隆(RaiceBook,因为它是由Rails制作的) ...将源代码提交给Github并提交该存储库的URL 必须已上传到Heroku 实施404,500个错误页面 变量名称和关联名称应该是特定的,一
原文是使用的Twitter和Facebook,因为国内被强,所以我觉得有用的是里面一个获取JSONP的那个工具类. 我很头疼的是,许多流行的 APIs 已经要求身份验证才能获取信息。 既然我可以访问到这些页面并取得信息,那为什么我不...
walle 让用户代码发布终于可以不只能选择 jenkins!支持各种web代码发布,php、java、python、go等代码的发布、回滚可以通过web来一键完成。walle 一个可自由配置项目,更人性化,高颜值,支持git、多用户、多语言、...