2025 年技术指引:让真实案例和经验为开发者开路 了解详情
写点什么

Go 语言专家曹大谈十年技术生涯:有理想,但不理想化

  • 2022-09-08
    北京
  • 本文字数:3549 字

    阅读完需:约 12 分钟

Go语言专家曹大谈十年技术生涯:有理想,但不理想化

作者 |贾亚宁

嘉宾 |曹春晖 / 曹大


个人成长和职业晋升是每个人都很关心的话题,对于软件工程师而言尤为显著。互联网不断普及,越来越多的程序员加入到了优质岗位的竞争中,每一个互联网从业者可能都思考过这样的问题:如何能从人才大军中脱颖而出,如何能更高效率地获得成长和发展?


关于这个话题,我们不禁想到了 Go 语言的专家——曹大。熟悉并使用 Go 语言的开发者可能多少都听过这个名字,互联网上甚至还有专门整理曹大内容输出的文章。但是曹大这个人很神秘,很少在公众场合露脸,多是通过文字和同行交流,他长期在 xargin.com 上进行技术输出,并践行终身学习理念。他对自己的要求极高,目前是一名自由职业者,也因此在下文中可以无所拘束地发表个人观点。


由于对曹大成长经历的好奇,我们特别邀请到了曹大本人——曹春晖老师,他是北航硕士,IT 行业多年从业者,曾在某公司担任技术专家,畅销书《Go 语言高级编程》的合著者,Go Contributor,对 Go 的底层实现有深入理解。


同时,曹春晖老师也是年初上线的 QCon+ 案例研习社「Go 语言与并发编程」专题的出品人,带队来分享 Go 解决并发问题的最佳实践。因此我们主要针对个人提升角度对曹春晖老师进行了采访,一起来看看他的实践和思考吧。


InfoQ:你最近主要在做什么呢?


曹春晖:过年的时候在读 Ray Dalio 的《原则 2》,一定程度上了解了自己为什么在股市上只会亏钱。年前看了一些排队论的知识,理解了延迟和队列的关系,可以用来解释很多场景,比如 Go 的调度系统和延迟的关系,网络队列和延迟的关系,为什么控制延迟要丢弃请求等等。最近就在玩艾尔登法环了。


InfoQ:你的职业生涯中印象最深刻的挑战是什么?你是如何解决的呢?


曹春晖:技术的挑战都不算什么大事,工程方面的问题一定可以找到解决方案,找不到方案的那就是世界难题了。在公司里最大的挑战是有 idea 的时候,要说服老板去做(碰到太多次了),因为公司里的老板背景各异,不同的人不可能对一件事情有相同的看法,这时候要达成共识就需要反复沟通,拉齐、磨合、开会,摆出各种软件工程系统架构理论,再搬出硅谷的 FAANG 是怎么做的,很心累。能说服老板的话,其它事情都是小事,这很难避免,因为大公司都是这样的。


InfoQ:方便分享一下你的职业发展路径吗?你认为影响技术人的职业发展的重要因素有哪些?


曹春晖:我的职业发展参考价值不大,其实这么多年看下来,在同样靠谱的前提下,职业的发展顺利与否主要都是看运气……了解了一些公司运作的规律和招人的潜规则以后,很多事情比较无奈,不太好说(真心话)。


学习方面给各位技术人的建议是要养成终生学习的习惯,不要学到某个程度就固步自封,即使是后端技术,五年前和现在其实差别已经挺大的了。我以前写过一篇《工程师应该如何学习》,介绍过一些学习的渠道和方法,可以参考。工作中打过交道的人,其实很多工作十年的人跟刚毕业的学生没什么区别,你看看你们公司的架构师,CRUD 都能搬出 100 种理论来说明为什么要这么设计,这才是真水平。


另外,写代码以外的技能也是要刻意训练的,比如口才、演技等,很多踏实写代码的人其实在大公司里很吃亏,要理解什么是一定程度上的按闹分配。


InfoQ:作为常年在 Go 语言世界里探索的人,你认为什么是学习 Go 语言最高效的方法?


曹春晖:入门的话就看《The Go Programming Language》,最好的学习方法就是把书上的例子都抄一遍。可以翻翻优秀的 Go 项目来学习他们是如何使用这门语言的,前面也提到了,awesome-go 里有很多这样的项目。直到你觉得 Go 的所有语法都了熟于心,就算是入门了吧。


