简评:原文作者 Fergus Henderson 在 Google 工作了 10 年以上,目前负责 Google 的 text-tospeech 工程小组。有很多书籍或文章会从 商业/管理 等非技术角度来讲 Google 是如何运作的,这篇文档则是从软件工程学的角度来讲 Google 是如何运作的。

Google 的成功有很多原因,其中一个重要原因就是 Google 不断积累的、优秀的软件工程实践经验。

本文的目的是梳理并简要介绍 Google 软件开发的核心流程,内容上主要分为软件开发 (Software development)、项目管理 (Project management) 和团队建设 (People management) 三个方面。

原文目录

软件开发

源码仓库(The Source Repository)

  • 单一源代码仓库,除了核心配置和安全相关代码,任何工程师都可以访问任何代码,并可以根据需要修改
  • 所有开发都基于 master 分支,发布的时候才创建发布分枝
  • 代码的每个子树都有 owner,任何修改都需要 owner 批准

Blaze 分布式构建系统(The Build System)

  • 构建和测试存储库中的任何软件通常非常简单和快捷
  • 开发人员只需要编写 BUILD 文件,并且每个构建系统仅依赖 BUILD 文件所声明的文件
  • 构建系统的优化:可靠,自动跟踪依赖关系,增量构建,缓存构建结果以便复用
  • 自动代码检查和测试

代码审查(Code Review)

  • 完善的代码审查工具,如可视化的 Web 界面、电子邮件集成、自动展示测试或静态分析的结果
  • 每个变更都必须由至少另外一人审查,并将审查结果自动复制到项目维护者的邮件列表
  • 鼓励小的变更,大的变更可以拆分为一系列较小的变更

测试(Testing)

  • 鼓励和广泛使用单元测试,Mocking 非常普遍
  • 广泛使用集成测试和回归测试
  • 自动测量测试覆盖率
  • 部署之前进行负载测试,显示关键的 metrics,比如延迟、错误率以及它们随请求速率的变化情况

Bug 跟踪(Bug tracking)

  • Google 使用名为 Buganizer 的 Bug 跟踪系统
  • 使用标签分类 bug
  • 每个 bug 都有一个默认的 assignee 和抄送邮件列表

编程语言(Programming languages)

  • 鼓励使用 C++、Java、Python 或 Go之一,最小化不同编程语言的数量
  • 每种语言都有 Google 风格指南,还有一个公司范围内的可读性培训
  • 不同语言之前使用基于 Protocol Buffers 的 RPC 通信
  • 为所有语言提供通用的开发工具,比如代码签出、编辑、构建、测试、审查、bug 报告等

调试和分析(Debugging and Profiling tools)

  • 在通用框架中提供调试和代码跟踪工具
  • 提供用于调试的网络接口检查 RPC 调用的时间、错误率和频率限制以及资源消耗、性能分析数据等

发布(Release engineering)

  • 频繁发布(比如每周或每两周),自动化发布任务,提高工程师积极性,允许更多迭代以加快整体速度
  • 发布分支,将 master 的修改 cherry-pick 到发布分支
  • 发布到 staging 服务器,测试部分生产流量的副本
  • 发布到 canary 服务器,测试真实生产流量的一个子集
  • 最后逐步发布到所有服务器

Launch approval

  • 任何用户可见的更改或重大的设计变更都需要工程团队之外的很多人员的审查和批准,以确保这些变更满足符合法律、隐私、安全、可靠性以及业务需求
  • Google 内部的 Launch approval 工具会跟踪这些审查和批准

Post-mortems

  • 任何重大的生产故障都需要写一份事后的总结文档,描述事件的原因、影响以及如何解决
  • 重点关注如何避免它们再次发生(而不是追究人员责任)

频繁重写(Frequent rewrites)

  • 大部分软件每隔几年都会重写一次
  • 减少了累计复杂性
  • 有助于适应当前的最佳实践,鼓励新的想法
  • 也是一种团队成员之间传递 ownership 的方式
  • 这是 Google 保持敏捷和长期成功的关键

