谷歌工程师文化中的几个核心原则

转载自  谷歌工程师文化中的几个核心原则

每周,一组谷歌员工都会在厕所的墙壁上粘贴一页来分享本周的测试小建议。有时这页纸会讨论依赖注入,并提供一个简单的示例展示如何用不同语言使用它;有时它可能会分享如何安装一个用于测量团队代码库测试覆盖率的软件。

“Testing on the Toilet”起初是个奇怪又有趣的方式,来教给工程师在工作中会用到的一些新的东西,这也被突出为Google文化中的核心力量:向工程师组织有效的传播一系列最佳实践。

 

我大学毕业后便加入Google的搜索质量团队,在2006年中旬到2008年中旬在其工作,在这期间,公司的规模从8000人上涨到20000人。在我的第一个项目,我同两位极具天赋的工程师一起工作,短短六个月,我们原型化、测试并启动了网站的新功能,每天向数百万用户在google.com上展示相关搜索。作为团队的新员工,自始至终最突出的感受是:

 

在这样的环境中,公司是如何能使像我这样的新工程师快速成长起来?

如果不是因为Google工程文化的关键要素,对于我们这样规模的团队来说,在如此短时间内发布新特性是极为困难的。这里的文化要素让我能够迅速地获得Google的代码库、工具和基础设施。这也是使公司能够达到今天50000员工规模的根本原因。

一些前谷歌员工可能抱怨公司变得迟缓和官僚,但是不可否认它已经获得很高的成就和很大的规模,在《财富》评选的100家最适合工作的公司中名列前茅。

下面是我从谷歌工程文化中获得的六个核心原则,希望你也能够从中获益:

1.把工程资源用于共享工具和抽象概念。

在早期谷歌在工具和抽象概念上大力投资,例如Protocol Buffers,MapReduce,BigTable和其他在工程中自始至终都会用到的东西。解决问题好的态度并使得每个人能够接受已经带来巨大的收益。每个团队都花费较少的心理周期选择使用哪个工具,专注于工具的团队能够更关注提升工程生产力,和改善已经使用的工具和服务。每个团队可能使用截然不同的工具链,这也意味着当你学习了基本单元结构后,更容易理解许多项目背后的设计。这个方法的负面影响就是有些时候你可能感觉你的case是被强行塞入一个特别的良好支持的工具,即使它不是最好的。

2.在新工程师培训中投资可重复使用的训练材料。

我在谷歌能够迅速变得如此高产的一个原因是公司在培训材料上面花了大力去投资,其称之为Codelabs,Codelabs包括了公司的核心抽象模型,解释它们为什么被设计出来,突出代码库的相关片段,以及通过实现练习验证理解它们。如果没有它,我将会花更多的时间来学习各种我需要去了解的各种技术,这也意味着我的队员要花费更多的精力向我去解释它们。我在谷歌这样积极的经历,强有力的影响了我在后来的Quora新人培训过程中大力推崇Codelabs使用的决定。

3.标准化编码约定。

每个关于空格、大小写、行长度、是否使用智能指针等约定,可能似乎是不重要的,但是到了谷歌这样的大规模时会带来巨大的影响。我不是第一次承认,当代码校验人员挑刺我的代码令我感到十分不愉快,就因为我没有正确的缩进或在行长度超出了规定的两个字符。但是因为大家都遵循同样的约定,使得浏览代码变得大大容易。当更换团队或在跨部门项目中工作时,这几乎没有额外支出去学习新团队的约定。当团队规模很小时,约定是那种很容易被忽视的东西,但是在代码和团队规模逐渐壮大在这方面越来越做出改变,这样你事实上希望从始至终都是一致。如果可能早期在约定一致性上保持一致,或者使用谷歌开源的风格指南。

4.通过代码复审(Code Review)提升代码质量。

对每次改变进行代码复审减缓了迭代更新的速度,但是提升了代码质量,新工程师收到反馈后,他们需要迅速的采取最佳的实践并专注于公认的代码质量等级。总体的代码质量越高,也就意味着新工程师在模仿周围人员的代码同时,初期就会写出更加简洁的代码。因此,代码复审有助于公司在较大规模上位置较高的软件质量。