进阶要去学习怎么定位 Go 在线上系统的问题,成为一个 Go 的高级工程师。这部分需要大家了解一些 Go 的底层知识,学习基于 goroutine 和 channel 的各种并发编程模式,以及常用的工具链:比如 pprof 怎么用,怎么用 --base 去找内存泄露,出了性能问题怎么做优化等等。要达到的目标是:线上的 Go 系统出了问题,能够通过自己的知识储备快速定位。Go 的底层知识现在国内比 java 圈还卷,文章很泛滥,可以随意搜搜,择优阅读。


下一步是要通过多接触各种场景(比如大流量,高并发的,业务的,基础设施的等等),同时与其它语言横向做对比,了解 Go 语言在各种场景下的优缺点,不要成为一个语言原教旨主义者,比如我在工作的过程中就看到过不少 Go 其实就没法应付的场景,大家硬着头皮用,硬着头皮 hack,项目搞到最后优化起来也很痛苦,可能还不如直接去用 Rust。尽量多思考,也不要忌讳与其它语言的熟手交流。


相比 PHP 之类的语言,Go 的最大好处是可以跨越很多领域,从业务到基础设施,如果你业务干腻了,技术储备又足够,也可以去玩玩基础设施开发 (当然,我不建议你总是换, 实在手痒可以业余时间给一些开源基础设施项目提提 PR)。也就是大家的工作内容选择范围会大很多,这又需要考验你的智慧了,选择哪个领域才能赚到钱,我没法给出很具体的建议哈哈。



InfoQ:你是如何看待软件开源的呢?你又是如何参与到社区内的呢?


曹春晖:开源曾经是最好的学习和与世界连接的方式,只不过现在的开源社区弥漫着令人不太舒服的氛围,开源组织大多被大公司所控制,程序员付出了自己的业余时间,但没法为这些付出得到适当的回报。如果你不是很抗拒这些东西,想要在 GitHub 上被别人看见,这个很容易,看看你日常工作中都用到了什么软件,去 GitHub 上提 issue,提 PR,这都是贡献方式,等你熟悉了以后就可以写一些大点的功能了。


如果你手边没用什么开源软件,那可以在 GitHub 上找找 awesome-xxx 类的仓库,看看里面有没有感兴趣的东西愿意帮作者一起维护。比如 Go 程序员,你可以看 awesome-go,找找里面 star 数很多的项目,无聊的时候翻翻它的代码,总能找到提 PR 的机会的。


另一方面,这两年有不少 infra 的创业公司靠开源融到了钱,这个对程序员来说是好事,因为 infra 在大多公司内被当成支撑部门和成本中心,其实不太受老板待见,创业公司做 infra 能赚到钱,这意味着会有更好更多的基础软件岗位。未来中美科技大概率会搞脱钩,谁也不知道我们手边的这些习以为常的基础设施会不会哪天就不让用了。


InfoQ:你是如何做到长期内容输出的呢?对想要开始的小伙伴有什么建议吗?


曹春晖:要给自己设立一个简单的目标,同时不要影响到工作,我之前写了很多年 blog,体感最合适的是一个月两篇文章。内容可以和工作相关,也可以无关。两周一篇,压力也不太大,可以没事想起来就写写。


输出是很重要的,费曼学习法告诉我们,你要把知识讲得明白,才能确定自己是真的会了,只是应付工作里的那点东西,很多时候人会变得懒惰,慢慢也就不想思考了。我曾经在某公司听到一个很高级别的人自豪地说他很多年没看一本书,还很骄傲地讲给他的下属听,我不认为新进入行业的人能够有像这位一样靠公司起飞的运气,还是要把学习当回事的。


因为增加了输入,这些输入一定会在某个时间点对你的工作产生帮助。在某大公司的时候我也看到内网上一些优秀的文章作者,他们基本上都保持了持续内容输出的习惯,这也意味着他们看了非常非常多的书。有些人的读书速度能快到匪夷所思的程度 (一年 68 本),不知道他们是怎么做到的。


多积累一些知识以后的输出是很有价值的,我之前写的系统设计的文章被人看到以后会来问我是怎么做的,说不定聊着聊着就成同事了。


InfoQ:最后,作为一名互联网老兵,你想对年轻的技术人说些什么呢?


