Docs Vault

本节课是本套课程的第一节课。先来介绍下,很多 Go 开发者都关心的问题:如何高效的学习 Go 语言?本节课,我会基于我过去的学习、写课和思考,介绍下我的一些学习方法,供你参考。


如何学习 Go 语言


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


在我看来学习 Go 语言分为 2 个大的阶段:

  1. 编程阶段:这个阶段 Go 开发者精力主要聚焦在如何编程实现功能。这个阶段需要掌握的能力是 Go 基础语法、Go 项目开发。当 Go 编程能力达到高级或者专家级别的时候,能力就需要慢慢往架构方向进阶;
  2. 架构阶段:架构阶段开发者的精力更多偏向于代码架构设计、软甲架构设计。这里更侧重于设计能力。要成为一个优秀的架构师,我觉得首先要先成为一个优秀的编码者。


在学习本课程之前,你应该已经完成第一阶段的学习。在后续的三个阶段中,第二阶段尤为重要,因为它是最后两个阶段学习的基础。


编码阶段提升


阶段一:学习 Go 基础语法


Go 语言语法简单,你可以在短时间内学习完基础语法。建议你先精读两本关于 Go 基础语法的书籍:《Go 程序设计语言》和《Go 语言编程》。


在学习过程中,你可能会遇到一些不太理解的知识点或容易遗忘的知识点,没有关系,请坚持完成学习。对于一些未能记住或不理解的知识点,可以在实际使用时再回过头来学习,这样效果会更佳。


在掌握基础语法后,你将具备充足的 Go 基础知识储备,接下来可以通过编码实战来加深对 Go 语法的理解、掌握和记忆,真正成为一名 Go 开发者。


提示:
在实战过程中,如果你还有精力和时间,建议再阅读两本关于场景化编程的书籍:《Go 并发编程实战(第 2 版)》和《GoWeb 编程》。


阶段二:学习 Go 编程实战


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

  1. 通过阅读优秀开源项目的源码实现,来学习开源项目的构建方式,例如:Gin、Kubernetes、Etcd、GORM 等;
  2. 通过优秀的实战教程来学习,例如:《Go 语言项目开发实战》图书,以及本课程。


这两种方法都是提升 Go 编码能力的有效途径,但适用的阶段不同。


第一种方法更适合具有一定 Go 编程能力、希望进一步提高的学习者。这类优秀的开源项目代码质量高且具备一定复杂度,非常适合突破编程能力瓶颈。然而,这类项目并非课程,尽管提供了丰富的文档,但主要是关于部署和使用的文档,没有关于如何开发该项目的文档。也就是说,你可以从中学到许多编程技巧,但这些技巧主要依赖于你对代码的理解,这对 Go 初学者而言是一项挑战。对于初学者来说,更为重要的是理解项目背后的设计思路、开发方法及开发流程,而这些内容,开源项目没有详细介绍。


第二种方法更适合初学者,这些课程普遍具备较高的代码质量。同时,在学习项目源码的过程中,配套的课程会讲解相关知识、设计思路、开发流程及构建技巧等,这些内容来源于作者多年在一线企业的项目开发经验。因此,第二种方法特别适合初学者。


这种实战课程在“课程复杂度”和“课程实现的项目功能”两个方面存在差异:

  1. 课程复杂度:低复杂度的课程学习周期短,能够掌握许多核心的项目开发知识,并且可以迅速进行企业应用开发。然而,相较于高复杂度课程,低复杂度课程在深度和广度上有所欠缺。高复杂度课程的学习周期较长,但能够学习到非常全面的项目开发知识;
  2. 课程实现的项目功能:每个课程实现的项目功能也各不相同。例如,这些课程可能实现了一个 Go 开发框架、一个数据处理服务或者一个 Web 服务。在此,我建议选择 Go 使用最广泛的场景:Web 服务开发。实际上,掌握 Web 服务开发后,你可以无缝迁移开发能力,从而进行框架类和数据处理类项目的开发。


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


因此,在本阶段建议的学习思路是:与 Go 基础语法阶段的学习方法相似,首先学习一门简单且精湛的实战课程。如果有时间和意愿,你可以再学习一门相对复杂的课程。


注意,本阶段强烈建议学习一门实战类课程,因为非实战类课程学完之后,虽然学到了知识,但是实战能力可能还是没有得到锻炼。所以建议学习实战类课程,既学习了开发知识,又锻炼了实战能力。


阶段三:进行 Go 编程实战


在完成阶段二的学习之后,你就可以面试 Go 开发岗位,或直接从事 Go 企业应用的开发。所以,这个阶段的你,应该已经位于公司的 Go 研发岗位。


实际上,无论你是否在公司的 Go 研发岗位上,如果希望提升 Go 编程能力,你接下来需要做的就是参与编程开发,成为一名一线的 Go 开发者。


那么如何进行编程开发呢?我建议采取以下方法:

  1. 以工作需求为驱动:最有效的学习方法是带着问题进行学习,因此我们可以以实际工作需求为导向(这里的学习是附加的,你真正要做的是产品需求的开发);
  2. 以开源项目为切入点:在实现产品需求时,你应该考虑是独立开发还是复用优秀的开源项目。当然,你完全可以独立开发,但我更建议借鉴现有的成熟、优秀的开源项目,并在此基础上进行二次开发;
  3. 以二次开发为提升手段:有了优秀的开源项目,你就要基于这个开源项目去实现产品的功能,在实现产品功能的时候,你必须深入了解开源项目的实现,并且基于理解改造开源项目,改造的部分就是你独立开发的部分。通过编写代码,改造现有的开源项目,可以使你逐渐成为一名真正的 Go 开发者。


阶段四:精进 Go 编程能力


最后一个阶段是精进阶段,旨在提高 Go 编程能力的上限。该阶段的学习方法相对简单,即阅读优秀开源项目的源码。在阅读过程中,记录这些开源项目的优秀编程技巧和实现方法,并在未来的开发生涯中将其应用于当前的企业应用开发中。推荐学习以下开源项目:OneXGinKubernetesEtcd 等。


在该阶段,你还可以尝试从零构建一些优秀的项目,例如 Web 类型的 Go 应用、Go 包或 Go 框架。在构建过程中,通过调研和思考,不断优化项目,你的开发能力可以得到显著的提升。


此外,在该阶段,你还可以通过自我学习来完善你的 Go 技术生态。例如:学习云原生相关技术,包括微服务、Docker、Kubernetes、Prometheus、Etcd 等。


架构能力提升


关于如何提升自己的架构能力,可以参考第 39 节课:39 | 开发能力进阶:如何继续提升 Go 开发能力?。


总结


本节课介绍了学习 Go 语言的四个阶段。


首先是掌握 Go 基础语法,这一阶段建议精读经典书籍如《Go 程序设计语言》和《Go 语言编程》,并在实践中逐步理解和记忆知识点。


第二阶段是 Go 编程实战,通过学习实战教程或阅读优秀开源项目源码提升编码能力,其中初学者更适合实战教程,以全面掌握项目开发的知识与技巧。


第三阶段强调实际编程开发,建议以工作需求为导向,借助优秀开源项目进行二次开发,深入理解项目的实现以提升自身能力。


最后一个阶段是精进阶段,通过深入研究优秀开源项目如 OneXGinKubernetesEtcd 等,积累高级编程技巧,并尝试自主构建项目,同时建议学习云原生技术,丰富个人的 Go 技术生态。