【CSDN编者按】提到开发工具,谷歌算得上是世界领先的,但是由于几乎所有的工具都和谷歌内部的生态系统紧密相连,这意味着离开了谷歌,这些工具或都将受限。为了打破这一瓶颈,一位曾在谷歌工作过的工程师BeyangLiu,分享了在使用谷歌工具的同时如何更好地引入其他的开发工具。一起来看看吧!

原文链接:https://about.sourcegraph.com/blog/ex-googler-guide-dev-tools/

本文由CSDN翻译,未经授权,禁止转载。

译者 | 章雨铭 责编 | 屠敏
出品 | CSDN(ID:CSDNnews)

很多年以前,我曾在谷歌短暂地工作了一段时间,没错,我也算是谷歌的一名前员工。虽然从谷歌离职后,周围的很多事都发生了不小的变化,但即使只是短暂地接触了谷歌的内部开发工具,也给我留下了深刻的印象。

谷歌内部的开发工具从很多方面来说,都可以算是世界上最领先的。谷歌不仅领头开发了自身软件系统,还优先探索如何大规模且高效地构建软件。多年来,谷歌无论是在代码库规模,还是代码可发现性、组织知识共享和多服务部署相关等问题的解决方案,都是很多其他公司无法企及的。

图源Sourcegraph

然而,从另一个角度来看,谷歌的内部工具是非常局限的。几乎所有的这些工具都和谷歌的内部生态系统紧密相连。所以,这意味着,如果从谷歌离开,你不能把这些工具也一起带走。

从谷歌离职的员工,成为很多其他公司的人才,他们在加入其他公司时,也常会分享在谷歌吸取的经验与教训。但是对于他们来说,使用过最前沿的工具之后,想要适应谷歌以外的编程开发环境并不容易,尤其是在他们已经产生依赖的工具无法使用之后。

这些年,我从自身的经历和其他从谷歌离职的人中学到了许多。

Sourcegraph早期的许多客户,就是因为在离开谷歌后,想念谷歌的代码搜索功能从而寻求我们的帮助。通过和他们密切合作,我们了解他们需要填补的空白,从而更好地构建Sourcegraph以满足他们的需求。一些谷歌前员工在不断探索将开发工具引入新公司的方法,结合他们在谷歌使用开发工具的经验,创造了一些模式。有的探索成效显著,有的则效果不佳。

所以,我认为写一本注重实操的关于谷歌以外的开发工具指南是很有必要的。当然,很多谷歌前员工都希望能够简单地将谷歌内部生态克隆到新的公司,但这显然行不通。

下面我将谈谈我的看法,关于谷歌前员工该从哪里开始的建议,以及能够使其团队高效运作的一些普遍的方法。

谷歌内部工具的软件开发生命周期:使用 or 不使用

刚从谷歌离职的员工在进入一家新公司后,可能有一种挫败感,因效率大不如前。你想要做出一些改变,但是从哪里开始呢?我认为,第一步应该是从日常工作中找出问题所在。

无论是在谷歌内部还是其他组织,软件开发的生命周期都大同小异:

  1. 开发者列出要构建的功能或者需要修复的错误;
  2. 通过阅读一堆代码、设计文档,和同事讨论,了解问题所在,以及给出一个能基本适应现有系统的解决方案;
  3. 编写代码。首要目的是让代码先运行起来。期间可能需要反复查看文档,或者再读几遍代码;
  4. 虽然代码已经可以运行,但是还没准备好交付。修复破坏了的测试,再做一些测试。重构代码让代码更整洁,并且让下一个接手的人更容易理解。将代码推送至代码库生成分支,等待CI运行,期间开发者可能还会进行一些额外的修复和细微的改进;
  5. 提交修补程序进行审核。根据团队的其他成员提出的意见进行修改。修改以后,在审核人员通过修改以前,这个过程可能还需要重复几轮;
  6. 合并补丁,进行部署;
  7. 监控系统将检查代码是否存在生产问题。如果新的补丁造成中断,就需要再进行修复。

