Junedayday Blog

六月天天的个人博客

0%

Go语言学习路线 - 8.高级篇:从五个问题来畅想Go工程师的未来发展

编程语言对软件工程师的意义

有人常说,编程语言对软件工程师来说并不重要,更重要的是软件工程思想架构设计能力等更高层面的内容。

这个观点本身没有问题,但它更多的是针对有相当工作经验的程序员。对于绝大多数的人,编程语言依然是最重要、最核心的技能,也是通往更高层面的敲门砖。所以,精通一门编程语言,不仅仅要熟悉其语法与原理,更要了解其周边的生态,包括框架、开源库、中间件等,以及掌握它适用的业务场景

所以,作为一名将Go语言作为主要开发语言的工程师,如果你能合理地利用好这个敲门砖,你的职业发展必将更加通畅。下面,我会从几个常见问题谈起,分享我的经验与见解,希望能给各位带来启发。

问题1:需要关注编程语言之争吗?

需要,而且非常有意义。但是,我们的精力毕竟有限,更应该关注哪些内容呢?我推荐三点:

  1. 编程语言常见特性的设计理念,能解决什么样的问题,如try-catch
  2. 编程范式所包含的思想,如面向对象编程函数式编程依赖注入
  3. 特定领域中语言的现状,如Julia在大数据体系中对Java的冲击

上面这些例子是一些很发散的内容,但能证明你的视野足够广阔。不过,在关注编程语言之争的同时,我们仍应把主要精力聚焦于一门语言的深入学习,这才是我们的核心竞争力。

问题2:Go语言工程师有什么其余语言无法替代的呢?

说到一门语言的不可替代性,核心关注两点:

  1. 现状:即一门语言在特定的领域中已沉淀的积累,包括开源软件、SDK库、文档、社区、用户等
  2. 未来:各公司或组织对这门语言的投入,如建立基金会、形成规范、招聘人才趋势等

上面这两点,也间接地回答了一个很常见的问题:Go能替代Java成为主流业务开发语言吗?我个人短期内并不看好。

回到问题,那么Go最擅长的领域是什么呢?答案也是大家耳熟能详的云原生技术

  1. 现状:云原生的核心技术Kubernetes与大量相关套件都是用Go语言开发的,短期内无法被替换
  2. 未来:云原生在CNCF的推动下,已经在各类云厂商中形成事实标准

问题3:Go语法简洁,做业务开发很方便,可以用吗?

当然可以使用!Go语法简洁的特性能让代码更容易阅读,但我们要清楚地认识到其弊端,才能长期地坚持走这条路:

  1. 由于不存在类似Spring的编程框架做强限制,不同人的代码风格差异还是很大,最好前期有个资深专家 做好前期框架规划,才能更好地体现Go的优势
  2. 对接部分技术体系的开源库缺失或不够成熟,尤其是对接HiveFlink等大数据体系时,Java仍是第一选择
  3. Go的标准库中往往为了通用性而牺牲了定制化,例如排序函数采用的是一个工业级混合多种排序的方法,而无法灵活地按需选择冒泡、快排等,这就需要一定的二次开发

也许你看完这三个问题,会觉得自己学Go语言的热情被劝退了,但其实换个角度来看问题,其实答案也很有意思:

  1. Go语言官方只做最基础的底层,而上层的业务框架由各家在实践中探索,发展空间很大
  2. Google推出Go之后又推出的gRPC、云原生理念,就是希望编程语言百家齐鸣,各自有各自擅长的领域
  3. 一方面,通用性能降低编程语言学习的复杂度;另一方面,我们也是希望把一部分的复杂度从编程语言转移到各类中间件中,可以减少很多重复建设

问题4:从目前来看,Go业务开发工程师的前途不行吗?

综合上面讨论的问题来看,现有阶段用Go语言做业务开发并不是最快的。

但是,从目前云原生理念被越来越多的人接受,我相信Go语言做业务开发也是一个很棒的选择。这里,我强调一个点:借势。怎么理解这个词呢?

  1. 承认短板:既然需要”借”,那就先得承认自己有不足。如果幻想毕其功于一役,那这条路很容易走到尽头。
  2. 善假于物:对于Go语言来说,借势的关键对象是两个:云原生其余编程语言的生态
    1. 云原生:有大量优秀的基础组件与中间件,尽可能地复用这部分的能力(基本上覆盖了所有的基础设施)
    2. 其余编程语言:根据业务需要自行使用,建议在非熟悉的领域尽可能地做到简单,把复杂的业务逻辑放到最熟悉的编程语言中

上面聊的比较抽象,我再举两个具体的例子:

  1. 对某个服务做网络的限流,更推荐放在Istio上,而不需要在应用程序中加上一堆计算流量的代码
  2. 某个Go服务想对接Flink计算业务数据,那就用利用JAVA的SDK开发一个对接的小服务,通过HTTP或MQ对外输出结果,而复杂的业务逻辑放在Go服务中

问题5:Go开发工程师的长期发展目标怎么定,才更有竞争力?

从能力层面来说,我认为Go语言工程师的核心技能点分为四层:

  1. 基础层:计算机基础、网络、操作系统、算法
  2. 语言层:Go语言原理与实践,其它语言的优秀特性
  3. 应用层:中间件、软件工程、架构设计
  4. 业务层:业务逻辑、云原生生态与解决方案

加粗的为Go语言特别关注

这四层的内容极多,我建议围绕着两个重点进行学习:

  1. 系统性的学习Go语言原理与实践,向下即阅读源码,掌握操作系统、网络等基础原理;向上则结合项目,对接各类中间件,学习软件架构设计
  2. 利用碎片时间了解云原生,云原生是一个日新月异的研发生态,对于非资深的开发者没必要前期就投入大量精力、导致基础不扎实,关注发展趋势、了解大致原理即可(技术的底层往往互通)

结束语

整个Go语言学习路线到此已经更新完毕,很高兴有朋友陪我走到最后。后续我也会持续更新这个系列的文章,保证内容的实时性。

学习技术是一个长期的过程,敝帚自珍很容易中途失去信心而放弃,大家一起鼓励、探讨,就能走得更远。

欢迎大家私聊我探讨问题,也可以通过公众号加入到Go学习小组中交流更多日常问题。

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

Blog: http://junes.tech/

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

公众号: golangcoding

二维码