本篇内容是根据2016年8月份#12 Beyang Liu on Go at Sourcegraph and Writing Better Code音频录制内容的整理与翻译
来自 Sourcegraph 的 Beyang Liu 加入节目,谈论 Sourcegraph 的 Go 及其用于编写更好代码的代码洞察和语言分析工具。我们还了解了 Sourcegraph 是什么以及将其集成到您的工作流程中的多种方法。
Erik St. Martin: 好的,我们又回来了,欢迎收听新一期的 Go Time 播客。这是第 12 期。今天和我一起的有 Brian Ketelsen……
Brian Ketelsen: 大家好。
Erik St. Martin: 我应该先自我介绍一下,我是 Erik St. Martin,总是忘记这一点。不幸的是,今天 Carlisia 不在我们这里。她正在新工作的第一周,不过她的精神与我们同在。我知道她特别希望能参加今天的节目,因为她是我们今天嘉宾的超级粉丝。他就是来自 Sourcegraph 的 Beyang Liu。你好吗?
Beyang Liu: 很好,很高兴能来到这里。
Brian Ketelsen: 我们都是 Sourcegraph 的大粉丝啊。你们因为在 GopherCon 上的实时推文出名了。
Erik St. Martin: 那真的很酷。
Beyang Liu: 谢谢!
Erik St. Martin: 你们今年还会做实时推文吗?
Beyang Liu: 这个我们还得想一想。我今年可能没办法参加 GopherCon,这通常是由我来组织实时推文的。不过我们团队里有 Dmitri Shuralyov 和 Renfred Harper,他们会参加。你们可能认识 Dmitri,他在 Go 开源社区里挺活跃的。他们两个都很棒,希望他们能组织起来。
Erik St. Martin: 我居然不知道 Dmitri 是 Sourcegraph 的员工,这太棒了。
Beyang Liu: 是的,他已经加入我们团队一年半了,是比较资深的成员之一,非常优秀。
Brian Ketelsen: 我们也得邀请他来上节目。每当我发现一些特别疯狂的 Go 项目,他的名字总会出现在其中。我搞不明白为什么。
Beyang Liu: 哈哈,是的,你们真的该邀请他来。他在开源社区做了很多很棒的事情,人也特别好。
Brian Ketelsen: 那我们就安排一下吧。不过今天是你的专场,所以我们聊聊你们最近发布的那些神工具吧……天啊!
Erik St. Martin: 是啊,真的很厉害。
Beyang Liu: 最近这几周我们确实发布了很多东西。有一些新的编辑器集成工具和原生功能,我特别兴奋地想和大家分享。这些功能可以把 Sourcegraph 提供的信息直接带到你的编辑器里,编程时只需按一个键,甚至不需要按键就能获取。
Erik St. Martin: 我记得我们前几期节目还聊过这个。
Beyang Liu: 我觉得我应该先做个介绍……我猜你们的大部分听众可能还不知道 Sourcegraph 是什么,所以我想稍微介绍一下我们是做什么的,对吧?
Erik St. Martin: 是的,当然。
Beyang Liu: Sourcegraph 本质上是一个基于全球代码图的编程助手。所谓助手,是指它可以帮助你回答每天编程时可能遇到的各种问题,比如“这个函数怎么用?”、“还有谁在用这个函数?”、“如果我要深入了解,应该问谁?”等等。而这一切都是基于代码图来实现的。每一段代码、每一个定义、包、类型等等,都是代码图中的一个节点,而函数调用、包导入之类的关系则是图中的连接。我们和其他许多工具的不同之处在于,其他工具通常只是把代码当成一堆文本,而我们真正理解代码的结构,比如“这里的某个函数调用了那里的某个函数”。正因如此,我们能提供非常高质量的使用示例、“跳转到定义”功能,以及优质的代码搜索。
所以从本质上来说,Sourcegraph 就像一个全方位的参考指南,它可以快速回答你在编程过程中遇到的问题。相比 grep 或谷歌搜索,我们能在几秒钟内给出答案,而不是几分钟,还能大大减少你在这方面的脑力消耗。这就是 Sourcegraph 的核心卖点。
Brian Ketelsen: 这听起来很有说服力。
Erik St. Martin: 是的,有几项重要功能……我们注意到了。其实 Carlisia 是我们这里的“百科全书”,我说我们在某期节目中聊过这个,她甚至能准确告诉我是哪一期。我们聊过新的编辑器插件功能,觉得特别棒。你在开始输入一个函数时,可以看到实际项目中的使用示例。这真的非常有用。GitHub 插件或者基于 GitHub 的浏览器插件是不是也有这个功能?我记得它会显示文档和代码引用,但它会不会在代码中直接显示这些内容?
Beyang Liu: 它不会直接在代码中显示。由于 Chrome 扩展是基于现有的 UI 构建的,所以功能上会受一些限制。我们尽可能在上面展示所有相关信息,但体验上还是比不上编辑器以及 Sourcegraph.com 的原生体验。
Erik St. Martin: 我还注意到你们发布了 SourceLib,这个库是用来进行代码解析的,对吧?
Beyang Liu: 是的,为了提取我们用来生成搜索结果和使用示例的信息,我们需要解析代码、生成符号表并进行静态分析。目前我们支持几种不同的语言,最初是从 Go 开始,现在已经支持 Java,很快也会支持 Python 和 JavaScript。为了以语言无关的方式实现这些功能,我们构建了一个叫 SourceLib 的库。它会调用特定语言的分析器,把它们生成的数据转换成语言无关的格式,供应用程序使用。这样,应用程序就不需要考虑每种语言的具体细节,只需处理统一的数据格式。
Erik St. Martin: 有没有人用这个库做出一些有趣的项目?每次看到这种东西,我都想用它做点什么,但总是想不出合适的用例。静态代码分析也是一样,我总觉得能做些有用的事情,但就是不知道该做什么。
Beyang Liu: 其实我们编辑器插件和集成工具的灵感就是来自社区的想法。有些人基于这些数据构建了自己的工具,比如把这些信息集成到他们的编辑器里。我们看到后觉得可以在这方面提供更多支持,做出更完善的功能,让这些工具不只是“黑科技”,而是真正成为 Sourcegraph 用户体验的一部分。
Brian Ketelsen: 我试用过 Vim 的插件---
准确来说是在 NeoVim 上,不知道有没有区别---
大概是上周还是前一周,我被震撼到了。这个插件实在是太酷了。
Beyang Liu: 太棒了,谢谢!
Brian Ketelsen: 不过我后来关掉了,因为稍微有点慢,不好意思……但我觉得这应该是网络延迟的问题,不过整体功能真的很棒。
Beyang Liu: 是的,性能优化是我们现在努力的重点之一。我们很快会推出一个原生桌面客户端,希望能解决一些延迟问题……这是个小预告。
Erik St. Martin: 是的,这确实很难做到,尤其是像 Brian 说的那样,网络延迟是个问题。如果所有代码都在本地运行,显然比远程处理更容易。
Beyang Liu: 是的,我们未来的目标之一是把本地代码和全球代码图连接起来。这样才能实现更多“魔法”。你可以访问全球开源代码的索引,同时还能在本地编辑器中实时查看代码图的变化。比如你在本地修改一个函数,这会影响某个开源函数的调用次数,或者影响团队中其他人正在修改的相关代码。未来我们的重点就是让这一切更加原生化,把实时变化的代码图和全球代码图结合起来。
Brian Ketelsen: 这听起来很疯狂。能不能讲讲当我在 Vim 中输入代码时,背后发生了什么?
Beyang Liu: 我们的架构设计尽量做到可扩展,希望支持各种编辑器插件而不需要为每个编辑器做过多定制化开发。每个插件都会调用 Sourcegraph 提供的专用 API,比如当光标悬停在代码中的某个符号上,比如函数名时,插件会在浏览器中打开 Sourcegraph,显示该函数的文档和使用示例。插件会从编辑器中提取符号名和上下文信息,然后向 Sourcegraph API 发出请求,比如“显示这个符号的文档”,并附带一些上下文信息,比如仓库 URL 和语言相关内容。Sourcegraph 会在全球代码图中找到对应的定义,填充文档和使用示例,并返回给插件,就是这样。
Brian Ketelsen: 你这么一说,这个过程真是快得惊人。你们后端用的是什么存储方案?我对硬件这块特别感兴趣。你们用什么数据库和索引?
Beyang Liu: 我们的图存储是基于 Postgres 和 Google Object Store 的定制系统。详细的元数据存储在 Google Object Store 中,比如特定函数或包的详细信息。而对于搜索查询和按条件列出定义这些操作,我们用的是 Postgres。事实上,这套系统已经让我们走得很远了。大多数人想到要构建一个覆盖全球代码的搜索引擎时,可能不会第一时间想到用 Postgres,但我们对它的全文本搜索支持和扩展能力印象深刻。
Erik St. Martin: 你们是不是还得构建一个爬虫来索引这些数据?
Beyang Liu: 是的,我们的爬虫在索引一个库时会提取它的依赖关系,然后继续索引这些依赖。它基本上是沿着代码的依赖图进行爬取。
Erik St. Martin: 你们有没有用过最近发布的 BigQuery 数据集?
Beyang Liu: 那个数据集真的很有趣,不过我个人还没玩过。其实那是一个基于文本的代码搜索方法,而我们很多功能已经能实现类似的效果了。比如,如果你想找某个函数的所有调用者,在 BigQuery 中你可能会写一个正则表达式去匹配整个代码库。但在 Sourcegraph 中,你只需要找到一个定义,我们提供的所有使用示例都是 100% 准确的,因为我们是基于解析器的。
Erik St. Martin: 是的,BigQuery 数据集让很多人写正则表达式,而你们在爬取时已经对代码进行了标记化处理。所以你们只需查找具体的内容,比如“我要找这个名字的函数”,而不需要写一个正则表达式去匹配函数定义。
Beyang Liu: 是的。不过我得说那东西也真的很酷。有一件事大家可能没有意识到:代码其实就是另一种形式的数据。它并不仅仅是你在编辑器里写的一堆文本,而是高度结构化的数据。当你把代码看作一种数据集时,你就能挖掘出更多潜力。
未来,我们可以想象团队中的资深成员会更关注代码质量和可维护性。他们可能会担心新人在代码中引入的反模式。这时候,他们就可以对公司的代码图或全球代码图发出查询,寻找这些模式或反模式,甚至进行大范围的修改……而不是像现在这样,每次都只能单人单机手动修改。
Brian Ketelsen: 很有意思。
Erik St. Martin: 所以 Sourcegraph 的下一步是不是打算构建一些团队工具,来检测这类问题?
Beyang Liu: 是的,你知道吗?Sourcegraph 目前提供的功能,比如代码搜索和代码片段展示,对每个程序员的日常工作都非常有价值。但我认为,Sourcegraph的真正价值在于它能够改变团队协作开发软件的方式。比如,团队可以使用 Sourcegraph 来发出查询,发现代码中的反模式(anti-pattern);还可以实现更明确的协作形式。现在,如果你对代码有疑问,通常会直接去找某个人问,或者在聊天工具里发消息给对方。
但无论是哪种方式,问题的答案通常会随着时间消失,一旦回答了就找不到了。这是个很糟糕的现象。因为如果你有这样的疑问,很可能团队里的其他人以后也会遇到同样或类似的问题。如果能够有一个工具,把这些讨论附加到特定的代码片段上,并且随着代码的变化保留下来,那不是很好吗?比如,讨论可以跟随某个函数或者包,即使代码行数发生变化,讨论依然存在。
我们思考了很多关于如何提升团队生产力的方式,因为我认为软件工程学科在开发方法论和最佳实践方面还处于早期阶段。
让我感到震惊的是,2016年像 healthcare.gov 这样的项目依然不是一件简单的事情。你不能仅仅召集四五个程序员就能完成这个项目。而我们想解决的,正是阻碍团队执行这些项目的痛点。
Erik St. Martin: 这很有意思。除了你们提供的这些全球化功能之外,我记得 Sourcegraph 还支持本地部署,对吧?
Beyang Liu: 是的。不过我们目前对本地部署的客户有所限制,因为我们团队还比较小,而本地部署涉及更多的承诺。我们的主要本地部署客户是 Twitter。我们现在暂时不为小型客户提供本地部署服务,但确实有这样的解决方案。
Erik St. Martin: 是啊,本地部署需要提供支持,还要保持更新,这确实需要额外的工作量。那么,能谈谈 Sourcegraph 是如何使用 Go 语言的吗?你们的大部分代码是用 Go 写的吗?
Beyang Liu: 是的,我们的应用程序架构大部分是用 Go 写的。除了前端部分是用 JavaScript 写的,以及与语言分析相关的部分是多语言的,其他几乎全是用 Go 编写的。Go 的表现非常棒,主要有两个原因。第一,它是一种非常扎实的工具,可以用来构建可靠的系统。它是一种非常直接了当的语言,开发 Web 应用时几乎不会有意外情况发生。Go 的工具生态也非常强大,这就引出了第二个原因:Go 其实对我们想通过 Sourcegraph 推广的一些理念产生了启发。
我认为,Go 的工具生态非常完善,它让你能够像处理数据一样处理代码,而不仅仅是手动输入代码。比如,go generate
这样的工具……Go 提供的元编程能力,在其他语言中如果没有强大的工具支持,是很难实现的。这种能力大幅提升了生产力。通过自动生成代码来实现目标,比让程序员手动输入代码要高效得多。
Brian Ketelsen: 绝对同意!
Erik St. Martin: 让 Brian 手动写代码好了,他最擅长这个。(笑)
Brian Ketelsen: 不,我可是代码生成之王。如果可以生成代码,那就是我的专长。
Beyang Liu: 哈哈,这确实很棒。而且 Alan Donovan 在 Go oracle 上的工作也非常出色。我很期待他在 GopherCon 上的演讲,虽然很遗憾我没法参加。他会讲解 Go Guru,这是 Go oracle 的扩展,为编辑器集成等功能设计的。
Brian Ketelsen: 你知道今年 GopherCon 会直播吗?
Beyang Liu: 我不知道。
Erik St. Martin: 是的,不过只有早场部分。
Beyang Liu: 那我可能会看直播。
Brian Ketelsen: 是的,我们会在 Twitch 上直播早场部分,地址是 twitch.tv/gophercon。
Beyang Liu: 很棒!
Brian Ketelsen: 如果直播技术没出问题的话,你可以在 11 日早上 9:35 观看那个演讲。希望我这个老家伙能搞定直播,这些东西都是年轻人的领域。(笑)
Beyang Liu: 太好了。我必须说,我参加过两次 GopherCon,体验都非常棒。感谢你们为此付出的努力!
Erik St. Martin: 谢谢!
Brian Ketelsen: 是的,这完全是出于我们对社区的热爱。
Erik St. Martin: 组织 GopherCon 是一件既有趣又有压力的事情,但最终的回报远远超过了压力。离大会开始只有几天了。Brian 明天早上就要上飞机了……
Brian Ketelsen: 是的。
Erik St. Martin: 我则是后天早上飞过去。
Beyang Liu: 这些年看着 GopherCon 随着 Go 社区一起成长,感觉如何?
Erik St. Martin: 感觉非常震撼。
Brian Ketelsen: 想听真话吗?(笑)第一年最疯狂,因为我们完全不知道自己在做什么,学到了很多东西。第二年稍微好一些,但搬到了会议中心后,所有规则都变了,规模也变得更大。
今年是我们在会议中心举办的第二年,对流程更有经验了,但 Go 的生态正在变化。今年我们有了一些新的赞助商,虽然老赞助商依然支持我们。随着 Go 的成熟,赞助的目标群体也在变化,这对我们来说是全新的体验。
Erik St. Martin: 是的,我们每年都在学习,比如演讲的技术深度、多轨道还是单轨道的安排……我们还在试验。不过大家每年都继续参加,所以我们应该做对了一些事情吧。
Beyang Liu: 是的,这很有趣。你们有没有注意到 Go 生态的更广泛趋势?比如,哪些人在使用 Go,哪些人在参加大会?
Erik St. Martin: 我和 Brian 都注意到,几乎所有新的分布式系统工具都是用 Go 写的。每当有新的分布式系统工具出现,它几乎总是用 Go 开发的。我不确定这是因为 Go 是最适合分布式系统的语言,还是因为使用 Go 的人刚好也喜欢分布式系统,但结果很棒,这就够了。
Beyang Liu: 这真的很有意思。
Brian Ketelsen: 今年让我最意外的是,我们看到了一些非常特别的注册者。比如,两三周前,有一家汽车零件公司注册了几名员工的参会。
Beyang Liu: 真的吗?这太疯狂了!
Brian Ketelsen: 是的,当我收到这封邮件时,我觉得这是 Go 被广泛采用的一个标志。这不是一家科技公司,也不是某个风投支持的初创企业,而是一家汽车零件公司。这让我觉得 Go 达到了一个拐点。
Beyang Liu: 我认为这反映了一个更广泛的趋势,不仅仅是在 Go 领域,而是在整个软件行业。越来越多的非传统科技公司开始深度依赖他们能构建的软件。
你们有没有看到 GE 最近的广告?他们的口号是“GE 是一家做基础设施的数字化公司”,整个广告的目的是吸引软件工程师,向他们表明 GE 是一家以软件为核心的公司。
Erik St. Martin: 现在几乎没有任何生意能离开软件。我们依赖软件的程度已经到了无以复加的地步。
Beyang Liu: 是的,完全同意。“业务逻辑”这个术语已经存在很久了,尽管经常被误用,但现在越来越多的企业逻辑确实体现在代码中的业务逻辑里。
Erik St. Martin: 而且,代码中的逻辑更安全。(笑)
Brian Ketelsen: 这取决于谁写的代码。拥有出色的软件系统,是一些公司竞争优势的来源。例如沃尔玛,他们使用非常先进的软件来显著降低成本。比如,他们的即时库存系统会根据天气预报,在飓风来临前就提前向佛罗里达州运送瓶装水。这就是一个很好的例子,说明软件如何改变了所有的商业,而不仅仅是传统的技术公司。
Beyang Liu: 是的,随着这种转变的发生,我认为 Go 是一个很好的选择,因为它有非常优秀的工具支持。但在很多其他语言生态系统中,我认为工具的发展还远远落后于软件变得关键的速度。看看那些尝试开发软件的非技术公司,大多数项目都会超出预算、拖延时间,功能也不够完善。
我们经常思考的问题是,如何构建工具生态系统,以及为个人和团队提供的编程助手,帮助那些并不具备深厚软件开发方法论的组织更高效地开发和交付软件。如果这个问题得不到解决,我们可能会看到更多像 healthcare.gov 这样的问题项目。
Brian Ketelsen: 这真是一个很好的过渡,可以聊聊我们的赞助商了---
说到那些帮助你快速交付软件的优秀工具开发者们。
Equinox 是我最喜欢的工具公司之一,它的网站是 Equinox.io,它可以帮助你打包和分发你的 Go 应用程序。使用 Equinox,你可以打包并发布 CLI 工具和本地部署的软件。我最喜欢 Equinox 的一点是它支持为 Mac、Windows 和 Linux 提供原生的安装包和安装程序。你可以得到 msi 文件、pkg 文件、Debian 包、rpm 文件、yum 包等所有这些好东西。用 Equinox 很容易创建一个应用程序,然后将其以自更新的格式交付给你的客户。
我们在 Backplane 使用 Equinox。我记得 Beyang,你之前提到过你也用过它,是吗?
Beyang Liu: 是的,我们在 Sourcegraph 用它来处理本地部署的事情。我要说的是,它真的非常简单……如果你的工作是管理基于 Go 应用程序的本地部署或原生安装程序,而你担心这会让你头疼,那么你绝对应该试试 Equinox。它能让你的生活轻松很多。基本上开箱即用,真的非常棒。
我还想特别提一下 Equinox 的创始人 Alan Shreve。他是个很棒的人,也是 Go 开源社区的活跃人物,他为开源做了很多了不起的贡献。
Brian Ketelsen: 太棒了。我们几乎每期节目都会提到 ngrok。
Erik St. Martin: 是的,我正想说这个。如果你没听说过 Equinox,那你一定听说过 ngrok。
Beyang Liu: 他还在今年的 dotGo 大会上做了一个演讲。他写了一个程序,可以让阅读 Go 代码中的函数变得更容易。它的基本功能是剔除所有样板代码。当你阅读某个函数,试图理解它是如何工作的,你真正想关注的是它在做什么,而不是日志语句、错误处理之类的东西。他写了一个工具,可以剔除这些杂项,只展示代码中你可能真正想看到的部分。如果你还没看过那个演讲,我强烈推荐去看看。
Erik St. Martin: 这听起来很有趣。
Brian Ketelsen: 真是太妙了。
Erik St. Martin: 那个项目叫什么?
Beyang Liu: 我不记得项目的名字了,但我觉得是在 dotGo。如果你搜索 “dotGo alan shreve”,应该能找到那个演讲。
Brian Ketelsen: 太棒了。你可以通过访问 Equinox.io/gotime 支持 Alan 和他的公司 Equinox。Equinox 对社区和个人项目是免费的,对公司发布他们的工具也非常便宜,所以一定要去看看。我们都很喜欢它。
Erik St. Martin: 我想他对收到一大袋现金也会感到非常高兴。 [笑声]
Brian Ketelsen: 我还得付费订阅 ngrok,因为我实在太喜欢它了。每天都在用。
Erik St. Martin: 是的,我也一直在用 ngrok。
Brian Ketelsen: 所以今天 Alan 算是以一个价格得到了两个赞助。 [笑声] 双倍的赞助。
Beyang Liu: 我很好奇,除了像 ngrok 和 Equinox 这样的工具之外,你们每天还依赖哪些其他工具,觉得特别有用?
Erik St. Martin: 哦,这个问题很有意思。我用的很多工具可能现在都被 Vim Go 抽象掉了,我自己并不直接运行它们。但 gometalinter 提供的很多功能我都经常用到。我甚至觉得应该暂停用它一阵子,这样我可以亲自检查代码,而不是完全依赖工具自动检测。现在我写代码时就会想,“反正工具会帮我抓出来。”
Brian Ketelsen: 我的回答和 Erik 的差不多,因为我也用 Vim Go,我完全不知道后台运行了多少二进制文件在帮我管理代码。不过我很喜欢它们,所以谢谢所有工具开发者。
Beyang Liu: 很棒。
Erik St. Martin: 我之前的公司用过一些比如 ffjson 和 SQL C 的工具。我在想还有哪些工具我们曾用来生成代码。
Beyang Liu: 是的,你们的代码库中会自动生成哪些部分?
Brian Ketelsen: 生成所有东西……所有的东西。 [笑声]
Erik St. Martin: 是的,Brian 最近一直在玩 Goa,用它来根据 API 规范生成所有 API 相关的代码。
Beyang Liu: 哇,这很不错啊。
Brian Ketelsen: 是的,我将在 Abstractions.io 做一个关于 “生成所有东西” 的演讲---
时间是在八月,我会在匹兹堡。我对此非常兴奋。Goa 的一个有趣之处在于它有一个 DSL 引擎,允许你创建自己的 DSL(领域特定语言),解析你想要解析的内容,然后从中提取元数据,生成你想要生成的内容。所以它不只是生成 API。如果你花几个小时写点代码,你可以生成 Kubernetes 配置文件、Docker 文件,或者任何你需要生成的东西。这是我 2016 年的一个燃烧热情---
真的想生成所有东西,并让 DSL 成为我唯一的事实来源。
我非常喜欢这种方式,因为通过生成代码,修改系统变得非常容易,而且 DSL 本身很具文档性,能让你清楚地知道自己在做什么以及为什么这么做。
Beyang Liu: 太棒了。
Erik St. Martin: 我看到一些关于依赖管理工具的调查,大家喜欢用哪些工具。我真的很想知道开发 Go 时人们经常用哪些工具。我敢打赌其中一定有很多流行的工具我没用过但应该用。
Brian Ketelsen: 我也觉得肯定有。
Beyang Liu: 是的,确实如此。感觉几乎每隔一周就会有人提到一个新工具,我都会想,“等等,这看起来很有用。我为什么还没开始用呢?”
Erik St. Martin: GoTime 频道里的 Florin 刚刚提到了 Delve。我们怎么能忘了 Delve?
Brian Ketelsen: 是啊,我们怎么能忘了这个最棒的调试器?不过我从来不调试代码,也许这就是我忘了它的原因,因为我的代码总是直接能运行。 [笑声]
Beyang Liu: 你是 printf 派吗?
Brian Ketelsen: 我大概只用过 Delve 两次,但我觉得它非常厉害。
Erik St. Martin: 是的,我不总是用调试器。这取决于我需要诊断的问题有多复杂,以及我需要多关注应用的整体状态,或者只是想知道某段代码是否被执行,以及那段代码范围内的变量值。所以很多时候我可能更倾向于用打印调试,但有时候我确实需要用到调试器。你们在 Sourcegraph 用什么工具?有没有什么是我们可能感兴趣想偷师的?
Beyang Liu: 呃,我用得最多的工具可能是 Sourcegraph 本身,用来浏览代码和寻找示例。除此之外,我以前用过 Go 的 Emacs 插件,因为我的编辑器是 Emacs。不过后来我们发布了自己的 Emacs 编辑器插件,我就改用那个了。
Erik St. Martin: 我得控制自己不因此对你有偏见。
Beyang Liu: 哈哈,对于日常编程中需要查找信息的情况,我现在主要依赖 Sourcegraph。至于元编程,我们生成了很多东西。我们写了一个叫 gen-mocks 的工具,可以自动生成用于测试的 mock 结构体。比如有一个结构体表示某种想调用的服务,gen-mocks 会为这个服务的每个端点轻松生成 mock。
我们还用 gRPC gateway 来生成 API,供 UI 和编辑器插件调用。
Erik St. Martin: 是的,我也用过 gRPC 很多次。gen-mocks 看起来挺有意思的。
Brian Ketelsen: 我还没见过这个工具。
Beyang Liu: 什么看起来有意思?
Erik St. Martin: 就是你刚才提到的 gen-mocks。
Beyang Liu: 哦,对,gen-mocks 是个很小的工具,非常简单明了,大家可以去看看。
Erik St. Martin: 看起来它就是基于一个接口生成实现该接口的 mock 结构体,对吧?
Beyang Liu: 是的。我真希望 Dmitri 今天在场,他其实可以聊聊我们用的很多工具以及我们为了保证代码质量所做的所有事情,尤其是在应用程序不断发展的过程中。
Erik St. Martin: 我们能不能像《谁想成为百万富翁》那样打电话求助朋友? [笑声] 可以安排一下吗?
Brian Ketelsen: 我们干脆专门做一期关于 Dmitri 的节目吧。这一定会是很有趣的一期。
Beyang Liu: 对啊。
Brian Ketelsen: 我们可以聊聊他的 gist 代码导入。
Beyang Liu: [笑] 是啊。
Erik St. Martin: 我都快忘了这事了。好吧,我猜我们时间快到了。你们想聊聊最近有哪些有趣的新闻或者项目吗?
Brian Ketelsen: 我这儿倒是有几个有趣的事情可以聊。
Erik St. Martin: 我知道你会提哪个。
Brian Ketelsen: 你觉得我会提哪个?快告诉我,我先会提哪个。
Erik St. Martin: Twitch,一定是 Twitch。
Brian Ketelsen: 没错!几天前 Twitch 发布了一篇关于垃圾回收器延迟的博客文章---
我们会把链接放到推特和节目笔记里---
那是一篇很棒的文章。我非常喜欢,真的很出色。我一连看了两遍。
Erik St. Martin: 这也呼应了 Beyang 的观点,关于工具以及社区的互动方式。我很喜欢看到他们在不断改进过程中所经历的旅程。你看过那篇文章吗?
Beyang Liu: 还没,不过我一定会去看看。
Erik St. Martin: 那篇文章基本上是讲 Twitch 从 Go 1.2 版本开始发布他们的聊天服务器实现时遇到的垃圾回收暂停问题,以及他们是如何逐步发现这些延迟的来源,同时在内部打补丁并与 Go 团队合作,最终对垃圾回收器进行优化和改进。
这真的很疯狂,他们的垃圾回收时间从最初的 10 毫秒……
Brian Ketelsen: 是从几十分之一秒降到了一毫秒。
Erik St. Martin: 是啊,太不可思议了。
Brian Ketelsen: 垃圾回收暂停时间的改进实在是太惊人了。这不仅是 Twitch 和他们的工程团队的一个很棒的故事,也是 Go 的一个很好的案例,展示了 Go 多年来的巨大进步。
Erik St. Martin: 是的,也许 Go 团队并没有因为这些幕后工作的成果得到足够的认可。我们只是看到了最终的结果,比如“垃圾回收时间减少了”,但我们没有看到一些公司在经历这些痛苦时所做的努力,也没有看到他们的工程师与 Go 团队合作,为我们其他人带来更好的体验。
Beyang Liu: 我真的很期待在 GopherCon 上看到 Go Guru 的演讲。我希望这就像是那篇博客文章的后续,并且我也很期待能用上它。看起来非常棒。我觉得 Go 团队在这里又一次做了很棒的工作,不仅推动了 Go 工具的发展,也推动了编程语言工具的整体进步。还有哪个语言会有开箱即用的工具,能像 Go oracle 那样提供如此丰富的代码信息?
Brian Ketelsen: 我同意。他们似乎在性能和工具链上并行发展。他们一方面致力于让 Go 尽可能快,另一方面又创造了一个令人惊叹的工具生态系统,真正提升了我们开发者的生活质量。我们爱 Go 团队。
Erik St. Martin: 今年有一些非常有趣的演讲,我很想看一些深入的内容。其中一个让我觉得最有趣的是关于数据包注入的演讲。我觉得那会很有意思,因为它完全不一样。他们用 Go 进行数据包捕获和分析。
Brian Ketelsen: 你知道吗,Erik,我们会直播哦。如果你去 Twitch.tv/Gophercon,可以在家看 [笑声]。
Erik St. Martin: 我可以在家看……?我可以躲在酒店房间里看吗?
Brian Ketelsen: 太棒了。“有谁看到 Erik 吗?”“没有。” [笑声]
Erik St. Martin: 很遗憾,我们总是要等到视频发布后才能看到演讲内容。不过我们也有完全不同的体验,这仍然很有趣。最近还有什么动态吗?我知道最近有一些版本发布……Kubernetes 1.3 发布了,这很棒。
Brian Ketelsen: 是的,这是一个大版本。
Erik St. Martin: ……里面包含了一些 Kubernetes 的功能,比如集群联邦。他们还提升了最大集群规模,现在支持两千个节点的集群和五六万个容器。
Brian Ketelsen: 是的,我几小时前看到一条推特说有六万个 pod。我不确定是否准确,但看起来 etcd 3.0 的加入确实让他们的扩展能力提高了不少。我知道 etcd 的这个版本发布挺大的。
Erik St. Martin: 我觉得他们现在应该基本兼容 OCI 和 CNI 了,或者 rocket。我还没看新版的仪表盘,但我也很期待。不过确实有很多很酷的东西。还有另一个项目已经到了 1.0.2 版本……
Brian Ketelsen: Traefik。Traefik.io 的负载均衡器。
Erik St. Martin: 没错!
Brian Ketelsen: 这是它们的一个大版本发布。还有 Glide,这周发布了 0.11 版本,看起来添加了很多很棒的新功能。不过我觉得总体来说这是相对平静的一周。我想大家都在把大招留到下周的 GopherCon,毕竟这是 Go 社区的大事件,我们期待所有的大新闻都在下周发布。
Erik St. Martin: 我觉得过去一周的热点基本都集中在 BigQuery 的事情上。我敢肯定……Beyang,你肯定看了不少相关的帖子,对吧?
Beyang Liu: 是的,我一直在关注。
Erik St. Martin: 是啊,这基本就是最近的一个大热点。而且你们已经走在前面了,因为你们已经在 GitHub 上对所有 Go 项目做代码分析有段时间了。
Beyang Liu: 是的。
Erik St. Martin: 你们现在做任何指标分析吗?有没有内部构建一些关于常用包之类的统计数据?
Beyang Liu: 是的,我们内部有很多这样的统计数据。我们还在开发产品化的版本。你们觉得关于 Go 项目,哪些统计数据会比较有用?
Erik St. Martin: 我觉得这会很有趣。我们应该向大家征集意见,列个清单,看看大家对哪些统计数据感兴趣。
Beyang Liu: 我们目前在考虑的是……一些基本的统计数据现在已经可以从网站上获取,比如某个函数在 Go 生态中被调用了多少次?有多少其他代码库引用了它?每个代码库调用它的频率是多少?有哪些作者以某种方式使用了这个函数?我们其实可以展示更多的统计数据,但问题在于,最重要的是什么……当用户试图浏览一个库,了解如何使用它,或者判断这个库是否是当前任务的最佳选择时,哪些信息是最重要的?
Brian Ketelsen: 我很想知道外部依赖的数量。这个库是否依赖了 47 个其他库?
Beyang Liu: 比如说有多少东西依赖它,或者它依赖了多少东西?
Brian Ketelsen: 它依赖了多少东西。我的未来会不会因为一个 left pad 而出问题?
Beyang Liu: [笑] 是的,完全有可能。
Erik St. Martin: 我觉得我会很感兴趣的是引入一个项目的影响。如果我为了某个需求引入这个包,我会引入多少其他包,或者总共引入了多少行代码?也许我可以用这个来决定是否应该仅仅复制这个函数,或者直接引入整个项目。我觉得这些信息可能会很有价值。我们也应该向大家征集意见。你们觉得他们应该通过什么渠道提交?推特?邮件?还是提交 issue?
Beyang Liu: 你可以发推特到 Sourcegraph 的账号 @srcgraph,或者直接发邮件到 hi@sourcegraph.com。
Brian Ketelsen: 不错。
Erik St. Martin: 我一直很喜欢这些 hi@ 开头的邮箱地址。
Brian Ketelsen: 感觉很友好。
Erik St. Martin: 我们需要一个 hi@gophercon 或 hi@gopheracademy 的邮箱。不过,我想我们不能在 GopherCon 上用“hi”这个词了,因为现在它有了不同的含义,特别是在新的规定下……
Brian Ketelsen: 尤其是在科罗拉多州,确实完全不同了。
Erik St. Martin: 可能会被误解。那么我们还有什么其他话题可以聊?
Brian Ketelsen: 我觉得是时候聊聊 \#FreeSoftwareFriday 了。
Erik St. Martin: 哦,对,我们怎么能忘了 \#FreeSoftwareFriday?
Brian Ketelsen: 我可不会忘,这已经融入我的血液了。
Erik St. Martin: Beyang,你知道 \#FreeSoftwareFriday 是什么吗?
Beyang Liu: 不知道,快告诉我吧。
Erik St. Martin: 这是 Brian 几个月前发起的一个活动,就是在 Twitter 上用 \#FreeSoftwareFriday 这个标签,表达对开源项目或维护者的感谢,因为这些项目让我们的生活更轻松。我们通常只有在不满意的时候才会对项目维护者说点什么,而这个活动的目的是鼓励大家多去感谢他们。作为我们节目的一个部分,我们也会加入这个环节,鼓励更多人参与。在节目的最后,我们会让每位嘉宾感谢一个对自己生活有所帮助的项目。
Beyang Liu: 很酷。
Erik St. Martin: 你可以自己提一个项目,也可以不提,因为我们有点突然抛出这个话题了。今天 Brian 和我都准备好了要提的项目。
Brian Ketelsen: 好的,那我就从 GoKit 开始吧。我们在 GopherCon 举办的 API 培训课上,最后一个主题是代码生成。当我在为这个课程写幻灯片时,我想起去年夏天差不多这个时候,我为 GoKit 写了一个代码生成器。所以我把它从 GitHub 上克隆下来,拉到本地运行了一下。它可以基于 JSON 编码生成一个 GoKit API 服务。我震惊了,因为这个我一年没有碰过的代码生成器,居然还能生成能在今天的 GoKit 上编译通过的代码。这种 API 稳定性可是无价的。我真的很佩服。你见过多少项目能让你一年不碰代码,依然能在当前版本上跑起来?我真的很惊讶,所以我要为 GoKit 团队和 Peter 的 API 稳定性点赞,太棒了!
Erik St. Martin: 太厉害了!对我来说,这周我一直在想能推荐一个大的项目,但其实我们经常忽略了一些基础的小工具。所以我回到最基础的工具---
The Silver Searcher。我已经用了好几年了,替代了 ack 和 grep 用来在目录中搜索。它的输出更简洁,而它的搜索速度简直快得离谱。
我最喜欢的一点是,它会遵循你的 .htignore
和 .gitignore
文件。所以当你在代码仓库里搜索某些东西时,它会自动跳过那些已经在忽略列表里的文件。而且它还有自己的 .agignore
,你可以全局配置,告诉它忽略某些扩展名的文件或特定路径下的文件。如果你还在用 ack 和 grep,我强烈建议试试 The Silver Searcher。
Beyang Liu: 不错。
Brian Ketelsen: 不错,听说有个很好的 Vim 插件支持它,对吧?
Erik St. Martin: 是的。而且它的搜索命令更简洁,只需要输入 ag
就可以用 Silver Searcher 搜索。而且确实有一个 Vim 的插件,你可以在 Vim 里用 ;ag
来直接搜索。
Brian Ketelsen: 不过 Beyang 应该用不上,因为他用的是另一个东西。
Erik St. Martin: 我知道。我确实需要更多使用 Sourcegraph。
Beyang Liu: 是的,试试吧,给我们反馈,告诉我们如何改进。我这周想提到的项目其实还没公开发布,但我们已经在内部使用了。它是由 Matt Holt(Caddy HTTP 服务器的作者)写的一个库,叫做 Checkup。本质上它是一个在线监测工具,有点类似于现有的一些在线监测服务,但它有一个非常简洁的配置格式,你可以快速地指定一堆 URL 进行监测。我觉得很多在线监测工具的 UI 太难用了,你需要手动更新,一旦有东西变了,你还得导航到 UI 界面再更新一次。而 Checkup 就很方便,你可以直接用代码描述所有关键的监测端点,这些端点可以随着代码的变化而变化。然后你可以把它部署到任何服务器上,比如 AWS 或 GCP 的节点上,它就能正常工作。它还能生成漂亮的图表,显示在线时间,非常易用,感觉完全符合 Go 的生态系统风格---
无废话、无冗余。你只需要列出想监测的内容就可以了。所以我要为 Matt 点赞,他为社区做了很多贡献。
Brian Ketelsen: 绝对的。
Beyang Liu: 我刚才还在网上搜索这个项目,但没找到公开的资料,不过我们已经在内部用了。
Erik St. Martin: 那我们就发动我们仅有的两个听众和我们自己去催 Matt,也许他会发布这个项目。
Beyang Liu: 是的,给他发推文。我说,发推文![笑声]
Brian Ketelsen: 加油,Matt!
Erik St. Martin: 我不知道现在有多少人在直播里听。也许 Matt 正在听。
Brian Ketelsen: 六个听众里可能有他一个。
Erik St. Martin: 我觉得我们的时间差不多了……节目已经超时了,不过这次聊天真的很有趣。我想感谢所有参与节目的人,感谢所有听众,感谢我们的赞助商 Equinox(equinox.io/gotime),一定要看看他们的服务,把节目分享给其他程序员……如果你还没有订阅,可以访问 GoTime.fm,订阅我们的每周电子邮件新闻,还可以在 Twitter 上关注我们。我们在 Gophers Slack 频道的名字是 GoTimeFm。我想就这样吧,大家再见,下周因为 GopherCon 我们不会有新节目。这些大会总是和播客时间冲突。
Brian Ketelsen: *叹气* 不过别忘了,如果你正在直播里听,不要忘了我们会直播 GopherCon。Twitch.tv/gophercon。我是不是已经提过了?
Erik St. Martin: 早上好,阳光少年……你提过了。
Brian Ketelsen: 好的,那就好。
Erik St. Martin: 是的,来看我们的直播吧。如果你会参加 GopherCon,记得来找我们。我们会有 T 恤……我想就这些了。Beyang,谢谢你来参加我们的节目,这次真的很有趣。
Beyang Liu: 非常感谢邀请我,这次节目真的很棒。
Brian Ketelsen: 节目结束啦!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。