谷歌的软件工程:软件开发
· 阅读需 9 分钟
业界公认,谷歌是一家工程能力超强的公司。它有哪些好的工程实践?我们可以在里面得到哪些启发?其中又有哪些地方是被人诟病的?这些内容比较细致我们慢慢讲,本篇主要是讲开发。
代码库
- 截止15年有 20 亿行代码存在少量的 Monorepo 单一代码库中,绝大部分代码对所有人是可见的。谷歌鼓励工程师见到有问题就可以改,只要所有人审核通过,就能进库。
- 几乎所有的开发都是在代码库的头部 (head) 进行的,而不是在分枝上,避免 merge 时候遇到问题,安全修复也更方便。
- 每个改动都会触发测试,有错几分钟内就能通知作者和审查者。
- 代码库的每个子树至少有两个所有人,其他开发者可以提交修改,但是所有人批准才能进库。
构建系统
- 分布式构建系统 Bazel 让编译、链接、测试轻 松快速。
- 成百上千台机器。
- 可靠性高,确定的依赖输入导致确定的结果输出,不会出现奇怪的不确定的抖动。
- 快。一个构建结果缓存了,依赖它的构建会直接采用缓存,不必重新勾结。只会重新构建改动的部分。
- 提交前自检 (pre-submit checks)。一些快速的测试可以在提交前先执行。
代码审查
- 有代码审查工具
- 所有改动必须有审查
- 发现 bug 之后可以去之前的那个审查上指出问题,相关人员会被邮件通知到
- 实验性质的代码不用强制审查,但是生产环境下的代码一定会被审查
- 鼓励每个改动尽量小。百行以内是“小”,三百行以内是“中”,一千行以内是“大”,超过一千行是“超tm大”。
测试
- 单元测试
- 集成测试、回归测试
- 提交前检查
- 自动生成测试覆盖率
- 部署之前做压力测试,并产生相应的关键指标,尤其是延迟、错误率随着负载的变化
Bug 追踪工具
Bugs, feature requests, customer issues, process 等等都记录起来,需要时常 triage 以确认优先级然后分配给相应的工程师。