Google 里的软件工程学

程序员的数学——傅里叶变换 作为音视频开发程序员,编解码的原理是必须了解的。而编解码原理中,傅里叶变换(Fourier Transform)是一个必学的数学知识。当然,网上可以搜索到的讲傅里叶变换的文章已经非常多,专门的书籍也有很多。而本文,主要总结搜集了众多网上相关资源,筛选出了其中质量较高的作为以后学习的参考 阅读详情

**简评:**原文作者 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

【DevFest 2020】嘉宾实录总结:Android codelab by郭霖 | Android 分会场 编者荐语: 文章来自郭霖老师公众号推文《Jetpack新成员,一篇文章带你玩转Hilt和依赖注入》,也是 DevFest 2020 Android 分会场 codelab 环节的详细总结与扩展,感兴趣的小伙伴往下看吧! 以下文章来源于郭霖 ,作者郭霖 11月22日,在上海,第 10 届 DevFest如约而至**。**我们与万名线上观众、1500+ 线下开发者、工程师,以及行业重磅嘉宾一起,尽享了一场技术盛宴! 在整场活动中,除了穿插70-80-90-00四代技术开发者圆桌会话的主会场,还有AI 阅读详情

相关推荐

零基础弄懂VLA原理:视觉-语言-动作模型核心机制解析

视觉-语言-动作模型(VLA)是具身智能的核心技术,本质是实现视觉感知、语言理解与物理动作三者在统一神经网络中的毫秒级多模态对齐。其原理突破传统模块拼接范式,依赖共享多模态编码器、具备物理约束建模能力的Action Head,以及支持复用与安全闭环的Action Chunk。该技术显著提升机器人对自然语言指令的泛化执行能力,广泛应用于工业协作、服务机器人与端到端具身系统。理解VLA,即掌握从语义意图到关节扭矩的完整映射逻辑,是当前AI工程落地的关键基础。

weixin_33716941的博客 447

谷歌软件之道

软件工程之道

qq_37903850的博客 271

谷歌的软件工程:软件开发

https://mp.weixin.qq.com/s/ojPUQRCQugV4q2syDJWJqw 谷歌的软件工程:软件开发 业界公认,谷歌是一家工程能力超强的公司。它有哪些好的工程实践?我们可以在里面得到哪些启发?其中又有哪些地方是被人诟病的?这些内容比较细致我们慢慢讲,本篇主要是讲开发。 Google Software Engineering - Software Development 代码...

小喽喽 1040

Google软件工程:什么是软件工程

• 编程不等于软件工程。软件工程是在时间、规模和权衡决策上的系统性工程;• 软件工程的三个特性:可持续性、规模性和复杂性;海勒姆定律和左移策略。

qq_41854911的博客 833

YOLO26算法皮革表面缺陷检测+训练好的模型+124张数据集+pyqt可视化界面.zip

附训练好的 YOLO 权重与 PyQt 可视化检测界面,页面底部含可视化效果预览,毕设/课设开箱即用。 【数据集概况】 · 检测类别(中文):[颜色(color), 切(cut), 折叠(fold), 胶水(glue), 好的(good), 戳(poke)] 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 68 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.7582** mAP50-95 | 0.4306 Precision | 0.6226 Recall | 0.6520 train/box_loss | 0.8731 train/cls_loss | 2.3543 val/box_loss | 1.3709 val/cls_loss | 3.9767 【训练过程分析】 从一开始的配置就定下了基调,训练配置包括了 yolo26n 模型、100 个 epoch,学习率初始设为 0.01,输入尺寸定为 640x640,批次大小为 24。这组配置在开始阶段表现得不错,模型刚开始训练时的 loss 降低得很快,这表明模型能够迅速从数据中吸收信息。但到了中后期,loss 曲线变得愈发平缓,从第 50 个 epoch 开始,即使我增加了学习率衰减的频率,仍然感到曲线在挣扎,像是陷入了平台期。这期间模型的收敛节奏明显减缓,似乎有些“停滞不前”的迹象。到了最后,模型确实收敛了,但在第 68 个 epoch 时 mAP50 获得了 0.7582 的值,这是一个不错的成绩,但与理想值相比仍有提升空间。... 使用场景:毕业设计、课程设计、深度学习入门、工业场景落地验证。

视频编码压缩11111

视频编码压缩11111

Google的软件工程概述

