【CSDN编者按】提到开发工具,谷歌算得上是世界领先的,但是由于几乎所有的工具都和谷歌内部的生态系统紧密相连,这意味着离开了谷歌,这些工具或都将受限。为了打破这一瓶颈,一位曾在谷歌工作过的工程师BeyangLiu,分享了在使用谷歌工具的同时如何更好地引入其他的开发工具。一起来看看吧!
原文链接:https://about.sourcegraph.com/blog/ex-googler-guide-dev-tools/
本文由CSDN翻译,未经授权,禁止转载。
译者 | 章雨铭 责编 | 屠敏
出品 | CSDN(ID:CSDNnews)
很多年以前,我曾在谷歌短暂地工作了一段时间,没错,我也算是谷歌的一名前员工。虽然从谷歌离职后,周围的很多事都发生了不小的变化,但即使只是短暂地接触了谷歌的内部开发工具,也给我留下了深刻的印象。
谷歌内部的开发工具从很多方面来说,都可以算是世界上最领先的。谷歌不仅领头开发了自身软件系统,还优先探索如何大规模且高效地构建软件。多年来,谷歌无论是在代码库规模,还是代码可发现性、组织知识共享和多服务部署相关等问题的解决方案,都是很多其他公司无法企及的。
然而,从另一个角度来看,谷歌的内部工具是非常局限的。几乎所有的这些工具都和谷歌的内部生态系统紧密相连。所以,这意味着,如果从谷歌离开,你不能把这些工具也一起带走。
从谷歌离职的员工,成为很多其他公司的人才,他们在加入其他公司时,也常会分享在谷歌吸取的经验与教训。但是对于他们来说,使用过最前沿的工具之后,想要适应谷歌以外的编程开发环境并不容易,尤其是在他们已经产生依赖的工具无法使用之后。
这些年,我从自身的经历和其他从谷歌离职的人中学到了许多。
Sourcegraph早期的许多客户,就是因为在离开谷歌后,想念谷歌的代码搜索功能从而寻求我们的帮助。通过和他们密切合作,我们了解他们需要填补的空白,从而更好地构建Sourcegraph以满足他们的需求。一些谷歌前员工在不断探索将开发工具引入新公司的方法,结合他们在谷歌使用开发工具的经验,创造了一些模式。有的探索成效显著,有的则效果不佳。
所以,我认为写一本注重实操的关于谷歌以外的开发工具指南是很有必要的。当然,很多谷歌前员工都希望能够简单地将谷歌内部生态克隆到新的公司,但这显然行不通。
下面我将谈谈我的看法,关于谷歌前员工该从哪里开始的建议,以及能够使其团队高效运作的一些普遍的方法。
刚从谷歌离职的员工在进入一家新公司后,可能有一种挫败感,因效率大不如前。你想要做出一些改变,但是从哪里开始呢?我认为,第一步应该是从日常工作中找出问题所在。
无论是在谷歌内部还是其他组织,软件开发的生命周期都大同小异:
在上述的每一个阶段,通常会需要工具来辅助开发者。工具能够塑造开发者的工作周期,并且对于生产力有巨大的影响。
为了提高生产力,开发者需要更好的工具。我推荐一个有用的GitHub存储库,其中包括谷歌内部几乎所有工具以及谷歌之外的公司拥有的最接近的工具。(链接:https://github.com/jhuangtw/xg2xg)这个列表很全面,但是让人眼花缭乱。那么,应该从哪里开始呢?
开始的第一个月,不要试图改变,只需要聆听+学习。
作为团队的新成员,你可能没有影响力或权限来更改团队使用的工具。另外,你还缺乏一些对于团队行事风格和原因的了解,以及使用现有工具的理由。简单的复制粘贴谷歌的工具并不一定就适合你的新团队。所以,你需要通过多听多学来了解什么是对团队有用的,而什么是团队不需要的。
代码搜索是个好工具。作为代码搜索公司的联合创始人,我这么说像是自卖自夸。但我这么说是有理由的:
如果你的新公司有多个团队,你可能会需要处理更多的代码,并且一个人摸索。即使你在一家规模较小的公司,也有可能通过依赖项获取大量的开源代码。这些代码是你在构建新功能或者跟踪某些关键Bug来源时需要深入研究的。
考虑到现在开发者必须要处理的代码的规模,如果缺乏代码搜索,就会严重影响开发的进度。
在选择代码搜索引擎时,需要考虑以下几点:
以下一些常见的代码搜索引擎:
另一个需要尽早改进的方面是监测。工程师总有些时候必须要处理一些在生产环境中出现的问题。生产和开发截然不同——不能只是设置断点或者添加printf就能马上看到效果。在很多方面,对于生产环境进行更新会产生巨大的开销,比如消耗计算资源,以及花费开发者大量的时间。
在过去的5-10年的时间里,部署发生了巨变。微服务、Kubernetes,云迁移等技术,极大地改变了公司部署软件方式。许多公司已经采用了这些新方式和技术,但这些公司还没有更新其监测基础结构,以便在新的生产环境中轻松地进行调试。
幸运的是,近年来,优秀的新开源工具和公司涌现,它们极大地改善了谷歌之外的世界中的监测和可观察性状态。
谷歌率先推出了分布式跟踪,这是一种日益常见的多服务架构的重要工具。Dapper的创造者之一Ben Sigelman继创建了Lightstep。分布式跟踪现在是许多监测系统的一个功能,包括像Honeycomb和Sentry这样的付费产品,以及像Uber工程师构建的Jaeger这样的开源项目。
考虑到监测必须集成到生产环境中,所以引入监测比引入代码搜索要更加棘手。通常会涉及到更改部署环境,而更改部署环境可能意味着要说服部署环境的团队。监测可能还需要添加监测代码,这需要向拥有所检测代码的各个团队提交补丁。这看起来非常麻烦。但是,从某种意义上来说,引入新工具不需要任何人改变现有的习惯。让开发者自由地使用新的工具,这似乎可以减少很多反对的声音。
引入代码搜索和监测都不需要团队改变现有的工作流,但是如果代码审查工具发生变化,那么工作流就会改变。
如果你曾在谷歌工作了一段时间,那么你可能会不适应在谷歌之外进行代码审查的方式。GitHub Pull Requests是最常见的代码审查工具,但Google前员工通常会对此有一些抱怨:
在谷歌之外,和Critique最接近的是Gerrit。Gerrit最初是Rietveld的一个分支,而Rietveld本身就是谷歌原始代码审查工具Mondrian的开源分支。因此,谷歌前员工应该对它有种亲切感,因为它来自一系列工具,而这些工具是为了支持谷歌进行代码审查的方式而创建的。
另一种谷歌前员工似乎更喜欢代码审查工具是Phabricator。Phabricator最初是Facebook的内部代码审查工具,随后被开源并向外界发布。这款工具由Phacility公司提供托管实例和支持,以防用户因不想为维护自己的实例而陷入麻烦。
还有一个值得研究的工具是Reviewable,它由前谷歌员工Piotr Kaminski创建。不同于Gerrit或Phabricator,Reviewable仅限云的,但能够提供最类似谷歌内部的代码审查体验。
向团队的其他成员推销Gerrit,Phabricator或Reviewable的前提是,现有的代码审查工具让团队感觉很痛苦。
以下是一些通过从类似GitHub-Pull-Request的工具切换到类似Gerrit的工具来解决一些常见问题的方法:
在软件开发生命周期中,最棘手的部分通常是CI和构建系统。因为要理解构建,通常需要理解整个代码库的每一个部分。而不断有人在尝试各种方法来加速构建,于是有越来越多的黑客参与构建代码,进行的优化也逐渐增多,直到人们发现不产生负面影响的更改屈指可数。
总之,构建系统就像是一团乱麻,所以在利用底层开发人员的成果之前,需要更加的谨慎。想要早发现早解决的话,Blaze是很好的选择,谷歌甚至帮助开源了Blaze的衍生产品Bazel。但Bazel不是Blaze——首先,它缺乏一个免费的大规模分布式构建集群,毕竟谷歌以外的世界和谷歌不尽相同。
然而,Bazel也不是万能的。Bazel首次发布时,Go社区中的许多开源项目纷纷转向使用Bazel。后来,由于其使用的复杂性、难上手以及Bazel的构建速度实际上较慢等缺点,在一年之内,许多开源项目又将工具切换了回来。不过,自那以后,Bazel对Go的支持有了重大改进。如果你选择再次使用它,还是需要对这些改进进行严格地评估。
进行这些严格的评估需要大量出色的开发工具,特别是需要出色的代码搜索工具,这样你才能深入研究代码库各个部分中的构建脚本,并且了解它们的来龙去脉。代码审查工具也是非常重要的,因为更改构建系统将是一个复杂的过程,需要获得许多不同工程团队的批准。
在万事俱备之前,你还需要知道,除了Bazel之外,还有许多构建工具,这些工具旨在实现大型代码库中的可扩展构建。包括以下几种:
还有YourBase,它不是一个构建工具,而是由谷歌前员工Yves Junqueira发起的CI服务,旨在为Google以外的世界带来超快速和可扩展的构建,而与使用的底层构建工具无关。
和大多数公司不同的是,谷歌优先考虑开发人员体验和开发人员工具。无论是谷歌的员工还是已经离职的前员工,都拥有使用一流开发工具的第一手经验,这些工具使其如虎添翼。
离开谷歌后,这些经验就变成了竞争优势,利用这些经验将新的开发工具带到新的组织中,让自身以及团队的生产力更上一层楼。
大规模构建软件是非常困难的。读过《人月神话》的人都知道,创建好的软件不能单靠雇用更多的工程师。你需要更好的工具,正如软件是最终用户生产力的乘积一样,开发工具也是软件工程师生产力的乘积。如果你认可新公司的使命,那么你的首要任务就是充分运用你在谷歌获得的专业知识,并为其提供最好的开发者工具。