Junedayday Blog

六月天天的个人博客

0%

Go语言学习路线 - 2.方向篇:如何成为一名优秀的Go语言工程师

核心成长方向

如何成为一名优秀的Go语言工程师,这是很多人都长期疑惑的问题。

我这边抛出自己的观点,希望能引起大家的思考:

掌握基础,熟悉生态,集百家长,深耕领域

接下来,我将围绕这四个词展开今天的分享。

1. 掌握基础

首先,我们来聊聊这个老生常谈的话题 - 掌握基础。关于基础的学习路线我会在后面细讲,今天我们先来谈点别的。

所谓基础,会根据工作的不同阶段而不断变化。 也就是要用 发展 的眼光来看问题。

举个例子,就以 编程语言 的作为切入点:

  • 一名合格的业务开发者,会熟练地应用编程语言去实现功能需求,熟练掌握常见的开源工具库
  • 进一步,如果作为一名模块的负责人,那就需要考虑设计模式来抽象复杂业务,熟悉编程语言底层的运行原理
  • 再进一步,作为一名架构师,就得思考如何用 工程化 来控制复杂度和约束规范性;
  • 而如果是更高一层的角色,如CTO,就需要从编程语言或框架的 成熟度、前瞻性 的角度来决定路线。

2. 熟悉生态

生态 这个词很微妙,社区里有不同的见解,我也无法抛出一个准确的定义,这块需要大家自行摸索。不过,我倒是可以分享几个踩坑经历:

  1. 语言生态 :编程语言都是有对应的应用领域的,我在上一讲已经说过,这里不再细谈;
  2. 框架生态 :编程语言往往提供多种框架,不同框架的设计理念和使用场景不同,甚至会有一定的矛盾。例如有的框架提供了重量级的解决方案,可以快速生成一套代码,但对应的灵活性就大大降低;对应的,另一个框架能提供轻量级的插件化解决方案,需要你自行挑选、组装、调试,以提升复杂度的代价换来了灵活性;
  3. 社区生态 :除了极少的探索性的工作,绝大部分的开发工作都能在社区中找到同路人,经常能发现很有价值的建议。但社区里的声音很杂,筛选信息是最大障碍,这一点很容易反复踩坑。

比起一些告诉你 该怎么做 的建议,我更倾向于那些 不该怎么做 的建议。

一次成功往往有大量的偶然因素,而从失败中分析出原因更有长期价值。

3.集百家长

接下来的这点,是本章的重点,希望大家看完之后能重点思考。

Go 语言是一个以简单著称的编程语言,又被号称是 云时代的编程语言。这背后蕴含了两层含义。

简单

第一点,也就是 简单 带来的副作用。一种编程语言如果被冠以 简单 的头衔,那么它的设计核心就是 可读性

但是,无论是模板、元编程、泛型这些语法上的高端特性,还是继承、多态、函数式等编程范式上的特性,虽然很复杂(或者说是学习曲线很陡峭),但不得不承认它们在特定的场景中,达到了很好的抽象效果,大幅度地提升了程序的效率。

所以,Go 语言决定了在单个程序中支持的复杂度有限,进一步则需要 JAVA、C++为代表的工业级编程语言 的一些特性。

云时代的编程语言

从上一点来看,Go 语言支持的单个程序复杂度有限,那就非常依赖 微服务 的核心理念 - 拆。通过拆解,可以将单个程序的复杂度转移到架构层面,也更好地契合了服务内聚的理念。

但是,即便进行了很好的设计与拆分,微服务 依然有两个比较重要的前置要求:服务间通信微服务治理。前者相对容易解决,统一采用 RESTful 风格或 gRPC 等框架进行通信,就能满足基本要求;而微服务的治理问题就非常复杂了,很长一段时间都没有一套成熟的解决方案。近几年,随着 Docker容器化 + Kubernetes调度平台 的出现与推广,已经成为了 微服务的Best Practice

K8s为核心的云原生生态,涵盖了监控、日志采集、链路追踪、Service Mesh等各类子领域的解决方案,均得到了快速迭代。其中,各种核心组件均是通过 Go 语言开发而成,像 Kubernetes、Prometheus、Etcd 等。

至此,我们开发的服务不再需要过分关注基础组件,而是更聚焦于业务领域。

CNCF

再回到这一个话题的核心 - 集百家长

云原生的社区CNCF提供了大量的组件,大家可以通过这个链接看到对应的全景图。它提供了是一整套插件化的组合方案,需要开发人员按需组合(后面我也会给出一些建议)。

我非常不建议大家去自己从头开发一个模块,主要有两点(巨型互联网的基础团队除外):

  1. 自建轮子跟不上社区迭代,投入产出比价值低;
  2. 很多时候某些功能已经在某个组件中实现,或者正在实现,只是没正确使用。

如果真要新增某个重要功能,优先去找个现有CNCF项目的负责人聊聊,提交PR合入,或者自行fork开发。

相信我,在一个成熟产品中新增特性,比你重写一个轮子更有价值!无论是对技术的提升、还是投递简历时的效果,都更有意义。

举一个场景,当我们发现需要在程序中用map保存大量结果时,用默认的数据结构效率很低:

  • 如果在JAVA生态里,那么内部就有丰富的容器库可供选择,放在一个服务中即可;
  • 而在Go中,自然也可以借用github上面搜索的三方库来解决,但更建议根据场景选用开源的K-V组件,通过RPC调用来解决问题,也就是拆成了 业务功能map数据存储 两个服务
  • 专业的事交给专业的组件

4. 深耕领域

在工作三年以上,我越来越感受到 领域 是一个很重要的概念,也是各公司考验高端人才的重要素质。

举几个例子:

  • 作为一名 电商支付领域 的开发专家,需要在编程语言的 如何保证数据一致性 的相关特性有深入研究;

  • 如果是 物流订单领域 的专家,则要考虑 如何合理抽象各类物流类型 的问题,来支持复杂的场景;

  • 当你负责的是一个 秒杀系统,那么需要对 高并发场景与异常兜底 有足够的经验。

每一块 领域 都需要有大量的 专业技能行业经验 沉淀,这是高端人才的核心竞争力。

虽说两者缺一不可,但还是具有一定的倾向性

  • 偏技术的领域更需要 专业技能 ,瓶颈往往是某一个垂直领域的技术深度;
  • 偏业务的领域更要求 行业经验 ,要求负责人能 带领团队避开坑,走对路

总结

回顾一下这四个点: 掌握基础,熟悉生态,集百家长,深耕领域 。这一整个过程,也可以说是:修炼内功,学习并合理使用外部资源,沉淀于特定领域

纵观周围环境,我发现大部分的开发者都热衷于 修炼内功和领域沉淀,而过于轻视了 外部资源 的作用,就错失了一个快速提升个人能力的手段,技术视野也非常有限。这一块,将是我后续分享的重点,也是区别于其余教程的一大特点。

Github: https://github.com/Junedayday/code_reading

Blog: http://junes.tech/

Bilibili: https://space.bilibili.com/293775192

公众号: golangcoding

二维码