5.用正确数据解决很多问题。

谷歌研发主管Peter Norvig经常谈到在解决复杂问题上“不合理的数据有效性”。正确的数据能够帮助你了解用户,划分办公室政治,解决争论,并让你跟上进度。开发日志和数据基础工具,如Sawzall和MapReduce,使谷歌的工程师从大量数据中筛选出来变为可能。

6.自动化测试来衡量你的代码。

谷歌有十分强烈的单元测试文化,“厕所测试”就是一个例子,差不多我每做一次代码的改动都伴随一个单元测试,代码复审员将会严格地检查他们。这让开发变慢,但它也意味着成百上千的工程师可以改变代码库中的同一部分而不会牺牲过多的质量和可靠性。谷歌以同样的方式在共享工具上进行投入,它也会共享测试框架,并通过最好的测试实践让大家写测试变得更容易。

当我后来在Ooyala和Quora帮助他们构建团队和产品时,谷歌的工作强烈地让我思考,在哪些地方什么会形成良好的工程文化。然而,在谷歌这样规模的公司工作好,并不一定意味着,会在不同机构不同发展时期的工作同样会好。

每个工程决策都包括一系列权衡,谷歌工程文化只是提供了一部分权衡,希望可以从这里学到一些对你价值的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325947.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初探CSRF在ASP.NET Core中的处理方式

前言 前几天,有个朋友问我关于AntiForgeryToken问题,由于对这一块的理解也并不深入,所以就去研究了一番,梳理了一下。 在梳理之前,还需要简单了解一下背景知识。 AntiForgeryToken 可以说是处理/预防CSRF的一种处理…

双重循环

