跳转至

19 链式 & 比较 & 环式学习法:怎么多维度提升技术能力?

你好,我是华仔。

上一讲我介绍了三段分解法,教你把“10年成为大牛”这个宏大的目标,分解成1~2个月的可落地计划,然后再按周来执行实际的行动。

但是,不同级别的核心要求是不一样的,晋升时评委的考察重点也不一样,所以在成长过程中,我们主要提升的技术维度也在发生变化。

一般来说,P5/P6/P7主要提升技术深度,P7/P8主要提升技术宽度,P8/P9主要提升技术广度。(我在第11讲第16讲分别以前端和Java后端为例,解释了这三个维度的区别。)

这三个不同的技术维度,分别适合用不同的方法来提升,这一讲我就会为你一一介绍,让你的学习更有针对性,在回答晋升评委提问的时候也能做到游刃有余。

链式学习法:提升技术深度

提升技术深度,最好使用链式学习法

如果你参加过晋升答辩,一定经历过评委的“追命连环问”,比如:

  1. 你在讲解PPT的时候提到,某个项目使用了Netty技术,评委首先会问你Netty的一些技术点;
  2. 当你回答说Netty的本质是Reactor网络模型时,评委又会问你Reactor网络模型的原理;
  3. 当你回答说Reactor的基础是Java NIO的时候,评委又会问你Java的NIO/BIO的技术细节;
  4. 当你回答说Java的NIO在Linux平台上是基于epoll来实现时,评委又问你Linux的epoll/select等的原理。

……

面对这种“打破砂锅问到底”的方式,如果平时没有充足的准备,你很可能会卡住。

所谓“链式学习法”,顾名思义,就是学习的过程好像从水里拉起一根链条,拉出一环后面又接着一环,最后将整个链条全部拉出来。

当知识联结成锁链,环环相扣,你对技术的理解就很透彻,评委问到底,你就能答到底。

但是知识的锁链不是胡乱连接的,环环相扣的方式很有讲究。常见的方式有两种:

第一种是自顶向下、层层关联,打通一项技术的领域分层。

第二种是由表及里、层层深入,打通一项技术的细节分层。

以Netty网络编程为例,相关领域一共可以分为6层,要么上层依赖下层,比如Netty依赖Java网络编程,Java网络编程在Linux上又依赖Linux提供的网络编程接口;要么下层是上层的应用和实现,比如TCP/IP是原理,而Linux网络调优和工具是TCP/IP的具体应用。它的领域分层图如下所示:

注:

  1. 以上图示仅为示例,你需要根据自己的实际工作情况来分析。如果你是在Windows平台上做开发,那么上图“操作系统”这一层就要改为“Windows网络编程”,“工具&配置”这一层就要改为“Wireshark”之类的。
  2. 具体分层关系并没有业界统一的标准,比如“工具&配置”这一层,如果你认为应该放在“计算机网络”那一层的上面,其实也是可以的。

同样以Netty网络编程为例,技术细节可以分为4层,它的细节分层图如下所示:

链式学习法的步骤

链式学习法的第一步,就是要明确一项技术的深度可以分为哪些层

具体来说,就是画出“领域分层图”和“细节分层图”。一开始你可能会觉得画不出来,这恰恰说明你对深度的理解还不够,而尝试画图本身就是一个梳理结构、强化认知的过程。

画出了两张图之后,第二步就是要明确你自己要学到哪一层

学得太浅,达不到提升深度的目的;学得太深,又会耗费太多的时间和精力。以Netty网络编程为例,从我自己实践和指导别人的经验来看,领域分层图的6层不用都学,大部分人学个3~5层就够了;不过细节分层图的4层,还是建议你每一层都学。

确定学到哪一层之后,第三步就是要明确每一层应该怎么学

在领域分层图中,越往上越偏应用,实际工作中用得越多,越往下越偏原理(包括相关的工具和配置),实际工作中用得越少。所以总的原则是,在上层投入更多时间,更关注细节和熟练使用,在下层投入相对少的时间,更加关注原理和简单应用。

