Google的Fergus Henderson在Software Engineering at Google中介绍了Google的软件工程实践。

软件开发

源码仓库

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

Blaze分布式构建系统

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

代码审查

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

测试

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

Bug跟踪

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

编程语言

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

调试和分析

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

发布

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

Launch approval

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

Post-mortems

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

频繁重写

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

项目管理

20%时间

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

OKR(Objectives and Key Results)

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

项目审批

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

公司重组

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

人员管理

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

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

工作环境(Facilities)

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

培训

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

换岗

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

绩效考核和奖励

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

更多内容请参考英文原文https://arxiv.org/pdf/1702.01715.pdf。更多SRE的内容请参考SRE以及SRE笔记

Software Engineering at Google的更多相关文章

  1.  Go is more about software engineering than programming language research.

    https://talks.golang.org/2012/splash.article Go at Google: Language Design in the Service of Softwar ...

  2. Software Engineering: 3. Project planning

    recourse: "Software Engineering", Ian Sommerville Keywords for this chapter: planning sche ...

  3. 第二篇——The communication during software engineering.

    I've learned a lot in my software engineering class about how a program comes out.That's also a esse ...

  4. Software Engineering: 2. Project management

    resources:"Software Engineering" Ian Sommerville For most projects, important goals are: D ...

  5. Software Engineering: 1. Introduction

    Resource: Ian, Sommerville, Software Engineering 1. Professional software development 1.1 Software e ...

  6. SENG201 (Software Engineering I) Project

    SENG201 (Software Engineering I) ProjectSpace ExplorerFor project admin queries:For project help, hi ...

  7. 个人阅读作业2—《No Silver Bullet: Essence and Accidents of Software Engineering》读后感

    在进行了一次结对编程.一次团队编程和一次个人编程项目后,读了<No Silver Bullet: Essence and Accidents of Software Engineering> ...

  8. 10. Software, Software Engineering, water fall (瀑布模型),Code Complete等名词的来源

    ①.Software-软件”一词是20世纪60年代才出现的,软件Software——1958年由贝尔实验室的著名统计学家John Tukey 提出软件与硬件一起构成完整的计算机系统,它们是相互依存,缺 ...

  9. SEMAT[软件工程方法和理论 Software Engineering Method and Theory]

    Agile software development Agile software development is a group of software development methods bas ...

随机推荐

  1. 如何设置,使IntelliJ IDEA智能提示忽略大小写

  2. ChannelOption用到的socket的标准参数

    ChannelOption.SO_BACKLOG, 1024 BACKLOG用于构造服务端套接字ServerSocket对象,标识当服务器请求处理线程全满时,用于临时存放已完成三次握手的请求的队列的最 ...

  3. 史上最易懂的大数据 OTO

    史上最易懂的大数据 OTO http://network.51cto.com/art/201503/467068.htm 终于有人把O2O.C2C.B2B.B2C的区别讲透了 http://tech. ...

  4. Audit File Delete

    OPEN 4656 ACCESS   4663 AN OBJECT WAS DELETED 4660 CLOSE 4658 1537 = Delete 1538 = Read_CONTROL 1541 ...

  5. Setting IE11 with Group Policy Preferences

    一.Setting Home Page with Group Policy Preferences 1.Open the Group Policy Management Console and cre ...

  6. 查找文件路径find

    查找文件路径find              1.按照文件名查找 (1)find / -name httpd.conf #在根目录下查找文件httpd.conf,表示在整个硬盘查找 (2)find ...

  7. Deep Learning -- 数据增强

    数据增强 在图像的深度学习中,为了丰富图像训练集,更好的提取图像特征,泛化模型(防止模型过拟合),一般都会对数据图像进行数据增强,数据增强,常用的方式,就是旋转图像,剪切图像,改变图像色差,扭曲图像特 ...

  8. PyMySQL防止SQL注入

    一.SQL注入简介 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库. 二.SQL注入攻击的总体 ...

  9. php 获取各类时间归类

    //php获取今日开始时间戳和结束时间戳 $beginToday=mktime(0,0,0,date('m'),date('d'),date('Y')); $endToday=mktime(0,0,0 ...

  10. python2 跟3的区别

    1----python2:1 臃肿 , 源码的重复量很多2:语法不清晰,掺杂着 c,pyp,java,的一些陋习 python3: 几乎是重构后的源码,规范 清晰 优美 2.python的分类 分为编 ...