https://mp.weixin.qq.com/s/vEWKb7eumWtfeodmwfpp9Q

嘉宾简介

毛剑,腾讯云最具价值专家(TVP),bilibili数据平台部技术总监。拥有近十年的服务端研发经验,擅长高性能、高可用的服务端研发,熟悉Go、Java、C等语言。在B站参与了从巨石架构到微服务的完整转型,现专注于大数据在bilibili的数据中台建设。

前言

本文的主人公毛剑,同时拥有着B站技术总监及B站重构引导者、人气技术分享者、Go语言布道者、新晋爸爸等多重身份。技术人如何在多重角色中兼顾不乱,游刃有余?毛剑老师将用他的经历为我们揭晓背后的答案。

B站重构引导者:技术之外,更需协作智慧

提起毛剑老师,许多技术同学首先想起的,便是“B站重构引导者”这一身份,毛剑老师在2015年加入B站,参与了B站从巨石架构到微服务的完整转型。从最初的“全家桶”代码,到如今能承载月均近2亿活跃用户的大型综合性视频社区,这次转型无疑是一次里程碑式的跨越。作为重构的引导者,在重构过程中是如何考量与决策,又有哪些经验和体会?毛剑老师为我们娓娓道来:

之前的B站,我们称之为巨石架构,是一套涵盖了几乎所有B站业务体系的“全家桶”代码。这样一个庞杂的系统面临着许多痛点问题:文档缺失导致代码维护难度大;原有架构无法承载更大规模的用户量,也给多人协作、共同开发造成困难。基于这样的背景,B站的重构优化提上了日程。

在技术选型上,毛剑老师及其团队选择了Go语言。究其原因,既有过往经验的积累沉淀,也离不开对语言本身的深刻洞见:

我在上一家公司的时候开始接触Go语言,发现无论是在业务开发上,还是在基础设施搭建上,它都比较契合,同时我也积累了一定的经验,因此在B站选型的时候就优先选择了自己比较熟悉和擅长的Go语言。

加上当时我们觉得Go语言在未来十年内会有很好的发展,这和Go语言本身的特点也是密切相关的:

一方面,Go是一门来自谷歌的语言,继承了谷歌的工程理念和设计方法,非常接地气。

另一方面,Go语言出现的时间比较晚,学习门槛低,容易上手。为什么很多程序员不会去学Java?一个原因是Java的发展历史长,程序员要花大量的时间去追溯它的演进过程,它整个的学习门槛会比学一个新语言来得高。所以对我来说,当时选择学习Go语言主要也还是因为它的学习门槛低,我觉得学Java、学C都已经有非常多的大神,后进入到这个方向也就意味着要和别人积累了十年的经验去竞争。而Go作为一门新语言,你能够在这个领域里快速地成为专家,我觉得这点真的非常重要。

在重构过程中,自然也少不了踩“坑”的时候,毛剑老师印象很深的是在架构可用性上的一次故障:

我们曾经遇到过机房入口的交换机核心交换故障。当时的情况是连接暴涨,由于之前我们的经验积累不足,超时处理得不够好,在组件上堆积了很多连接,导致交换机压力大,核心交换过窄,先前设想的一些灾备方案也没有生效,最终导致整个机房流量进不来。

架构可用性的挑战真的非常多,即使是很小的事故也容易导致连锁故障,所以我们在开发代码的过程中一定不能假设这个东西足够稳定,我认为可用性一定是从Server和Client两个角度都要做相互的兜底和容错。

而重构一个老网站并且不影响原有业务,面临的远不仅是技术上的困难,还会有来自产品和运营方面的压力,如何处理重构过程中技术之外的问题?毛剑老师有着独到的内部协作智慧:

第一前提是换位思考。因为从产品和运营的角度来说,他们一定是希望用户端的功能能够尽快上线,让用户感知到我们的产品在优化。而从技术的角度来说,我们希望我们的架构界限清晰,能够高效地迭代,同时在稳定性方面去做技术债务的解决。因此换位思考一定是首要原则。

第二是合作共赢。它指的是:技术会满足产品或运营的功能需求,同时产品和运营也需要考虑到在功能更新这一过程中,会夹带一些技术的演进和迭代。技术重构一定是双方共同协商的结果,我们最终都是为业务目标而服务的,因此在技术重构的过程中,尽量不影响产品运营的功能实现。很多人会觉得你用Go语言或者用微服务的架构去重构它,是不是为了刷KPI,其实并非如此,原有的架构在不改动的情况下其实很稳定,去做改动反而会产生更多的问题。所以技术重构不是为了短期刷KPI,而是出于更长远的稳定性和效率的考虑。

新晋爸爸:工作、家庭与自我提升的平衡之道

在不久前,毛剑老师有了一个全新的角色——新晋爸爸,当家庭生活进入到新的阶段,而立之年的技术人如何在繁忙的工作、家庭与自我提升中找到平衡点?从自身经历出发,毛剑老师给出了他的见解。

谈及工作与自我提升的平衡之道,毛剑老师认为工作当中的独立思考、业余时间的持续学习,以及结合业务目标的技术实践,都是程序员自我提升的具体路径:

