阅读 2952

聊聊自己学Go一年来的经历与成长 | 🏆 技术专题第二期征文

今天偶然在掘金上看到了关于Go的征文稿,恰逢赶上自己学GoLang一周年的时间,最近也在部门内做了关于《Let's Go ! Go语言入门与实践》的分享,结合自身在字节跳动的业务开发经历,整体聊聊自身关于go的一些学习感悟与成长。

写在前面

首先在此说明下,自己并非严格意义上的后端开发工程师,本职的工作是一名前端工程师,在前端领域已摸爬滚打多年,从jQuery 1.2+的时代一直写到React Hooks + TS,期间呆过的公司既有非常传统的金融系统,企业自动化办公(java的天下),也有如地理信息定位+本地生活服务这类红极一时的产品(python + php),后来从2014年起一直在做和信息流相关的产品(feed推荐+推送部分最终都选了golang),所以一直在和各种语言系统对接,忙里偷闲之中也会试着了解下服务端的一些特性和系统架构,结合自己常年在一线开发的经验,相信会给出一些相对比较客观的评价。

前端不是有node吗,为什么还要来写Go?

这应该是大部分做前端同学的第一感觉了,JavaScript才是最好的选择,也能覆盖各种实际的场景,我们不在一个领域深耕反而要再折腾一门语言?在下真的学不动了。。。关于这些疑惑,我自己的有以下几点想法可供大家思考:

  • Go是一门更现代化的语言,Web编程语言从诞生至今已经有了快30年的历史了,近十年来各种技术理念和代码规模也有了极大的变化,我们从对语言的单一性能追求变成了如多核硬件架构,大规模分布式计算,云原生,并行计算,拥抱社区,兼顾编译速度和编写效率,渐进式版本增强等多需求,Go在语言层面都给予了良好的支持,非常适合作为web开发的主力语言;

  • 编程的本质是用技术的手段来解决实际的问题,而非盲目的宗教式崇拜,Linus的一句话非常经典,**“烂程序员关心的是代码,优秀程序员关心的是数据结构和它们之间的关系”,**服务端开发的典型场景是用合适的方式解决相同领域的问题,期间并不限于一门或多门语言,一切需要从实际出发,同时比较依赖完善的工程体系与基础设施,加上近年来云计算微服务模式的盛行,各种语言的灵活使用的成本已经变得非常低了;

  • Go的创始团队是全明星阵容,C语言的联合作者,UTF-8作者,memory cache的作者,Google V8 Engine开发者(没错,你没看错,V8的作者也是Go的主力开发者),参考下图,只能说:强者恒强,一个优秀的程序员必然不会受限于语言。

  • Go的高性能,语言层面的天然并发的优势,goruntine协程思想 + csp并发模型从今天来看也是十分先进(不要再一提到高性能就只能想到node的单线程+异步io来解释了),此外在国内社区里热度也是一直居高不下,很多优秀的开源作品也逐步在大规模生产环境中使用,具体可以看《为什么Go语言能在中国这么火》一文。

  • 越来越多的公司在新的项目上已经首选Go,笔者所在的公司字节跳动更是国内最大规模的Go落地场景之一,你所熟悉的产品如今日头条,抖音,西瓜视频,直播电商,企业云服务等都是基于Go进行主力语言搭建的平台,无论是在商业模式和工业级落地上我们都有了非常多的成功案例,见:《今日头条Go建千亿级微服务的实践》,同样如下大厂也都在用:

    所以综上所述,都2020年了,作为Web开发者的你,为了更美好的前(钱)途,真的不来了解一下golang吗?真香预警一波。

Go学习的经验小结

作为一门全新语言的学习,笔者个人感觉就是,尽量忘记你之前学过的语言(有点张无忌学太极的思路),从语言的通用理论体系+自身特点作为切入点来进行,当然最要紧的还是三多:多看示例,多写代码,多总结,把一项技术的优点用好了说明你掌握了,把他的缺点都用出来了那就说明是真正的精通了。如下是自己在学习过程中的一些知识点汇总,覆盖了基本概念,数据结构图显示,类型对比等,可以做个大致的参考:试着自己去做整体梳理,掌握基本知识大纲,最后再转换成适合自己的知识体系。

积极拥抱社区,保持积极开放的心态