项目管理

20% 时间

  • 允许工程师将 20% 时间花在喜欢的任何项目上
  • 有助于新想法的原型开发和演示,提高员工积极性
  • 鼓励创新企业文化

OKRs(Objectives and Key Results)

  • 个人和团队要明确记录目标并评估这些目标的进展情况,团队设置季度和年度目标
  • 建立关键结果来量化 OKR,用 OKR score 评估进展情况
  • 设置野心勃勃的 OKR 指标,即设置期望为目标的 65%
  • OKR 是全公司透明的,是一种简化的沟通框架,使每个人都清晰了解公司的目标以及自己的位置

项目审批(Project approval)

  • Google 没有明确的项目审批流程,一般通过自下而上的方式进行

公司重组(Corporate reorganizations)

  • 因项目取消而重组时工程师可以自由选择新的团队或角色
  • 在很大程度上,技术驱动公司应该进行频繁的重组以避免组织效率低下

团队建设

角色(Roles)

技术角色与管理角色分开,项目由技术主管领导和决策,而经理负责管理技术主管,指导职业发展,并负责绩效评估。

  • 软件工程师
  • 研究科学家
  • SRE
  • 产品经理
  • 项目经理

工作环境(Facilities)

  • Google 提供丰富的娱乐、运动和餐饮设施
  • 开放式办公鼓励沟通
  • 先进的视频会议设施方便不同团队的沟通

培训(Training)

  • 新员工培训,每个新员工都有导师和伙伴(Buddy)
  • 「Codelabs」和丰富的培训课程
  • 也支持外部机构学习

换岗(Transfers)

  • 鼓励在不同部门换岗,帮助公司内传播知识
  • 允许 12 个月内表现良好的员工更换项目
  • 鼓励临时性的参与其他项目

绩效考核和奖励(Performance appraisal and rewards)

  • 鼓励「peer bonuses」和「kudos」
  • 明确详细的晋升过程,确保正确的人得到晋升
  • 匿名反馈调查评估经理的绩效

▎小结

本文简要介绍了在 Google 使用的重要软件工程的实践方法。Google 是一个庞大并且多元化的组织,有一些部门用的是不同的实践方法,但是这里描述的实践方法被 Google 大多数的团队所遵循。

实践方法的详细内容请移步文末的英文原文链接。


原文链接:Software Engineering at Google

Google 里的软件工程学的更多相关文章

  1. Google开源SLAM软件cartographer中使用的UKF滤波器解析

    在Google开源SLAM软件cartographer中,相对<SLAM for dummies>使用了更为复杂.性能更好的Scan匹配与UKF算法,这里简单介绍下cartographer ...

  2. 隐藏windows7/8“卸载或更改程序”里的软件

    隐藏windows7/8“卸载或更改程序”里的软件 通过修改注册表即可隐藏电脑中已安装的软件,这个方法会造成卸载列表无法加载已安装的软件,请谨慎操作!提示:删除注册表后windows自带的卸载程序.其 ...

  3. Google分布式构建软件之一:获取源代码

    本文原文在google开发者工具组的博客上[需要FQ],以下是我的翻译,欢迎转载,但尊重作者版权,注名原文地址. 在Google,所有的产品都是在主干上开发的.这样的好处:每个人都可以查看和修改代码, ...

  4. Google分布式构建软件之二:构建系统如何工作

    分布式软件构建第二部分:构建系统如何工作 注:本文英文原文在google开发者工具组的博客上[需要FQ],以下是我的翻译,欢迎转载,但请尊重作者版权,注名原文地址. 上篇文章中提到了在Google,所 ...

  5. Google分布式构建软件之三:分布式执行构建步骤

    注:本文英文原文在google开发者工具组的博客上[需要FQ],以下是我的翻译,欢迎转载,但请尊重作者版权,注名原文地址. 之前两篇文章分别介绍了Google 分布式软件构建系统Blaze相关的为了提 ...

  6. Google分布式构建软件之四:分发构建结果

    注:本文英文原文在google开发者工具组的博客上[需要FQ],以下是我的翻译,欢迎转载,但请尊重作者版权,注名原文地址. 之前的文章,介绍了Google在分布式构建软件过程中,如何把构建过程分发到许 ...

  7. Ubuntu 14.04安装地里编码软件Nominatim过程

    一.必须软件: 在Ubuntu系统编译执行Nominatim软件系统必须安装的软件有: 1.GCC 编译器 2.postgresql 数据库 3.proj4 4.geos 5.postgis 6.PH ...

  8. Google、微软软件测试之道

    扫码时备注或说明中留下邮箱 付款后如未回复请至https://shop135452397.taobao.com/ 联系店主

  9. python IDE-pycharm在virtualenv里安装软件

    1  windows命令行,进入venv下的scripts目录,执行activate.bat进入虚拟环境 2  以selenium安装为例,输入pip install selenium回车开始安装 3 ...

