查看原文
其他

Go 创始人 Rob Pike:我们做对了什么?

陈煎鱼 脑子进煎鱼了 2024-05-02

大家好,我是煎鱼。

前两个月 Go 创始人之一 @Rob Pike(下称:rob) 分享了他对 Go 这门语言的历史性回顾和思考《What We Got Right, What We Got Wrong[1]》。

今天和煎鱼一起看看大佬认为 Go 做对的部分,看看能不能从中吸取到一些神奇的知识,再化作技巧在平时使用。

为什么要创造 Go

Go 创始人 rob 表示,他们最初的目标不是创造一种新的编程语言,而是创造一种编写软件的更好方法。(感觉大佬比较务实,不会像某些 PPT 再造一个虚假过去)

为什么当时会想创造一种更好的方式呢?

煎鱼用力围观了一圈,TOP3 主要是以下:

  1. 编译和构建等了太久:当时花了 45 分钟去构建我当时正在处理的二进制文件,慢是程序本身导致的,不单单是因为编程语言。
  2. 构建较好的构建软件的流程:大佬认为现在这个语言的使用流程,不太符合公司的软件开发模式,因此造成了缓慢和各种问题。
  3. 构建现代服务器软件的复杂性:考虑控制软件依赖关系、与人员不断变化的大型团队一起编程、易维护性、高效测试、有效使用多核 CPU 和网络等因素。

整体上来看,rob 表示 Go 不仅仅是一种编程语言,Go 的目的是帮助和提供一种开发高质量软件的更好方法。

Go 做对了什么?

可爱的吉祥物

@Renee French 设计了一个专属于 Go 的吉祥物(地鼠毛绒玩具),不过他非常认可这是是 Go 成功的最早因素之一。(虽然 rob 觉得这很奇怪,但却很正确)

一只可爱又显著的吉祥物,让 Go 在行业内成功冒泡了。

规范(Specification)定义

Go 在很早就定义和宣导了规范说明的文档,每次介绍、迭代、变更必定要求修改和说明,已经完全融入了 Go 研发、教育流程当中。

如下图:

也就是这一份《The Go Programming Language Specification[2]》,使用 Go 的同学都应当看过。如果没看过,抽时间要补下功课了。

可移植性很强大

Go 简化了交叉编译,大家可以根据自己的需要编译成自己所需的平台,在任何计算机架构上发布你的应用。

兼容性很强大

Go1 的兼容性保障,非常出名。在一个几乎没有其他东西是稳定的世界里,不用担心新发布的 Go 会破坏你的项目是件令人高兴的事。这个兼容性保障,有人爱也有人很恨。

更详尽的兼容性保障细节,大家可以看看《Go 1 and the Future of Go Programs[3]》。

标准库的统一

一个可靠、制作精良、包含编写 21 世纪服务器代码所需的大部分内容的库的存在是一笔重要的财富。能够让整个 Go 社区都在使用同一个工具包。

这样做的效果非常好,有助于防止出现变种库,有助于统一社区使用。

工具链的支撑

Go 为编译器提供了一系列辅助工具,如自动测试、覆盖率和代码审查。另外还有 go 命令(它集成了整个构建过程,是许多项目构建和维护 Go 代码所需的全部工具)和 gopls。

Go 还有一个很出名的成就:构建很快。工具链的强大支撑也是由此而来。

写到我就想起最近在烦恼的前端 Node,包又大,构建又慢,打出来的镜像也大。前端的同学反馈说没什么好办法。

标准的代码格式化(Gofmt)

其实我(煎鱼)认为 Gofmt 也属于工具链中的其中之一,但是 rob 还是把他单独拎出来了。

Gofmt 是一个 Go 代码的标准化格式工具,在整个编程社区和 Go 都留下了深刻的印记。

这可以说是一个突破性的工具。因为在此之前没有什么人重视这一块自动格式化工具的建设。

现在几乎所有值得使用的编程语言都有标准格式器。大家不用再为空格和换行各种撕逼,节省下来的时间可以去做更多的事情。

同时由于 Go 代码格式化后都长的一样了,可以根据 AST 去做更多的自动化工具,甚至做代码的自动替换等。

多种实现方式

像是现在的 Go 核心开发 @Ian Taylor,看了第一版的规范后就实现了一个新的 Go 编译器(gcc frontend)来作为练手项目。

也就是现在有多个编译器,都在执行上述提到的规范。(有了规范,实现起来就容易多了)

如下图:

这意味着大家可以根据这份规范都做很多事情,拥有多个编译器有助于完善语言和改进规范。

也可以让不喜欢 Plan9 的一些同学自己动手,提供更定制化的可替换环境。

总结

看了 Go 大佬对自己开发的编程语言的成功因素的分析,发现他们对于标准化是非常看重的,标准化又代表:规范、工具、库等。

同时由于程序员开发的业务特殊性,对于跨平台和快速构建的诉求又特别的强烈。

因此 Go 最终逐步的演变成了现在这样子,也算是可圈可点,大家可以提取自己认可的部分纳入到平时自己在工作的工程化建设中。

推荐阅读

参考资料
[1]

What We Got Right, What We Got Wrong: https://commandcenter.blogspot.com/2024/01/what-we-got-right-what-we-got-wrong.html

[2]

The Go Programming Language Specification: https://go.dev/ref/spec

[3]

Go 1 and the Future of Go Programs: https://go.dev/doc/go1compat


关注和加煎鱼微信,

一手消息和知识,拉你进技术交流群👇



你好,我是煎鱼,出版过 Go 畅销书《Go 语言编程之旅》,再到获得 GOP(Go 领域最有观点专家)荣誉,点击蓝字查看我的出书之路

日常分享高质量文章,输出 Go 面试、工作经验、架构设计,加微信拉读者交流群,和大家交流!


原创不易 点赞支持

继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存