如何成为一名优秀的Go语言工程师,这是很多人都长期疑惑的问题。
我这边抛出自己的观点,希望能引起大家的思考:
掌握基础,熟悉生态,集百家长,深耕领域
接下来,我将围绕这四个词展开今天的分享。
首先,我们来聊聊这个老生常谈的话题 - 掌握基础。关于基础的学习路线我会在后面细讲,今天我们先来谈点别的。
所谓基础,会根据工作的不同阶段而不断变化。 也就是要用 发展 的眼光来看问题。
举个例子,就以 编程语言 的作为切入点:
生态 这个词很微妙,社区里有不同的见解,我也无法抛出一个准确的定义,这块需要大家自行摸索。不过,我倒是可以分享几个踩坑经历:
比起一些告诉你 该怎么做 的建议,我更倾向于那些 不该怎么做 的建议。 一次成功往往有大量的偶然因素,而从失败中分析出原因更有长期价值。
接下来的这点,是本章的重点,希望大家看完之后能重点思考。
Go 语言是一个以简单著称的编程语言,又被号称是 云时代的编程语言。这背后蕴含了两层含义。
第一点,也就是 简单 带来的副作用。一种编程语言如果被冠以 简单 的头衔,那么它的设计核心就是 可读性。
但是,无论是模板、元编程、泛型这些语法上的高端特性,还是继承、多态、函数式等编程范式上的特性,虽然很复杂(或者说是学习曲线很陡峭),但不得不承认它们在特定的场景中,达到了很好的抽象效果,大幅度地提升了程序的效率。
所以,Go 语言决定了在单个程序中支持的复杂度有限,进一步则需要 JAVA、C++为代表的工业级编程语言 的一些特性。
从上一点来看,Go 语言支持的单个程序复杂度有限,那就非常依赖 微服务 的核心理念 - 拆。通过拆解,可以将单个程序的复杂度转移到架构层面,也更好地契合了服务内聚的理念。
但是,即便进行了很好的设计与拆分,微服务 依然有两个比较重要的前置要求:服务间通信 和 微服务治理。前者相对容易解决,统一采用 RESTful 风格或 gRPC 等框架进行通信,就能满足基本要求;而微服务的治理问题就非常复杂了,很长一段时间都没有一套成熟的解决方案。近几年,随着 Docker容器化 + Kubernetes调度平台 的出现与推广,已经成为了 微服务的Best Practice 。
以 K8s为核心的云原生生态,涵盖了监控、日志采集、链路追踪、Service Mesh等各类子领域的解决方案,均得到了快速迭代。其中,各种核心组件均是通过 Go 语言开发而成,像 Kubernetes、Prometheus、Etcd 等。
至此,我们开发的服务不再需要过分关注基础组件,而是更聚焦于业务领域。
再回到这一个话题的核心 - 集百家长。
云原生的社区CNCF提供了大量的组件,大家可以通过这个链接看到对应的全景图。它提供了是一整套插件化的组合方案,需要开发人员按需组合(后面我也会给出一些建议)。
我非常不建议大家去自己从头开发一个模块,主要有两点(巨型互联网的基础团队除外):
如果真要新增某个重要功能,优先去找个现有CNCF项目的负责人聊聊,提交PR合入,或者自行fork开发。 相信我,在一个成熟产品中新增特性,比你重写一个轮子更有价值!无论是对技术的提升、还是投递简历时的效果,都更有意义。
举一个场景,当我们发现需要在程序中用map
保存大量结果时,用默认的数据结构效率很低:
在工作三年以上,我越来越感受到 领域 是一个很重要的概念,也是各公司考验高端人才的重要素质。
举几个例子:
每一块 领域 都需要有大量的 专业技能 与 行业经验 沉淀,这是高端人才的核心竞争力。
虽说两者缺一不可,但还是具有一定的倾向性
回顾一下这四个点: 掌握基础,熟悉生态,集百家长,深耕领域 。这一整个过程,也可以说是:修炼内功,学习并合理使用外部资源,沉淀于特定领域 。
纵观周围环境,我发现大部分的开发者都热衷于 修炼内功和领域沉淀,而过于轻视了 外部资源 的作用,就错失了一个快速提升个人能力的手段,技术视野也非常有限。这一块,将是我后续分享的重点,也是区别于其余教程的一大特点。