You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

209 lines
23 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 结束语 | 如何让自己的 Go 研发之路走得更远?
你好我是孔令飞。不知不觉我们的这段Go学习之旅就要走到终点了。
首先,恭喜你耐心看完了整个专栏,相信你一定学到了不少知识。还要特别感谢那些常常向我反馈问题、提出改进建议的同学。因为有你们,这门课才能越来越完善,和你们的交流也让我获益良多。
先和你分享下我做这门课的一些“心路历程”。在过去的5年里我不断学习从一个Go新手一步步向Go老鸟迈进。在学习的过程中我遇到了很多困难也收获了一些心得。因为我是一个热爱分享的人也特别想把这些困难的解决方法以及沉淀下来的学习心得分享给更多的人所以才有了这门课。
俗话说活到老学到老在Go研发的道路上我跟你一样仍然是个学生。既然是学生就有知识盲区在写专栏的过程中我很怕因为自己水平不够误导大家。所以在前期我做足了调研几乎把专栏中每一个大知识块儿的业内实现都翻了个底朝天就是为了构建一个专业的知识体系。这门课最终的质量基本符合当初的预期也算是没辜负我熬的那些夜和掉的无数根头发了。
这里就用一张图片来概括这个历时一年的过程吧:
![图片](https://static001.geekbang.org/resource/image/8c/e9/8cc0bc147ed8e1386d8163de304434e9.jpg?wh=1920x875)
希望这些呈现给你的具体数据,可以让你对自己所学知识的专业度抱有更多的信心。
陪你走完这一程Go学习之旅是我的荣幸这门课虽然结束了但你的学习和成长之路才刚刚开始。那么如何在Go研发之路上走得更远呢
在我看来,**一个Go开发者的完整职业生涯会经历开发者阶段、架构师阶段、创业者阶段**
![图片](https://static001.geekbang.org/resource/image/83/5b/830031yy640c6c29eb2113148f29d05b.jpg?wh=1920x1135)
处于这三个不同的阶段,你要扮演的角色也是不同的。
1. 开发者阶段在这个阶段你可以使用Go语言完成产品经理、领导分配的各种开发任务中间会掺杂一些架构设计的工作但这些架构设计通常局限在跟开发任务相关的范围内。
2. 架构师阶段在这个阶段你已经熟练或者精通Go语言的基本语法并能够驾轻就熟地使用Go语言开发出一个大型的应用。除此之外你还能从系统资源层面、应用层面、应用生命周期管理层面来设计整个系统架构最终构建出一个高性能、高可靠、可维护、可扩展的能够满足产品需求的应用。
3. 创业者阶段:在开发者阶段和架构师阶段,你本质上还是一个技术导向的从业人员。但在创业者这个阶段,你的重心已经从技术转向产品,成为整个业务线的负责人。这不是因为技术不重要,而是因为你已经有了深厚的技术积累。这时候,技术对你来说更多是一种用来创造优秀产品的工具。
其实在开发者阶段和架构师阶段我们的最终目的也是开发一个产品但和创业者阶段的侧重点有所不同。在开发者阶段我们主要是完成技术Leader分配的任务在架构师阶段我们则更多地扮演一个技术Leader的角色是底层技术的主导者和决策者拥有更大的话语权和职责。在这两个阶段我们还应该通过学习不断地补全自己的Go技术生态最终尽可能地将整个Go技术生态中的点和面装入脑海中。
要完成开发者 -> 架构师 -> 创业者的角色转变,你就需要在日常的工作中不断学习、思考和实践。而学习,是最基础,也最重要的一个环节。因为这门课是一个技术专栏,所以接下来我们就重点看三个阶段中的前两个,聊聊**如何学习,才能使自己成为一名优秀的开发者,然后成功晋级到一位优秀的架构师**。
## 开发者阶段
作为一名Go开发者首先你会进入开发者阶段。在开发者阶段我们可以通过三个步骤来成为一名优秀的Go开发工程师。需要说明下这三步虽然是由浅入深的但是可以并行。你不用学完所有基础语法知识才研究优秀项目、上手实战可以根据需要穿插进行。
### 第一步:基础语法学习
我们可以精读一到两本经典的Go语言基础教程这里我向你推荐两本书[《Go程序设计语言》](https://book.douban.com/subject/27044219/)和[《Go语言编程》](https://book.douban.com/subject/11577300/)。
如果你还有时间和精力,还可以再看两本关于场景化编程的书籍:[《Go 并发编程实战》第2版](https://book.douban.com/subject/27016236/)和[《Go Web编程》](https://book.douban.com/subject/27204133/)。
![图片](https://static001.geekbang.org/resource/image/eb/85/ebaf72e28afab675046962ede7291685.png?wh=1920x695)
你可以先通读《Go程序设计语言》这本书掌握Go的基础语法。在学习的过程中你可能会遇到一些知识点不太理解或者看了就忘的情况没关系先坚持学习完。如果你还有精力可以选择继续读《Go语言编程》这本书。这两本书啃下来你就有了充足的Go基础语法储备为下一步的研究优秀项目打下了坚实的基础。
### 第二步:认真研究一个优秀的项目
有了一定的Go基础语法储备后就该认真研究一个优秀的项目了。你不仅要学习项目中包含的知识还要学习它的构建思路。我们来看下工作年限和开发能力的关系
![图片](https://static001.geekbang.org/resource/image/ef/12/ef95ab3d5a427e631fa72854b95e6f12.jpg?wh=1920x1226)
如上图所示,工作年限和开发能力之间是一个抛物线关系:刚开始的时候,随着工作年限的增长,开发能力会提升得很快;但是,当工作年限增长到一定程度,开发能力的增长就放缓了。这是因为,到达一定工作年限后,我们更多是去反复使用已有的知识和经验积累,所以开发能力提升有限。
那么如何才能提高开发能力的天花板呢在我看来这时应该去认真研究下如何构建一个优秀的项目来扩充自己的知识和经验库。一次学习整个研发生涯都会受益。《Go 语言项目开发实战》就是一门带你研究优秀项目的课程只要你充分消化吸收了这门课的知识相信你的Go项目研发能力已经得到了极大的提升。
### 第三步:项目实战
对优秀项目有了一定研究之后你应该以需求为驱动通过实践来加深对Go基础语法的掌握和理解。
在实践的过程中用需求来驱动学习不仅效率是最高的而且学习的过程也是工作产出的过程可以说是一箭双雕。这里又有3个问题
* 需求从哪里来?
* 如何查找优秀的开源项目?
* 如何进行二次开发?
接下来我们就分别看下这3个问题。
#### **问题一:需求从哪里来?**
在我看来,需求来源于工作。这些需求可以是产品经理交给你的某一个具体产品需求,也可以是能够帮助团队提高工作效率的工具,还可以是能够提高自己工作效率的工具。
总之,如果有明确的工作需求最好,如果没有明确的需求,我们就要创造需求。我们可以思考工作中的痛点、难点,并将它们转化成需求。比如,团队发布版本,每次都是人工发布,需要登陆到不同的服务器,部署不同的组件和配置。这样效率低不说,还容易因为人为失误造成现网故障。这时候,你就可以将这些痛点抽象成一个需求:开发一个版本发布系统。
有了需求,接下来我们就要完成它,也就是进入到实践环节。那么如何实践呢?在我看来精髓在于两个字:**“抄”**和**“改”**。
上面我们抽象出了一个需求开发一个版本发布系统。如果自己从0开发出一套版本发布系统工作量无疑是巨大的。而且以我们这个阶段的水平即使花费了很多时间开发出一个版本发布系统这个系统在功能和代码质量上也无法跟一些优秀的开源版本发布系统相比。
所以这时候最好的方法就是在GitHub上找到一个优秀的版本发布系统并基于这个系统进行二次开发。这样你不仅能学习到一个优秀开源项目的设计和实现还能够以最快的速度完成版本发布系统的开发。
#### **问题二:如何查找优秀的开源项目?**
那么就到了我们刚才说的第二个问题如何查找优秀的开源项目放在这里就是如何在GitHub上找到优秀的版本发布系统。
下面我把我自己的方法分享给你。我主要通过5个步骤来搜索如下图所示
![图片](https://static001.geekbang.org/resource/image/56/74/5624815009e0d39706a3a293fc815274.png?wh=1920x881)
这里我结合图片具体说明下这5个步骤。
1. **在GitHub搜索栏中按语言搜索**`language:go 版本发布`中,`language:go`说明我们要搜索语言类型为Go语言的项目`版本发布`是我们搜索项目时的关键词。这个关键词对搜索结果影响很大,需要你合理填写。这里有个技巧,如果搜索`版本发布` ,搜索出的项目很少,那么可以减少关键词再次搜索,比如搜索`发布`。
2. **GitHub搜索页面的 `Sort options` 选择 `Most stars` ** 因为GitHub项目很多我们不可能看完所有搜索出来的项目所以这里我们要选择性地去查看。你可以通过`Most stars`进行排序一般来说Star数越多说明项目越受欢迎而受欢迎的原因很可能是整个项目在同类项目中比较优秀。根据我之前的搜索经验一些Star数少的项目也可能很优秀最终还是需要你根据自己的理解去判断。
3. **看描述:**因为项目比较多我们不可能认真去研究每个项目所以要快速了解项目最简单的方式是先看描述。如果描述符合预期那么可以将这个项目在新的浏览器Tab页打开或者将项目地址保存起来等初步筛选完所有项目后再详细查看这个项目的README以及代码。
4. **看项目名字:**一些优秀的项目可能没有描述,这时候可以通过项目的名字来判断。
5. **根据Code做筛选**如果我们搜索的项目很冷门搜索GitHub后只有寥寥几个搜索结果而且搜索出的项目也不是我们期望的。那么这时候你可以从`Code`中来筛选。
通过上面这5步我们初步搜索出了匹配的项目并知道了如何对这些项目做初步的筛选。接下来你就需要按页来筛选页面中的开源项目然后从第1页一直筛选到第100页。GitHub一页默认会展示10个开源项目所以如果按照这种方法最终你可能需要调研`10 * 100 = 1000`个开源项目。当然也不一定每次都要从第1页一直看到第100页如果后面的项目明显都跟预期的需求不匹配可以不用再继续看了。
研究完GitHub上的开源项目这时候我还建议你通过[libs.garden](https://libs.garden/go)再查找一些开源项目。libs.garden的主要功能是库在 Go 中叫包)和应用的评分网站,是按不同维度去评分的,例如增长速度(根据新增 Star 数排序)、受欢迎程度(按 Star 数排序)、活跃度等。
libs.garden 包含了很多编程语言的评分,包括 Go 语言,地址为 [https://libs.garden/go](https://libs.garden/go)。你可以通过以下3步查找需要的开源项目
1. 打开 [https://libs.garden/go](https://libs.garden/go)
2. 根据我们需要的功能判断其类别Go 的所有类别可以参考[这个链接](https://libs.garden/go/categories) 。例如,配置文件解析应该属于 Config 类;
3. 打开所属类别,根据 Popular 进行排序,如下图所示:
![图片](https://static001.geekbang.org/resource/image/0d/b7/0dfdbbd4a837234443fb5f0d6fe7f5b7.png?wh=1291x753)
执行完这三步,我们就从上图的第 1 行开始,根据 Repository 的描述判断当前 Repository 有没有可能是我们要找的包。如果有,就打开 Repository阅读它的README.md 来进一步判断。如果判断出可能是我们要找的包,并且各方面都还可以,就 clone 下来,根据其 README.md 中的帮助文档,编写代码并测试其功能。
研究完上一个 Repository 之后,我们继续根据排序,以相同的方法研究第 2 个 Repository并以此类推直到找到满意的包或者GitHub Star 数小于某个预期值为止。用这样的方法,我们应该可以找到符合要求的优秀开源包,而且该开源包极有可能是“最”优秀的包。
此外GitHub 上的 [awesome-go](https://github.com/avelino/awesome-go) 项目也根据分类记录了很多包和工具你也可以在这个项目中寻找。我的建议是优先从GitHub上找再在 libs.garden 上找,最后再参考 awesome-go项目。
到这里我们已经通过自己的调研找到了一堆GitHub上的开源项目。为什么我们要找这么多开源项目呢主要目的有两个
* 确保自己基于一个最优的开源项目来进行二次开发,一开始便站上至高点。
* 填充自己脑海中的Go生态图。
不过这些开源项目只是经过了初步筛选里面有很多是不满足我们需求的甚至可能跟我们的需求完全不一致。所以我们还需要进行二次筛选可以通过精读开源项目的README来筛选。如果有必要并且项目部署简单你也可以部署这个开源项目亲自体验一下。
经过第二次的筛选,我们已经筛选出了一些能够满足要求的优秀开源项目。这时候,我们还需要再经过一轮筛选。这轮筛选,我们要从各方面来对比这些开源项目,并从中选出一个最合适的开源项目,来进行二次开发。这个开源项目,你可以自信地跟你老板说它是一个最优解。
#### 问题三:如何**进行二次开发?**
接下来你就可以基于这个项目进行二次开发最终出色地完成设定的需求。那么如何对选定的项目进行二次开发呢我总结了5个步骤
1. 手动编译、部署这个开源项目。
2. 阅读项目的README文档跟着README文档使用这个开源项目至少运行一遍核心功能。
3. 阅读核心逻辑源码,在不清楚的地方,可以添加一些 fmt.Printf 函数,来协助你理解代码。
4. 在你理解了项目的核心逻辑或者架构之后,就可以尝试添加/修改一些匹配自己项目需求的功能,添加后编译、部署,并调试。
5. 二次开发完之后,你还需要思考下后续要不要同步社区的代码,如果需要,如何同步代码。
在你通过“抄”和“改”完成需求之后,记得还要编写文档,并找个合适的时机在团队中分享你的收获和产出。这点很重要,可以将你的学习输入变成工作产出。
看到这里,你可能想说:我开发一个项目而已,调研这么多项目,花这么多时间,值得吗?我觉得是值得的,因为这种学习方式会带来下面这几个好处。
* 最优解你可以很有底气地跟老板说这个方案在这个类别就是业界No.1。
* 高效:基于已有项目进行二次开发,可以提高开发和学习效率。
* 产出:在学习的过程中,也有工作产出。个人成长、工作贡献可以一起获得。
* 知识积累为今后的开发生涯积累项目库和代码库。GitHub就是一个大的代码仓库里面几乎囊括了你开发过程中需要的所有技术实现。你需要做的其实就是找到其中的最优实现并升级成自己的实现。这是一个从量变到质变的过程最终你的研发模式会变成`Ctrl + C` + `Ctrl + V`。这首先意味着你的开发工作会越来越轻松;另外,你`Ctrl + C`的是一个优秀的开源项目或代码,`Ctrl + V`的是经过你改进后的代码,这就意味着,你基于这个开源项目或代码二次开发后的实现一定是 `(你, GitHub最优解)` 二元组中最好的一个实现。
到这里,我就完整讲述了开发者阶段的“三步走”学习法,这三步分别是基础语法学习、研究一个优秀项目和进行项目实战。用这种方法进行学习,你不仅能非常高效地开发出一个优秀的功能,而且也能得到老板的认可,最终使你在年底绩效考核时顺利拿到优秀员工称号。
## 架构师阶段
在开发者阶段你通过自己的努力成为一名优秀的Go开发工程师之后可能会遇到职业瓶颈。这时候你突破瓶颈的最好方式就是转型架构师需要说明下这里的架构师是技术架构师而不是售前架构师。架构师有很多方向在云原生技术时代转型为云原生架构师对学Go语言的我们来说是一个不错的选择。现在的我也在这个道路上前进期待和你一起成长。
要成为云原生架构师,首先要学习云原生技术。云原生技术有很多,我推荐的学习路线如下图所示:
![图片](https://static001.geekbang.org/resource/image/1d/db/1dd9dd6357bbaef297fec7ff6eeb3bdb.jpg?wh=1920x698)
通过学习微服务、Docker、Kubernetes、Knative、Prometheus、Jaeger、EFK、DevOps这些技术你可以掌握云原生中的核心技术栈通过学习KVM、Istio、Kafka、Etcd、Tyk你可以补全你的云原生核心技术栈。如果你还有精力还可以再学习下TKEStask、Consul、Cilium、OpenShift这些项目。下面我给你介绍一些不错的参考资料。
* 微服务:[《微服务设计》](https://book.douban.com/subject/26772677/)
* Docker[《Docker技术入门与实战》第3版](https://book.douban.com/subject/30329430/)、[《Docker ——容器与容器云》第2版](https://book.douban.com/subject/26894736/)
* Kubernetes [《Kubernetes权威指南从Docker到Kubernetes实践全接触》第4版](https://book.douban.com/subject/33444476/)、[《基于Kubernetes的容器云平台实战》](https://book.douban.com/subject/30333237/)
* Knative[Knative Documentation](https://knative.dev/docs/)
* Prometheus[Prometheus Documentation](https://prometheus.io/docs/introduction/overview/)
* Jaeger [Jaeger Documentation](https://www.jaegertracing.io/docs/1.26/)
* KVM[《KVM虚拟化技术 : 实战与原理解析》](https://book.douban.com/subject/25743939/)
* Istio[《云原生服务网格Istio原理、实践、架构与源码解析》](https://book.douban.com/subject/34438220/)
* Kafka[《Apache Kafka实战》](https://book.douban.com/subject/30221096/)、[《Apache Kafka源码剖析》](https://book.douban.com/subject/27038473/)
* Etcd[etcd实战课](https://time.geekbang.org/column/intro/391)
* Tyk[Tyk Open Source](https://tyk.io/docs/apim/open-source/)
* TKEStask[TKEStack Documentation](https://tkestack.github.io/docs/)
* Consul[Consul Documentation](https://www.consul.io/docs)
* Cilium[Cilium Documentation](https://docs.cilium.io/)
* OpenShift [《开源容器云OpenShift构建基于Kubernetes的企业应用云平台》](https://book.douban.com/subject/27088186/)
如果需要的话,你还可以参考我整理的[awesome-books](https://github.com/marmotedu/awesome-books),里面有更全面的参考资料。
学习了上面的技术之后,你其实已经具备了一名云原生架构师需要的技术基础,能够比较全面地构建整个云原生技术栈。接下来你需要做的,就是在工作中积极主动地承担更多的架构工作,你在团队中的角色会慢慢地从一名开发者转变成一名架构师。
在架构师阶段,你应该继续学习,但这时候学习的侧重点不再是具体深入的技术细节。这不是因为细节不重要,而是因为以你当前的技术能力,只要简单了解,你就能知道具体是怎么构建的。这个阶段,你学习的重点是增强自己的架构能力。你可以通过很多方式来使自己拥有这些能力,我推荐下面这几种:
* 调研竞品,了解竞品的架构设计和实现方式。
* 参加技术峰会学习其他企业的优秀架构设计例如ArchSummit全球架构师峰会、QCon等。
* 参加公司内外组织的技术分享,了解最前沿的技术、架构和解决方案。
* 关注一些优秀的技术公众号,学习其中高质量的技术文章。
* 作为一名创造者,通过积极思考,设计出符合当前业务的优秀架构。
需要注意在架构师阶段你仍然是一名技术开发者一定不能脱离代码。你可以通过下面这几个方法让自己保持Code能力
* 以Coder的身份参与一些核心代码的研发。
* 以Reviewer的身份Review成员提交的PR。
* 工作之余,阅读项目其他成员开发的源码。
* 关注一些优秀的开源项目,调研、部署并试用。
## 创业者阶段
成为了一名优秀的架构师,就意味着你已经,或者将要触碰到技术的天花板了,那这时候如何突破呢?
在我看来一个比较好的方向是突破技术的圈子把技术当成一种工具用这个工具来创造一个优秀的产品。这时候你其实已经从一个技术人员转型成为一个创业者。这个时候的天花板对你来说可以是无限高的你可以通过努力成为公司的经理、总裁甚至CEO也可以成为行业TOP公司的创始人。
至于如何扮演好一个创业者角色,内容太多,变化也太多,而且跟本专栏的技术性质不匹配,所以这里就索性留一些空白,等着你来填充。总之,那时候就是:技术在手,天下我有!
## 写在最后
感谢你陪我走完了这段历时4个月的Go学习之旅。不过站在终点的你可以看到你的Go研发之路才刚刚开始。希望我今天分享的这些学习和工作心得能帮你在这条路上走得更远。
看到这里你可能觉得我们之间的关系就这样结束了没有结束你可以通过下面这两步继续跟我保持联系继续探讨如何开发Go项目以及课程中的一些疑难问题。
* 步骤一:请给这门课的[实战项目](https://github.com/marmotedu/iam) **点个Star**。IAM项目会持续升级维护这个Star绝对不亏
* 步骤二如果还有关于课程的问题需要咨询或者想了解我熬夜写完专栏发际线依然坚挺的秘诀不点Star不分享哈哈可以加我微信WeChat`echo bmlnaHRza29uZw==|base64 -d` 。
最后,我还给你准备了一个[调查问卷](https://jinshuju.net/f/o1nVPp)。题目不多,大概两分钟就可以填完,主要是想听一下你对这门课的看法和建议。期待你的反馈!
[![](https://static001.geekbang.org/resource/image/fc/e1/fc9610a599691da13d617a4a2c61b5e1.jpg?wh=1142x801)](https://jinshuju.net/f/o1nVPp)