我们知道,Go 出自名门 Google 公司,是一门支持并发、垃圾回收的编译型高级编程语言。Go 兼具静态编译语言的高性能以及动态语言的高开发效率。除此之外,Go 还具有很多其他优秀的语言特性,例如:语言简单,学习周期短;支持多返回值;具有丰富的内置类型;跨平台等。另外,学会 Go 语言,你还能撬开云原生世界的大门,享受云原生带来的红利

Go 带你撬开云原生世界的大门

先来看看 Go 云原生世界中有什么。完整的技术图谱可见:CNCF Cloud Native Landscape。为了便于你了解,我按分类列出了其中最受欢迎的一些成员及其开发语言(云原生技术栈内容很多,这里列出了我觉得重要的类别,更多类别,你可以直接参考 CNCF Cloud Native Landscape):

1.开篇词:如何精进 Go 开发能力? - 图1

上面列出的这些开源项目,在各自所属类别中,不是标准,就是事实标准;不是事实标准,就是最受欢迎的;不是最受欢迎的,就是非常受欢迎。我们再来分析下这些技术栈中开源项目的语言组成:

1.开篇词:如何精进 Go 开发能力? - 图2

Go 语言占比 63% ,占了云原生技术栈的绝大部分!所以,如果学会 Go 语言,你可以很轻松地在云原生圈子游走。

那么问题来了,为什么要进入云原生圈子?

云原生时代,涌现了一大批的理念,技术架构和开源项目(例如:Docker、Kubernetes、Prometheus 等)。通过走进云原生的圈子,我们可以学习到优秀的开发理念、编程技巧和实现方式,以此反哺我们的 Go 开发能力

另外,云原生时代,大量的新技术架构、开源项目共同实现云原生的理念,这就导致企业会额外多出很多组件,带来了维护成本。为了节省成本,提高效率,企业通常会选择将这些基础能力下沉,通过中台的形式对外提供各种能力。这些特点也产生了一个新的就业方向:基础架构开发

相较于业务开发来说,基础架构开发更聚焦于技术,当然技术最终是要服务于业务的。对于一个刚毕业,或者技术能力需要提升的开发者来说,也许一开始选择基础架构的就业方向会更好,因为通过基础架构开发,开发者能够更好地打磨自己的研发能力,为以后转向业务开发做好技术储备。另外基础架构开发,相较于业务开发来说,跟业务解耦,后期可以无缝转型为业务开发。加入云原生圈子,你的就业范围更广。

Go 带给你更好的求职优势

