服务端开发:技术、方法与实用解决方案
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.4 服务端开发进阶路径

在互联网行业,很多时候加班对工程师来说是家常便饭,同时互联网领域技术又日新月异,要求工程师有很强的学习能力。如何在繁忙的工作中做好积累,构建个人核心竞争力,相信是很多工程师都在思考的问题。

近些年,中年危机几乎是绕不开的话题,为何会有中年危机呢?其根源在于职业本身的特点。事实上,不只是互联网领域,在其他领域,具有以下特点的职业,同样不可避免地会面临中年危机:

❑能力习得速度快的行业,后辈更容易挑战前辈,形成中年危机。

❑技能演进速度快的行业,手里的秘籍容易成为废纸,形成中年危机。

互联网领域的技术演进日新月异,很多时候,先入行者不但没有先发优势,反而可能还有巨大的劣势:或许你是一位中年JavaScript“艺术家”,老一套已经信手拈来,可新来的工程师直接上React秒杀你;或许你花了十年时间把C++玩得滚瓜烂熟,可面对现代大型分布式项目,年轻人用Scala处理得又快又好。现实就是如此残酷,你会的技术,别人一学也会;你掌握的利器,过两天可能就成了钝铁。如此种种,让互联网行业呈现出一边倒的年轻化特征,在大多数非创新岗位上也不存在老专家这么一说。因此,某种意义上,软件工程师的中年危机是由其职业属性决定的,不可避免。

当然,不可否认的是,互联网领域也有像Jeff Dean那样的一群人,对所谓的中年危机完全“免疫”。但不要忘了,这样的大牛毕竟是少数派。既然危机将不可避免地到来,对于软件工程师来说,最好的应对方式就是想办法解决,规划一条进阶路径,进而构筑自己的能力护城河,最大限度降低危机的影响和冲击。

1.4.1 构建能力模型

在进阶之路上,为提升自身的核心竞争力、构建能力护城河,首先需要打造具有竞争力的能力模型。如图1-24所示,处于中心的是行为处事的准则,也就是正确的思想观念。其中最核心的观念就是要把职业生涯当作自己的事业,为自己而工作,把提升自身能力作为事业的目标。围绕着这一核心的还包括主动承担责任、团队协作等。为了达成这些能力,需要养成良好的习惯并掌握相关技能。习惯和技能相辅相成,影响着平时的一言一行,通过规范言行来帮助将这些观念深化为本能。而为了保证上述的方案能够落地执行,需要执行详细的规划并反复实践,并通过复盘等手段总结得失,查漏补缺。

此外,大厦需要有坚实的基础,否则只能是空中楼阁。改变现状的勇气、优秀的执行力和健康的身体便是这一切的基础。

图1-24 能力模型示意图

1.4.2 专业知识体系化

本节所述的知识特指技术知识和业务知识,基于这两者,形成服务端开发工程师的专业技能和业务技能。在互联网领域,技术和业务相辅相成,技术服务于业务,业务促进技术更迭,两者并行,因此一般将技术知识和业务知识统称为领域知识。

从事服务端开发,领域知识是最基础却又最重要的能力。但是,只有当领域知识形成体系时,才可以成为真正的核心竞争力。当遇到问题时,如果连相关的知识储备都没有,将很难解决问题;而如果你有相应的知识储备,则可以将知识迁移到问题场景中,辅以推理寻找解决问题的方法。为了让领域知识和逻辑推理更好地结合,我们要系统地学习知识,专注于某些技术方向的同时,有意识地向周边拓展。对于服务端开发工程师,除了掌握服务端开发技术栈和相关业务知识,也应了解一些客户端的原理,知道服务端和客户端之间如何联系。

那么,如何才能使自己的领域知识系统化呢?很多时候,领域知识点本身是可以相互联系起来的,但前提是你对这些点都理解透彻。在工作中学习,最常陷入的困境就是学习时间过于碎片化,学了后面的,就忘了前面的,不得要领。出现这种情况的一个很重要的原因在于:领域知识宏观层面的整体大图没有形成,关键知识点理解深度不够、不透彻。这些关键点就是这个领域的骨架、支点。缺了骨架,自然难以体系化;缺了宏观大图,容易误入歧途。

