跳到内容
Caiden's Blog
返回

《左耳听风》里的高效学习方法论

读《左耳听风》里面关于如何高效学习的总结笔记

一、端正学习态度

1.1 认识学习金字塔

学习分为被动学习和主动学习:

被动学习时听别人在讲、我们在被动的接收他人的思想,被他人灌输,所以留存率并不会很高; 但是主动学习,是自己在思考论证、在操作和在输出,这才是自己掌握的学习能力。

1.2 深度学习

深度学习就是通过自己实际操作进行学习,一定要实操,比如学习英语,就要找人不断的说和讲,而不是死记硬背单词。 并且学习不是努力读更多的书,盲目追求阅读的速度和数量,这会让人产生低层次的勤奋和成长的感觉,这只是在使蛮力。要思辨,要践行,要总结和归纳,否则,你只是在机械地重复某件事,而不会有质的成长的。 深度学习的关键点,换言之,如何进行深度学习?

1.3 学习三个步骤

要注意的是,学习不仅仅是为了找到答案,更是为了找到方法,只有掌握解题的思路和方法,才算拥有解决问题的能力,此外,还要不仅仅局限于知道,要学会理解和思考;学习的目的就是发现自己的不足和上升空间,从而才能让自己成长。学习是为了改变自己的思考方式,改变自己的思维方式,改变自己与生俱来的那些垃圾和低效的算法。总之,学习让我们改变自己,行动和践行,反思和改善,从而获得成长。

二、源头、原理和知识地图

2.1 挑选知识和信息源

要学会挑选信息源,一般要满足以下几点

2.2 勿在浮沙筑高台:注重基础和原理

如果了解底层的 Socket 编程,了解多路复用和各种 I/O 模型(select, poll, epoll, aio, windows completion port, libevent 等),那么,对于 Node.js、Java NIO、Nginx、C++ 的 ACE 框架等这些中间件或是编程框架,你就会发现,无论表现形式是什么样的,其底层原理都是一个样的。 无论是 JVM 还是 Node,或者是 Python 解释器里干了什么,它都无法逾越底层操作系统 API 对“物理世界”的限制。而当你了解了这个底层物理世界以后,无论那些技术玩成什么花样,它们都无法超出你的掌控(这种感觉是很爽的)。 说白了就是了解底层,上层应用都是基于底层的,而且底层的基础知识和原理类的知识,都是经历过长时间考验的,也是历史上任务的智慧结晶,比如:TCP 协议的状态机,可以让你明白,如果你要设计一个异步通信协议,状态机是一件多么重要的事,还有 TCP 拥塞控制中的方式,让你知道,设计一个以响应时间来限流的中件间是什么样的。

3.3 使用知识图谱

大概意思就是,可以让自己把类似的知识归类,并且,学习一门新技术,要问自己,学习这个新知识的目的是什么,他解决了旧知识的什么痛点,又是如何解决的,为什么这样解决

三、深度,归纳和坚持实践

3.1 系统的学习

学习某个新技术,要多问自己几个为什么,建议通过填写以下知识模板的问题,都了解了,才算是自己学习了这个技术了

3.2 举一反三

如何学会举一反三?首先咱们拆分下举一反三的能力,可分为以下三种基本能力

如何训练自己举一反三的能力?

3.3 总结归纳

做总结归纳的方法:把你看到和学习到的信息,归整好,排列好,关联好,总之把信息碎片给结构化掉,然后在结构化的信息中,找到规律,找到相通之处,找到共同之处,进行简化、归纳和总结,最终形成一种套路,一种模式,一种通用方法

3.4 实践出真知

要学以致用,别空谈理论,实践是很累很痛苦的事,但只有痛苦才会让人反思,而反思则是学习和改变自己的动力。

3.5 坚持不懈

说到底还是靠坚持,当然,坚持也不是要苦苦地坚持,有循环有成就感的坚持才是真正可以持续的。所以,一方面你要把你的坚持形成成果晒出来,让别人来给你点赞,另一方面,你还要把坚持变成一种习惯,就像吃饭喝水一样,你感觉不到太多的成本付出。只有做到这两点,你才能够真正坚持

四、如何学习和阅读代码

4.1 读文档还是读代码

杰夫·阿特伍德(Jeff Atwood)说过这么一句话:“Code Tells You How, Comments Tell You Why”。

如果你想了解一种思想,一种方法,一种原理,一种思路,一种经验,恐怕,读书和读文档会更有效率一些;如果你想了解的就是具体细节,比如某协程的实现,某个模块的性能,某个算法的实现,那么你还是要去读代码的。

4.2 如何阅读源代码

建议满足以下条件后再去阅读源码:

  1. 基础知识:要有相关语言的基础技术知识
  2. 软件功能:要熟悉这个玩意儿到底是干啥的,有啥功能特性
  3. 相关文档:要读过阅读软件的相关文档,Readme 也好,Release Notes 也好,Design 也好,Wiki 也好,这些文档可以让你明白整个软件的方方面面
  4. 代码的组织结构:要知道每个包都是干啥的,每个目录都是啥样的功能

然后接下来可以了解这个软件是由哪部分代码构成的

  1. 接口抽象定义:任何代码都会有很多接口或抽象定义,其描述了代码需要处理的数据结构或者业务实体,以及它们之间的关系,理清楚这些关系是非常重要的。
  2. 模块粘合层:中间件,代理委托,依赖注入等
  3. 业务流程:不必关心细节,站在高层看数据处理流向,一般自己画一个数据流程图或时序图
  4. 具体实现:上述三个理解了,大概心里有数了 ,现在可以看具体实现,但是看的时候要注意看重点
    • 注意业务逻辑和控制逻辑分开看:业务逻辑不必多言,就是业务处理逻辑;控制逻辑就是 flag 之类的控制变量、多线程处理、异步控制、RPC 调用及对象序列化反序列化这些
    • 出错处理:如果没有特殊情况,出错处理这些东西其实可以不太关注,排除此干扰因素,高效阅读代码
    • 数据处理:比如倒腾数据的 DAO、DTO 这些,不是主要逻辑,也可以不关注
    • 重要的算法(核心关注):比如信息推荐算法,全局唯一 ID 算法,一般都比较难读,但是也是最有技术含量的一部分
    • 底层交互:和操作系统或 JVM 的交互,通常需要底层知识,不然很难读懂
  5. 运行时调试:debug 一下,自己跑跑看看,会好很多

4.3 阅读代码步骤总结

五、面对枯燥和量大的知识

5.1 如何面对枯燥的知识?

一般枯燥的知识都是比较偏理论的

  1. 面对这个知识,要想一下自己为什么要学?然后先了解一下使用场景,学点实用的操作,再回过头看理论;比如说想学《TCP/IP 详解》,可以自己先试着写一个通过网络通讯的 demo 软件,然后再回过头来看,到底是咋做到的,就能收发消息了
  2. 学习需要反馈,要带着问题去学习,学完之后问题解决,这个反馈会很棒
  3. 找牛人讲解,也是不错的手段

5.2 如何面对大量的知识

  1. 一点一点学,一口一口吃,注重基础,画知识图,多问为什么,多动手,坚持
  2. 学习的目的,是要学到本质上,学到原理上,要经得住考验的,把学习当做投资
  3. 带着问题去学习,带着需要解决的挑战去学习,会获得源源不断的学习驱动力
  4. 多做笔记多分享,学习完毕及时输出
  5. 有条件的话可以找个同路人,有人同行会好很多;就算找不到,读者和观众也会给你点赞,这也是动力

分享到:

上一篇
递归算法总结
下一篇
语雀同步 hexo 方案设计