1. 介绍Google已经是一个非常成功的公司。正如在搜索和竞价广告方面的成功一样,Google也提供了许多其他突出产品,包括Google地图,Google新闻,Google翻译,Goo...

Agilean 的博客 801

两相交错并联Boost电路仿真模型(Simulink仿真实现)

内容概要:本文详细介绍了基于Simulink平台构建的两相交错并联Boost电路的仿真模型,系统阐述了该拓扑结构在提升系统效率、降低输出电流纹波以及改善动态响应特性方面的技术优势。文中涵盖了主电路架构设计、双闭环控制策略(电压环与电流环)的实现原理、关键参数(如电感、电容、开关频率)的选取依据,并通过仿真结果验证了控制方案的有效性与稳定性。该模型突出展示了多相交错技术在功率变换器中的应用价值,有助于深入理解现代电力电子系统的设计思路与优化方法,适用于新能源发电、储能系统及高效率DC-DC变换器的研发场景。; 适合人群:具备电力电子技术基础理论知识和Simulink仿真操作经验的电气工程、自动化、能源动力等相关专业的本科高年级学生、研究生,以及从事电源变换器设计与开发的工程技术人员。; 使用场景及目标:① 掌握两相交错并联Boost电路的工作机理及其在减小输入/输出电流纹波中的作用;② 学习并实践双闭环反馈控制策略的设计与调试方法;③ 利用仿真模型开展控制器参数优化,提升系统的稳态精度与抗扰动能力,为后续硬件原型开发提供理论支撑与设计参考。; 阅读建议:建议读者结合仿真模型逐步操作,重点关注交错控制时序、占空比分配、电感电流交错现象及环路补偿设计,对照理论分析进行波形观测与参数调整,深化对多相并联拓扑动态特性的理解,并将其迁移应用于实际工程问题中。

《谷歌的软件工程》笔记(一)