读者是否曾有过这样的体验:在某个领域学习知识特别快,但换个领域就总是不得要领。想象一下,为什么你对家所在的小区周边特别了解,不会迷路?本质上就是因为你脑中已经对小区周边形成了整体大图,并对关键节点了然于胸。把你放到陌生的小区,你可能就迷路了,关键节点、整体大图均没有,胡乱摸索,即便你把摸索路上所见到的每一个小餐馆的情况都了解了,也没什么意义,再过几条街你就忘了。

鉴于上面抛出的问题,在学习领域知识的时候,特别是进入一个新领域时,首先要厘清整体大图和关键知识点,然后循着大图和关键点通过实践进一步强化。

1.4.3 掌握学习方法

知识通常是抽象的,离开校园后,静下心来看书或研究源码是一件比较困难的事情,因此需要掌握正确的学习方法。

1.场景式学习

场景式学习有助于克服“学习困难症”。具体而言,就是带着问题去学习,在学习某方面知识的时候,先列一个问题表,带着这些问题逐一寻解。举个例子,在入门Spring框架的时候,我最初是看书,看到四十多页就犯困了,似懂非懂;后来我换了一种方式,列了一系列问题:Bean到底是什么?Bean会被垃圾回收(Garbage Collection,GC)吗?等等。基于这些问题,我逐一去查资料、跑demo,比直接看文献轻松很多。

当然,再好的方法也需要执行力支撑。在学习的过程中,我们会遇到很多问题,而解决这些问题通常需要你去做很多事,比如下载源代码(找不到网址,放弃)、编译(还要去学习那些编译参数,放弃)、搭建环境(太麻烦,放弃)。这中间九九八十一难,放弃任何一难都取不了真经。这也是为什么同样的学习、同样的问题,优秀的人能学会、能解决,有些人却不可以。

2.站在“巨人”的肩膀上

古人云:“三人行,必有我师焉。”在学习的道路上,要善于向身边优秀的人学习。很多时候,大牛的指点可以让你事半功倍。举个例子,笔者曾遇到过这样一个问题:在应用刚启动时,连接数据库特别慢(非慢查询)。百思不得其解,于是向一位经验丰富的同事请教,他仅凭我的描述便给出了原因和解法:创建连接时,MySQL会进行反向域名解析,这一过程比较耗时,通过配置参数skip-name-resolve跳过即可解决。

大型企业通常都有较为完善的技术传承体系,以帮助员工成长,提升研发效率。以蚂蚁集团为例,不仅有针对新员工的“精武门”“青年近卫军”等内部培训,还有“般若堂”“奇点学堂”等形式多样的内部技术分享。把握住这些向大牛学习的机会,定会有所收获。

1.4.4 技术与业务同行

在互联网行业,工程师大都在技术领域很有追求,但部分工程师却轻视业务,甚至嗤之以鼻。这种现象多与工程师的职场经历相关。通常工程师是和产品经理沟通需求的,而不是直接与真正的业务方沟通,导致很多工程师不了解业务全貌。同时,工程师专注于技术,为各种需求所累,业务意识不足,更不会主动去思考业务痛点和了解业务策略。笔者初入职场时,做的是比较偏中台技术的工作,对业务感知比较少,也不感兴趣,那时候比较崇拜技术大牛,根本没有意识去了解业务相关的信息。

在互联网领域,特别是在阿里、腾讯这类商业科技公司里,一个不理解业务的工程师与流水线的工人是没有很大区别的。在阿里,工程师评价指标分为三大板块:业务理解、项目管理和专业技术。其中业务理解是非常重要的,层级越高,业务理解的占比越大。一个不懂业务、不了解业务的工程师,很难设计出好的系统。比如12306这样的系统,如果不了解它的业务,何谈设计?它的业务有多复杂呢?此处就其SKU(Stock Keeping Unit)来进行分析。

