2014 年夏天...
IBM:“我们需要你搞清楚 Docker 是什么。”
我:“好的。”
IBM:“开始贡献代码,积极参与进去。”
我:“好的。”(内心独白):“这是用 Go 写的。那是什么?”(谷歌搜索)“哦,一门编程语言。我职业生涯中学习过不少。应该不难。”
我大学的新生编程课是用 VAX 汇编语言教学的。在数据结构课上,我们使用 Pascal——通过软盘加载到图书馆计算机中心里那些老旧的 PC 上。在一门高级课程中,我的教授喜欢用 ADA 展示所有示例。我在 Sun 工作站上玩各种 Unix 实用程序的源代码时学到了一些 C 语言。在 IBM,我们使用 C 语言——以及一些 x86 汇编——来编写 OS/2 源代码,并且在一个与 Apple 的合作项目中大量使用了 C++ 的面向对象特性。此后不久,我开始学习 shell 脚本,先是 csh,然后在 90 年代中期发现 Linux 后转向了 Bash。在将 IBM 的自定义 JVM 代码移植到 Linux 的过程中,我在研究即时 (JIT) 编译器时被迫学习了 m4(可以说它更像是一个宏处理器,而不是一种编程语言)。
快进 20 年... 我从未害怕学习一门新的编程语言。但 Go 感觉不一样。我将在 GitHub 上公开贡献代码,所有人都可以看到!我不想成为笑柄,一个 40 多岁的资深开发者却是个 Go 新手!我们都知道程序员的自尊心是不喜欢被打击的,无论你的经验水平如何。
我早期的调查显示,Go 似乎比其他一些语言更注重其“惯用性”。不仅仅是让代码编译通过;我需要能够以“Go 的方式”编写代码。
现在,我已经进入 Go 的旅程四年,提交了数百个 pull request,我不敢自称专家,但我确实感觉比 2014 年更轻松地贡献和编写 Go 代码。那么,如何教老家伙一些新技巧——或者至少是一门新的编程语言?以下是我在 Golang 世界的旅程中非常有价值的四个步骤。
1. 不要跳过基础知识
虽然你可能可以通过复制代码并在早期学习中摸索(谁有时间阅读手册?!),但 Go 有一个非常易读的 语言规范,该规范显然是为了被阅读和理解而编写的,即使你没有语言或编译器理论的硕士学位。鉴于 Go 在 parameter:type 结构顺序方面做出了一些独特的决策,并且具有像通道和 goroutine 这样有趣的语言特性,因此重要的是要扎根于这些新概念。阅读本文档以及来自 Golang 创建者的另一份优秀资源 Effective Go,将大大提高你有效和正确使用该语言的准备程度。
2. 向最好的学习
有很多有价值的资源可以深入学习,并将你的 Go 知识提升到新的水平。所有最近的 GopherCon 演讲都可以在网上找到,例如 2018 年 GopherCon US 的这个详尽列表。演讲的专业知识和技能水平各不相同,但你可以通过观看演讲轻松找到你不知道的关于 Go 的内容。Francesc Campoy 创建了一个名为 JustForFunc 的 Go 编程视频系列,该系列有越来越多的剧集来扩展你的 Go 知识和理解。在“Golang”上快速搜索可以发现许多其他视频和在线资源,供那些想了解更多信息的人使用。
想看看代码? GitHub 上许多最流行的云原生项目都是用 Go 编写的:Docker/Moby, Kubernetes, Istio, containerd, CoreDNS 等等。对于惯用性,语言纯粹主义者可能会认为某些项目比其他项目更好,但这些都是很好的起点,可以了解大型代码库如何在高度活跃的项目中使用 Go。
3. 使用好的语言工具
你很快就会了解到 gofmt 的价值。 Go 的一个优点是,每个项目都没有关于代码格式指南的争论——gofmt 内置于语言运行时中,它根据一组稳定且易于理解的语言规则格式化 Go 代码。我不知道任何基于 Golang 的项目不坚持使用 gofmt 检查 pull request,作为持续集成的一部分。
除了直接内置于运行时/SDK 中的各种有用的工具之外,我强烈建议使用具有良好 Golang 支持功能的编辑器或 IDE。由于我发现自己更常出现在命令行中,因此我依赖 Vim 加上出色的 vim-go 插件。我也喜欢 Microsoft 提供的 VS Code,尤其是它的 Go 语言插件。
寻找调试器? Delve 项目一直在改进和成熟,并且是使用 gdb 类调试 Go 二进制文件的有力竞争者。
4. 投入并编写一些 Go!
除非你开始尝试,否则你永远无法更好地编写 Go。找到一个有一些标记为“需要帮助”问题的项目并做出贡献。如果你已经在使用用 Go 编写的开源项目,请找出是否有针对初学者的解决方案的错误,并提出你的第一个 pull request。与生活中的大多数事情一样,改进的唯一真正方法是通过实践,所以开始吧。
而且,事实证明,显然你可以教一位年长的资深开发者一些新技巧——或者至少是语言。
4 条评论