比如对于Netty网络的领域分层图,如果你不是Netty项目的开发人员,而是只想使用Netty来搭建自己的系统,那么“Linux网络编程”这一层,你只要掌握select/epoll等技术原理和优缺点就行了,epoll提供的API你有时间可以大概看看,没时间不看也可以;但是对于Netty本身提供的API,则是越熟练越好。

在细节分层图中,你需要详细地学习每一层。要注意的是,对于“实现源码”这一层,你不需要去掌握每一行源码,只要掌握关键源码就行了,也就是和设计原理以及设计方案相关的源码。

链式学习法的优点

链式学习法主要有两个优点:

1. 促使我们主动提升

大部分人在实际工作中,很多技术都只接触到了领域分层图和细节分层图中的前2层,没有进一步地去了解。

而如果采用链式学习法,你就会意识到,使用一项技术完成了工作,并不意味着你就完全掌握了这项技术。你还需要把刚刚自己用到的技术作为切入点,画出完整的领域分层图和细节分层图,然后逐一攻破,这样才能提升深度,达到精通水平。

2. 将知识和技能系统化

明确知识和技能点之间的关联关系,有助于更好的理解和应用这些知识和技能。

例如,如果我们要在Linux平台上基于Netty开发并发10万连接的高性能服务器,既要深入掌握Netty的技术细节,又要深度掌握领域深度相关的技术,包括:

  • Netty技术细节:需要设置Netty的相关参数(ChannelOption.SO_BACKLOG,ChannelOption.TCP_NODELAY,ChannelOption.SO_REUSEADDR等)。
  • Java网络编程:调试的时候需要知道Java的网络编程API等等。
  • Linux网络工具:需要使用Linux网络工具定位问题。
  • Linux操作系统配置:需要修改Linux的最大文件句柄数、需要优化Linux的TCP/IP参数(net.ipv4.tcp_tw_reuse,net.ipv4.tcp_keepalive_time等)。

只有使用链式学习法,你才能系统地了解到这些关联的知识和技能,以及如何将它们串起来。

链式学习法小结

现在,我们回顾一下链式学习法的重点:

  1. 链式学习法是让知识形成锁链,环环相扣,主要用来提升技术深度。
  2. 链式学习法的步骤包括:明确一项技术的深度可以分为哪些层,明确要学到哪一层,明确每一层应该怎么学。
  3. 链式学习法的优点有:促使我们主动提升,将知识和技能系统化。

比较学习法:提升技术宽度

提升技术宽度,最好使用比较学习法

如果你有过晋升P7或者更高级别的经历,肯定被问到过大量跟“Why”有关的问题,比如:

  1. 为什么选择Redis,为什么不用Memcache?
  2. 为什么选择MySQL而不是Redis?
  3. 选择Flink的理由是什么?(除了Flink本身的技术特点外,还需要你回答为什么选择Flink而不是Spark或者Storm。)

……

这些问题大部分都是考察你思考、判断和决策的逻辑和过程。如果你只有技术深度而没有技术宽度,这时就会陷入窘境:单个技术细节你都很熟悉,但是却无法解释为什么用这个,而不用那个。

所谓比较学习法,就是横向比较同一个领域中类似的技术,梳理它们异同,分析它们各自的优缺点和适用场景。

这样你就能加深对整个领域的理解,评委问的每个为什么,你都能回答得有理有据。

比较学习法的步骤

比较学习法的具体操作步骤如下:

  1. 先用链式学习法掌握某个领域的一项技术,将这个领域的关键技术点整理成表格。
  2. 基于整理好的技术点,学习这个领域的另一项技术,将它们在技术点上的差异整理成思维导图。
  3. 找出差异较大的技术点,将背后的原理和对应用场景的影响整理成表格。

接下来,我以缓存领域的Memcache和Redis为例,说明一下比较学习法的用法。

  1. 先用链式学习法掌握Memcache技术,整理出缓存领域的6个关键技术点。

  1. 基于这6点快速掌握Redis技术,整理出Memcache和Redis在这些点上的差异。

  1. 找出差异较大的技术点,包括并发方案、数据结构、高可用和持久化,整理出它们背后的原理和对应用场景的影响。

注:表格内容仅为示例,实际内容不止这么多,如果你有兴趣,可以上网搜索或者自行补充完整。

