1 新智元编译
以下是新智元对整份 告的重点翻译。
目录
摘要
1.概述
2.软件开发
2.1.源码库
2.2.编译系统
2.3.代码审查 2.4.测试
2.5.Bug追踪
2.6.编程语言
2.7.调试和分析工具
2.8.工程发布(Release Engineering)
2.9.验收
2.10.复盘
2.11.频繁修改
3.项目管理
3.1.20%时间
3.2.目标和关键结果
3.3.项目验收
3.4.团队重组
4.人员管理
4.1.角色
4.2.设施
4.3.培训
4.4.人员变动
4.5.表现评估与奖赏
5.结论
致谢
参考书目
1. 概述
Google已经是一个非常成功的公司。除了Google搜索和AdWords之外,Google还贡献了许多其他杰出的产品,包括Google地图、Google新闻、Google翻译、Google语音识别、Chrome和Android。Google还大幅增强和扩展了许多通过购买小型公司(如YouTube)获得的产品,并对各种开源项目做出了重大贡献。同时Google还展示了一些尚未推出的惊人产品,例如无人驾驶汽车。
Google的成功有很多原因,包括开明的领导力、优秀的人才、严苛的招聘标准,以及在迅速成长的市场中占据先机而积累的资金实力,而其中一个原因是Google形成了优秀的软件开发流程。这些源自地球上最有才华的软件工程师智慧的做法随着时间的推移而逐渐进化。我们希望和世界分享,其中也包括从错误中学到的教训。
2. 软件开发
2.1.源码库
几乎所有的软件开发都发生在存储库的“头”,而不是在分支上。这有助于及早识别集成问题,并最大限度地减少所需的合并工作量,同时也便于更快推出安全修复程序。
有关Google源代码存储库的更多信息,请参阅[17,18,21];关于另一家大公司如何应对同样的挑战,见[19]。
2.4 测试(Testing)
我们强烈鼓励并广泛采用单位测试。生产中使用的所有代码都需要进行单元测试,如果添加了源文件而没有相应的测试,代码审查工具将突出显示。代码审查人员通常要求对于添加新功能的任何更改,都应添加新测试以涵盖新功能。模拟框架(Mocking frameworks,允许构建轻量级单元测试,甚至对于重量级库的依赖的代码)是相当普遍的。
集成测试和回归测试也广泛应用。
如上面“预提交检查”中所述,测试可以作为代码审查和提交过程的一部分自动执行。
Google还提供用于衡量测试覆盖率的自动化工具。结果也被集成为源代码浏览中。
Google还有一个重点是在部署之前进行负载测试。团队需要生成一个表格或图,展示关键指标(特别是延迟和错误率)如何随传入请求而变化。
2.5. Bug 追踪(Bug tracking)
Google使用一个叫 Buganizer 的错误跟踪系统来跟踪各种问题:错误、功能需求、客户问题和流程(如发布或清理工作)。错误被分为层次化组件,每个组件有一个默认的负责人和默认电子邮件列表以便CC。当发送源更改以供审查时,系统会提示工程师将用问题的关联编 提示工程师。
Google的团队通常(但不是普遍的)定期扫描其组件中的开放问题,确定优先级,并在适当时将其分配给特定工程师。一些团队有一个特定的人负责错误分类,其他人在他们的常规团队会议中进行错误分类。Google的许多小组都使用错误标签来指示是否已对错误进行了分类,以及每个错误所针对的版本。
2.6.编程语言(Programming languages)
强烈鼓励 Google 的软件工程师使用以下四种官方认可的编程语言之一进行编程:C++,Java,Python 或 Go。尽可能少地使用的不同编程,这能减少了代码重用和程序员协作的障碍。
除了这四种语言之外,还有许多专用的领域专用语言用于特定目的(例如用于构建目标及其依赖性的构建语言)。
这些不同的编程语言之间的互操作主要使用“协议缓冲区”(Protocol Buffers.)。协议缓冲区是一种高效但可扩展的方式,用以编码结构化数据。它包括一种用于结构化数据的特定领域语言,以及一个编译器。编译器可以接受这种描述,并生成 C++,Java,Python 的代码,以构建、访问、序列化和反序列化这些对象。Google 的 Protocol Buffers版本与Google的 RPC 库集成,支持简单的跨语言 RPC,对 RPC 框架自动处理的请求和响应进行序列化和反序列化。
过程的通用性是使开发变得容易的关键因素,即使具有巨大的代码库和多样化的语言:有一组命令来执行所有常见的软件工程任务(例如check out, edit, build, test, review, commit, file bug report 等),并且无论什么项目或语言都可以用相同的命令。开发人员不需要因为他们用的代码是不同项目的一部分或用不同的语言编写的,而学习新的开发过程。
2.7.调试和分析工具 (Debugging and Profiling tools)
Google 服务器与库相链接,这些库提供了许多工具用于调试运行服务器。在服务器崩溃的情况下,信 处理程序将自动把堆栈跟踪转储到日志文件,并且保存核心文件。如果崩溃是由于堆内存泄漏,将转储堆对象样本子集的分配点的堆栈跟踪。还有用于调试的 络接口,其允许检查传入和传出RPC(包括定时、错误率、速率限制等),改变命令行标志值(例如以增加特定模块的日志冗长度),资源消耗, 性能分析等等。这些工具大大增加了整个调试过程的便利性,以至于很少需要启动传统的调试器(如gdb)。
2.8. 发布工程(Release engineering)
有几个小组有专门的发布工程师,但对于 Google 的大多数小组,发布工程工作都是由通常的软件工程师完成的。
大多数软件发布比较频繁; 通常的目标是每周或每两周发布一次,有一些团队甚至每天发布。这是通过自动化大多数正常发布工程任务实现的。经常发布有助于保持工程师的积极性(如果它在几个月甚至几年后才会发布,就很难激发),并通过更多的迭代增加总体速度,从在一定时间内获得更多的反馈机会和更多的机会回应反馈。
最后,该发布可以推广到所有数据中心中的所有服务器。对于非常高流量,高可靠性的服务,会在几天的时间内逐步推出,以帮助减少因为新引入的错误没有被发现而带来的影响。
有关Google发布工程的更多信息,请参见SRE手册[7]的第8章。也参见[15]。
2.9. 批准发布(Launch approval)
任何用户可见的更改或重大设计更改,需要来自实施更改的核心工程团队之外的许多人员的批准。在某些特殊的审批(通常需要详细审查),要确保代码符合法律要求,隐私要求,安全要求,可靠性要求(例如,具有自动监控以检测服务器中断并自动通知相应的工程师),业务要求等等。
2.10. 事故分析(Post-mortems)
2.11. 频繁重写(Frequent rewrites)
大多数Google的软件每隔几年就要重写。
这看起来非常昂贵。确实,它消耗了Google资源的很大一部分。然而,它也带来了一些重要的好处,这是谷歌的敏捷性和长期成功的关键。在几年的时间里,随着软件环境和周围的其他技术发生变化,以及随着技术或市场的变化影响用户需求、愿望和期望,产品的需求通常会发生显著变化。
几年前的软件是围绕一套老的需求设计的,通常不是以当前需求的最佳方式设计的。此外,它通常积累了很多复杂性。重写代码消除了所有不必要的累积复杂性,这些复杂性只是解决了不再那么重要的需求。另外,重写代码可以向新的团队成员传递知识和所有权感。这种所有权感对生产力至关重要:工程师自然会更努力地开发特性,并在“他们的”的代码中解决问题。频繁的重写也鼓励工程师在不同项目之间的移动,有助于鼓励想法的杂交。频繁的重写也有助于确保代码使用现代技术和方法编写。
3.项目管理
3.1. 20% 的时间
工程师被允许花高达20%的时间在他们选择的任何项目上工作,而无需他们的老板或任何其他人的批准。
3.2. 目标和关键结果 (Objectives and Key Results -OKRs)
Google的个人和团队需要明确记录他们的目标,并评估他们在实现这些目标方面取得的进展。
3.3. 项目批准(Project approval)
尽管有一个明确定义的启动批准流程,但Google没有明确定义的项目审批或取消流程。尽管我已经在Google工作了近10年,现在已经成为一名经理,我仍然不能完全理解如何做出这样的决定。部分是因为在整个公司,这种方法是不统一的。每个级别的经理都对他们的团队的项目负责,并且在他们认为合适的时候行使其自由裁量权。在某些情况下,这意味着这种决策是以自下而上的方式做出的,工程师可以在其团队职能范围内自由选择做什么项目。在其他情况下,这种决策以更自上而下的方式做出的,管理人员或管理人员决定哪些项目将进行,哪个项目获得额外的资源,哪个将被取消。
3.4. 公司重组(Corporate reorganizations)
少数情况下,执行者决定取消一个大型项目,然后该项目的工程师可能需要在新的团队上找到新的项目。
4.人员管理
略
5.结论
我们简要介绍了大部分在Google使用的重要软件工程实践。当然,Google现在是一个庞大而多样化的组织,它 的某些部分有不同的做法。但是这里描述的做法通常被大多数团队遵循。
由于涉及这么多不同的软件工程实践,以及Google成功的许多其他方面的原因,因此很难给出任何定量或客观的证据,将个人做法与结果改进联系起来。然而,这些做法是经受了谷歌时间考验的,成千上万的优秀软件工程师的集体遵守它。
【寻找AI独角兽】新智元联手10大资本
启动2017创业大赛
AI 创业大赛由新智元与10 家主流 AI 创投机构:蓝驰创投、红杉资本中国基金、高瓴智成人工智能基金、蓝湖资本、蓝象资本、IDG资本、高榕资本、中信建投证券、明势资本、松禾远望基金携手发起,由新智元主办,北京市中关村科技园区管理委员会、中关村科技园区海淀园管理委员会支持,是一场聚合了 AI 技术领袖和投资领袖的盛会。新智元向满怀雄心的未来AI独角兽提供强大的创投资源对接机会,顶级风投 TS 等你来拿。
http://form.mikecrm.com/gthejw
点击文章下方阅读原文,在线填写 名申请 名表。该 名表为参与评选必填资料。
如有更多介绍资料(例如BP等),可发送至 xzy100@aiera.com.cn,邮件标题请注明公司名称。如有任何咨询问题,也欢迎向该邮箱发信联系。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!