编程语言对软件工程师的意义
有人常说,编程语言对软件工程师来说并不重要,更重要的是软件工程思想、架构设计能力等更高层面的内容。
这个观点本身没有问题,但它更多的是针对有相当工作经验的程序员。对于绝大多数的人,编程语言依然是最重要、最核心的技能,也是通往更高层面的敲门砖。所以,精通一门编程语言,不仅仅要熟悉其语法与原理,更要了解其周边的生态,包括框架、开源库、中间件等,以及掌握它适用的业务场景。
所以,作为一名将Go语言作为主要开发语言的工程师,如果你能合理地利用好这个敲门砖,你的职业发展必将更加通畅。下面,我会从几个常见问题谈起,分享我的经验与见解,希望能给各位带来启发。
问题1:需要关注编程语言之争吗?
需要,而且非常有意义。但是,我们的精力毕竟有限,更应该关注哪些内容呢?我推荐三点:
- 编程语言常见特性的设计理念,能解决什么样的问题,如
try-catch
- 编程范式所包含的思想,如
面向对象编程
、函数式编程
、依赖注入
- 特定领域中语言的现状,如
Julia
在大数据体系中对Java
的冲击
上面这些例子是一些很发散的内容,但能证明你的视野足够广阔。不过,在关注编程语言之争的同时,我们仍应把主要精力聚焦于一门语言的深入学习,这才是我们的核心竞争力。
问题2:Go语言工程师有什么其余语言无法替代的呢?
说到一门语言的不可替代性,核心关注两点:
- 现状:即一门语言在特定的领域中已沉淀的积累,包括开源软件、SDK库、文档、社区、用户等
- 未来:各公司或组织对这门语言的投入,如建立基金会、形成规范、招聘人才趋势等
上面这两点,也间接地回答了一个很常见的问题:Go
能替代Java
成为主流业务开发语言吗?我个人短期内并不看好。
回到问题,那么Go最擅长的领域是什么呢?答案也是大家耳熟能详的云原生技术。
- 现状:云原生的核心技术
Kubernetes
与大量相关套件都是用Go语言开发的,短期内无法被替换 - 未来:云原生在
CNCF
的推动下,已经在各类云厂商中形成事实标准
问题3:Go语法简洁,做业务开发很方便,可以用吗?
当然可以使用!Go语法简洁的特性能让代码更容易阅读,但我们要清楚地认识到其弊端,才能长期地坚持走这条路:
- 由于不存在类似
Spring
的编程框架做强限制,不同人的代码风格差异还是很大,最好前期有个资深专家 做好前期框架规划,才能更好地体现Go的优势 - 对接部分技术体系的开源库缺失或不够成熟,尤其是对接
Hive
、Flink
等大数据体系时,Java
仍是第一选择 - Go的标准库中往往为了通用性而牺牲了定制化,例如排序函数采用的是一个工业级混合多种排序的方法,而无法灵活地按需选择冒泡、快排等,这就需要一定的二次开发
也许你看完这三个问题,会觉得自己学Go语言的热情被劝退了,但其实换个角度来看问题,其实答案也很有意思:
- Go语言官方只做最基础的底层,而上层的业务框架由各家在实践中探索,发展空间很大
- Google推出Go之后又推出的gRPC、云原生理念,就是希望编程语言百家齐鸣,各自有各自擅长的领域
- 一方面,通用性能降低编程语言学习的复杂度;另一方面,我们也是希望把一部分的复杂度从编程语言转移到各类中间件中,可以减少很多重复建设
问题4:从目前来看,Go业务开发工程师的前途不行吗?
综合上面讨论的问题来看,现有阶段用Go语言做业务开发并不是最快的。
但是,从目前云原生理念被越来越多的人接受,我相信Go语言做业务开发也是一个很棒的选择。这里,我强调一个点:借势。怎么理解这个词呢?
- 承认短板:既然需要”借”,那就先得承认自己有不足。如果幻想毕其功于一役,那这条路很容易走到尽头。
- 善假于物:对于Go语言来说,借势的关键对象是两个:云原生 与 其余编程语言的生态
- 云原生:有大量优秀的基础组件与中间件,尽可能地复用这部分的能力(基本上覆盖了所有的基础设施)
- 其余编程语言:根据业务需要自行使用,建议在非熟悉的领域尽可能地做到简单,把复杂的业务逻辑放到最熟悉的编程语言中
上面聊的比较抽象,我再举两个具体的例子:
- 对某个服务做网络的限流,更推荐放在
Istio
上,而不需要在应用程序中加上一堆计算流量的代码 - 某个Go服务想对接
Flink
计算业务数据,那就用利用JAVA的SDK开发一个对接的小服务,通过HTTP或MQ对外输出结果,而复杂的业务逻辑放在Go服务中
问题5:Go开发工程师的长期发展目标怎么定,才更有竞争力?
从能力层面来说,我认为Go语言工程师的核心技能点分为四层:
- 基础层:计算机基础、网络、操作系统、算法
- 语言层:Go语言原理与实践,其它语言的优秀特性
- 应用层:中间件、软件工程、架构设计
- 业务层:业务逻辑、云原生生态与解决方案
加粗的为Go语言特别关注
这四层的内容极多,我建议围绕着两个重点进行学习:
- 系统性的学习Go语言原理与实践,向下即阅读源码,掌握操作系统、网络等基础原理;向上则结合项目,对接各类中间件,学习软件架构设计
- 利用碎片时间了解云原生,云原生是一个日新月异的研发生态,对于非资深的开发者没必要前期就投入大量精力、导致基础不扎实,关注发展趋势、了解大致原理即可(技术的底层往往互通)
结束语
整个Go语言学习路线到此已经更新完毕,很高兴有朋友陪我走到最后。后续我也会持续更新这个系列的文章,保证内容的实时性。
学习技术是一个长期的过程,敝帚自珍很容易中途失去信心而放弃,大家一起鼓励、探讨,就能走得更远。
欢迎大家私聊我探讨问题,也可以通过公众号加入到Go学习小组中交流更多日常问题。
Github: https://github.com/Junedayday/code_reading
Blog: http://junes.tech/
Bilibili: https://space.bilibili.com/293775192
公众号: golangcoding