本篇内容是根据2017年6月份#49 Adventures in VS Code 音频录制内容的整理与翻译
Ramya Achutha Rao 加入了节目,谈论了使 VS Code 成为编写 Go 的出色编辑器的所有因素、从社区获得的帮助以及其他有趣的 Go 项目和新闻。
过程中为符合中文惯用表达有适当删改, 版权归原作者所有.
Erik St. Martin: 欢迎大家回到《GoTime》的另一期节目。这是第49期,本期节目由 Toptal 赞助。
今天的嘉宾有我自己,Erik St. Martin,还有 Carlisia Pinto, 和大家打个招呼吧,Carlisia。
Carlisia Thompson: 大家好!
Erik St. Martin: Brian Ketelsen 今天没能来,不过我们很幸运地邀请到了 Johnny Boursiquot 来加入我们。
Johnny Boursiquot: 很高兴回到节目!
Erik St. Martin: 今天的特别嘉宾对所有 VS Code 爱好者来说绝对是个惊喜,她是 VS Code 的作者和维护者,Ramya。欢迎来到节目!
Ramya Rao: 大家好!很高兴参与节目!
Erik St. Martin: 你可以先给大家简单介绍一下你自己以及你目前的工作吗?你实际上是在微软工作的,对吧?
Ramya Rao: 是的,就像你刚刚说的,我叫 Ramya。我大学毕业后就直接加入了微软,那是在九年前的印度。四年后,我搬到了美国,现在住在西雅图。从那时起,我一直在一个叫开发者部门(Developer Division,也叫 DevDiv)的团队工作。这个团队专注于开发者、开发工具以及开发者使用的各种服务。我非常喜欢这个团队。
在这里,你终于能参与开发一个自己也会用到的产品, 你就是自己的客户,这种感觉真的很棒。
我在 DevDiv 的几个团队工作过。第一个团队是关于开发者内容服务的,比如大家熟悉的 MSDN 和 TechNet。微软是一家大公司,所以几乎每个团队在内容方面都有自己的一套工具和方式。我们当时的目标是整合所有这些内容,让大家都采用现代工具,比如 Markdown 和 Git,并加快发布流程---编写内容并迅速上线。
之后,我加入了 VSTS(Visual Studio Team Services)团队。VSTS 是一个应用生命周期管理(ALM)所需服务的集合,比如源码管理 工单跟踪、持续集成的构建服务,以及持续部署的发布服务,所有这些都集成在一个平台中。
如果你还记得老版的 Team Foundation Server(TFS),那是一个本地部署的产品,而 VSTS 是它的在线版本,并且功能更强大。在 VSTS 工作了一段时间后,我听说 VS Code 团队要在雷德蒙成立一个新的小组。在此之前,VS Code 团队主要由位于苏黎世的十几个人组成,由 Erich Gamma 领导。我觉得这是一个不可错过的机会,于是一年前我加入了 VS Code 团队,这就是我如何开始参与 VS Code 的故事。
Erik St. Martin: 你在开发这个插件之前就接触过 Go 吗?还是说这是你第一次接触 Go?
Ramya Rao: 老实说,在那之前我完全没听说过 Go。当时的情况是,我刚加入团队,而就在我加入前两个月,开发 Go 扩展的人离开了公司……那是 Luke Hoban (译者注: Typescript项目的联合创始人),一并感谢他为这个出色的工具奠定了基础。
团队决定,“嘿,把这个任务交给新人吧。” [笑声] 所以我成了那个新人---不仅对 VS Code 是新手,对 VS Code 扩展开发也完全陌生,对 Go 更是一无所知。那段时间里,我成了唯一的维护者和贡献者。所以,这就是我开始接触 Go 的方式。
Erik St. Martin: 那你现在喜欢 Go 吗?因为开发这个扩展,你开始在其他地方也用 Go 吗?
Ramya Rao: 我在日常工作中并不会经常用 Go,因为我们并没有在产品中使用它;VS Code 本身并不依赖 Go。不过,我偶尔会写一些小程序来学习更多关于 Go 的知识。
Erik St. Martin: 这很有意思。VS Code 是基于 Electron) 开发的吗?
Ramya Rao: 是的,VS Code 是基于 Electron 开发的。最初,大约五年前,Erich 和其他几个人在探索“能否用 Web 技术提供一种开发者体验、一种在浏览器中编码的体验”。于是,Monaco Editor 应运而生。
它被用于 Azure 门户中的 [听不清 00:05:20.20]、Azure 网站的在线编辑;Electron 也被用于 IE11 的调试支持---
你在其中看到的就是 Monaco。VSTS 也用它来实现在线代码编辑---
这也是 Monaco。就在那个时候,Electron 也开始流行起来。团队停下来思考,“我们应该走哪条路?” 于是,Electron 和这个编辑器结合到了一起,事情开始步入正轨,最终有了基于 Electron 的 VS Code。
Electron 解决了跨平台问题,还让你可以使用 Web 技术开发出如此惊艳的产品。我很喜欢 Electron 的一点是,你不再需要为了跨平台开发而学习原生技术。只要懂 Web 技术就够了,再加上一点点 [听不清 00:06:16.20]。
Carlisia Thompson: 我们听说有些代码编辑器在性能上存在问题,而问题的根源似乎是 Electron。但 VS Code 似乎没有这些性能问题。你们是否对 Electron 做了什么优化来解决性能问题?还是说我们听到的并不准确,其实 Electron 并没有性能问题?
Erik St. Martin: 我觉得关键在于基于 Electron 开发的编辑器本身---
它们是两个不同的编辑器,都基于 Electron。
Ramya Rao: 我想你指的是 Atom...
Carlisia Thompson: 我可没说,是你说的。 [笑声]
Ramya Rao: 哦,我不知道这是不是一个需要保持政治正确的话题…… [笑声] 是的,Atom 也是基于 Electron 开发的。确实有一种观点认为某些性能上的缓慢可能与 Electron 有关,但我认为这更多取决于产品设计的方式是否合理。我们的团队在构建产品时采取了非常聪明的设计方式,同时也在需要时对 Electron 做出了贡献。
据我所知,我们并没有为了解决性能问题而做任何特殊的调整。不过,这个问题可能由苏黎世团队的 Ben 来回答会更合适。我知道的信息就是这些。
Carlisia Thompson: 明白了。
Johnny Boursiquot: 我们也不应该对 Atom 过于苛责……我想我们很多人仍然在用它,因为某些原因我们喜欢其中的一些机制。但话又说回来,我们也面临着引发“编辑器之争”的风险,虽然我相信我们今天的播客中会在某个时候提到这一点。不过显然……就我个人而言,我用了 VS Code 大概 4-5 个月了。在那之前,我是一个彻底的 Vim 死忠粉,_你只能从我那冷冰冰的手里把 Vim 拿走_。我现在仍然几乎每天都会用 Vim,但当我开发 Go 的时候,VS Code 已经成为我日常使用的工具了。
Erik St. Martin: 老实说,今天居然没人把我踢出这个节目我也很惊讶,因为我仍然是那种 你得从我冷冰冰的手里把 Vim 拿走 的用户。 [笑声]
Ramya Rao: 就我个人来说……你知道,每个人都有自己的选择。有时候你习惯了一种工具,并且它对你有效---
那就很好。只要能让你高效工作,能让你从工具中发挥出最大的效率就行。我们只是建议大家都尝试一下不同的工具,找到适合自己的。
Erik St. Martin: 是的,看看 VS Code 和一些新的 lens 功能---
确实很吸引人。不过我用 Vim 是因为习惯了。现在有很多编辑器都很好用。以前我用 Vim 的时候,是因为其他的替代品太笨重,比如那些基于 Swing 的应用程序之类的东西……但现在纯粹是习惯,而且我经常通过 SSH 连接到服务器,我用 SSH 会话的效率可以和本地一样高。
不过是的,现在一些新的编辑器确实很吸引人。新的 lens 功能真的很酷……我想它叫这个名字,对吧?
Ramya Rao: 是的,叫 _CodeLens_。你知道你应该试试什么吗?试试 VS Code 上的 Vim 插件吧。这可能是尝试结合两种工具优势的一种方法。
Johnny Boursiquot: 这是我安装的第一个插件,因为……基本上,我对 Vim 的肌肉记忆已经根深蒂固了。所以当我看到 VS Code 上有 Vim 插件时---
老实说,没有这个插件我就没法用 VS Code,我已经习惯了用 Vim 的操作方式……
有人在频道里提到有一个新的编辑器,好像刚发布或者是测试版……我记得它叫 _Gogland_。不过我不太会发音,不知道正确的读音是什么。
Erik St. Martin: 我想是 _Gogland_。
Johnny Boursiquot: 对。我试了一下,老实说,它让我觉得很笨重……让我想起我用 Eclipse 开发 Java 时的噩梦。我试了一下,但它真的不适合我。
Carlisia Thompson: 是的,_Gogland_ 对于那些同时使用 Scala、Java 和 Go 的人来说真的很好用。他们特别喜欢这个编辑器。但也是那些本来就喜欢这种工具的人……我也试过,但它也不适合我。
现在的我正处于一种“_编辑器疲劳_”中。我喜欢花时间优化我的编辑器,让它对我来说尽可能高效。我对 Vim 优化过,对 Atom 也优化过,但总有一些地方不够好。所以现在我在尝试用 VS Code,而且我什么都没做;它还是很基础的状态,因为我已经累了。但我仍然在尝试。我在使用 Vim 插件时遇到了一些问题,比如我会被困在 Visual Mode_,而无法从 _Normal Mode 切换到 _Insert Mode_,然后再返回到 _Normal Mode_。
不知为何 Visual Mode 会启动,我以为自己在 Normal Mode_,但其实是在 _Visual Mode_。所以我无法从 _Visual Mode 切换到 _Insert Mode_。当我意识到这一点时,我就会点击 "I" 十次……然后不得不按 escape 进入 _Normal Mode_,然后再按 "I" 或 "A" 开始输入。这让我快要疯了。我不知道自己哪里做错了。
Erik St. Martin: 在普通 Vim 里,你能从 Visual Mode 直接切换到 Insert Mode 吗?现在我也开始怀疑了;我不记得我有没有尝试过。
Carlisia Thompson: 你可以。如果你可以的话,我不知道该怎么做。这就是问题所在---
我不知道怎么会进入 Visual Mode_,但我总是进入 _Visual Mode_。然后我想切换到 _Insert Mode_,心想“我应该在 _Normal Mode 吧,因为我没做什么会让我进入 Visual Mode 的操作”,但我却在 _Visual Mode_,然后没法进入 _Insert Mode_。我得---
哦,天啊!抱歉……
我还想说的是,知道 Visual Studio 在设计上做了一些特别的优化,让它的性能不会像其他编辑器那样出问题,这让我很欣慰。而且,我并不是想挑起编辑器之争---
尤其是因为我曾是 Atom 的超级粉丝---
但知道如果我坚持用这个编辑器,它不会像其他工具那样变得越来越臃肿,这真的很好。
Ramya Rao: 是的。性能对我们来说非常重要。我们确实在检查启动的每个阶段,看看可以在哪些方面改进,看看哪些地方耗时很长。还有一个原因是我们整个扩展性模型的设计。我们的扩展运行在一个独立于主编辑器的进程中。这样假如你安装了某个扩展,它由于某些奇怪的原因运行很慢。这并不会妨碍你的正常编辑体验。
这是很早就做出的一个决定,把扩展托管在一个独立进程中,而不影响主体验。所以这可能是另一个与众不同的地方。
Johnny Boursiquot: 这可能是你们整个项目中做出的最棒的决定。真的……就像大家在聊天里和播客中说的,每个人都曾经历过编辑器变慢的情况。似乎你用得越久,打开的时间越长,它就会变得越慢,占用的内存也越多。就像你在用 Chrome 一样;到某个时候你就得重启。但我在用 VS Code 时几乎没有遇到这种问题,我想这部分是因为它的这种独特架构,让各部分运行在不同的进程中。
Ramya Rao: 关于你的 Vim 问题,还有一点……我可以给你推荐一个联系人,你可以在 Twitter 上向他提问关于 Vim 插件的问题。Peng 会很乐意回答你的问题。他花了相当多的时间让 Vim 插件达到现在的状态,比起 7-8 个月前已经有了很大提升。
Carlisia Thompson: 太好了,我一定会去问,因为这真的让我快疯了。我觉得这也是让我没有投入时间好好配置这个编辑器的原因……因为我还没跟 Vim 插件“和解”。
Erik St. Martin: 这也是我的挣扎所在。关于 Vim 模式的功能进展确实很多,但我觉得对一个新项目来说,用过去其他 Vim 模式失败的经验去评判它有点不公平。
所以我确实需要安装 VS Code,用 Vim 模式试用一周,因为我觉得其他应用程序中的 Vim 模式这些年来已经进步了很多。
有人真的在用 Vim 模式吗---
比如 Firefox 有一个,我想 Chrome 也有一个 Vim 模式的扩展。有人用这些东西吗?
Carlisia Thompson: 我用过五分钟。
Johnny Boursiquot: 是啊,我也是。
Erik St. Martin: 是的,我喜欢 Vim,但有些事情用鼠标操作就是更简单。 [笑声]
Johnny Boursiquot: 是的,那是我“锤子时刻”。我当时想,“是啊,我爱 Vim……为什么不在浏览器环境和其他地方也用 Vim 呢?”然后我意识到,“好吧,我不能到处都用这个……这不太实际。”
Carlisia Thompson: 回到 Vim 的话题,有一个包含 VS Code 快捷键的 PDF。我不确定是不是只包含 Vim 的快捷键,还是 VS Code 的---
我想是 VS Code 的快捷键。有人有那个链接吗?因为我弄丢了。
Ramya Rao: 我们有一个叫 Keymaps 的东西。如果你是从 Atom 或 Sublime 转过来的,想用以前熟悉的快捷键,可以安装它们到 VS Code 上……
Carlisia Thompson: 真的?!
Ramya Rao: 是的!
Carlisia Thompson: 哪里可以找到!? [笑声]
Erik St. Martin: 你刚刚交到了一个铁杆粉丝。 [笑声]
Carlisia Thompson: 是的,是的!
Ramya Rao: 如果你现在打开了 VS Code,只需要在扩展面板中搜索“keymap”,你就会找到适用于 Sublime、Atom、Visual Studio、Emacs、Eclipse 的键位映射扩展……
Carlisia Thompson: 天哪……这正是我需要的!
Ramya Rao: 还有 NetBeans……有好几个这样的扩展。
Carlisia Thompson: 当然,现在我已经忘记快捷键了……(笑)不,我真的需要这个。太棒了!
Ramya Rao: 是的,我们的初衷是如果有人从其他编辑器迁移过来,我们希望尽可能让他们快速上手。
Carlisia Thompson: 那么,我下载了 Atom 的扩展,毕竟我之前用的就是 Atom。我的 Atom 被我改得特别顺手。那么现在我去哪里查看那些键位映射呢?因为我已经忘记了。
Ramya Rao: 点击 Atom Keymap,在右侧你应该可以看到更多信息,并且会有相关链接。
Carlisia Thompson: 太好了!太棒了。
Johnny Boursiquot: 实时技术支持,各位女士先生们。(笑声)
Ramya Rao: 我的天啊……这会变成客户支持电话吗?
Carlisia Thompson: 是的!
Johnny Boursiquot: (无法辨识,笑声)让我打开我的编辑器……(笑声)
Carlisia Thompson: 这就是我的初衷……这就像一个客户支持教程……
Erik St. Martin: 然后她还请了 Brad Fitzpatrick 来,只是为了让他合并她的 pull request……(笑声)
Carlisia Thompson: 而且成功了!
Johnny Boursiquot: (笑)哦,天哪……Ramya,有一件事我想深入了解一下……我记得 Erik 之前提到过 VS Code 今年早些时候新增了一个叫 CodeLens 的功能。那么从插件开发者的角度来看,这个功能在底层提供了什么?它和之前的功能有什么不同?_CodeLens_ 的作用是什么?尤其是在 Go 开发方面,它是如何帮助你的?
Ramya Rao: CodeLens 这个功能在 VS Code 中已经存在一段时间了。新的其实是 Go 扩展中的 CodeLens 功能。当我说“新”的时候,并不是说这项技术以前不存在,而是之前没人想到要在 Go 扩展中实现它。
CodeLens 是一种可操作的、上下文相关的功能。例如,它会出现在某个函数或方法的上方,并且与该函数或方法相关。你可以用它来显示引用、运行测试等。
不同的扩展可以根据需要使用 _CodeLens_。例如,有一个扩展会在 package.json
文件中为每个依赖项添加一个 _CodeLens_,告诉你每个依赖项的最新版本。
你可以用它来做任何事情,只是我们现在才在 Go 中实现它,所以你现在可以看到这些功能了。
Johnny Boursiquot: 非常酷。
Erik St. Martin: 你提到 CodeLens 已经存在一段时间了……最近有没有什么新的功能加入到插件中,或者你正在开发的、让你感到特别兴奋的功能?
Ramya Rao: 目前让我兴奋的一些功能是那些能帮助你更快编写代码的东西,比如代码模板(stubs)。如果你有一个接口,现在可以生成实现该接口的所有方法的模板代码。社区里有人提交了一个相关的 PR,我对此感到非常兴奋。
还有一些与模板相关的功能,比如方法提取(extract method)。我对这个功能期待已久。我尝试过使用 Go Doctor,但它在许多场景下并不适用。我在考虑使用 guru
,它有一个叫 Free Variables 的功能。我相信如果有人感兴趣,可以尝试用 Free Variables 来实现方法提取功能。这是我目前关注的两个功能……
Erik St. Martin: 这个项目会有很多外部的贡献吗?你是否主动寻求社区帮助解决一些问题?
Ramya Rao: 我当然非常希望能得到帮助。最近的贡献比以前多了。当我写发布说明的时候,看到贡献者名单上有更多的名字,而不仅仅是我自己的名字,这让我特别开心。我试图保持这种平衡。
在过去的几次版本发布中,确实有更多的社区贡献,我希望这种趋势能够继续下去。我也很愿意帮助大家一起调试问题……比如 References CodeLens 功能就是这么来的。有人觉得这是个好主意,然后开始实现。他遇到了一个问题,我们一起解决了。接下来的两三天,我们就有了 References CodeLens 功能。
Johnny Boursiquot: 这太棒了。那么看一下项目中的问题列表,你有大约 27 个标记为“需要帮助”的问题,其中 5 个被标记为“简单”,所以对于一些人来说应该很容易上手,贡献代码。
我还想问一个问题---
你用什么语言为扩展开发代码?是 TypeScript 吗?你具体是用什么编写的?
Ramya Rao: 是的,用 TypeScript。所有的 VS Code 扩展都是用 TypeScript 或 JavaScript 编写的。如果你想提供语言支持,还有一种叫 Language Service 的东西……你听说过 Language Service 协议 吗?微软、红帽和一些开发者在一年前的一次黑客松上提出了这个协议。
这个协议的想法是,你只需要实现一次语言服务器,就可以在支持语言服务器的编辑器中重复使用。你可以用任何语言编写语言服务器,但扩展本身是用 TypeScript 或 JavaScript 编写的。
Carlisia Thompson: 我还想问,Ramya,你是如何 1)决定为 VS Code 添加哪些功能的?2)如何确定哪些功能应该优先开发的?这让我想到了 Fatih 和他的 Vim Go……我说对了吗?
Erik St. Martin: Vim Go?
Carlisia Thompson: 对,谢谢;我刚才说错了。他是一个开发者,每天都在开发代码,他开发了 Vim Go。我猜---
虽然我不确定---
他的思路可能是“我需要这个功能”或者“我想要这个功能”,然后就把它加入进去了。当然,他也在听取其他人的意见,但整体上是他在让 Vim Go 成为一个最适合他自己的编辑器……这也恰好符合大多数使用 Vim 的社区用户的需求。那么 VS Code 是如何做出这些决定的呢?
Ramya Rao: 一开始,Luke 完成了诸如格式化、代码检查等基本功能后,当我接手项目时,我的计划是先处理那些简单的功能请求。我的第一个月基本上就是这样---
把所有简单的问题解决掉。
之后,我开始查看积压的问题,大约有 100 个。我会观察“哪些问题最受社区关注?哪些问题的投票数最多?”然后优先处理这些问题。
比如代码补全功能,即使你没有导入包---
比如没有导入 math
,你可以直接输入 math.
并获得补全提示。
Carlisia Thompson: 这功能太棒了。
Ramya Rao: 谢谢……这个功能请求吸引了很多人讨论,大家都觉得“如果有这个功能就好了!”于是我想:“为什么不做呢?”所以这是我目前的决定标准---
哪些功能请求的投票数最多,或者哪些是社区用户最希望看到的。
Carlisia Thompson: 所以你是说,用户积极表达自己的意见和需求真的很重要,对吗?
Ramya Rao: 是的,绝对重要。但同时,这也不是唯一的衡量标准。我知道有一个功能请求有 35 个投票,我至今还没实现它,因为用当前技术实现它会导致性能很慢……所以直到有更好的解决方案出现之前,我不会马上去做。因此,这是一种综合考虑的结果。
还有另一种情况……有时候 VS Code 的核心产品会发布一些新的 API 或功能。默认情况下,VS Code 支持 TypeScript 和 JavaScript 的新语言功能。那么扩展的开发者就需要跟进,并在自己的扩展中实现这些功能。
如果不跟进核心产品的更新,就会出现“VS Code 能做 ABC 功能,但 Go 扩展却不支持”的情况。所以你需要跟上核心产品的步伐,才能让用户体验到这些新功能。
Carlisia Thompson: 合理。
Erik St. Martin: 哦,所以你还需要持续开发,以便跟上核心编辑器的更新,是吗?
Ramya Rao: 是的。
Erik St. Martin: 这有点像一个永远处理不完的待办清单,对吧?你想要开发新功能,但同时也要……这几乎就像技术债一样。你需要确保保持更新,因为你越是拖延实现新功能,距离目标就会越远。
Ramya Rao: 是的,我觉得有一个与调试相关的功能就是这么来的。有一个叫 launch.json
的文件,如果你需要调试代码,就需要这个文件,你会在里面添加配置。最初,你需要根据文档手动编写它;而现在,你可以在这个文件中使用代码片段(snippets)。比如,可以用一个片段来调试你的测试函数,或者用一个片段来调试你的包(package)。这些框架(scaffolding)都已就位,你只需要编辑这些片段就可以了。这就是从核心产品中衍生出的一个功能。它的关键点在于,Go 扩展所需要做的只是实现这些片段并将其挂载,然后你就能在调试配置中看到它们了。
Carlisia Thompson: 顺便问一下,有人愿意分享他们的代码片段配置给我吗?因为我完全没有。我想要一些代码片段,比如用来新建一个函数,或者写 fmt.Println
什么的……
Ramya Rao: 哦,有一个东西可以帮到你。我想---
让我快速确认一下再说是否可行……你可以在命令面板中输入 "Insert Snippet",然后就会打开所有 Go 扩展可以为你提供的片段。
Carlisia Thompson: 哦……"Insert Snippet"……
Johnny Boursiquot: 我现在就在试。
Carlisia Thompson: 我也在试……[笑]
Erik St. Martin: 我感觉自己在这之前应该先装一下 VS Code……
Johnny Boursiquot: 你应该的……[笑声] 你可能还能蹭到一点免费的技术支持。
Erik St. Martin: “Erik 在直播中转投 VS Code 阵营……”
Ramya Rao: 这些是 Go 扩展自带的片段,然后你也可以自己创建片段。
Carlisia Thompson: 那这个怎么用呢?比如,有一个叫 "If" 的片段,是用来写 if 语句的。那我输入 "if" 然后按什么?Tab?但这没用……
Ramya Rao: 不,不是那样的。你不用输入它,你直接选择它。
Carlisia Thompson: 哦,我明白了。但这对我来说点得有点多……我想输入几个字母,然后按 Tab。
Ramya Rao: 是的,这也是可以的。在编辑器中,如果你知道片段的前缀,比如输入 for
,我记得应该有两个 for
的片段会在你的建议列表中出现。
Carlisia Thompson: 抱歉,我需要输入什么?
Ramya Rao: 对于 for
循环,只需要输入 for
,它就会建议你使用片段。
Carlisia Thompson: 是的……哦,第一个出现的 for
不是片段。
Ramya Rao: 那是关键字。第二个和第四个才是片段。你可以通过建议列表中的图标来区分它们。那些像盒子的图标是片段。
Carlisia Thompson: 那我需要按向下箭头才能选到其他的片段。有更快的方法吗?
Johnny Boursiquot: 你可以自己映射(快捷键)。
Ramya Rao: 有一个设置可以让片段建议显示在顶部、底部,或者内嵌显示……你可以调整一下。
Carlisia Thompson: 真的?
Ramya Rao: 是的。
Carlisia Thompson: 好的,那是在 Preferences,Settings 里吗?
Ramya Rao: 对,或者你可以用快捷键 Cmd,
。这真的快变成技术支持电话了。[笑声] 我都没看 Slack……有人在 Slack 上提问吗?
Erik St. Martin: 没有,他们基本上在开玩笑,比如 Carlisia 的“咔哒咔哒”键盘声……
Carlisia Thompson: 哦,抱歉,我忘了换键盘……天哪。
Erik St. Martin: 是啊,我通常也会换掉我的。我用的是机械键盘……
Carlisia Thompson: 节目快结束了,我才意识到这点……抱歉,大家。
Johnny Boursiquot: 没事的,这让你看起来更像极客。[笑声]
Erik St. Martin: 我觉得大家现在都在猜你的键盘用的是哪种 Cherry MX 轴,根据按键的声音来判断。[笑声]
Carlisia Thompson: 好吧,我不知道我该不该说,还是让大家继续猜……是棕轴。
Erik St. Martin: 棕轴?
Carlisia Thompson: 是的,Thor 猜中了。
Johnny Boursiquot: 看吧,Thor4 在频道里猜中了。好吧。我确实想稍微从技术支持话题转一下……
Ramya Rao: 是的,请转吧。[笑声]
Johnny Boursiquot: 你差不多是在去年 10 月接替了 Luke 的工作,现在你实际上扮演的是产品经理的角色,一边根据大家的反馈进行开发,一边自己做一些需求分类,还要跟上语言的变化和 VS Code 的更新……所以可以说你在同时处理很多事情。
显然,你是突然进入了这个角色---
你觉得在这段经历中,你学到的最大经验是什么?
Ramya Rao: 这是个很棒的问题。一开始,当我刚接手的时候---
你需要知道,这是我的第一个开源项目……
Johnny Boursiquot: 干得好!
Ramya Rao: [笑] 谢谢……我当时非常兴奋。整个过程,和陌生人讨论代码、做 PR(Pull Request)---
这是一段很棒的体验。在这个过程中,我觉得最初几个月我太投入了,以至于每周都在发布更新。我会想,“哦,这个新功能真棒!我可以做这个!”然后做三四件事,砰!一次更新!
我一直这样做,后来我学到了一个教训,那就是这种方式行不通。[笑声] 而且,就像你说的,我既是产品经理,又是开发者,还要到处收集需求、测试、与用户互动……所有角色融为一体,这种感觉既充满挑战,又令人兴奋。
我之前在的团队是这样的:你只是一个开发者。团队会提出设计或需求,然后大家讨论技术实现方式,你再去完成它,然后就完事了!但在这里,所有的事情都由我一个人完成,这对我来说是一次很大的提升。
有几个月我完全沉浸在其中。我每隔半小时就检查一次通知,看有没有人提问,“我要回答这个吗?我要说那个吗?”对我来说,最难的事情是调整节奏并找到一个规律,但最终我学到的经验是“放慢脚步”。
现在,我大概每个月发布一次更新;这个节奏好多了。我每天回复一次通知,而不是每半小时回复一次。所以,这就是我的经验。
Erik St. Martin: 我觉得,这种情况的另一个难点是,当你为你的雇主开发产品时,通常会有一条清晰的汇报链条和层级结构,你只需要让你的上级满意。他们会负责协调你和其他团队之间的关系,以及相关的影响。但在开源项目中,实际上有成千上万的人都成了你的“老板”,而每个人都有自己的优先事项和需求。有些时候,这些需求还会相互冲突,而你就会想,“我要怎么才能让所有人满意?”
Ramya Rao: 是的,这种事情确实发生过。同时,我已经和一些人谈过这个了。有一次,我正在和一个人讨论一个PR(Pull Request),我说:“你知道吗,这种情况下这样做行不通,但那样可能会更好。” 然后那个人说:“哦,对,你太棒了!” 我差点感动得哭了。我有九年的工作经验,但这比任何绩效评估都要好得多……
但真的,我从来不知道,一个陌生人简单的“谢谢”会让人感觉这么好。
Erik St. Martin: 太棒了!这其实也是我们每周举办 #FreeSoftwareFriday 的部分原因。通常你只有在需要东西时才会联系开源项目。我们真的希望大家多多支持,哪怕只是提交一个Issue,告诉人们你有多喜欢他们的工作。或者分享一个Issue,虽然可能会很快膨胀……成千上万的人提交Issue说:“我们爱你!谢谢!” [笑声]
Johnny Boursiquot: 或者像大多数人一样,直接在Twitter上称赞他们。
Erik St. Martin: 对。所以我觉得我们可能已经超出了第一个赞助商插播的时间段了,所以我们来插播一下赞助商广告,因为他们让这个节目得以实现。今天的赞助商是 Toptal。
插播广告:
Erik St. Martin: 我们回来了,现在和 Ramya 聊关于 VS Code 插件 的事情。我觉得我们关于插件和未来的事情已经聊了很多了……你们想聊聊一些项目和新闻吗?过去几期节目我们甚至都没机会讨论这些,我觉得清单已经堆积了起来;可能需要翻一下之前的节目文档。
Johnny Boursiquot: 听起来不错。
Erik St. Martin: 我发现了一个很酷的项目---
实际上,这不是我的功劳,我弟弟发给我的链接并让我看看有多酷。它也和编辑器有关,希望 Ramya 不会因此揍我……[笑声]
Ramya Rao: 嘿,我已经说了,各取所需!用你喜欢的东西吧。[笑声]
Johnny Boursiquot: [模糊不清的发言]
Erik St. Martin: 我觉得这个项目很酷,因为它也和Go有关。它叫 Gonvim,是一个用Go编写的nvim的GUI前端。这真的很酷。我还没有试过,所以不能告诉你我喜欢还是讨厌它,但看起来确实很棒……不过,我有点想尝试VS Code,所以我想我最终会先玩VS Code。其他人可以试试这个,然后告诉我他们有多爱它。
我昨天还看到一个很酷的东西,也是来自微软(Azure团队)的,叫 Draft。看起来非常有趣。它基本上是一种可以检测你正在运行的应用程序类型,并自动生成Docker文件和Kubernetes规范的方法,这样你就可以在本地写代码,然后运行一个命令,把它部署到Kubernetes集群中的沙盒环境。
Ramya Rao: 哦,提到Docker---
我们有一个Docker扩展。
Erik St. Martin: 是为VS Code的吗?
Ramya Rao: 对。
Erik St. Martin: 哦,太棒了。我想知道它有哪些功能,比如自动完成之类的。
Ramya Rao: 你应该去看看!
Erik St. Martin: 我应该去……更有理由试试它了,我觉得Vim里没有Docker扩展。
Johnny Boursiquot: 这就对了……
Ramya Rao: 目前还处于初期阶段,所以可以提交功能请求,告诉我们你希望看到哪些功能。它是开源的。
Carlisia Thompson: 我刚安装了,就这么快。
Johnny Boursiquot: 哇……[笑声]
Erik St. Martin: 我一直试图秉持这样的理念:“尽量提交Pull Request而不是Issue。” 如果我有能力解决问题,我更愿意试着添加功能或修复问题。
Johnny Boursiquot: 更好的是,同时提交Issue和Pull Request。
Erik St. Martin: 这倒也是,因为这样别人可以跟进。所以我不记得 GopherCon Singapore 是什么时候了……应该是几周前吧,我记不清具体日期了,但是视频已经在YouTube上了。
Johnny Boursiquot: 很好!一共有多少场演讲?
Erik St. Martin: 好问题……总共有17场。
Johnny Boursiquot: 哇,那可是一堆视频要看啊。
Erik St. Martin: 是的。而且坦白说,今年还有其他会议的视频我都没看完,我真的不知道该怎么赶上。这一天就24小时……我该怎么挤出时间来看这些?现在有那么多会议,产生了如此多的内容,就算每天看一个视频也永远赶不上。
Johnny Boursiquot: 这是个不错的问题。
Erik St. Martin: 确实是。
Carlisia Thompson: 说到会议,我们还应该提到……GopherCon 就在下个月!我太兴奋了!
Erik St. Martin: 哦对,因为现在已经是六月了,所以是的……还有一个月。
Carlisia Thompson: 我们应该提到,闪电演讲的CFP(Call for Proposals)已经开放。
Erik St. Martin: 是的,是的……
Johnny Boursiquot: 什么?在哪里?
Erik St. Martin: 它已经开放了……我来找一个链接,我们可以把它发到频道里,也会发到Twitter上,这样那些一周后才听到这个消息的人也有机会看到。Ramya,你会去GopherCon吗?
Ramya Rao: 会的。起初我不确定,但后来Google的Jana联系了我,说“你应该去!” 然后我就说,“好吧……” 所以我会去的。
Erik St. Martin: 你应该去。我们应该给你弄一个专属展位,让大家见见你,感谢你。
Ramya Rao: 是的,只要它不会变成一个客户支持展位就行……[笑声]
Johnny Boursiquot: 我刚刚脑子里也在想这个……
Carlisia Thompson: 我不能去那个展位……我肯定会变成客户支持的样子……[笑声]
Erik St. Martin: 你可以放个牌子,上面写着“只接受爱,不接受问题。”
Ramya Rao: 不,你可以问我任何问题,只要找到我。如果你带着你的笔记本电脑或Mac,我们可以一起看。
Carlisia Thompson: 你报名参加“Women Who Go”的晚餐了吗?
Ramya Rao: 哦,有“Women Who Go”的晚餐?
Carlisia Thompson: 哦,是的……
Ramya Rao: 我还没跟上消息……
Carlisia Thompson: 没关系,我会把链接发给你。
Ramya Rao: 我应该……[听不清 00:43:04.15]
Erik St. Martin: 你以前参加过类似的活动吗?还是这次是你的第一次?
Ramya Rao: 不,这是我第一次参加 GopherCon。不过关于会议,我之前参加过 Grace Hopper 大会,以及微软内部的一些会议。所以我非常期待这次活动。
Erik St. Martin: 我也很兴奋,有很多事情我们一直在幕后准备……这次会非常酷。我们玩得很开心。我可能会泄露一些事情,至少是我正在做的一些东西。
Johnny Boursiquot: 你在吊人胃口。
Erik St. Martin: 是的,我确实在吊胃口。这也是举办会议最有趣的部分之一……比如当你可以稍微透露一些内容的时候……像我之前分享房卡的照片之类的……看到大家如此兴奋真的很有意思,比如“天哪,我需要一个这样的房卡!”
Johnny Boursiquot: [听不清 00:44:02.12] 我还留着上次 GopherCon 的半打房卡。
Erik St. Martin: 我都不记得我们怎么处理那些了---
当时我们剩下了几百张印好的房卡……我不知道后来它们被怎么处理了。有些周边物品我们捐给了当地的避难所,比如马克杯之类的东西……所以我可以想象,有些完全不懂技术的人拿着 GopherCon 的周边四处走动……[笑声]
不过很有趣的是,即使穿着这些周边衣服,也会引来很多奇怪的目光,人们不明白为什么一个成年男人会穿着一件印着卡通地鼠的 T 恤。
Johnny Boursiquot: 太有趣了。你总是会因此得到一些奇怪的目光。
Erik St. Martin: 是的,我从来没怎么想过这个问题……我就是随便穿这些衣服,偶尔有人会问我关于这件衣服的事情。那么我们还有什么要讨论的吗?
Johnny Boursiquot: 是的,我看我们的清单上还有一些内容。我看到这里有一个关于高性能 Go 的演讲,涉及汇编语言,这是在 FOSDEM 上的……
Erik St. Martin: 是的,Minio 团队的一个成员今年在 FOSDEM 上做了一个演讲,他们做了一些 [听不清 00:45:09.24] 的事情,使用的不是普通的汇编语言,而是 Go 的汇编语言来实现部分功能。我看了那个视频,当时一边多任务处理一边看,所以我只记得一些细节。我记得他们通过用汇编语言实现某些函数,性能提升了大约 100 倍。超级酷的内容,我们会把链接放在节目文档里,如果你对这类内容感兴趣,可以去看看。
Johnny Boursiquot: 是的,我还想提一下 Francesc Campoy 的 Just For Func 系列节目,我记得是每周或每两周更新一次---
我不确定他现在的更新频率,但这些节目真的特别有趣。他最近的一期是关于用 gRPC 和 Kubernetes 写一个文本转语音服务的。他在节目里一边现场写代码一边展示,最后还部署到了 Kubernetes 上。整个项目从头到尾非常有趣。我强烈推荐大家去看看。
Erik St. Martin: 我还没看过最新的一期,但我很喜欢看这些节目。他真的很有趣!
Johnny Boursiquot: 是的,他真的很享受这些节目。
Erik St. Martin: Ramya,你看过 Just For Func 系列吗?
Ramya Rao: 我看过一集……这算吗?
Erik St. Martin: [笑] 算,当然算……这也算看过了。我敢肯定 Carlisia 看过。
Carlisia Thompson: 是的。
Erik St. Martin: 这是我一定会抽时间去看的系列之一。至于会议的内容,现在我几乎不得不挑着看,因为内容太多了。
我记得有人提到 DevOps Days?
Carlisia Thompson: 是的,是我提的。我几期节目之前就想提了,但最后没时间说,上周我也没来……我真的很想提一下 Kelsey Hightower (kubernetes-the-hard-waykubernetes-the-hard-way
的作者) 几周前在 DevOps Days Austin 做的一场演讲。真的非常感谢他做了这场演讲。他讲了他的背景、成长经历、如何进入科技行业并坚持下来的故事,以及他的一些经历。
我觉得这是一场非常值得观看的演讲,尤其是对于他的粉丝来说,因为你可以更深入地了解他。此外,我一直认为软件开发是关于人的领域,你可以从中看到一个人如何以非常脆弱和开放的方式分享一些平时不会提及的故事。这些故事并不是人们不想说,而是因为在日常生活或会议演讲中很难找到合适的机会去讲,所以通常不会被听到。我觉得有很多人都有类似的经历---
不仅仅是少数群体,每个人都会有自己的挣扎;只是有些人面临的挑战更多,更明显,当然也更难。然而,每个人都有自己的困难,即使你没有,这样的故事也有助于你了解他人的挑战。
他提到的一些话让我特别有共鸣……其实整场演讲都让我非常感动,老实说我当时都哭了。还好我不是看完当天就提这场演讲,否则我可能会非常情绪化。他讲到他和一个人的对话……一个白人男性非常惊讶地看到一位黑人男性到他家里来,做着非常出色的技术工作。基本上,这个人可能从未见过黑人从事任何专业工作,因为他生活的环境和人际圈子让他对黑人有一些固有认知,这并不是他的错……就是他成长的环境如此。而他非常惊讶地看到 Kelsey 表现得如此出色,这种惊讶非常明显。
Kelsey 说的一些话让我印象深刻,比如“你要给人机会”,我引用他的原话:“人是可以改变的,如果你做对了,你会看到这种改变发生……”这显然是对这些挑战性互动的一种非常积极的看法。人们可能会对我们说,“我从未想过你会做这个……”甚至怀疑我们是否能做好,或者我们是否真的在做。
对此我的一个感悟是,通过自己的努力看到改变的美好。你从什么都不知道开始---
你想进入一个领域,但你什么都不知道;然后你经历学习的过程,这个过程很难……接着你开始能做出一些成果,然后变得更好,甚至开始教学和指导他人……在这个过程中,你成长为了一个完全不同的人。有时候我会看着自己,感叹“哇……”[笑] 所以,看到自己改变的过程也是一件很棒的事情……能够亲眼见证这一切,我对此也非常感恩。不管怎样,我觉得这是一个值得一看的演讲。
Erik St. Martin: 是的,我觉得这是一场非常情绪化的演讲,听到他的背景故事……这样的内容真的很棒,因为它让这些人变得更加真实。你会意识到“感知即现实”,我们看到一个人正在做的事情,往往会根据自己的认知描绘出这个人是谁以及如何到达那一步。所谓“一夜成名”的神话其实并不存在---
你会看到人们所经历的各种挣扎,从而意识到我们每个人都在自己的生活中面对挑战,并用不同的方式去克服它们。
Kelsey 之前在 Twitter 上也发过一些类似的内容,他更开放地谈论自己的成长经历。看到一个在社区中有如此影响力的人能够开放地分享他的过去,真的很令人敬佩。这让人们变得更真实。
同样的,我们今天有 Ramya 来聊 VS Code……这对你来说是进入开源和 Go 世界的一个契机,所有这些事情……我们对你的印象和现实往往有很大的不同。
Ramya Rao: 这是一段有趣的旅程。
Erik St. Martin: 是的。我本以为你之前就一直在写 Go,然后因为喜欢 VS Code 就决定写一个插件。[笑] 通常事情就是这样发展的。我真的很高兴这个项目交到了你手上,因为它看起来很棒,尽管我目前还没用上---
不过也许你会说服我……[笑] 我记得当我们邀请 Edward Muller 来节目的时候,Vim 和 VS Code 是使用 Go 的开发者最常用的两个编辑器……这太棒了。
Ramya Rao: 听到这个很高兴,因为这样的反馈也会激励我。这种反馈对项目维护者和贡献者来说非常重要,能够让我们继续做下去……所以听到这个真的很好。
Erik St. Martin: 是的,这会让你觉得自己所做的工作是有意义的,能够帮助到很多人。
Ramya Rao: 是的。
Erik St. Martin: 太棒了!在我们进入 #FreeSoftwareFriday 环节之前,有没有其他有趣的项目、新闻或公告想讨论的?如果没有的话……
我不知道 Ramya 你是否听过这个节目,但我们之前提到过一点… 通常在节目即将结束时,我们会有一个 #FreeSoftwareFriday 环节,在这个环节中,我们会感谢某个人、某个公司或某个项目,这些人或项目在开源世界中让我们的生活变得更轻松。这个环节旨在表达我们的感谢和认可。它不一定非得是与 Go 有关的东西,最近很多时候也不是。但如果你有想感谢的对象,欢迎加入我们;如果没有,那也没关系。
Carlisia,你想开始吗?
Carlisia Thompson: 好的,当然可以。今天我想特别感谢一些人,而不是软件… 我想感谢 JBD (Jaana B. Dogan)。她在 Google 工作,并且在 Go 的领域做了很多工作。她主要专注于---
我不想说错,但她在 Go 的性能优化和改进方面做了很多工作。根据我的理解,她还领导了 Devex 小组,也就是开发者工作组,该小组的目标是改善开发者的入门体验,同时处理其他事项。
她有许多很棒的开源项目,并且写了很多与 Go 相关的优秀博客文章。她的博客文章非常值得一读。换句话说,她是一个了不起的人,非常努力;我觉得她没有得到足够的认可,所以今天我想特别感谢她。
Erik St. Martin: 我们都很喜欢 JBD。她发布了许多很棒的博客文章,我这些年从中学到了很多东西。
Carlisia Thompson: 她还曾经参加过 第 22 期。
Erik St. Martin: 你是记得这个期数,还是查过?
Carlisia Thompson: 我查了一下,我写下来了。 [笑声]
Erik St. Martin: 我记得有一期节目,你没有查就直接说出了某人参加的期数,我当时很震惊。
Carlisia Thompson: 我当时肯定也很震惊… [笑声]
Erik St. Martin: 如果是两期前的内容我可能还记得,但时间稍长点我就忘了… [笑声] Johnny,你呢?
Johnny Boursiquot: 我最近在用一个叫 q 的调试工具。我觉得它是从 Python 社区的一个项目移植过来的。y0ssar1an 在 GitHub 上---
我们可以分享一下 链接---
我想他是把这个工具移植过来的。q 基本上是一个更好的 fmt.Printf
。我不太用调试器,比如 Delve 那样的工具… 我不是很喜欢调试器;我是那种老派的“打印日志然后查看程序运行到哪”的人。对我来说,使用 q 是更好的体验。
它的工作原理是你打开一个终端控制台,运行 qq
,它会打开一个流,实时输出你代码中记录的内容,格式非常友好。
在 Go 代码中,你只需引入 q 库,然后用 q.q
代替 log.Printf
或 fmt.Printf
,将想输出的内容传递给它。输出会显示在一个流中,格式漂亮,还会附加一些元数据,比如输出语句所在的位置。
这个工具非常棒… 我几乎所有的调试工作都依赖于它。我在代码中随处插入 qq
,它成了一个非常好用的调试助手。所以我要感谢开发这个工具的人。我几乎每天都用它。谢谢。
Erik St. Martin: 那 Ramya 呢… 你有想感谢的人或项目吗?
Ramya Rao: 哦,我有很多人想感谢。首先,我要感谢 Luke Hoban,他在 2015 年 11 月创建了 Go 扩展。这让我有机会参与并贡献这个很棒的项目。所以这是第一个感谢。
第二个感谢是那些出色的开发者,他们开发了像 gocode、godef
、godoc
、gogetdoc
这样的工具。这些工具被我们扩展内部使用。感谢你们开发这些工具。
最后,我要感谢所有提交 PR、记录 Issue、确保我们保持 Go 扩展最新状态的优秀开发者们。我爱你们,非常感谢。请继续努力![笑声]
Erik St. Martin: 今天我想感谢一家公司,那就是 Microsoft。我觉得过去几年我们见证了一个全新的 Microsoft。他们对 Go 插件、VS Code 本身,以及 Docker 和 Kubernetes 的贡献,还有最近收购 Deis 的举措(包括最近发布的 Draft 项目)都非常出色。我觉得我们真正看到了 Microsoft 团队在社区贡献和参与方面的努力。我对此非常感激,也很高兴他们为开发这些我们能用到的工具付出了金钱和人力。
Johnny Boursiquot: 完全同意。
Erik St. Martin: 在结束节目之前,还有其他人想补充的吗?
Johnny Boursiquot: 我要特别感谢 Ramya 为 Go 扩展所做的工作。我觉得她应该得到特别的感谢,对吗?
Erik St. Martin: 毫无疑问。
Ramya Rao: 谢谢。
Johnny Boursiquot: 感谢你,Ramya,为我们做出的贡献。希望你能继续下去。
Ramya Rao: 我一定会的。
Erik St. Martin: 非常感谢你参加我们的节目;这真的很有趣。我们一定会保持联系,关注 VS Code 插件和 VS Code 本身的变化与改进,因为你比我们更了解这些事情。
Ramya Rao: 很高兴参与这个节目。你们可以随时联系我,我现在有 Twitter 账号了… 我之前参加的其他播客节目没有多提这个,但我吸取了教训。我现在在 Twitter 上,你们可以分享我的账号。任何关于 Go 扩展或 VS Code 的问题都可以问我。如果我不知道答案,我肯定认识知道答案的人。我可以转发你们的问题和疑问,所以随时联系我。
Johnny Boursiquot: 太棒了!
Erik St. Martin: 再次感谢你参加节目,也感谢所有今天参与讨论的嘉宾… 特别感谢 Johnny 代替 Brian 参加节目。我总是很喜欢你来参加节目。
感谢所有正在收听的听众,以及之后会听到这期节目的听众。特别感谢我们的赞助商 Toptal;再次呼吁大家支持他们,因为他们让我们有机会制作这个节目。
一定要把这个节目分享给其他 Go 开发者。如果想订阅,可以访问 GoTime.fm。我们很快会开始发送每周邮件,所以可以去订阅。你也可以在 Twitter 上关注我们。如果我没有跑题太多… 如果你有想在节目中讨论的话题,或者对嘉宾有建议,请在 ping 上提交 Issue。
我想就这些了… 再见,大家下周见。
Johnny Boursiquot: 再见!
Carlisia Thompson: 再见,这次很有趣!
Ramya Rao: 再见!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。