比较学习法的优点

比较学习法主要有三个优点:

1. 学得快

同一个领域的技术在功能上大都是类似的,区别往往在于实现方案和细节。所以当你掌握了一项技术之后,再去同一个领域的另一项技术,就不需要从0开始了,因为基础的部分你已经学会了,只要重点关注它们的差异点就能够快速掌握。

2. 学得全

整理关键技术点和制作思维导图的过程,会促使你把一个领域的技术体系化,更全面、更系统地掌握这个领域。

3. 学得深

从差异点到背后的原理再到应用场景的思考过程,会让你对技术的取舍之道理解得更深,在每一次技术选择时都能给出让人信服的理由。

比较学习法小结

现在,我们回顾一下比较学习法的重点:

  1. 比较学习法是横向对比,让选择有理有据,主要用来提升技术宽度。
  2. 比较学习法的步骤包括:整理领域关键技术点,整理不同技术的差异点,整理差异点背后的原理和对应用场景的影响。
  3. 比较学习法的优点有:学得快,学得全,学得深。

环式学习法:提升技术广度

提升技术广度,最好使用环式学习法。

很多人一听要提升广度,就以为学得越多越好,想到什么牛就学什么,看到什么热就追什么。学了一段时间,感觉学了很多,但好像啥也不会,网撒得很广,却没捞到几条鱼。

所谓环式学习法,就是构建一个完整的闭环过程,将多个领域的“鱼”一网打尽。

技术上常见的闭环是功能环,代表某个功能的处理过程。以一个最简单的“用户登录”为例,如果它的实现方式是前端在手机App上用做登录页面,后端用了微服务架构来存储,那么就可以构建这样一个功能环:


注意:

  1. 上图仅为示意,你可以根据实际情况自己完善,比如拆分为更多环,或者每个环增加更多的技术点。
  2. 上图我是用PPT画的,你也可以根据自己的喜好采用其他画图工具,比如UML类工具。

这里要说明一点,环式学习法更加适合业务系统相关的技术人员,而不太适合中间件(数据库、缓存、消息队列和服务中心等)相关的的技术人员,因为中间件的技术更加专注于深度和宽度,和具体的业务关系不大,对技术广度的要求并不高。

当然,如果你已经达到了P8+/P9这个级别,无论什么领域,都可以采用环式学习法来学习跨领域的技术。

除了功能环以外,还有很多构建闭环的思路,比如业务上常见的“业务环”,它代表某个业务的处理步骤,以及管理上常见的“流程环”,它代表某件事情的处理步骤。

所以,环式学习法不但可以用来提升技术广度,也可以用来提升业务能力和管理水平。

环式学习法的步骤

环式学习法的第一步,就是把闭环画出来

具体的画法是将完整的闭环分为几个关键的环节,然后标出每个环节的关键内容。

就拿“用户登录”这个功能环来说,它可以分为前端、客户端、网络层、机房入口、Nginx、用户中心、安全中心和数据中心,总共8个环节;每个环节又会涉及不同的技术,比如客户端涉及JsBridge和OkHttp,用户中心涉及微服务、MySQL和Redis等,总共涉及的技术有18项。

通过这么一个简单的功能环,你就可以看出技术广度的边界和范围;而且这些技术都是业务上实际用到的,你完全不用担心自己是没有目的地乱学。

环式学习法第二步,就是由近及远,逐步攻克闭环上的各个节点

就算是同一个闭环,不同领域的人学习顺序也是不同的。还是以用户登录这个功能环为例,前端的人先需要学客户端的JsBridge和OkHttp等知识,然后再去学服务端相关的知识;而服务端用户中心的人,需要先学Nginx和安全中心相关的知识,之后再逐步扩展到客户端和前端。

通常来说,职业等级越高,技术广度的要求也越高,所以功能环上要求掌握的相关技术也越多。

对于单个技术,你还是需要用链式学习法来学习,但是因为数量太多,全部严格按照链式学习法的要求来学是不太现实的。我的建议是,可以先不去研究源码,只要学习接口设计、设计原理、设计方案这3层就行了;在合适的时候或者有时间的时候,可以看看核心源码加深理解。