这个系列是这本书的读书笔记,这本书总共有四个部分。所以应该总共也就有四篇。第一部分只有一章,所以可以水一篇,开心。什么是软件工程软件工程是随着时间的推移不停地对代码进行集成(Program...

光谷码农 1134

什么是Merkle树?用“文件柜”类比理解区块链的核心技术

Merkle树是一种用于区块链的数据结构,像一个高效的“文件柜”,用于存储和验证大量交易数据。比特币通过Merkle树将交易哈希组织成树状结构,层层汇总,最终生成一个唯一的根哈希,存储在区块头中。这种设计大幅减少数据存储和验证成本,支持快速校验交易的完整性和存在性。Merkle树通过密码学保证数据不可篡改,广泛应用于比特币、区块链及其他分布式系统。它的优势在于高效、轻量和安全,尤其适合轻节点验证和数据同步。理解Merkle树就像掌握区块链的“索引秘籍”,是Web3世界的关键技术。

在路上的专栏 1192

从零到一:在RK3588 Android12上实战RTL8723DU WiFi蓝牙双模驱动移植

本文详细介绍了在RK3588 Android12系统上实战RTL8723DU WiFi蓝牙双模驱动移植的全过程。从驱动源码获取与修改、系统级集成与编译,到调试与性能优化,提供了完整的解决方案。特别针对USB接口适配、电源管理和蓝牙共存等关键问题给出了具体代码示例,帮助开发者快速完成驱动适配并提升设备稳定性。

weixin_28703489的博客 326

程序员2020年新书推荐之 01《Software Engineering at Google》

程序员2020年新书推荐之《Software Engineering at Google》 一、图书简介 如今,软件工程师不仅需要知道如何有效地编程,还需要知道如何开发适当的工程实践以使其代码库可持续和健康。本书强调了编程和软件工程之间的区别。 软件工程师如何管理有效的代码库,该代码库在生命周期中不断发展并响应不断变化的需求?根据他们在Google的经验,软件工程师Titus Winters和Hyrum Wright以及技术作家Tom Manshreck,对一些世界领先的从业者如何构建和维护软件进行了坦率而

iCloudEnd的博客 1787

深入解析Buck开关电源中的死区时间设计及其对系统性能的影响

本文深入解析了Buck开关电源中死区时间的设计原理及其对系统性能的关键影响。死区时间通过防止上下管同时导通来避免穿通电流,确保系统安全。文章详细探讨了其工作机制、设置时的效率与安全权衡,以及不当设置对效率、稳定性和EMI的连锁反应,并提供了基于实测的调试方法与实战案例。

Apple的专栏 1130

Jetpack新成员,一篇文章带你玩转Hilt和依赖注入

各位小伙伴们大家早上好。终于要写这样一篇我自己都比较怕的文章了。虽然今年的Google I/O大会由于疫情的原因没能开成,但是Google每年要发布的各种新技术可一样都没少。随着Andr...

郭霖 656

Altium Designer 16安装教程(Windows11、小白教程)

Altium Designer 16在Windows11中的超详细安装教程

qq_47003770的博客 1万+

4D毫米波雷达

详解4D成像毫米波雷达

sangba2019的博客 2393

Android Hilt:依赖注入解耦与 Hilt MVVM 解耦思路

Android Hilt:依赖注入解耦与 Hilt MVVM 解耦思路、@HiltAndroidApp、@AndroidEntryPoint、@Inject、@Binds、@Provides、Qualifier、@InstallIn、@HiltViewModel

OuO-1 的博客 413

量化策略分享 | MA超进化:LLT低延迟趋势线

移动平均线(MA)是我们技术分析中常用的一种趋势跟踪指标,但在使用的时候你是否也会有这样的烦恼:交易信号延迟太久,或者交易信号太频繁了!延迟性和平滑性问题似乎是不可兼得的“鱼和熊掌”。 针对这个问题,广发证券基于通信领域的滤波器原理,在《短线择时策略研究之三:低延迟趋势线与交易性择时》中创造性构建了:LLT低延迟趋势线(Low-lag Trendline)。 LLT低延迟趋势线是一种二阶滤波器,阶数相对适宜,相比MA、EMA等均线指标能够降低延迟,同时增强在低频部分的输出信号。 当然,..

量化交易研究 5310

Google公司的软件工程之道 (3)

http://mp.weixin.qq.com/s/6KMFeVlt1QzLkfcYcWC08A 英文原文由Google软件工程师Fergus Henderson 于2017年1月31日所写,文章末尾原文链接。 【本文比较彻底、全面地分享谷歌公司的软件工程之道, 总共分为三部分,前面已经发布了Google软件开发之道: Google公司的软件工程之道 (1

wuxiaobingandbob的专栏 1669

Darknet-Yolov3 移植过程

本教程面向使用寒武纪平台进行深度学习推理任务的开发者。针对当前主流检测网络darknet-yolov3,进行寒武纪平台的移植。开发者对照移植过程,能够利用寒武纪智能处理器设备完成多种场景的目标检测任务。本实验代码基于 Neuware 1.6.1 与 Python 2.7 环境。

shengyin714959的博客 438

在Tricore上移植μC/OS-III——1.1 AURIX Development Studio的使用

本文主要介绍AURIX Development Studio软件的安装和使用方法。 英飞凌针对Tricore系列单片机推出了一款免费的软件——AURIX™ Development Studio,集成了iLLD库,内置Tasking compiler和Tasking Debugger,但这两个模块只能用于非商业用途,可供学习和试用。iLLD库是英飞凌为TC2XX和TC3XX Tricore系列单片机提供的底层驱动库,有完善的使用手册,和较好的移植性。 可从下面的链接获取软件安装包,软件安装好后,新建工程时会自

weixin_42967006的博客 2290

极光推送集成流程

Android极光推送集成(可接收到服务端推送消息) 最近公司的项目中用到了极光推送,查文档,百度,终于算是基本实现了功能。从来没写过任何博客,所以想着将极光的集成流程大致记录一下,方便日后再次用到的时候,不至于忘记一些重要细节,如果能帮到那些初次集成极光碰到问题的朋友,那自然是更好了。 第一步,注册极光开发者服务,然后进入到后台,创建应用,填写我们自己应用的名称,上传...

wzs470733294的博客 1517

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

《谷歌的软件工程》笔记(二)

这本书第二部分讲的是文化,对于技术人员来说稍微有点无聊,不过决定我们在一家公司工作舒服不舒服的,其实主要就是这些文化内容,如果用这一部分里的内容去考核那些我们日常工作中的人,可能结果也会令...

光谷码农 914

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: 作为软件工程师,如何进行知识管理
下一篇: 17 个关于雪花的有趣事实
极光推送
博客等级 码龄14年 109粉丝 108原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值