链式学习法:提升技术深度
如果你参加过晋升答辩,一定经历过评委的“追命连环问”,比如:
- 你在讲解 PPT 的时候提到,某个项目使用了 Netty 技术,评委首先会问你 Netty 的一些技术点;
- 当你回答说 Netty 的本质是 Reactor 网络模型时,评委又会问你 Reactor 网络模型的原理;
- 当你回答说 Reactor 的基础是 Java NIO 的时候,评委又会问你 Java 的 NIO/BIO 的技术细节;
- 当你回答说 Java 的 NIO 在 Linux 平台上是基于 epoll 来实现时,评委又问你 Linux 的 epoll/select 等的原理。
环环相扣的方式很有讲究。常见的方式有两种:
- 自顶向下、层层关联,打通一项技术的领域分层
- 由表及里、层层深入,打通一项技术的细节分层
同样以 Netty 网络编程为例,技术细节可以分为 4 层,它的细节分层图如下所示:
链式学习法的步骤
- 明确一项技术的深度可以分为哪些层
具体来说,就是画出“领域分层图”和“细节分层图”。一开始你可能会觉得画不出来,这恰恰说明你对深度的理解还不够,而尝试画图本身就是一个梳理结构、强化认知的过程。
- 明确你自己要学到哪一层
学得太浅,达不到提升深度的目的;学得太深,又会耗费太多的时间和精力。以 Netty 网络编程为例,从我自己实践和指导别人的经验来看,领域分层图的 6 层不用都学,大部分人学个 3~5 层就够了;不过细节分层图的 4 层,还是建议你每一层都学。
- 明确每一层应该怎么学
在领域分层图中,越往上越偏应用,实际工作中用得越多,越往下越偏原理(包括相关的工具和配置),实际工作中用得越少。所以总的原则是,在上层投入更多时间,更关注细节和熟练使用,在下层投入相对少的时间,更加关注原理和简单应用。
- 比如对于 Netty 网络的领域分层图,如果你不是 Netty 项目的开发人员,而是只想使用 Netty 来搭建自己的系统,那么“Linux 网络编程”这一层,你只要掌握 select/epoll 等技术原理和优缺点就行了,epoll 提供的 API 你有时间可以大概看看,没时间不看也可以;但是对于 Netty 本身提供的 API,则是越熟练越好。
- 在细节分层图中,你需要详细地学习每一层。要注意的是,对于“实现源码”这一层,你不需要去掌握每一行源码,只要掌握关键源码就行了,也就是和设计原理以及设计方案相关的源码。
链式学习法的优点
- 促使我们主动提升
- 将知识和技能系统化
链式学习法小结
- 链式学习法是让知识形成锁链,环环相扣,主要用来提升技术深度。
- 链式学习法的步骤包括:明确一项技术的深度可以分为哪些层,明确要学到哪一层,明确每一层应该怎么学。
- 链式学习法的优点有:促使我们主动提升,将知识和技能系统化。
比较学习法:提升技术宽度
如果你有过晋升 P7 或者更高级别的经历,肯定被问到过大量跟“Why”有关的问题,比如:
- 为什么选择 Redis,为什么不用 Memecached?
- 为什么选择 MySQL 而不是 Redis?
- 选择 Flink 的理由是什么?(除了 Flink 本身的技术特点外,还需要你回答为什么选择 Flink 而不是 Spark 或者 Storm。)
所谓比较学习法,就是横向比较同一个领域中类似的技术,梳理它们异同,分析它们各自的优缺点和适用场景。
比较学习法的步骤
- 先用链式学习法掌握某个领域的一项技术,将这个领域的关键技术点整理成表格。
- 基于整理好的技术点,学习这个领域的另一项技术,将它们在技术点上的差异整理成思维导图。
- 找出差异较大的技术点,将背后的原理和对应用场景的影响整理成表格。
以缓存领域的 Memcache 和 Redis 为例:
- 先用链式学习法掌握 Memcache 技术,整理出缓存领域的 6 个关键技术点
- 基于这 6 点快速掌握 Redis 技术,整理出 Memcache 和 Redis 在这些点上的差异
- 找出差异较大的技术点,包括并发方案、数据结构、高可用和持久化,整理出它们背后的原理和对应用场景的影响
比较学习法的优点
- 学得快
- 学得全
- 学得深
比较学习法小结
- 比较学习法是横向对比,让选择有理有据,主要用来提升技术宽度。
- 比较学习法的步骤包括:整理领域关键技术点,整理不同技术的差异点,整理差异点背后的原理和对应用场景的影响。
- 比较学习法的优点有:学得快,学得全,学得深。
环式学习法:提升技术广度
所谓环式学习法,就是构建一个完整的闭环过程,将多个领域的“鱼”一网打尽。
技术上常见的闭环是功能环,代表某个功能的处理过程。以一个最简单的“用户登录”为例,如果它的实现方式是前端在手机 App 上用做登录页面,后端用了微服务架构来存储,那么就可以构建这样一个功能环:
这里要说明一点,环式学习法更加适合业务系统相关的技术人员,而不太适合中间件(数据库、缓存、消息队列和服务中心等)相关的的技术人员,因为中间件的技术更加专注于深度和宽度,和具体的业务关系不大,对技术广度的要求并不高。
环式学习法的步骤
- 把闭环画出来
具体的画法是将完整的闭环分为几个关键的环节,然后标出每个环节的关键内容。
- 就拿“用户登录”这个功能环来说,它可以分为前端、客户端、网络层、机房入口、Nginx、用户中心、安全中心和数据中心,总共 8 个环节;每个环节又会涉及不同的技术,比如客户端涉及 JsBridge 和 OkHttp,用户中心涉及微服务、MySQL 和 Redis 等,总共涉及的技术有 18 项。
- 由近及远,逐步攻克闭环上的各个节点
提升业务能力也很重要
常见的吃亏场景包括:
- 讨论需求的时候,因为不懂业务,就算产品的业务需求不合理、实现代价很高,你也发现不了。结果到了设计甚至是编码阶段,你才发现自己做得累死累活,效果还不好。
- 处理线上故障的时候,因为不熟悉业务,只能被动接受别人的分析和推断,很容易背锅。
- 因为不熟悉业务,无法承担整体需求分析和方案设计这种任务,导致个人能力得不到锻炼,失去很多晋升机会。
以下是用户登录的业务环,供你参考。
环式学习法的优点
- 培养全局视野
- 避免盲目地广撒网却捞不到鱼
环式学习法划定的范围是实际工作的闭环,能够形成一套有效的组合拳,而不是东一榔头西一棒槌的胡乱搭配,能够大大提升学习效率。所以你只要对照环来提升就可以了,不用再担心广撒网却捞不到鱼了。
环式学习法小结
- 环式学习法是构建闭环,打出组合拳,主要用来提升技术广度。
- 环式学习法的步骤包括:先把闭环画出来,然后由近及远,逐步攻克闭环上的各个节点。
- 环式学习法的优点有:培养全局视野,避免盲目地广撒网却捞不到鱼。