提升业务能力也很重要

很多技术人员有一个误区,认为业务设计是产品经理的事情,产品经理设计好了,技术人员再把自己负责那部分做好就行了。

这种想法会让你在工作中非常被动,而且可能吃大亏。常见的吃亏场景包括:

  1. 讨论需求的时候,因为不懂业务,就算产品的业务需求不合理、实现代价很高,你也发现不了。结果到了设计甚至是编码阶段,你才发现自己做得累死累活,效果还不好。
  2. 处理线上故障的时候,因为不熟悉业务,只能被动接受别人的分析和推断,很容易背锅。
  3. 因为不熟悉业务,无法承担整体需求分析和方案设计这种任务,导致个人能力得不到锻炼,失去很多晋升机会。

无论是前端、客户端还是服务端的技术人员,最好都花点时间,通过业务环来了解业务的整个流程。

以下是用户登录的业务环,供你参考。

注意:上图仅为示例,省略了很多分支和细节,实际的业务流程图比这个要复杂,你可以直接参考产品经理的需求文档。

环式学习法的优点

环式学习法有两个优点:

1. 培养全局视野

在画出完整闭环的过程中,你可以端到端地了解全流程涉及哪些系统或者模块,每个模块的关键技术是什么,从而培养出全局的视野和能力。

2. 避免盲目地广撒网却捞不到鱼

环式学习法划定的范围是实际工作的闭环,能够形成一套有效的组合拳,而不是东一榔头西一棒槌的胡乱搭配,能够大大提升学习效率。所以你只要对照环来提升就可以了,不用再担心广撒网却捞不到鱼了。

环式学习法小结

现在,我们回顾一下环式学习法的重点:

  1. 环式学习法是构建闭环,打出组合拳,主要用来提升技术广度。
  2. 环式学习法的步骤包括:先把闭环画出来,然后由近及远,逐步攻克闭环上的各个节点。
  3. 环式学习法的优点有:培养全局视野,避免盲目地广撒网却捞不到鱼。

思考题

这就是今天的全部内容,留一道课后思考题给你吧。在你的面试或者晋升的过程中,有没有因为某个专业方面的问题没答上来而留下遗憾的经历?学完今天的内容后,你觉得可以用什么方式来学习,避免以后再留下类似的遗憾呢?

欢迎你把答案写到留言区,和我一起讨论。相信经过深度思考的回答,也会让你对知识的理解更加深刻。