1)SKU总数多。对于普通商品,一个SKU对应一种商品,每卖出一件,库存减1。而列车票则是一种动态SKU,以上海到成都的G1974次列车为例,共有20站、3种座位,粗略一看似乎只有3种SKU(商务座、一等座、二等座),实际上G1974有570个SKU,始发站上海与后面的19站便有19×3个SKU,以此类推共计(19+18+17+…+1)×3=570个SKU。

2)SKU计算复杂。G1974总共有570个SKU,但是SKU的数量和库存却都是动态的,库存不仅会减少,还会增加。比如列车驶出上海站,SKU会减少19×3个,对应的库存也会清零;与此同时,上海与第三站及其后面的站对应的18×3个SKU可能未卖完,这些座位自然不会浪费,因此,第二站苏州北到后面各站的SKU库存则可能会增加。如果再考虑座位存在位置差异(A、B、C、D、F),计算量会更大。

铁路交通领域的票务系统非常复杂,在系统设计之前,首先需要对铁路交通领域的业务进行充分调研,深刻理解业务场景和运作模式,在此前提下再谈设计。

通过上面的例子,相信读者对于业务的重要性已经有所感悟。事实上,一个公司通常也是先有业务模式,然后才去招兵买马,组建研发团队的,皮之不存毛将焉附。业务发展的好坏往往决定了公司的营收和前途,也决定了研发的效益和去留。

根据工程师对业务的影响程度,可划分6个阶段,如图1-25所示,层层递进,越往上对业务的影响越大。在具体的业务中,不论做前端开发、服务端开发,还是质量保障,最终目标都是促进业务发展,只是担当的角色不同,影响程度不同。工程师在打磨技术的同时应关注业务,促进业务发展,这样可以让技术的价值得以更好地体现。

图1-25 工程师对业务的影响程度示意图

1.4.5 树立正确的观念

不要随心所欲地生活,也不要随遇而安地行走在职业生涯的漫漫长路上。没有明确的方向,你走的每一步可能都是徒劳的。对工程师来说,没有以不变应万变的方法,唯一不变的就是改变,树立长远的目标,持之以恒,踏实前行,方能达到最终的目标。

1.关于工作

你不是为老板工作,也不是为公司工作,而是为自己工作。工作是属于公司的,而职业生涯却是属于你自己的。当把这件事情想明白的时候,你的职业发展将会焕发新的青春。在这个过程中,你应学习如何像公司一样思考,如何提升自己的技能,从而让公司持续地购买你的服务。

在工作中,切忌无意义的抱怨、愤怒,这些不成熟的行为可能会让你痛快一时,但更多的是证明你的无能,于现状而言没有任何帮助。吐槽、抱怨、愤怒很容易,而提出解决方案才有价值,应争取成为后者。

2.关于责任

责任与重要性成正比。当你的责任越大,承担的事情越多时,公司对你的依赖也就越重,也更容易让你脱颖而出,得到更好的资源和机会。所以,需要主动地承担更多的责任,不要退缩,敢于顶上去,做出引人注目的成绩,成为问题的解决者,并不断提升自己。

人都是有惰性的,倾向于在自己熟悉的领域行动,心理学上称之为“安全区间”,对于有挑战的事情,内心往往因“缺乏安全感”而不愿意尝试。但是,你要明白,挑战所在常常也是机会所在,敢于承担责任,赢取机会,才能不断突破自己的舒适区,拓宽自己的能力域,使自己更有价值。

3.关于技术

要揽瓷器活,得有金刚钻。只有形成自己的技术影响力,当出现某类问题时,公司才会首先想到你。同时,要有技术广度,对自己所从事的领域相关的技术都有一定的了解,具备较为完善的技术栈。扩展广度要注意范围,最好沿着自己所从事的领域向外扩展,而不是征服不成体系的技术知识点。

4.关于协作

在互联网领域,不要试图单打独斗,要注重团队协作。人多力量大的前提是:创建一个好的环境,制订合理的激励措施,规划好成长路线,让每个人都能被激发并释放自己的能量,让优秀的人脱颖而出。在进阶的路上,即便你专注于技术,也不可能事必躬亲,团队协作的力量不可或缺。