- Google如此的成功有很多原因,包括开明的领导、杰出的人才、高标准的招聘门槛和其在非常快速增长市场中通过领先地位积累的财务实力。但其中还有一个原因是Google积累了卓越的软件工程实践经验
1、代码仓库
在Google,绝大多数的代码都存储在一个代码仓库中,Google所有的工程师都可以访问该仓库
所有的开发代码修改都发生在代码仓库的头部,即master开发,有测试保证的情况或者结对编程的情况下
自动化测试系统会频繁测试,测试可视化
提交代监测
代码所有权
2、构建工程
工程师通过写"Build"文件告诉Blaze如何去构建他们的软件。构建的实体例如链接库、程序、测试都通过高层次的声明性的构建规范声明,指定每一个实体、其名字、源代码文件、链接库和其需要依赖的其他实体。构建的规范由一系列"build rule"组成,其中的每一个都详细指定高层次的概念
在该构建系统中,编译器器也被当作输入。
3、代码检视
可以进行多人检视并评论
因为在开发中进行代码审阅比在开发完成后进行要更为高效
鼓励工程师使用尽可能小的修改
鼓励小修改的一种方式是,代码审阅工具会根据提交修改量分类标记该提交,30-99行的增/删/移除会被标记为"medium-size"(中型修改),超过300行以上会被打上不太友好的标记,例如"large"(大型修改,300-999)
4、测试
Google强烈推荐并广泛使用单元测试
Google也广泛使用集成测试和回退测试。
Google也开发了自动化评估测试覆盖度的工具,该工具的分析结果可以作为源代码浏览时的可选的一层。
5、Bug跟踪
bug分类、标签
Bugs会被分类和层次组件化,每个组件都会有默认的委托人和默认邮件CC列表。当发送一个源代码请求审阅时,工程师可以立即关联到相应代码修改的问题编号。
6、程序升级语言
Google强烈鼓励工程师使用正式批准的5种程序设计语言C++、Java、Python、 Go或JavaScript之一进行编程。减少编程语言的种类可以减少代码复用和代码合作上的障碍
对于每种程序设计语言,Google都有其编码风格规范,鼓励公司所有的代码都有相近的风格、布局、命名规范等。此外,Google还有全公司范围的代码可读性培训,关心代码可读性资深的工程师会培训其他工程师使用特定的一种语言如何去写可读性高、符合惯用模式的代码。
不同语言之间的互操作主要使用Protocol Buffers。Protocol Buffers是一种可扩展的结构化编码数据的方式。它包括领域特定语言定义数据结构和一个编译器,输入定义好的数据结构描述,自动生成该数据结构对应C++, Java, Python对象代码,代码中提供构造、访问、序列化、反序列化这些对象的功能
过程的通用性是使开发容易的关键性因素,即使在由庞大的代码库和多种程序语言的情况也是如此。
7、调试和统计工具
对大多软件来说,会频繁进行发布
自动化绝大多数普通的发布任务使频繁的发布成为可能
频繁的发布有助于保持程序员的积极性(不然,在以月计甚至以年计的发布周期中很难保持兴奋),并提升整体迭代的速度,在给定的时间内也就增加反馈和响应反馈的机会。
8、发布工程
构建发布分支--小规模集成测试,其他的改动进行"cherry-picked"操作
"staging"(临时)服务器 集成测试
下一步通常是部署一个或者多个”canary“(金丝雀)服务
最后,该发布会在所有数据中心全部部署。对于高请求量、高可靠性的服务,会在几天时间内逐渐部署,这有助于减少由于之前步骤没有发现的bug而引起的故障的影响。
9、 发行许可
10、事故分析
11、频繁重写
表面上看起来这样代价非常高,实际上,它也确实消耗了Google的一大部分资源。但是,它同样有重大的意义,是Google保持敏捷和长期成功的关键性因素。在几年内,通常产品的需求会发生重大的改变,软件开发环境及其周围相关的技术也会改变,并且技术或者市场上的改变会影响用户需求、渴望和期望。几年以上的老软件是基于旧的需求集合开发的,通常不是根据当前需求的最优设计。而且,通常也积累了很多复杂性。重写代码避免了为了解决不再重要的需求引入的累积复杂性。除此之外,重写代码还是一种迁移学习知识的方式,也能让新的团队成员找到归属感。归属感对生产力非常重要:工程师天然的会在他们感觉是“自己的”代码上投入更多的精力开发和修复问题。频繁重写也鼓励了在不同项目间流动,这有助于鼓励思想的交叉碰撞。频繁重写也有助于确保代码是使用现代的技术和方法论开发的