精选留言(15)
  • 学要有所用 👍(115) 💬(6)

    关于学习方法,最近看过一本书,书中有些学习方法别具一格,颠覆认知,书名——《认知天性:让学习变得轻而易举的心理学规律》。 这本书介绍了各种高效学习的方法,其中有几种方法,比较颠覆认知,书中认为学习时,应该有间隔的进行,而非集中式的重复进行,这样带来的好处是:能带来更长久的记忆,也就是长期记忆,而集中式练习则是短期记忆。花十分钟记忆十个单词所留存的记忆,不如分两次五分钟记忆十个单词所留存的记忆来得深刻。理由是:长期记忆的形成,需要有个巩固的过程,可能是数小时,可能是数天,在这期间,记忆痕迹得到加深,所学的新知识与旧知识建立连接,带来稳固的长期记忆,因此不要频繁的进行集中式学习,而是有间隔的进行,频繁的集中练习只会带来短期记忆,有间隔的学习所耗费的精力远大于频繁的重复式学习,使用这种方式,学习起来也更加困难,但也不容易遗忘。理论上来说,遗忘的越多,重新回忆起来的难度越大,但所保持的效果越持久,不过,还是不要等到所学知识遗忘的差不多了后再去重新学习,那样的话,你基本回忆不起来,只能重新从头开始,得不偿失,等到所学知识有点儿遗忘再去学会比较好。 拿学习专栏来说,不要反复地去学习同一章节,而是有间隔地进行,这会带来长期记忆,在学完一章内容后,不要立刻练习所学内容,而是应该等遗忘一些后进行,效果要好于学完一章节后立刻进行练习的方式,学完后不容易忘,在学完后立刻进行练习,学完后容易忘。书中建议:学习知识或技能时,通过自我检测的方式,代替重复学习,并且有间隔地进行自测,就拿学习算法来说,不要一遍接一遍地重复去学,而应该在学习完某一算法后,通过自测的方式来逼迫自己的大脑去检索所学,拒绝机械式的重复重复再重复,这样所学的知识会更加稳固,留存的记忆更持久,书中还提到:自我检测后的延迟反馈会进一步加强学习效果,也就是在进行自测后,不要立马查看答案,而是应该间隔一段时间再查看。 在练习所学时,有顺序的练习比无顺序的练习效果差,且这期间,穿插不同类容类型的学习方式,所产生的效果,要比在熟练某一知识后,再进入下一学习内容的练习效果要好,不仅能保持长久的记忆,使所学知识不易遗忘,还能提高学习者的辨识能力,也就是在面对各种复杂问题时,能正确识别问题类型,根据所学知识,从脑海中搜寻出对应问题的解决方案。回想一下我们上学时的课本内容安排,都是有顺序地,由浅入深地进行,而我们在学习时,就是通过不断练习同一知识点直至完全掌握后,依次有顺序地进入下一知识点的学习,直到课程学完。这种通过大量练习同一类型的题目的方式,使我们在考试遇到时,能得心应手地解决,但面对综合题时,这些问题都被混合在了一起,且没有顺序,我们难以辨别题目真正要考察什么问题,无法辨别问题的类型,从而无法正确地运用所学知识解决问题。拿到生活上来说,你遇到的问题也是没有顺序,且都是混合在一起的,你难以辨别各个问题之间的差异,不清楚要解决的问题到底是什么,从而无法选取合适的解决方案解决问题。 面对这种现状,前面提到的穿插不同内容类型的学习方式能帮到你。简单来说,就是在当前学习内容掌握的还不熟练的情况下,跳入下一阶段的学习,这种方式比在当前学习内容练习熟练后,再顺序进入下一阶段的学习方式,效果要好。例如,你在学完数组,哈希表,树,堆等数据结构后,在练习时,要在数组还未掌握熟练时,就进入树的练习,而不是等到完全掌握熟练一项内容才进入下一阶段的练习,你不能每学一样知识,待熟练后才进入下一阶段,应该以随机非顺序的方式进行,这种非顺序的穿插不同类型的学习方式能促进知识的活学活用。 这种学习方式如果转换到专栏学习的话,相当于在一个章节内容还未熟练的情况下就要进入下一章节的学习,比如,在学习完专栏章节1,2,3后,从章节2开始练习,待初步掌握,还未熟练时,进入章节1的练习,然后在未熟练时又进入章节2的学习,这种在练习期间,穿插各种不同学习内容的方式,比大量练习同一主题内容完全熟练后,再进入别的主题学习,效果要好得多,书中说的是远好于。 这样看来,这种学习方式还是很适合学习难度高的专业知识的,它能使所学知识停留在长期记忆,并能促进知识的活学活用,你一定不想体会辛辛苦苦好不容易学完算法后,在下一次要用到时想不起来的尴尬境地,或者在遇到综合各种算法问题时,束手无措的苦苦挣扎,而以上的学习方式或许能帮到你。

    2021-01-11

  • Harvey 👍(10) 💬(1)

    你好,华仔: 问题:关于链式学习 。如何才能画出一个技能的领域分层,能否提供具体的指导原则和标准? 举例:对于一个不了解netty的人,肯定是画不出来这个图,可能只会只会想到第二层,或者想到的层次的技术不对,这些都会影响链式学习的效果。所以我的思考是能画出一个领域图就是一个学习的路径,剩下的就是行动+具体的学习方法。 课程总结 链式学习:对于我而言优先选择这种方式,业务开发且先需要先掌握几个深度学习的案例。对于如何画出领域和技术细分模型,还没有具体实施过。 (1)对于领域模型的划分我能想到的是首先会列一个netty的学习框架,根据这个框架抓住重点和难点。对于下一个层次该学什么,就需要看专业类的书籍,根据经典书籍在确定下一层学什么。 (2)技术细节的划分可以使用华仔的四层模型,但对设计原理和设计方案之间的区别还不清楚,需要在实际过程中找出之间的概念。 (3)关于领域划分的每个层次学习的权重华仔也给出了具体的建议,可以参考。对于领域底层的知识,先掌握原理,毕竟通过6个月学习一个技能需要在时间上计划好,尤其是对最底层的知识。 比较学习:比较学习需要多问为什么,5w,7w2h等方式。 环式学习:对于此方式主要提升技术广度。要在目前手上的工作内容画出业务和技术的环图,优先处理重点和难点的业务和技术。对于我而言业务的闭环也非常重要,之前对于业务闭环做的还不够,更多的都是在某一个功能点,可以参考产品思维。

    2021-01-13

  • 欧阳娜 👍(4) 💬(1)

    环式学习法,在一定深度上,拉长和拉宽不是一样的吗?怎么还有宽度和广度?

    2021-04-11

  • 👍(3) 💬(1)

    我觉得我是更注重解决问题的能力,而不是只限于技术,大差不差的情况下有些细节技术能力没必要深究,毕竟要花费很多精力,结果只是为了解决一个不大的问题。

    2021-07-28

  • Monday 👍(3) 💬(2)

    链式学习法的第一步,就是要明确一项技术的深度可以分为哪些层。 具体来说,就是画出“领域分层图”和“细节分层图”。一开始你可能会觉得画不出来,这恰恰说明你对深度的理解还不够,而尝试画图本身就是一个梳理结构、强化认知的过程。 怎么分解出领域分层图和细节分层图狠关键啊,有点类似于项目的架构设计,后面每个细节的学习就相当于开发实现。 使用链式法的分层方法可否来一个加餐章节,多举几个例子,比如 1、学习上节提到的unix/linux 2、上节提到的安全 3、mybatis,MySQL,Redis,spring,Java多线程, 。。。。 当然我也会自己试着去分层

    2021-01-13

  • Hesher 👍(2) 💬(2)

    换个思维,面试别人的时候,为了有得可问,你就要深入下去,直到你知道了哪里是最深的地方,达到了这个深度,才会在面试候选人时更有信心、更有底气。就算你不是面试官,也可以定期找同事玩玩模拟面试,共同成长,双赢合作。没准也是个另辟蹊径的学习方法。 从深度、宽度、广度被面试难倒的情况全都遇到过,不过并不遗憾,毕竟当时是真的不会。如同学生时期期末考试前临时抱佛脚的感觉,这反而是认识自己和增加学习动力的契机。

    2021-03-30

  • 受超凡 👍(1) 💬(2)

    老师说到了netty有个问题请教下,tomcat高版本也支持nio了,netty除了支持不同的协议外和tomcat高版本有什么区别吗,性能一定比tomcat的nio好吗?

    2021-07-21

  • xin 👍(1) 💬(1)

    看了才知道之前多浪费时间

    2021-04-23

  • 👍(1) 💬(1)

    感觉后台开发要学好多知识,华仔有推荐的学习线路吗?

    2021-01-12

  • leon 👍(0) 💬(2)

    华仔可以介绍下kafka的领域分层图和细节分层图吗?

    2023-11-30

  • Geek_798202 👍(0) 💬(1)

    熟悉业务功能这块很有体会,如果对业务不熟悉的话,在设计和开发功能这块很吃亏,第一次听到这个环式学习法,感觉学习还是需要方法,事半功倍

    2023-08-23

  • 一步 👍(0) 💬(1)

    技术宽度和技术广度有什么区别?

    2022-02-04

  • 受超凡 👍(0) 💬(1)

    如果对一项技术本身就不了解,如何画领域和细节分层图呢?感觉如果能画出来好像已经理解了很多了。学习方法太重要了,以前浪费了不少时间,看的不少却没什么效果,这三个学习方法就是指路明灯。

    2021-07-16

  • 逍遥乐古今 👍(0) 💬(2)

    这一讲的领域分层图和上一讲分解技能画出xmind知识思维导图,有什么先后顺序吗?学习某项技能时,应该怎么做呢?

    2021-05-30

  • 起而行 👍(0) 💬(2)

    老师请问细节分层图中的设计原理和设计方案有什么区别呢~

    2021-03-29