随机推荐

  1. pymysql.err.IntegrityError: (1062, "Duplicate entry 'roxml-ROXML' for key 'PRIMARY'")

    在<Python数据挖掘-概念.方法与实践>一书的第3章实体匹配中,如果一路按照作者的代码及SQL语句进行配置运行的话,会出现如题目所示的错误.根据python脚本的执行错误提示显示,错误 ...

  2. placement new

    placement new就是把原本new做的两步工作分开来.第一步你自己分配内存,第二步你调用类的构造函数在自己分配的内存上构建新的对象. class Foo { float f; public: ...

  3. 8-cin cout PK scanf printf(速度快慢问题对比)

    我们在c++ 中使用cin cout很方便但速度很慢,导致有些题目用cin就超时而用scanf则就ac了,那到底改用谁? cin慢是有原因的,其实默认的时候,cin与stdin总是保持同步的,也就是说 ...

  4. udp调优经验

    降低丢包率: 1. 增大输入输出缓冲区 2. 调用发送接口时增大单次发送的buffer大小 8k 3. 多个socket 多线程接收 4 发送端流量控制,并且保证发送速率均匀 降低时延: 减小包大小? ...

  5. CMDB之数据采集

    一. 四种方式 1. Agent方式 api - URL - 发送数据格式 - 返回值 agent - 采集数据,发送数据 好处: - 简单 - 采集速度快,响应速度快 坏处: - 每台agent装的 ...

  6. GIT checkout 和 reset 区别

    git checkout -- file:撤销对工作区修改:这个命令是以最新的存储时间节点(add和commit)为参照,覆盖工作区对应文件file:这个命令改变的是工作区 git reset HEA ...

  7. HDU 6065 RXD, tree and sequence (LCA+DP)

    题意:给定上一棵树和一个排列,然后问你把这个排列分成m个连续的部分,每个部分的大小的是两两相邻的LCA的最小深度,问你最小是多少. 析:首先这个肯定是DP,然后每个部分其实就是里面最小的那个LCA的深 ...

  8. gcc中支持的一种字符串表示方式

    gcc支持的一种的字符串的表示形式 "xxx" "xxx" "xxx" 他会将这3个字符串连成一个并 且只会在最后的一个字符串末尾添加 '\ ...

  9. java 文件中 定义一个字符串,它的默认编码是什么?

    .java 文件的编码就是 String 字符串的编码 File 文件的编码就是 文件内容的编码 request 的设置的编码就是inputstream 的编码 jvm 的默认编码(the defau ...

  10. POJ1087 A Plug for UNIX 2017-02-12 13:38 40人阅读 评论(0) 收藏

    A Plug for UNIX Description You are in charge of setting up the press room for the inaugural meeting ...