在上述的每一个阶段,通常会需要工具来辅助开发者。工具能够塑造开发者的工作周期,并且对于生产力有巨大的影响。

为了提高生产力,开发者需要更好的工具。我推荐一个有用的GitHub存储库,其中包括谷歌内部几乎所有工具以及谷歌之外的公司拥有的最接近的工具。(链接:https://github.com/jhuangtw/xg2xg)这个列表很全面,但是让人眼花缭乱。那么,应该从哪里开始呢?

新工具放一边,先熟悉现有工具

开始的第一个月,不要试图改变,只需要聆听+学习。

作为团队的新成员,你可能没有影响力或权限来更改团队使用的工具。另外,你还缺乏一些对于团队行事风格和原因的了解,以及使用现有工具的理由。简单的复制粘贴谷歌的工具并不一定就适合你的新团队。所以,你需要通过多听多学来了解什么是对团队有用的,而什么是团队不需要的。

从易到难

代码搜索是个好工具。作为代码搜索公司的联合创始人,我这么说像是自卖自夸。但我这么说是有理由的:

  • 首先这是谷歌前员工最想念的工具之一;
  • 你可以尝试不同的代码搜索引擎,找出好用的再推荐给其他人。这意味着你既不需要获得批准,也不需要花费宝贵的时间来说服其他人使用你自己都没用过的工具;
  • 大多数团队还没有代码搜索工具,所以其他人不会被迫改变现有的习惯。(如果你的团队已经开始频繁地使用出色的代码搜索工具,可跳过本节。)

如果你的新公司有多个团队,你可能会需要处理更多的代码,并且一个人摸索。即使你在一家规模较小的公司,也有可能通过依赖项获取大量的开源代码。这些代码是你在构建新功能或者跟踪某些关键Bug来源时需要深入研究的。

考虑到现在开发者必须要处理的代码的规模,如果缺乏代码搜索,就会严重影响开发的进度。

在选择代码搜索引擎时,需要考虑以下几点:

  • 查询语言:正则表达式只是入场券。代码搜索引擎应该确保代码搜索查询语言具有很好的表现力,且易于使用的。文字搜索应该是直观的,另外,更高级的模式匹配也是必要的;
  • 扩展性:代码搜索引擎要能够适应代码库的规模。如果代码库超过几千兆字节,那么关键就要看代码搜索引擎是否使用了三元组索引,因为这样你才能在大型代码库中实现正则表达式匹配;
  • 代码浏览:使用过谷歌代码搜索的人都知道的,搜索并非是其全部。用户希望单击后能跳转到定义并查找引用,就像在IDE开发环境中查看代码一样简单。但是,如果没有出色的代码浏览,用户就需要经常在编辑器和代码搜索引擎之间来回切换;
  • 权限:如果公司强制实施代码库权限,那么就需要考虑代码搜索引擎是否符合这些权限;
  • 总体成本:考虑代码搜索引擎的价格和保持工具在线的维护开销。

以下一些常见的代码搜索引擎:

  • OpenGrok:一个非常老但生命力持久的代码搜索引擎,现在由Oracle维护;
  • Hound:由Etsy的工程师创建和开源的代码搜索引擎;
  • Livegrep:由Stripe的Nelson Elhage创建的代码搜索引擎;
  • 当然,还有我们的Sourcegraph。

获得良好的监测

另一个需要尽早改进的方面是监测。工程师总有些时候必须要处理一些在生产环境中出现的问题。生产和开发截然不同——不能只是设置断点或者添加printf就能马上看到效果。在很多方面,对于生产环境进行更新会产生巨大的开销,比如消耗计算资源,以及花费开发者大量的时间。

在过去的5-10年的时间里,部署发生了巨变。微服务、Kubernetes,云迁移等技术,极大地改变了公司部署软件方式。许多公司已经采用了这些新方式和技术,但这些公司还没有更新其监测基础结构,以便在新的生产环境中轻松地进行调试。

幸运的是,近年来,优秀的新开源工具和公司涌现,它们极大地改善了谷歌之外的世界中的监测和可观察性状态。

  • Prometheus:一个时间序列指标跟踪器和可视化工具,类似于Borgmon。它能够让用户通过检测应用程序来跟踪随CPU
    利用率、错误率和p90延迟等指标的变化;
  • Grafana:一个类似于Viceroy的仪表板工具。一种常见的方式是将Grafana与Prometheus连接起来,这样用户就可以构建指示整体应用程序运行状况的关键指标的单页视图。

谷歌率先推出了分布式跟踪,这是一种日益常见的多服务架构的重要工具。Dapper的创造者之一Ben Sigelman继创建了Lightstep。分布式跟踪现在是许多监测系统的一个功能,包括像Honeycomb和Sentry这样的付费产品,以及像Uber工程师构建的Jaeger这样的开源项目。

考虑到监测必须集成到生产环境中,所以引入监测比引入代码搜索要更加棘手。通常会涉及到更改部署环境,而更改部署环境可能意味着要说服部署环境的团队。监测可能还需要添加监测代码,这需要向拥有所检测代码的各个团队提交补丁。这看起来非常麻烦。但是,从某种意义上来说,引入新工具不需要任何人改变现有的习惯。让开发者自由地使用新的工具,这似乎可以减少很多反对的声音。

代码审查

引入代码搜索和监测都不需要团队改变现有的工作流,但是如果代码审查工具发生变化,那么工作流就会改变。

如果你曾在谷歌工作了一段时间,那么你可能会不适应在谷歌之外进行代码审查的方式。GitHub Pull Requests是最常见的代码审查工具,但Google前员工通常会对此有一些抱怨:

  1. 不够直观。有时无法查看自上一轮审核以来所做的更改。简单路径仅允许查看显著的差异;
  2. 不支持堆叠的CR;
  3. 变更集中所有文件的全部差异显示为一个巨大的页面,并且很难跟踪所查看的内容;
  4. GitHub PR的审核机制非常不友好。如果不添加额外的第三方集成,审核流程可能看起来很松散,即使使用了第三方集成,它仍然可能缺乏执行更精确的审核和签出策略的能力;
  5. 对于某些语言,模糊跳转到定义或者查找引用存在限制,但是它远比不上谷歌内部使用的Critique的水平。

在谷歌之外,和Critique最接近的是Gerrit。Gerrit最初是Rietveld的一个分支,而Rietveld本身就是谷歌原始代码审查工具Mondrian的开源分支。因此,谷歌前员工应该对它有种亲切感,因为它来自一系列工具,而这些工具是为了支持谷歌进行代码审查的方式而创建的。

另一种谷歌前员工似乎更喜欢代码审查工具是Phabricator。Phabricator最初是Facebook的内部代码审查工具,随后被开源并向外界发布。这款工具由Phacility公司提供托管实例和支持,以防用户因不想为维护自己的实例而陷入麻烦。

还有一个值得研究的工具是Reviewable,它由前谷歌员工Piotr Kaminski创建。不同于Gerrit或Phabricator,Reviewable仅限云的,但能够提供最类似谷歌内部的代码审查体验。

向团队的其他成员推销Gerrit,Phabricator或Reviewable的前提是,现有的代码审查工具让团队感觉很痛苦。

以下是一些通过从类似GitHub-Pull-Request的工具切换到类似Gerrit的工具来解决一些常见问题的方法:

  • 通过明确的签发,Gerrit能够提供更具有结构化的审核流程,这对于希望审核策略更加严苛的组织来说是个助力;
  • Gerrit可以让审阅大量的差异变得更加轻松,因为用户可以逐个文件查看、查看自上一轮评审以来的更改以及堆叠CR,以便于更快、更彻底地进行审查。

最后一步

在软件开发生命周期中,最棘手的部分通常是CI和构建系统。因为要理解构建,通常需要理解整个代码库的每一个部分。而不断有人在尝试各种方法来加速构建,于是有越来越多的黑客参与构建代码,进行的优化也逐渐增多,直到人们发现不产生负面影响的更改屈指可数。

总之,构建系统就像是一团乱麻,所以在利用底层开发人员的成果之前,需要更加的谨慎。想要早发现早解决的话,Blaze是很好的选择,谷歌甚至帮助开源了Blaze的衍生产品Bazel。但Bazel不是Blaze——首先,它缺乏一个免费的大规模分布式构建集群,毕竟谷歌以外的世界和谷歌不尽相同。

然而,Bazel也不是万能的。Bazel首次发布时,Go社区中的许多开源项目纷纷转向使用Bazel。后来,由于其使用的复杂性、难上手以及Bazel的构建速度实际上较慢等缺点,在一年之内,许多开源项目又将工具切换了回来。不过,自那以后,Bazel对Go的支持有了重大改进。如果你选择再次使用它,还是需要对这些改进进行严格地评估。

进行这些严格的评估需要大量出色的开发工具,特别是需要出色的代码搜索工具,这样你才能深入研究代码库各个部分中的构建脚本,并且了解它们的来龙去脉。代码审查工具也是非常重要的,因为更改构建系统将是一个复杂的过程,需要获得许多不同工程团队的批准。

在万事俱备之前,你还需要知道,除了Bazel之外,还有许多构建工具,这些工具旨在实现大型代码库中的可扩展构建。包括以下几种:

  • Buck:来自Facebook;
  • Gradle:Java界的宠儿;
  • Pants:由前谷歌前员工最初为Twitter和Foursquare创建;
  • Please:一个由谷歌前员工创建的新手构建工具;

还有YourBase,它不是一个构建工具,而是由谷歌前员工Yves Junqueira发起的CI服务,旨在为Google以外的世界带来超快速和可扩展的构建,而与使用的底层构建工具无关。

总结

和大多数公司不同的是,谷歌优先考虑开发人员体验和开发人员工具。无论是谷歌的员工还是已经离职的前员工,都拥有使用一流开发工具的第一手经验,这些工具使其如虎添翼。

离开谷歌后,这些经验就变成了竞争优势,利用这些经验将新的开发工具带到新的组织中,让自身以及团队的生产力更上一层楼。

大规模构建软件是非常困难的。读过《人月神话》的人都知道,创建好的软件不能单靠雇用更多的工程师。你需要更好的工具,正如软件是最终用户生产力的乘积一样,开发工具也是软件工程师生产力的乘积。如果你认可新公司的使命,那么你的首要任务就是充分运用你在谷歌获得的专业知识,并为其提供最好的开发者工具。

谷歌前员工:一流开发工具经验在手却不能用?相关推荐

  1. 谷歌高效开发的秘密:来自谷歌前员工的软件开发工具指南

    点击上方 "程序员小乐"关注, 星标或置顶一起成长 后台回复"大礼包"有惊喜礼包! 关注订阅号「程序员小乐」,收看更多精彩内容 每日英文 Smile, Beca ...

  2. Jeecg-Boot 快速开发平台,前后端分离—开发工具安装

    目录索引: 后端开发工具 前端开发工具 Nodejs镜像 WebStorm入门配置 JeecgBoot采用前后端分离的架构,官方推荐开发工具前端开发: Webstrom 或者 IDEA后端开发: Ec ...

  3. 寻仙新马源码一键端_强大,腾讯开源前后端接口开发工具!

    APIJSON是啥? APIJSON是一种为API而生的JSON网络传输协议. 为 简单的增删改查.复杂的查询.简单的事务操作 提供了完全自动化的API. 能大幅降低开发和沟通成本,简化开发流程,缩短 ...

  4. 最佳开发工具大全!前谷歌工程师两年打造“厂外生存指南”,登上GitHub热榜

    晓查 栗子 方驭洋 发自 凹非寺  量子位 报道 | 公众号 QbitAI 一位曾经的谷歌工程师,花费两年时间,辛苦整理了一份清单. 这个名为"xg2xg"的清单,原本是这位前谷歌 ...

  5. 前谷歌大脑员工创业公司获4000万美元融资,Hinton、李飞飞等支持

    来源:新智元 [导读]NLP模型提供商Cohere宣布获得4000万美元A轮融资.该公司由谷歌大脑前员工创立,核心模型源自Transformer,并获得了Geoffrey Hinton,李飞飞等AI界 ...

  6. 谷歌真的“不作恶”?前员工起诉:它早已亲手打破座右铭

    在过去很长一段时间里,"不作恶(Don't be evil)"一直是谷歌非常著名的非官方座右铭. 这一理念最早诞生于上世纪 90 年代末,彼时有一些商业人士加盟技术驱动的谷歌,其创 ...

  7. Spring Boot 2.x 入门前的准备-IntelliJ IDEA 开发工具的安装与使用

    ntelliJ IDEA 开发工具的安装与使用 1 下载 IntelliJ IDEA 2 破解版本安装 2.1 window 下的破解 2018.3.1最新版破解 2.2 window 下的破解 20 ...

  8. 前端面试题(重点整理):谈谈你对web标准和W3c的认识、什么是ECMA、什么是html、浏览器和开发工具介绍

    目录 一.对web标准和W3C的认识 1.1 web标准 1.2 W3C的认识 二.什么是ECMA 三.什么是html 四.浏览器和开发工具介绍 4.1 浏览器介绍 4.2 开发工具介绍 一.对web ...

  9. imac java7下载地址,如何在苹果电脑上安装JAVA开发工具,经验告诉你该这样

    这里给苹果电脑的用户介绍,在哪里下载JAVA SE 开发工具的下载?以及如何安装JDK和验证JAVA安装的版本? 工具/材料 Imac.Macbook Pro.Air JDK安装包 下载JDK 01 ...

最新文章

  1. 三、索引优化(3)聚集索引上的非聚集索引
  2. Android博客文章整理
  3. 用友U8 归纳采购退货结算三种情况
  4. linux 串口text模式安装,使用串口安装centos操作系统
  5. xstream,节点属性起别名时这样的问题你遇到过吗
  6. hadoop大数据开发基础_Java大数据开发(三)Hadoop(2)经典的Hadoop
  7. 凝思系统机器名怎么查看_机器视觉系统|工业零件生产效率和检测效率不匹配怎么办?...
  8. Postfix:邮件系统常见错误代码解释
  9. 运筹学从何学起?如何快速入门精确式算法?
  10. [Linux] IOmeter 安装
  11. 我们学校有一个计算机室英文,深圳朗文版小学二年级下册Unit 2 At school练习题...
  12. IBM Power小型机用前面板液晶屏查看HMC端口IP
  13. Linux计划任务写入保存命令
  14. 手机网络 G、E、H、H+、4G 都是什么意思
  15. 自动整理html书签,技巧:使用 Excel 快速整理重复书签丨Matrix 精选
  16. CentOS7安装配置BareOS备份工具
  17. 计算机南北桥芯片的作用
  18. 不属于mysql事物的特性_mysql基础---事务 事务的四大特性(ACID) 四种隔离级别
  19. java原始人生存繁殖的游戏,一款原始人生存繁殖的游戏
  20. 汽车上的“黑匣子”,EDR成为中美智能汽车产业竞争的关键战场

热门文章

  1. 别再跟风报经济师专业,五点教你如何选择
  2. 报关单打印、报关下载、关单数据存储管理
  3. ffmpeg所有参数查询
  4. Stardock的十条成功法则
  5. 关于Mask-Rcnn中标注工具VIA(VGG Image Annotator)使用的详解
  6. android开发人员要求_如何成为一名Android开发人员
  7. 均值归一化_机器学习总结(算法):高斯、高斯过程、SVM、归一化
  8. 阿里云服务产品清单和简介--截至20141024
  9. RPC与Netty简介
  10. edos攻击的服务器修复,d您的云服务器dos攻击