作为一门开源语言,笔者觉得学习新知识的方式也应该抱着比较开放的学习思路来进行,所以在Go的学习过程中也经常在各种社区里寻找一手资料,甚至还十分有幸的认识了诸多大佬,感谢他们在我的学习中给予我的大力支持和鼓励。其中说个比较有意思的故事是,之前go语言中文网的作者 @polarisxu 作为优质头条号作者在头条上发文总是被审核未通过,发了个吐槽贴说再不通过就要转微信公众号了,我看到了之后试着联系了公司的同事描述了下问题,不仅得到了当时头条号运营方的及时反馈,还顺道推动解决了头条文章中代码排版不友好的的问题,最后再和当事人聊天沟通后发现,他还是我老家那边的高中学长,就是这么神奇~~

学以致用,延迟满足感的同时不断提升自身的成就感

作为一家坚持始终创业的公司(外界称为APP工厂),在字节跳动内部每年我们都有无数孵化中的产品在打磨,我们时常也会面临如下的问题:作为公司的老员工天然要起着引导团队推动项目发展的作用;作为前端又天然离着系统的业务逻辑较远(毕竟前端开发中不管啥业务,给接口+原型,就能给你把产品界面怼出来),自身发展的天花板是比较低的,那该如何做些破局?这也是我自己在过去一年多里做新产品项目中所面临的切实问题,而且服务端的同学很多也是java,python等经验背景,也会有一个学习适应Go的过程。

我自己的解决方案是:都是新团队,那就一起成长,不要给自己设边界。后续在项目迭代中我会坚持和后端的同学一起梳理系统架构,熟悉服务运维和治理平台,分析报警异常,同时在一些服务端同学可能觉得并不希望投入太多的地方由前端同学主导开发,做些定制尝试。比如基于Go的HTTP服务和BFF层设计,RPC框架搭建,OAuth2的认证和授权,API网关的熔断限流服务接入及安全插件定制,CDN资源动态下放,图像上传动态签名获取等,这些以往都是前端同学要则伸手的事,当你自己作为实际的开发者去尝试实现时,无论是对公司基础架构的熟悉还是业务领域的编程能力提升都是有着极大的促进作用,同时在底层能力上也能和服务端做更多的打通,如下就是我们当时做的一些知识整理:

事实上经过过小一年的磨合,不仅我们在技术栈上持续拓展,解决的问题的思考方式也不再局限于围绕界面开发,主动性和参与度也有了显著提升,我们最终的期望是:早日开启自身对技术认知的上帝视角,而Go在中扮演的会是一把金钥匙的角色。

关于未来

随着Go的稳步发展,相信在明年我们也会迎来Go2.0的正式版,目前的设计草案还在持续修改中,但是基本方向已经确定:主打规模化和扩展性,同时兼顾更安全高效的编程体验,主要包含三个方面,错误处理、错误值和泛型,十分值得期待。

推荐读物

此外感慨下信息爆炸的时代,当下的开发者已经拥有了无比丰富的学习资源,物美价廉的资料层出不穷,巨人肩膀的效应也在逐步放大,这算是处于软件开发的一个红利期,与此同时,不同的人可能也有着不同的学习习惯,在此我也结合自身的学习经验,总结了如下的一些资料,可供新人学习参考:

**经典书籍类: **

《Go程序设计语言》 Go语言核心团队出品,最权威的语法解读

《Go语言编程三部曲》语言实战 + 高级语言编程 + Go web编程,全面系统掌握Go web开发

《Go语言编程之旅:一起用Go做项目》 Go语言中文站⻓出品,边看边练手

《Go语言高并发与微服务实战》 Go语言在微服务中的实践与应用

《Go并发编程实战(第2版)》全面了解Go中的并发编程和gorutine原理 

**视频课程: **

Go语言入门系列视频头条号作者@李文周,全面介绍go和gin框架的使用,非常适合入⻔

Go语言中文网》GoLang国内综合学习社区

极客时间Golang视频视频全面深入解析go语言的特性和语法细节

Go语言核心36讲》通关Go语言教程 

练手项目:

golang-design-pattern》设计模式Go的实现版

gin-vue-admin》基于Vue和Gin开发的全栈前后端分离的后台权限管理系统

go-gin-admin》基于gin的博客管理系统

最后祝愿诸位在Go的道路上学习顺利,工作愉快,早日登上人生巅峰,奥利给。 👍👍👍

 🏆 技术专题第二期 | 我与 Go 的那些事......