最核心、最关键的一点是独立思考。很多人虽然每天都很忙,但却没有花时间思考,比如我们每天都在做需求,做这些需求的价值是什么?我们要从这个角度去考虑。另外,我们做了一件事情后,又产出了怎样的效果?我们也必须去关注。我印象比较深刻的是:谷歌每周五会给程序员半天的时间做头脑风暴,鼓励大家主动去思考,因为独立思考真的非常重要,有时候你需要停下自己手头的工作,思考一下你做的东西方向对不对。

独立思考之外,一定是持续学习。因为行业在发展变化,许多技术也在不断迭代,所以我们即便工作时间很忙,业余的时候也一定要抽时间去充实自己。比方说在打车或坐地铁上班的路上,我会去看微信的公众号,我订阅了很多技术类公众号,每天它们都会产出一些高质量的文章,如果是长文章,我会把它加入微信的收藏或是悬浮窗,如果文章比较短,我就会快速阅读,利用这些碎片时间去充实自己。

最后是更多地实践。在为业务目标服务的前提下,尝试做些技术的演进。这样的话既能很好地完成OKR或KPI,取得不错的业务效果,同时也有机会去实现自己技术上的一些想法。

大咖金句:不要为了技术高大上而去做纯技术上的技改,结合业务目标去做技改效果会更好。

持续学习不仅是技术人自我提升的重要方法,同样也是逃离中年危机的根本途径。对于程序员的中年危机问题,毛剑老师也给出了自己的建议:

首先,我们一定要做一个非常好的选择。我相对来说运气比较好,选择的两家公司加入的时间都比较早,而且两家公司都上市了。所以我觉得做选择一定要看好未来几年,也就是所谓的“做一年,看三年”,一定要想好未来三年行业可能产生的变化,用更长远的眼光去看待自己的职业生涯,不要为了所谓的短期收益放弃长远的收益。

其次,是持续学习。我现在32岁,整个的工作时长、学习时长还是挺高的。如果你每天都在很多琐碎的事情上浪费时间,那你和同龄人的差距肯定只会越拉越大,而当你花的时间比别人更多,我相信一定不存在年龄上的距离。国外的很多程序员到五六十岁仍然很资深,比如Go语言的几个创始人,我认为其实不存在三十多岁就战斗力不行了。

总结来说就是一句话,无论在哪个时间段,更多地先关注自己的成长,并且持续学习。

而关于工作与家庭的关系,在毛剑老师看来,工作与家庭并不是一道二元对立的选择题。即使是新晋爸爸,同样也能从中找到平衡:

现在我的小孩睡得比较早,八九点就睡了,我一般是等他睡着以后会开始做自己的事情。很多人会觉得有了宝宝以后,自己的时间基本上就没有了,但我们要学会利用空隙时间,抽出一点时间来去关注自己职业上的事情。它不是要么倾向工作,要么倾向生活,而是说你要找到一个自己的平衡点。

人气技术分享者:谈技术影响力与兴趣原动力

身兼人气技术分享者、Go语言布道者以及开源社区贡献者的多重角色,毛剑老师一直积极活跃于技术圈内。在老师看来,个人影响力的塑造对程序员而言是非常必要的。结合自身技术分享的经验,毛剑老师和我们分享了他的收获与感悟:

第一,技术分享是倒逼自己进行阶段性总结的方式。虽然大家总是吐槽“PPT工程师”,但实际上要把PPT做好并不是一件容易的事情,尤其技术PPT一定是对过去技术知识点的抽象化思考和总结,并且要用深入浅出的方式讲明白,传递给受众。我认为技术分享是倒逼自己持续地整理和总结过去的知识的一个有效的方式。

第二,经常出来分享也是个很好的交流机会,能够学习其他讲师的经验。看到别人有更好的解决方案的时候,对你的业务也有帮助。我一般看到很不错的分享之后都会立刻拍照,或者会跟团队说:“你看别人是这样解决问题的,我们也可以参考一下。”另外,还能够认识很多朋友,有可能哪天遇到相同的困难,询问身边的朋友就能得到一个可以快速借鉴的解决方案,减少了很多踩坑的可能。

第三,是有利于提升技术影响力。无论是在公司内部,还是在行业当中,要推动一件事情往往需要有人站出来充当主心骨的角色,所以对程序员来说,技术影响力的塑造是相当有必要的。

而在技术影响力之外,毛剑老师认为,对技术的兴趣和热爱同样不可或缺。它们在程序员的职业生涯中起到原动力的作用:

在职业发展的前期,认真、负责、努力……这些职业化地对待工作的方式能够让一个人晋升到一定的级别。但在发展到一定阶段以后,如果想要再进一步,我认为原动力非常重要。原动力就是你真的喜欢这个东西,那么你会主动在上面投入很多时间,源源不断地持续发光发热,你可能就会比其他人走得更远。就像我做技术一样,我还是蛮喜欢的,虽然还有很多不会的东西,但我也都很感兴趣,感兴趣就会有动力去钻研得更深,去把它做得更好。

大咖金句:除了职业化,我们更要有兴趣和热爱。