一、什么是二重循环? 一个循环体内包含另一个完整的循环结构。 比如说: 1.while(循环条件1){ //循环操作1 while(循环条件2){ //循环操作2 } } 2.do{ //循环操作1 do{ //循环操作2 }while(循环条件2); }while(循环条件1); 3.for(循环条件1){ //循环操作1…

二维数组常用的赋值方式

静态初始化并赋值 int[][] data new int[][] { { 1, 2 }, { 2, 3 }, { 2, 3, 4 }, { 1, 2, 3, 4 } };print(data);int edges[][]{{0,1},{1,2},{1,3},{2,4},{3,4},{2,5}};动态赋值 //动态赋值int[][] data2 new int[3][2];for (int i 0; i < data2.length; i) {for (int j…

HBase体系架构说明

HBase体系架构说明&#xff01; client&#xff1a;两种—-Hbase shell 命令行接口 JavaAPI client访问Region不能直接访问&#xff0c;首先client需要先连接到zookeeper&#xff0c;zookeeper管理HMaster&#xff0c;说明&#xff0c;hdfs集群&#xff0c;在没有zookeepe…

面试中的这些坑,你踩过几个?

转载自 面试中的这些坑&#xff0c;你踩过几个&#xff1f; 01、请你做一个自我介绍 误区&#xff1a; 一般人回答这个问题过于平常&#xff0c;只说姓名、年龄、爱好、工作经验&#xff0c;这些在简历上都有。 要点&#xff1a; 简历上有的可以一两句话带过&#xff0c;…

asp.net core 编译mvc,routing,security源代码进行本地调试

因为各种原因&#xff0c;需要查看asp.net core mvc的源代码来理解运行机制等等&#xff0c;虽说源代码查看已经能很好的理解了。但是能够直接调试还是最直观的。所有就有了本次尝试。因调试设置源代码调试太辍笔&#xff0c;所以不用这个方法&#xff0c;转而使用编译源代码的…

并查集判断是否有环存在

题目描述 思路分析 代码实现 package com.atguigu.disjointSet;public class djset {public static int VERTICES6;public static void initialise(int parent[]){int i;for (i 0; i < VERTICES; i) {parent[i]-1;}}public static int find_root(int x,int parent[]){int …

进入ASP .net mvc的世界

一、mvc执行流程&#xff1a; 启动mvc项目–>Global.asax–>App_Strat–>RouteConfig–>Controllers(控制器)–>View(视图)–Index.aspx 二&#xff1a;Controller&#xff0c;控制器的代码&#xff0c;包含动作方法和业务操作 三&#xff1a;View&#xff0c;…

Visual Studio 2017更新,侧重于提高稳定性

Microsoft已对其旗舰开发软件产品Visual Studio 2017&#xff08;VS2017&#xff09;的安装程序和设置引擎做了全新设计&#xff0c;意在能快速地部署更新到VS2017。VS2017的第一个命名版本更新在VS2017首发的一个月后就可用&#xff0c;这充分体现了这一全新设计的优势所在。 …

你还在Java8中使用循环语句吗?

转载自 你还在Java8中使用循环语句吗&#xff1f; Java 8中的新功能特性改变了游戏规则。对Java开发者来说这是一个全新的世界&#xff0c;并且是时候去适应它了。 在这篇文章里&#xff0c;我们将会去了解传统循环的一些替代方案。在Java 8的新功能特性中&#xff0c;最棒…

hadoop fs -ls / 出现WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform

Hadoop fs -ls / 出现WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable问题 配置完hadoop启动的时候出现如下警告信息&#xff1a; WARN util.NativeCodeLoader: Unable to load native-…

阅读器关闭时尝试调用Read无效时的解决方法

今天在写asp .netmvc的项目时&#xff0c;发现了个困扰我很久的问题&#xff0c;经过仔细研究终于解决了。 问题如下&#xff1a; 首先来看一下原来有问题的代码&#xff1a; public static SqlDataReader Excutereader(string sql,params SqlParameter [] param) {using (SqlC…

.NET或将引入类型类和扩展

类型类是另外一项正被考虑引入.NET未来版本的特性。在提案“外观和扩展&#xff08;Shapes and Extensions&#xff09;”中&#xff0c;该特性被称为外观&#xff0c;它们将大幅提升.NET泛型的能力。Mads Torgersen这样描述类型类&#xff1a; 接口抽象的是作为类型实例的对象…

成为更优秀的程序员:退后一步看问题

转载自 成为更优秀的程序员&#xff1a;退后一步看问题 一天&#xff0c;在工作中… Bug #3890 来自客户&#xff1a; 有个程序出现了错误&#xff0c;程序提示说“SpeedCalculator::compute()里出现了除零情况”。 请尽快修复&#xff01; 你打开SpeedCalculator.php&#…

JAVA生成随机数

方式一 Random rand new Random();for(int i0; i<10; i) {System.out.println(rand.nextInt(10) 1);}方式二 for (int i 0; i < 50; i) {arr[i](int)(100*Math.random());}

深夜福利, 小试linuxkit

前言 今天小编的朋友圈被DockerCon和linuxkit刷屏了&#xff0c;再不出来写点linuxkit的东东恐怕就要跟不上时代了。小编翻阅了N多的有关linuxkit的文章&#xff0c;发现绝大多数都是英文的讲解&#xff0c;小编本着对读者负责的态度决定先将linuxkit的文章翻译成中文&#xff…

HBase的hbase shell 详解

进入hbase命令行 ./hbase shell 显示hbase中的表 list 创建user表&#xff0c;里面包含info&#xff0c;date两个列族 create user,info,data create user,{NAME > info, VERSIONS > 5},{NAME > data , VERSIONS > 5 } 插入数据 puthbase> put ns1:t1, r1, c1, …

类的无参方法

一、方法&#xff1a; 1.组成&#xff1a;访问修饰符&#xff08;public&#xff09; 返回值类型&#xff08;void,String ,int&#xff09; 方法名&#xff08;采用驼峰命名法&#xff09;(){ //方法体 } eg:public String run(){ //方法体 return “快跑”; } 注意&#xff1…

这些保护Spring Boot 应用的方法,你都用了吗?

转载自 这些保护Spring Boot 应用的方法&#xff0c;你都用了吗&#xff1f; Spring Boot大大简化了Spring应用程序的开发。它的自动配置和启动依赖大大减少了开始一个应用所需的代码和配置量&#xff0c;如果你已经习惯了Spring和大量XML配置&#xff0c;Spring Boot无疑是…