Go 语言之父:四十年来软件开发之巨变与 Go 的过去和未来(go语言创始人)
Rob Pike 是 Go 语言核心作者之一。本文是针对 Rob 的一次专访,话题涉及 Rob 四十年的职业生涯、Go 语言过去十年的发展及其未来。
与现今的很多开发人员不一样,你几十年前就在贝尔实验室开始了自己的职业生涯。从你角度来看,你认为软件开发方式最大的变化是什么?
现今的规模要大得多,不仅仅是计算机和网络,还有程序本身。所有的 Unix V6(大约发布于 1975 年)都可以轻而易举地装在一个 RK05 磁盘(只有差不多 2MB 的存储空间)中,还留出了大量的用户空间。这是一个很好的计算环境,至少在当时看起来是这样的。
基于“抵制改变”和“承诺兼容”这样的思想,你如何看待 Go 语言和它的生态系统在未来 10 年的发展?你设想的最好的未来是怎样的?
尽管还不是很确定,但在经过十多年的发展之后,参数多态设计——也就是通常认为的泛型,将在未来一两年出现。为已有的语言找到一种合适的设计是个大难题,不过 Ian Lance Taylor(Go 语言另一位核心作者)在这个问题上投入了惊人的精力,现在看来答案已经触手可及了。
这将给库、生态系统和社区带来怎样的影响?我们拭目以待。
随着“渐进式类型”被引入到“动态类型”语言中,以及“类型推断”被引入到“静态类型”中,二者之间的界限现在变得越来越模糊了。你对现代编程语言的类型系统有什么看法?
我非常喜欢静态类型,因为它的稳定性和安全性。
我非常喜欢动态类型,因为它给我带来了乐趣。
我不喜欢类型驱动编程、类型层次、类和继承。尽管有很多非常成功的项目都是通过这种方式构建的,但我觉得这种方法将重要的决策过早地放在了设计阶段。换句话说,我更喜欢组合,而不是继承。
不过我要对那些喜欢使用继承的人说:不要在意我所说的,请继续使用你认为有效的方式。
有时候人们应用技术的方式很奇怪,例如通过 Python 或 Ruby 来生成 Go 代码(我们的确看到过这种做法)。这些年来,你都见过哪些奇怪、有创意或有趣的 Go 语言用法?令你感到最惊讶的是什么?
最大的意外是我们得知 Go 语言被用来编写恶意软件。你无法控制谁会使用你的东西或者他们会用它做些什么。
你开发了很多文本编辑器。你觉得 Visual Studio Code 怎么样?有了 LSP 这样的技术,“文本编辑器”和 IDE 之间的界限现在变得越来越模糊了。你认为软件开发人员需要像 GoLand 那样的全功能 IDE 吗?或者使用 VS Code 就可以了?
我来自一个早于 IDE 出现的时代。在 Go 语言项目的早期,我们讨论过 Go 语言是否需要借助 IDE 才能获得成功。但当时团队中没有人具备开发 IDE 的技能,所以我们没有尝试去开发一个 IDE。不过,我们确实开发了可用来解析和打印 Go 语言代码的库,并很快成为各种编辑器和 IDE 插件的基础,这是一个意外的成功。
最近,我们一直在努力开发一个叫作 gopls 的 Go LSP 服务器,任何支持该协议的编辑器或 IDE 都可以用它来改善 Go 语言编程体验。
或许是因为我们习惯使用简单的编辑器样式,所以我们确信 Go 语言开发人员在编程环境方面也不需要做很多繁重的工作。不过,IDE 确实可以提供一些帮助:我看到的大多数 Go 语言开发人员都使用了 IDE,或者至少是支持 Go 语言的编辑器,并从中获得了很多好处。
使用什么样的编辑器是一个个人偏好问题,取决于你使用的编程语言。
软件开发人员喜欢给事物贴标签,比如 Dart 是“前端语言”,C 语言是“系统底层语言”,等等。从 Go 语言的特性和用法来看,你会给它贴什么样的标签?
Go 语言是一种通用的编程语言。你可以用它开发你想要的东西,而不用担心语言会被固定在一个问题领域。
你个人还喜欢哪些现代编程语言?
开发 Go 语言的经历让我明白了人们喜欢对编程语言发表意见。我自己也确实这样,但我已经厌倦了这种消极的结果,所以现在我尽量避免去评判它们。
在过去的 10 年里,语言设计领域出现了真正的复兴,而在此之前,很少有新编程语言出现并获得成功。我很高兴看到这些以及它们所带来的创新。
在谷歌工作给 Go 语言的开发带来了哪些帮助?在 Twitter 上发布类似“告诉我们你是如何使用我们的语言的”这样的问题,并得到来自世界各地大公司的回应,这对你来说有多重要?它只是一个补充还是语言发展的一个重要组成部分?谷歌给你带来了哪些帮助?
谷歌对 Go 语言项目的支持是非常慷慨的,我非常感谢它。当然,Go 语言的出现是因为我们认为谷歌需要它,云计算需要一种支持并发和易于部署的编程语言。不过,谷歌并没有太过直接插手这个项目,它支持我们,让我们做我们认为是对的事情。
对于其他公司和用户来说,社区输入是了解项目进展(语言、编译器、工具、运行时、库、环境)的关键组成部分。
经过 10 年的开发和观察,你能说出 Go 语言在设计上最大的成功和失败是什么吗?它的强项和弱项分别是什么?
我想说两件事,一个是技术上的,一个是政治上的。
从技术方面说,Go 语言支持并发计算。Go 语言只有十年左右的历史,但在它诞生之初,“线程”和并发并没有在编程社区得到广泛的重视。事实上,开发 Go 语言的一个主要原因是当时在 C 中执行并发计算比较困难。在项目启动后不久,对并发性的支持成了一个明显的优势,弥补了其他方面的不足。人们看到并发性的优势之后,他们就开始探索语言的其他方面,然后进一步了解到更多的东西。所以,对并发的支持是一道很重要的关口。
正如 Cloudflare 的 John Graham-Cumming 所言,“我是为了并发而来,为了组合而留”。
Go 语言改变了多核计算编程。
从政治方面说,我们兑现了对 Go 1.0 兼容性的承诺。在使用了几年 Go 语言之后,我们有一长串需要修复的东西,而且都是重大的变更。我们开发了一个更新程序,用“go fix”命令来推动社区,然后我们就停了下来。这种稳定性——2012 年编写的 Go 程序到今天仍然可以完美地编译和运行——是 Go 语言发展的一股巨大的推动力。其他公司可以非常自信地使用 Go 语言,相信我们不会对他们的程序造成破坏。在 1.0 和兼容性承诺兑现之后,使用率得到显著的提高。
你是如何平衡工作和生活的?现在很多人都在谈论“职业倦怠”,而疫情对解决这一问题毫无帮助。你的 40 年职业生涯可以给新一代开发人员带来哪些启示?
避免倦怠的最好方法是在一个可以为你提供支持的环境中做你真正喜欢做的事情。在我的整个职业生涯中,我非常幸运,但并不是每个人都像我一样幸运。如果你感到工作压力很大,你应该放松一下,或者改变一下方向,尤其是当下这种情况。
事后看来,很多技术的流行要归功于所谓的“杀手级应用”。你能说出一个 Go 语言的“杀手级应用”吗?你对“杀手级应用”持什么样的看法?
几年前,Danny Berkholz 说 Go 语言是“云基础设施的新兴语言”,这并非偶然。Go 语言是谷歌员工设计的,目的是让谷歌相关程序的开发变得更容易,尤其是部署在联网服务器上的程序,也就是我们今天所说的“云”。
因此,看到一些使用 Go 语言开发的云计算组件(Docker、Kubernetes 等),我们感到欣慰,但并不会很惊讶。Go 语言确实已经成为云基础设施事实上的编程语言。
你认为目前 Go 语言在哪些领域存在竞争?你对 Rust 的“无垃圾回收”和编译时保证有什么看法?
Rust 是一种有趣的编程语言,我饶有兴趣地关注着它的发展。除此之外,我没有其他意见,就像我上面说的那样。
Go 语言在 GitHub 上的星数刚刚达到 7 万!你认为 GitHub、Reddit、Twitter、离线和在线会议、网络研讨会等不同的活动对 Go 语言有怎样的影响?它们对编程语言取得成功是否很重要?还是说它们仅仅是对语言的一种反映?
我们在各种会议和社交媒体上遇到的人是 Go 语言发展的关键组成部分。很多贡献者以积极的方式影响着语言的发展,包括最初移植到 Windows 和非 x86 架构、工具和库的开发、对技术建议的深入讨论,等等。
当 Go 开发团队参与到社区,参与讨论、提出问题、寻求帮助和指导,就走向了另一个方向。
有一件事我认为很重要,那就是让社区的声音保持统一,让社区成为一个团队,而不只是个体。一致的信息更容易理解。
作为一种流行编程语言的作者,这给你的生活带来了哪些改变?
需要说明的是,我是一个联合作者。Ken Thompson 和 Robert Griesemer 和我一起启动了这个项目,还有其他很多人也为项目做了巨大贡献,所以请不要把我当成“作者”。
Go 语言确实提高了我的公众形象,让我被一个新的充满活力的社区所认识。但除此之外,并没有太大的影响。在漫长的职业生涯中,我有过很多成功的经历(也有无数次的失败)。
假如你有机会回到过去,给年轻时的自己一个建议,也就是在你开始设计 Go 语言规范的时候,你会给自己和同事什么样的建议呢?
很简单,忽略那些讨厌你的人。只需要倾听那些理解你的目标的声音,他们才是你需要关心的人。不是每个人都认同你所做的,不过这没关系,那些参与推进你正在尝试做的事情的人是一个极好的想法、能量和灵感的来源。
我们将永远感谢这个充满激情的社区。
关注我并转发此篇文章,私信我“领取资料”,即可免费获得InfoQ价值4999元迷你书!