离开谷歌之后,很难再享受到这些称手的开发工具了。
博主 Beyang Liu 在多年以前曾在谷歌短暂任职,尽管时间不长,但谷歌内部工具还是给他留下了深刻的印象。在他看来,谷歌的内部开发工具在很多方面都堪称全球最强水平。谷歌不仅善于扩展自有软件系统,在探索如何高效大规模构建软件方面也一直号令群雄。谷歌以绝大部分其他公司无法企及的复杂程度,处理着海量代码库、代码可发现性、组织知识共享及多服务部署等现实难题。
但从另一方面来看,谷歌的内部工具其实数量不多,而且几乎都与谷歌内部环境紧密耦合。所以离开谷歌之后,很难再享受到这些称手的开发工具了。此外,在谷歌工作期间,大家已经习惯了谷歌内部的工作方式,离职后会有人感觉编程难度陡然提升,其实这也与大家失去了自己熟悉的工具有关。
Beyang Liu 结合自己和其他前谷歌员工的经验,总结出数个关于开发工具的使用心得,并编写出了这份谷歌以外的实用主义开发工具指南,帮助开发者设计开发工具常规路径,最终为自己和新团队探索出尽可能高效的工具。
离开谷歌加入其他公司多少会让人有些沮丧,因为没有多少企业能在工作效率上跟谷歌相提并论。但具体区别到底体现在哪里?首先,我们应该考虑自己每天在做什么,然后确定这种沮丧情绪的来源。
有一点可以确定的是,无论是否在谷歌工作,软件开发生命周期的一般形式都差不多:
软件开发阶段 | 谷歌内部 | 谷歌外部 |
---|---|---|
识别功能或bug | 问题跟踪器 | GitHub问题、Jira |
阅读代码 | 代码搜索 | 你所使用的编辑器: OpenGrok, Hound, Sourcegraph等 |
编写代码 | Cider, IntelliJ, Emacs, Vim, VS Code | 除Cider以外,其他与谷歌内部相同<br>(编者注:自发布以来,Gitpod与Codespaces等云IDE也开始获得大量关注) |
测试代码 | Blaze | 各种工具都有,但 Bazel越来越受欢迎 |
审查代码 | Critique | GitHub PR, Gerrit, Phabricator, Reviewable |
部署 | Borg | Kubernetes |
监控 | Borgmon, Dapper, Viceroy | Prometheus, Grafana, Lightstep, Honeycomb, Sentry |
为了提高生产力,最好能在各个步骤中找到更好的工具。这里向大家推荐一个实用的 GitHub repo,能够识别谷歌内部几乎每款工具所对应的最相似外部工具:https://github.com/jhuangtw/xg2xg。
这份列表非常全面,但内容也确实太多了。那我们该从哪里入手呢?
离开谷歌之后,在新公司入职的第一个月,先别急着做出改变,多听、多学习。
作为团队的新成员,大家还没有足够的影响力或者权限来变更团队使用的各种工具。另外,我们也缺乏实践知识,比如不清楚新团队如何工作、为何选择这种工作方式、为什么要使用当前工具集。
如果你简单地把谷歌内部工具复制过来,并不一定就能在新团队中实现良好效果。因此,你需要先摸索一下哪些工具适合新团队使用,哪些并不适用。
大家可以先从代码搜索起步。事实上,当一个程序员离开谷歌之后,他最怀念的往往就是代码搜索工具。
你可以自己尝试不同的代码搜索引擎,验证它们究竟效果如何,并在确定有效后再向同事推荐。千万别急着把自己都不熟悉的工具推荐给同事,或者提交给决策者进行审查。
同时,你也不必改变他人的原有工作习惯,毕竟新团队往往还没有用上代码搜索工具。即使已经在用,也就是分两种情况:比较差的情况是,他们选的工具效果一般、使用频率不高;比较好的情况是,他们选的工具已经非常出色,不用再费心。
如果你所在的新公司旗下拥有多支开发团队,那么需要处理的代码可能更多,作为新员工当然有必要去理解这些代码。而即使是在小而精的初创公司,也有可能通过依赖项的方式引入了大量开源代码。只有深入研究了这些代码,我们才能进行后面的新功能构建或关键 bug 跟踪等工作。
如今,几乎每位开发者都必须面对庞大的代码规模,所以如果代码搜索工具跟不上,绝对会大大降低你的开发速度。
在评估代码搜索引擎时,我们需要考虑以下几个重点:
另一个重要的早期目标,就是监控。每位工程师在特定情况下都需要处理生产问题。请注意,生产环境跟开发环境完全是两码事,我们不可能在生产环境下设置断点或添加 printf,并指望在几秒内就看到结果。另外,生产环境的更新对应着极高成本:计算资源、开发者时间,还有可能给客户带来的糟糕体验。
过去 5 到 10 年来,部署思路发生了很大变化。微服务、Kubernetes、云迁移等一系列新生事物,都标志着企业软件部署方式上的重大转变。不少企业开始采用这些新的范式和技术,但并没有更新自己的监控基础设施,所以很难在新型生产环境下开展调试。
幸运的是,近年来涌现出一些伟大的开源工具和厂商,他们用努力极大改善了谷歌之外的监控与可观察性工具选项。
但总体来讲,引入新工具并不需要改变其他同事的原有工作习惯,所以难度不算太高。人们可以自由选择使用或不使用新工具,所以前期推广压力不会太大。
代码搜索和监控的引入,并不会影响到任何团队成员的现有工作流程。但代码审查工具却不一样,它会实实在在影响到同事们的工作方式。
如果大家在谷歌工作过一段时间,那么离开谷歌后可能会觉得外面的代码审查方式有点奇怪。GitHub PR 就是最常见的代码审查工具,但谷歌员工还是能从中发现不少问题:
Phabricator 也是一款不错的代码审查工具,反正对前谷歌员工来说要比 GitHub PR 强不少。Phabricator 最初是 Facebook 的内部代码审查工具,随后被开源了出来。它的背后由 Phacility 公司负责运营,为其提供托管实例和支持,能为那些不愿自行维护实例的客户分担压力。
另一款值得关注的工具,则是由前谷歌员工 Piotr Kaminski 开发的 Reviewable。与 Gerrit 或者 Phabriactor 不同,Reviewable 只支持云环境,但换来的则是最接近于谷歌内部的代码审查体验。
在向团队其他成员介绍 Gerrit、Phabricator 或者 Reviewable 的优点时,请务必关注大家对于原有代码审查工具的感受。从 GitHub PR 等转向 Gerrit 之类的工具,可以有效解决以下几大常见痛点:
软件开发生命周期当中,最棘手的部分往往就是 CI 和 build 系统。这是因为要想理解整个 build,就必须以非常具体的方式观察整个代码库的每一部分。随着时间推移,大家都希望加快构建速度,所以 build 代码也就积累了越来越多的调整和优化部分,导致投入大量人手也未必能实现无痛更新。
简而言之,build 系统就是最后的守关 Boss,所以在完成前面的“打怪升级”积累之前,千万不要轻易尝试。但它又时刻在诱惑在我们,毕竟跟现有工具相比,Blaze 实在是太强大了。谷歌甚至以 Bazel 的名号对 Blaze 进行了开源。但 Bazel 毕竟不是 Blaze,它缺少大规模分布式 build 集群,而且毕竟不是运行在谷歌内部。
所以先要承认,Bazel 绝不是什么万金油。当初刚刚发布时,Go 社区中就有很多开源项目转用它来支持标准 Go build 工具。但不到一年,由于使用太过复杂、Go 社区内很多成员对它不够熟悉,以及 Bazel 的构建速度似乎更慢等现实,大家又纷纷选择放弃。从那时起,Bazel 对 Go 语言的支持虽然实现了重大改进,但还是建议大家在使用之前认真做一番评估。
为了开展这项严格评估,我们先得把其他开发工具落实到位:包括出色的代码搜索,确保真正深入到代码库中各部分的 build 脚本当中,理解它们的作用和依赖关系。大家还需要出色的代码审查工具,确保 build 系统的变更能够在不同工程团队之间获得支持和协同。
在做好准备之后,还要明确一点。除 Bazel 之外,还有很多其他 build 工具能够在大型代码库中实现可扩展构建。具体包括:
在离开谷歌之后,大家的一大竞争优势,就是利用这些经历将出色的开发体验融入新的组织,借此提高自己和其他团队成员的工作效率。配合上述大规模软件开发最佳实践,各位完全可以将谷歌那极高的工程组织协同能力转化为新公司的底层实力。
大规模软件的构建过程相当复杂。有经验的朋友都知道,单靠堆人手是无法获得更好的软件的,我们还需要更好的工具。正如优秀的软件会成为最终用户的生产力放大器,出色的开发工具也是软件开发者的生产力放大器。因此,如果大家愿意作新公司的主人翁,不妨利用自己前谷歌员工的专业知识,将世界一流的开发者工具引入这片全新的天地。
原文链接:
https://about.sourcegraph.com/blog/ex-googler-guide-dev-tools
领取专属 10元无门槛券
私享最新 技术干货