`
panny1982
  • 浏览: 574 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Facebook是如何管理代码的

阅读更多
我对facebook的运转着迷。这是一个很独特的环境,不容易被复制(他们的体系并不适合所有的公司,即使他们努力尝试过)。下面是我和facebook的朋友们关于他们如何开发和管理项目的记录。

  现在距离我收集的这些信息又过去6个月了,我相信facebook肯定又对他们的项目开发实践进行了改进。所以这些记录可能会有点过时。同时facebook的工程师驱动文化也越来越为大众所知。非常感谢那些帮助我整理这篇文章的facebook的朋友们。

  记录:

截止到2010年6月,facebook有将近2000名员工,10个月前只有1100名,一年之间差不多翻了一番。
两个最大的部门是工程师和运维,每个部门大概都是400-500人。这两个部门人数大约占了公司的一半。
产品经理与工程师的比例大约为1-7到1-10。
每个工程师入职时,都要接收4-6周的培训,通过修补bugs和听高级开发工程师的课程来熟悉facebook。
培训结束后,每个工程师都可以接触线上的数据库(更大的权力意味着更大的责任,也有一份"勿做清单",不然可能会被开,比如共享用户的隐私数据)。
有非常牢靠的安全体系,以免有人不小心/故意做了些不好的事。
每个工程师可以修改facebook的任何代码,随时可以签入。
浓厚的工程师驱动文化。"产品经理基本可以被忽略",这是facebook一名员工的话。工程师可以修改流程的细节,重新安排工作任务,随时植入自己的想法。
在每月的跨部门会议上,由工程师来汇报工作进度,市场部和产品经理会出席会议,也可以做些简短的发言,但如果说得太多,很可能就会被打小报告。他们确实想让工程师来主导产品的开发,对自己的产品负责。
项目需要的资源都是自愿的
一个产品经理把工程师们召集到一起,让他们对他的想法产生兴趣。
工程师们决定开发那些让他们感兴趣的特性。
工程师跟他们的经理说:"我下周想开发这5个新特性"。
经理会让工程师独立开发,可能有时会让他优先完成一些特性。
工程师独立完成所有的特性——前端/后端/数据库,等等所有相关的部分。如果需要得到设计人员的帮助,需要先让设计人员对你的想法产生兴趣。其他如架构之类的也一样。但总体来说,工程师要独立完成所有的任务。
对于某个特性是否值得开发的争论,通常是这么解决的:花一个星期的时间完成他,并在小部分人群中(如1%)进行测试。
工程师常常希望解决难题,这能获得声望和尊敬。他们很难对前端项目或UI设计产生太大的兴趣。这跟其他公司可能正好相反。在facebook,后端任务,比如新的feed算法,广告投放算法,memcache优化等等,是工程师真正感兴趣的。
所有的代码修改都要进行审核(通过一个或多个工程师),但News Feed是个例外,因为太重要了,Zuckerberg会亲自review。
所有的修改至少要被一个人审核,而且这个系统可以让任何人很方便地审核其他人的代码,即使你没有邀请他
工程师负责测试,代码修复,和维护自己的项目。
每个办公室或通过VPN连接的员工会使用下一版的facebook,这个版本的facebook会经常更新,通常比公开的早1-12小时。所有的员工被强烈建议提交bugs,而且通常会很快被修复。
很奇怪只有很少的QA或自动测试——"大部分工程师都能写出基本没有bug的代码,只是在其他公司他们不需要这么做。如果有QA部门,他们只要把代码写完,扔给他们就行了"
[针对上一条]我们有自动测试,代码发布前必须要通过测试。我们不相信"所有的工程师都能写出没有bug的代码",毕竟这是一个商业公司。
很奇怪,缺少产品经理的影响和控制——产品经理是很独立的和自由的。产生影响力的关键是与工程师和工程师的领导们搞好关系。需要大致了解技术,不要提一些愚蠢的想法。
所有提交的代码每周二打包一次。
只要多一分努力,总有一天会发生改变。
星期二的代码发布,需要所有的提交过代码的工程师在场。
代码打包前,工程师必须在一个特殊的IRC channel上。
运维执行打包过程
facebook有大约60000台服务器。
有9个代码发布级别。
最小的级别只有6台服务器。
星期二的代码发布会先发布到6台服务器上,运维组会检测这6台服务器的反应,保证代码正常工作,然后再提交到下一级。
如果发布出现了一些问题(如报错等等),那么就停止下一级的部署,提交出错代码的工程师负责修复问题,然后从头继续发布。
所以一次发布可能会经历几次重复:1-2-3-fix. 回到1. 1-2-3-4-5-fix. 回到1. 1-2-3-4-5-6-7-8-9。
运维组是受过严格训练,倍受尊敬,而且有商业意识的。他们的工作包括分析错误日志,负载和内存状态等等,还包括用户行为。
代码发布期间,运维组使用IRC-based页面系统,可以通过facebook/email/irc/im/sms ping每一个工程师,如果需要他们注意的话。对运维组不做回应是一件很羞愧的事。
代码一旦发布到第9级,并且稳定运行,就算发布成功了。
如果一个特性没有按时完成,也没什么大不了的,下次完成时一并发布即可。
如果被svn-blamed,public shamed或工作经常疏忽就很可能被开除。"这是一个高效的文化"。不够高效或者不够聪明的员工会被剔除。管理层会在6个月的时间里观察你表现,如果不合格,只能说再见。每一级都是这个待遇,即使是C级别和VP级别,如果不够高效,也会被开除。
被责骂不会导致解雇。我们特别尊重别人,原谅别人。大部分高级工程师都或多或少犯过一些严重的错误,包括我。但没有人因此被解雇。
我也没有遇到过因为上面提到过的犯错误而被解雇。有些人犯了错,他们会非常努力地去修复,也让其他人得到了学习。
分享到:
评论

相关推荐

    23-Facebook 代码管理.doc

    ### Facebook的代码管理机制 #### 一、概述 Facebook作为全球知名的社交网络平台,其背后的技术支持和代码管理体系一直是IT行业内研究的重点。本文基于“23-Facebook 代码管理.doc”文档的内容,深入探讨Facebook...

    facebook源代码框架

    Facebook的源代码框架与Android框架紧密集成,展示了如何充分利用Android SDK和各种API来创建用户界面、处理网络请求、管理数据存储以及实现后台服务。例如,它可能包含了对Android的Activity、Fragment、Intent、...

    Unity Facebook API 官方 Demo 完整工程 代码

    6. **Facebook SDK for Unity**:官方Demo使用的Unity插件是Facebook专门针对Unity开发的SDK,它包含了所有必要的库和示例代码,简化了与Facebook平台的集成过程。 7. **官方文档**:在<https://developers....

    Facebook登录上传图片C#源代码

    1. **安装Facebook SDK**:在Visual Studio中,通过NuGet包管理器安装Facebook SDK。 2. **配置应用**:在Facebook开发者平台上注册你的应用,获取App ID和App Secret。 3. **初始化SDK**:在C#代码中,初始化...

    Android代码-Facebook客户端.zip

    14. **版本控制与协作**:开发过程中,版本控制工具如Git必不可少,它帮助团队成员协同工作,管理代码变更。 15. **发布与更新**:完成开发后,应用需要通过Google Play Store发布,遵循其审核指南和更新机制。 总...

    facebook源码

    Facebook源码中的版本控制系统(如Git)和代码审查流程,展示了其内部的协作模式和代码质量管理机制。 总的来说,深入研究Facebook源码可以为开发者提供宝贵的实践经验,帮助他们理解大规模社交网络的构建、运维和...

    facebook api和facebook_jar包

    同时,Facebook会定期更新API,开发者需要保持关注并及时更新代码,以确保应用兼容性和安全性。 总的来说,Facebook API和Facebook_JAR包为开发者提供了强大的工具,帮助他们轻松地构建与Facebook集成的应用。通过...

    Facebook 的代码开发工具.pdf

    **源码控制集成**:集成Git和Mercurial等版本控制系统,使得代码管理更加便捷。\n4. **Buck集成**:与Facebook的构建工具Buck紧密集成,提高了开发效率。\n5. **调试器**:强大的调试功能,对多种语言提供支持。\n6...

    jQuery仿Facebook图片画廊代码.zip

    以上就是这个jQuery仿Facebook图片画廊代码中涉及的主要技术点。通过理解这些知识点,你可以更好地构建和维护类似的图片展示功能。在实际开发中,还需要考虑浏览器兼容性、性能优化以及安全性等因素,以提供高质量的...

    facebook页面设计

    10. **社区管理**:及时回应评论和私信,建立积极的在线社区,展现品牌的关注和专业性。 11. **广告整合**:结合Facebook的广告服务,通过精准定向推广页面,扩大品牌影响力。 12. **合规性**:遵守Facebook的社区...

    FACEBOOK FLASH 示例 教程

    开发者在这里定义事件监听器、处理Facebook API请求和响应,以及管理用户交互。 7. **Com组件**:`com` 目录可能包含了一些自定义组件或者库,这些可能被用在`facebook_demo`项目中以扩展其功能,比如提供更高级的...

    Facebook针对MySQL开源Online Schema Change代码

    为了解决这一问题,Facebook的数据库技术团队开源了他们的Online Schema Change(OSC)代码,这是一个重要的里程碑,标志着MySQL用户可以更加无缝地进行数据库结构的修改。 Online Schema Change是一种允许在不影响...

    Python-fbadmin基于selenium和phantomjs完成的facebook群管理工具

    fbadmin的源代码(在`fbadmin-master`目录下)可能包括`__init__.py`、`config.py`、`driver.py`、`manager.py`等文件,分别对应初始化、配置、驱动和管理等功能。 为了使用fbadmin,用户需要安装Selenium、...

    wordpress WooCommerce Facebook 多像素插件

    Facebook Pixel 是一个代码片段,当安装在网站上后,可以跟踪用户的活动,如页面浏览、购物行为、事件触发等。通过收集这些数据,Facebook 可以为商家提供更精准的广告定位,优化广告投放,提升转化率。多像素功能则...

    基于C#的Facebook开发包

    4. **事件和页面管理**:对于需要管理Facebook事件或页面的应用,SDK提供了相应的接口,可以创建、编辑和管理这些对象。 5. **分享和社交插件**:集成SDK后,开发者可以方便地添加Facebook分享功能,让用户能够将...

    web版facebook登录

    1. 安全存储App Secret,避免在客户端代码中暴露。 2. 使用HTTPS加密通信,防止中间人攻击。 3. 及时刷新访问令牌,避免长时间使用同一令牌。 4. 监听Facebook的令牌撤销事件,及时更新用户状态。 总结,Web版...

    facebook_lib4.17.0

    3. **Graph API**:Facebook SDK 4.17.0允许开发者访问Facebook的Graph API,从而获取用户信息、发布内容、管理事件等。开发者可以发送HTTP请求来执行这些操作,SDK提供了一个方便的抽象层来简化这个过程。 4. **...

    facebook-java-api-2.1.1-bin.zip

    - 管理页面和群组:代表用户管理他们所拥有的Facebook页面和群组。 - 社交图谱查询:使用Graph API进行深度数据挖掘,获取用户的朋友的活动、兴趣等相关信息。 - 广告管理:创建、修改和监控Facebook广告。 - 处理...

    Laravel开发-facebook

    在 `app/facades/Facebook.php` 中创建以下代码: ```php use Illuminate\Support\Facades\Facade; class Facebook extends Facade { protected static function getFacadeAccessor() { return 'facebook'; } ...

    Facebook OpenBmc介绍的PPT

    Facebook推出OpenBMC的目的是为了推动数据中心基础设施的创新,通过开放源代码的方式,促进更高效、更可靠的系统管理解决方案的发展。 OpenBMC基于Linux操作系统,采用精简版的定制化分布,确保了在资源有限的BMC...

Global site tag (gtag.js) - Google Analytics