此外,学好 Go 语言,你还具有很大的求职优势,这里通过以下一些官方的调查来佐证这一点。

  1. 2021、2022 年连续两年在腾讯内部,Go 取代 C++ 成为最热门编程语言。其他大厂例如:Google、Facebook、阿里、京东、今日头条、小米、滴滴、七牛云、360 等都在大量使用 Go,并对外放出很多 Go 就业岗位。
  2. Go 语言相关的就业薪资相比于其他语言,也很有优势(居Java、C++、PHP、C、C#、.NET、Python、Node.js 等语言之首),下图是从 Boss招聘平台 进行统计的结果图示:

1.开篇词:如何精进 Go 开发能力? - 图3

《StackOverflow开发人员调查报告 2022》中,使用 Go 语言的开发者薪资排名进入前十:

1.开篇词:如何精进 Go 开发能力? - 图4

这里还有 2 份调查报告可以帮助你了解 Go 语言的现状:

如何学习 Go 语言?

既然,Go 语言非常值得学,那么如何学习呢?在我看来,学习 Go 语言可以分为 4 个阶段,见下图。

1.开篇词:如何精进 Go 开发能力? - 图5

在学习本课程之前,你应该已经过了第 1 个阶段。后续阶段中,第 2 阶段尤为重要,因为它是后续学习的基石。我们分别说一下每个阶段的学习方法。

  1. 学习 Go 基础语法

Go 语言语法简单,你可以在很快时间学习完 Go 的基础语法。这里我建议,先精读 2 本 Go 基础语法的书籍:《Go程序设计语言》《Go 语言编程》:

1.开篇词:如何精进 Go 开发能力? - 图6

在学习的过程中,你可能会遇到一些知识点不太理解,或者看了就忘的情况,没关系,先坚持学习完。一些没有记住或者不懂的知识点,可以在使用的时候,再回过头来学习,效果会更好。

在学习完基础语法之后,你就有了充足的 Go 基础语法储备,接下来你可以通过编码实战来加深你对 Go 语法的理解、掌握和记忆,并真正作为一个 Go Coder。

提示:在实战的过程中,如果你还有精力、时间,还可以再看两本关于场景化编程的书籍:Go 并发编程实战(第2版)Go Web编程

  1. 学习 Go 编程实战

学习完 Go 基础语法之后,接下来的阶段一定是编码实战。通常我们可以通过 2 种途径来提升自己的编码实战能力:

  1. 通过阅读优秀开源项目的源码实现,来学习开源项目是如何构建的,例如:Gin、Kubernetes、Etcd、GORM 等。
  2. 通过优秀的实战教程来学习。

这 2 种方法,其实都是非常棒的提升 Go 编码能力的方法,但我觉得,这 2 种方法适用的阶段不同。

第 1 种方法, 更适合你具有一定的 Go 编程能力,想要进一步精进自己 Go 编程能力的时候去学习。因为像这种优秀的开源项目,代码质量很高,具有一定的复杂度,很适合你去突破编程天花板。但这类项目不是课程,虽说项目有丰富的文档,但这些文档,是部署、使用文档,并不是教你如何开发这个项目。

也就是说,你看完之后,能学到很多编程技巧,但这些编程技巧更多是你根据代码理解出来的,这对于一个 Go 初学者来说是一个挑战。 对于一个 Go 初学者,更重要的是:项目背后的思考、开发流程、开发方法等,但这些项目并没有介绍。

第 2 种方法, 更适合初学者,这些课程一般都具有比较高的代码质量,并且你在学习项目代码的同时,配套的课程,也会讲解相关的知识、背后的思考、开发流程、构建技巧等来自作者一线项目开发的实战经验。所以,更适合初学者。

这种实战课程,又在“课程复杂度”和“课程实现的项目功能” 两方面有差异。

  • 课程复杂度:低复杂度的课程:学习周期短,能学到很多核心项目开发知识,并能很快进行企业应用开发。但相较高复杂度的课程,从深度、广度上有所欠缺;高复杂度的课程:学习周期长,但能学到非常全面的项目开发知识。
  • 课程实现的项目功能:比如有框架类的实战课程、有数据处理类的实战课程、有 Web 开发类的实战课程。我们该如何选择呢?这里我建议,选择 Go 使用最广泛的场景:Web 服务开发(来自:2021 年 Go 调查报告)。其实,学会了 Web 服务开发,像开发框架类、数据处理类项目都可以无缝迁移开发能力,进行开发。下图是 Go 语言常见的应用场景:

1.开篇词:如何精进 Go 开发能力? - 图7

提示:Go 语言在云计算、微服务、大数据、区块链等领域都有非常广泛的应用;另外,Go 最常见的用途是构建 REST API / PRC 服务,其次是数据处理;另外 Go 也广泛应用在虚拟机处理、文件系统、分布式系统、数据库等后端服务中。

所以,在本阶段我建议的学习思路是:像 Go 基础语法学习阶段的学习方法一样:先学习一门简单精湛的课程。如果有时间、意愿可以再学习一门相对复杂的课程。

  1. 进行 Go 编程实战

在完成阶段2:学习 Go 编程实战 之后,我们就可以面试 Go 开发相关岗位,或者直接从事 Go 企业应用的开发。所以,这个阶段的你,应该已经位于公司的 Go 研发岗位。

其实,不管你是否处在公司的 Go 研发岗位上,这个阶段你想提升 Go 编程能力,你需要做的都是:编程开发,作为一线的 Go Coder。

那么如何编程开发呢?我的推荐是:以工作需求为驱动、以开源项目为切入点、以二次开发为提升手段。

  • 以工作需求为驱动: 最好的学习方法是带着问题去学习,所以这里我们可以带着工作的需求去学习(其实这里的学习只是附加品,你真正做的是产品需求的开发);
  • 以开源项目为切入点: 要实现一个产品需求,自己独立实现,还是复用开源项目?当然,你完全可以独立开发,但我更建议借鉴现有的、成熟、优秀的开源项目,然后基于这个开源项目进行二次开发。
  • 以二次开发为提升手段: 有了优秀的开源项目,我们就要基于这个开源项目去实现产品的功能,在实现产品功能的时候,你需要非常了解开源项目的实现,并且基于理解改造开源项目,改造的部分就是你独立开发的部分,通过手撸代码,实现功能,可以让你变成一个真正的 Go Coder。
  1. 精进 Go 编程能力

最后一个阶段就是精进阶段,提高 Go 编程能力天花板。这个阶段的学习方法其实很简单,阅读优秀开源项目的源码,在阅读过程中记录这些开源项目的优秀编程技巧、实现方法,并在今后的开发生涯中,将这些编程技巧、实现方法应用在当前的企业应用开发中。

这里推荐你学习以下开源项目:ginkubernetesetcdtidbgormkratosgrpc-go 等。

这个阶段,你还可以尝试从 0 到 1 构建一些优秀的项目:例如:Web 类 Go 应用、Go 包、Go 框架等,在构建过程中, 通过调研、思考不断的优化项目,你的开发能力也会得到极大的提升。

另外,这个阶段,你还可以通过自我学习,完善你的 Go 技术生态,比如:携带 Go 利器,学习云原生相关技术,例如微服务、Docker、Kubernetes、Prometheus、Etcd 等技术。

通过本课程你将学到什么?

上面我们分析了,学完 Go 基础语法之后,最高效的 Go 进阶路线,就是认真学习一门 Go 课程。本课程就会手把手带你基于 Go 语言开发一款 Web 应用,快速提升 Go 研发能力,成为一个真正的 Go Coder。

通过本课程你能够学习到的技能图谱如下图所示:

1.开篇词:如何精进 Go 开发能力? - 图8

此外本课程还具有以下特点:

  • 清晰的功能开发步骤: 本课程会通过盖楼式的课程安排,教你一步一步构建一个完整的项目,通过这种方式可以使你了解一个企业应用的构建步骤和思路,解决“不知道从哪个地方入手开发”的迷惑;

  • 从理论到最佳实践: 本课程在介绍如何构建一个功能的时候,会介绍我的思考过程,并选择一种最佳构建方法,之后会使用该最佳实践实现该功能;

  • 完整的代码解读: 为了降低你的学习难度,本课程会尽量注释一些难以理解的代码行/块,并介绍相关的知识点;

  • 来自一线企业的开发经验: 我始终觉得课程的精髓,是来自我研发过程中的一些经验和思考,所以课程中,也会大量穿插这类经验和思考,帮助你学习一些 Code 之外的灵魂内容;

  • 一个生产级可用的、高质量的项目源码: 实战项目的每一个功能点构建,都是遵循最佳实践的方式去构建的,并且交付的是一套企业功能就绪的完整源码,可供你学习后,直接拿来二次开发。这种方式不仅能提高你的开发效率,还能够协助你在学习完 Go 基础语法之后,尽快从事 Go 工作需求开发。

  • 课程内容涵盖Go 项目开发的各个阶段: 能够学习到 Go 项目开发的核心阶段,以及每个阶段中的核心开发工作。每个阶段,你可以学习到的内容如下:

    • 设计阶段: 本课程会介绍设计阶段的一些核心设计项,例如:代码规范、版本规范、接口规范、日志规范、错误规范、提交规范以及代码目录结构设计。因为这些规范设计内容较多,本课程不会一一详细介绍,但会给出我已经整理好的规范文档,供你深入学习。通过设计阶段的学习,你能够掌握 Go 项目开发中的一些核心设计点,并采用一种最佳的设计方法,提升整个 Go 项目的质量。
    • 开发阶段: 本课程会从零开始,一步一步教你构建出整个 Go 应用,在构建过程中,会展示一种比较好的功能开发流程,介绍如何实现项目中的重要功能点,背后的思考、以及来自我一线企业项目的开发经验。
    • 测试阶段: 测试阶段会介绍开发中最常需要的测试用例:单元测试、性能测试,会介绍如何编写这些测试用例,也会介绍如何进行性能测试和性能分析,提高整个应用的接口性能。
    • 部署阶段: 部署阶段会直接基于 Kubernetes 集群进行部署。会介绍部署过程中的核心知识和流程,引领进入云原生世界的大门。

下节课我们正式进入实战环节,如果大家有问题,也欢迎在留言区讨论。