你好,我是华仔。
上一讲我介绍了三段分解法,教你把“10年成为大牛”这个宏大的目标,分解成1~2个月的可落地计划,然后再按周来执行实际的行动。
但是,不同级别的核心要求是不一样的,晋升时评委的考察重点也不一样,所以在成长过程中,我们主要提升的技术维度也在发生变化。
一般来说,P5/P6/P7主要提升技术深度,P7/P8主要提升技术宽度,P8/P9主要提升技术广度。(我在第11讲和第16讲分别以前端和Java后端为例,解释了这三个维度的区别。)
这三个不同的技术维度,分别适合用不同的方法来提升,这一讲我就会为你一一介绍,让你的学习更有针对性,在回答晋升评委提问的时候也能做到游刃有余。
提升技术深度,最好使用链式学习法。
如果你参加过晋升答辩,一定经历过评委的“追命连环问”,比如:
……
面对这种“打破砂锅问到底”的方式,如果平时没有充足的准备,你很可能会卡住。
所谓“链式学习法”,顾名思义,就是学习的过程好像从水里拉起一根链条,拉出一环后面又接着一环,最后将整个链条全部拉出来。
当知识联结成锁链,环环相扣,你对技术的理解就很透彻,评委问到底,你就能答到底。
但是知识的锁链不是胡乱连接的,环环相扣的方式很有讲究。常见的方式有两种:
第一种是自顶向下、层层关联,打通一项技术的领域分层。
第二种是由表及里、层层深入,打通一项技术的细节分层。
以Netty网络编程为例,相关领域一共可以分为6层,要么上层依赖下层,比如Netty依赖Java网络编程,Java网络编程在Linux上又依赖Linux提供的网络编程接口;要么下层是上层的应用和实现,比如TCP/IP是原理,而Linux网络调优和工具是TCP/IP的具体应用。它的领域分层图如下所示:
注:
同样以Netty网络编程为例,技术细节可以分为4层,它的细节分层图如下所示:
链式学习法的第一步,就是要明确一项技术的深度可以分为哪些层。
具体来说,就是画出“领域分层图”和“细节分层图”。一开始你可能会觉得画不出来,这恰恰说明你对深度的理解还不够,而尝试画图本身就是一个梳理结构、强化认知的过程。
画出了两张图之后,第二步就是要明确你自己要学到哪一层。
学得太浅,达不到提升深度的目的;学得太深,又会耗费太多的时间和精力。以Netty网络编程为例,从我自己实践和指导别人的经验来看,领域分层图的6层不用都学,大部分人学个3~5层就够了;不过细节分层图的4层,还是建议你每一层都学。
确定学到哪一层之后,第三步就是要明确每一层应该怎么学。
在领域分层图中,越往上越偏应用,实际工作中用得越多,越往下越偏原理(包括相关的工具和配置),实际工作中用得越少。所以总的原则是,在上层投入更多时间,更关注细节和熟练使用,在下层投入相对少的时间,更加关注原理和简单应用。
比如对于Netty网络的领域分层图,如果你不是Netty项目的开发人员,而是只想使用Netty来搭建自己的系统,那么“Linux网络编程”这一层,你只要掌握select/epoll等技术原理和优缺点就行了,epoll提供的API你有时间可以大概看看,没时间不看也可以;但是对于Netty本身提供的API,则是越熟练越好。
在细节分层图中,你需要详细地学习每一层。要注意的是,对于“实现源码”这一层,你不需要去掌握每一行源码,只要掌握关键源码就行了,也就是和设计原理以及设计方案相关的源码。
链式学习法主要有两个优点:
1. 促使我们主动提升
大部分人在实际工作中,很多技术都只接触到了领域分层图和细节分层图中的前2层,没有进一步地去了解。
而如果采用链式学习法,你就会意识到,使用一项技术完成了工作,并不意味着你就完全掌握了这项技术。你还需要把刚刚自己用到的技术作为切入点,画出完整的领域分层图和细节分层图,然后逐一攻破,这样才能提升深度,达到精通水平。
2. 将知识和技能系统化
明确知识和技能点之间的关联关系,有助于更好的理解和应用这些知识和技能。
例如,如果我们要在Linux平台上基于Netty开发并发10万连接的高性能服务器,既要深入掌握Netty的技术细节,又要深度掌握领域深度相关的技术,包括:
只有使用链式学习法,你才能系统地了解到这些关联的知识和技能,以及如何将它们串起来。
现在,我们回顾一下链式学习法的重点:
提升技术宽度,最好使用比较学习法。
如果你有过晋升P7或者更高级别的经历,肯定被问到过大量跟“Why”有关的问题,比如:
……
这些问题大部分都是考察你思考、判断和决策的逻辑和过程。如果你只有技术深度而没有技术宽度,这时就会陷入窘境:单个技术细节你都很熟悉,但是却无法解释为什么用这个,而不用那个。
所谓比较学习法,就是横向比较同一个领域中类似的技术,梳理它们异同,分析它们各自的优缺点和适用场景。
这样你就能加深对整个领域的理解,评委问的每个为什么,你都能回答得有理有据。
比较学习法的具体操作步骤如下:
接下来,我以缓存领域的Memcache和Redis为例,说明一下比较学习法的用法。
注:表格内容仅为示例,实际内容不止这么多,如果你有兴趣,可以上网搜索或者自行补充完整。
比较学习法主要有三个优点:
1. 学得快
同一个领域的技术在功能上大都是类似的,区别往往在于实现方案和细节。所以当你掌握了一项技术之后,再去同一个领域的另一项技术,就不需要从0开始了,因为基础的部分你已经学会了,只要重点关注它们的差异点就能够快速掌握。
2. 学得全
整理关键技术点和制作思维导图的过程,会促使你把一个领域的技术体系化,更全面、更系统地掌握这个领域。
3. 学得深
从差异点到背后的原理再到应用场景的思考过程,会让你对技术的取舍之道理解得更深,在每一次技术选择时都能给出让人信服的理由。
现在,我们回顾一下比较学习法的重点:
提升技术广度,最好使用环式学习法。
很多人一听要提升广度,就以为学得越多越好,想到什么牛就学什么,看到什么热就追什么。学了一段时间,感觉学了很多,但好像啥也不会,网撒得很广,却没捞到几条鱼。
所谓环式学习法,就是构建一个完整的闭环过程,将多个领域的“鱼”一网打尽。
技术上常见的闭环是功能环,代表某个功能的处理过程。以一个最简单的“用户登录”为例,如果它的实现方式是前端在手机App上用做登录页面,后端用了微服务架构来存储,那么就可以构建这样一个功能环:
注意:
这里要说明一点,环式学习法更加适合业务系统相关的技术人员,而不太适合中间件(数据库、缓存、消息队列和服务中心等)相关的的技术人员,因为中间件的技术更加专注于深度和宽度,和具体的业务关系不大,对技术广度的要求并不高。
当然,如果你已经达到了P8+/P9这个级别,无论什么领域,都可以采用环式学习法来学习跨领域的技术。
除了功能环以外,还有很多构建闭环的思路,比如业务上常见的“业务环”,它代表某个业务的处理步骤,以及管理上常见的“流程环”,它代表某件事情的处理步骤。
所以,环式学习法不但可以用来提升技术广度,也可以用来提升业务能力和管理水平。
环式学习法的第一步,就是把闭环画出来。
具体的画法是将完整的闭环分为几个关键的环节,然后标出每个环节的关键内容。
就拿“用户登录”这个功能环来说,它可以分为前端、客户端、网络层、机房入口、Nginx、用户中心、安全中心和数据中心,总共8个环节;每个环节又会涉及不同的技术,比如客户端涉及JsBridge和OkHttp,用户中心涉及微服务、MySQL和Redis等,总共涉及的技术有18项。
通过这么一个简单的功能环,你就可以看出技术广度的边界和范围;而且这些技术都是业务上实际用到的,你完全不用担心自己是没有目的地乱学。
环式学习法第二步,就是由近及远,逐步攻克闭环上的各个节点。
就算是同一个闭环,不同领域的人学习顺序也是不同的。还是以用户登录这个功能环为例,前端的人先需要学客户端的JsBridge和OkHttp等知识,然后再去学服务端相关的知识;而服务端用户中心的人,需要先学Nginx和安全中心相关的知识,之后再逐步扩展到客户端和前端。
通常来说,职业等级越高,技术广度的要求也越高,所以功能环上要求掌握的相关技术也越多。
对于单个技术,你还是需要用链式学习法来学习,但是因为数量太多,全部严格按照链式学习法的要求来学是不太现实的。我的建议是,可以先不去研究源码,只要学习接口设计、设计原理、设计方案这3层就行了;在合适的时候或者有时间的时候,可以看看核心源码加深理解。
很多技术人员有一个误区,认为业务设计是产品经理的事情,产品经理设计好了,技术人员再把自己负责那部分做好就行了。
这种想法会让你在工作中非常被动,而且可能吃大亏。常见的吃亏场景包括:
无论是前端、客户端还是服务端的技术人员,最好都花点时间,通过业务环来了解业务的整个流程。
以下是用户登录的业务环,供你参考。
注意:上图仅为示例,省略了很多分支和细节,实际的业务流程图比这个要复杂,你可以直接参考产品经理的需求文档。
环式学习法有两个优点:
1. 培养全局视野
在画出完整闭环的过程中,你可以端到端地了解全流程涉及哪些系统或者模块,每个模块的关键技术是什么,从而培养出全局的视野和能力。
2. 避免盲目地广撒网却捞不到鱼
环式学习法划定的范围是实际工作的闭环,能够形成一套有效的组合拳,而不是东一榔头西一棒槌的胡乱搭配,能够大大提升学习效率。所以你只要对照环来提升就可以了,不用再担心广撒网却捞不到鱼了。
现在,我们回顾一下环式学习法的重点:
这就是今天的全部内容,留一道课后思考题给你吧。在你的面试或者晋升的过程中,有没有因为某个专业方面的问题没答上来而留下遗憾的经历?学完今天的内容后,你觉得可以用什么方式来学习,避免以后再留下类似的遗憾呢?
欢迎你把答案写到留言区,和我一起讨论。相信经过深度思考的回答,也会让你对知识的理解更加深刻。