曹春晖:技术是安身立命之本,要保证自己的技术能够比工作岗位上的要求高出一截,你才能脱颖而出。公司里做事情的时候,不要觉得琐碎的工作没有意义,大多数的自动化、抽象、架构和平台都是从琐碎的工作中积累而来的,如果你没有这个重复劳动和思考的过程,你对任何场景的思考都不会很深入。边工作也要边输出,也就是前面说的,输出很重要,写文章、写书和去演讲都算输出,就算公司黄了,你通过输出也至少有个业界影响力对不对。当然,重复的工作干了两年,这肯定是不行的。


选择也很重要,要能看得出什么是行业的红利,哪里有现金流,哪些是公司内的重点项目,哪些比较容易出成果(你要是不懂这些,只会写代码,那你的发展就会慢)。特别是这几年,这个能力会变得更加重要。


要懂得公司内的各种潜规则,比如正常是多长时间可以晋升,比正常时间长那自己基本上被当前的老板打上低潜标签了,建议找到好机会就尽早溜。其它还有很多,技术以外的思考和观察也不能太少。


如果有很粗的大腿,不要太抗拒去抱,没有人不愿意去当嫡系部队。不公平是这个世界的常态,要坦然接受!


嘉宾简介


曹春晖 某公司技术专家

北航硕士,IT 行业多年从业者,曾在某公司担任技术专家,畅销书《Go 语言高级编程》的合著者,Go Contributor,对 Go 的底层实现有深入理解,从业期间保持输出习惯,xargin.com 作者。

内容推荐

一堂来自技术大牛的私享课-“平凡的”程序员应该如何快速成长

2022-09-08 18:2212241

评论

发布
暂无评论
发现更多内容

数据治理(七):Atlas搭建启动

Lansonli

数据治理 8月月更

网络架构设计概要

阿泽🧸

8月月更

gateway网关

急需上岸的小谢

8月月更

Spring 全家桶之 Spring Security(一)

小白

8月月更

Spring 全家桶之 Spring Security(二)

小白

8月月更

音频技术的下一个“热点”,会出现在哪个领域?丨一期一会 • 音频工程师专场

声网

人工智能 音频

关于TAE(Transactional Analytical Engine)的那些事

MatrixOrigin

MatrixOne 矩阵起源 MatirxOrigin TAE

Kubernetes Argo Rollouts高级的部署能力

CTO技术共享

Kubernetes伟大的未来

CTO技术共享

数据治理几乎所有常见问题的简答都在这里了

雨果

数据治理

NOIP考试注意事项

工程师日月

8月月更

Spring 全家桶之 Spring Security(五)

小白

8月月更

Spring 全家桶之 Spring Security(三)

小白

8月月更

Spring 全家桶之 Spring Security(四)

小白

8月月更

C++多态案例(三)-电脑组装

CtrlX

c c++ 面向对象 8月月更

头脑风暴:判断子序列

HelloWorld杰少

算法 LeetCode 8月月更

基于STM32的录音机设计(STM32F103+VS1053B)

DS小龙哥

8月月更

语音聊天app源码:系统功能有哪些?

开源直播系统源码

软件开发 直播系统源码 语音直播系统 语音直播

密集计算场景下的 JNI 实战

vivo互联网技术

Java c++ 性能 JVM jni

【算法实践】| 一步步带你实现寻找最大公约数

迷彩

数学 算法解析 算法实践 8月月更 最大公约数

用golang官方Docker镜像运行项目

程序员欣宸

golang 8月月更

数据技术大融合,HSTAP数据库有多少想象空间?

MatrixOrigin

MatrixOrigin MatrixOne HSTAP

[教你做小游戏] 用177行代码写个体验超好的五子棋

HullQin

CSS JavaScript html 前端 8月月更

Go-Excelize API源码阅读(十八)——GetPageMargins、SetWorkbookPrOptions、GetWorkbookPrOptions

Regan Yue

Go 开源 源码解析 8月日更 8月月更

说实话,Hibernate 和 MyBatis 哪个更好用?

TimeFriends

8月月更

七种常见的IPv6网络攻击

穿过生命散发芬芳

ipv6 8月月更 网络攻击

每日一 R「12」数据结构(三)哈希表

Samson

8月月更 ​Rust

面试突击76:${} 和 #{} 有什么区别?

王磊

Java 常用面试题

开源一夏 | 大佬,人人都说精通的单例模式,你精通了吗

知识浅谈

单例模式 8月月更

kubernetes ansible快速构建

CTO技术共享

并行接口8255A简介

乌龟哥哥

8月月更

Go语言专家曹大谈十年技术生涯:有理想,但不理想化_QCon+_Alice_InfoQ精选文章