高效学习小结(待完善)

概要

学习态度-->源头、原理和知识地图深度、归纳和坚持实践学习、阅读源码面对量大和枯燥的知识。

学习步骤、知识地图、学习技术模板、举一反三训练、总结归纳、实践坚持、阅读文档与源码、两大与枯燥的知识。

如何构建知识体系:学习技术模板、坚持实践、技巧[文档、源码、思考-举一反三、实用技巧]

如何学习一门课程:流程:信息源、原理整理、总结归纳、实践形成知识地图对比、举一反三进一步总结归纳

一、端正学习态度

1、学习态度:自律、探索、实践;
2、主动学习:讨论、实践、传授他人的知识留存率:50%、75%、90%;
3、深度学习:高质量信息源、知识连成地图、反思思辨 & 举一反三、实践 & 转换成技能;
      步骤:1)、知识采集:信息源,破解表面信息的内在本质,多方数据验证;
          2)、知识缝合:信息组织,成为结构体。连接记忆、逻辑推理、知识梳理很重要;
          3)、技能转换:举一反三、实践和练习和传授教导,把知识转换成技能。
4、找到学习方法。掌握解题思路和方法,才算拥有解决问题的能力,找到通往答案的路径和方法,拥有无师自通的能力。
5、找到原理。通过某个事表面去探索内在本质和原理。要不断追问,这个技术出现的初衷是什么?解决什么问题?为什么要用这种办法?为什么不用别的办法?为什么不能更简单一些...
6、了解与改变自己。

7、小结
学习态度:自律
学习步骤:  1、知识采集:信息源,破解表面信息的内在本质,多方数据验证。
                2、知识缝合:信息组织,成为结构体。连接记忆、逻辑推理、知识梳理很重要。
                3、技能转换:举一反三、实践和练习和传授教导,把知识转换成技能。
学习目的:学习方法、找到原理、了解自己、改变自己。
感受:今天最大的收获就是如何进行深度学习:知识采集、缝合、转换成技能!

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

1、挑选知识和信息源:社区>谷歌>百度;一手资料、权威人士或公司,被时间检验、加入自己经验与思考,引发深思的。
2、注重基础和原理。基础知识和原理性的东西和技术,经过长时间考验的。学的多就会思考的多,然后对比多,对比多就会学的更快。
3、知识地图。

联想记忆法,面对《C++ Primer》,把C++分成3部分。
第一部分:解决C语言的问题。指针、宏、错误处理、数据拷贝… C++用什么技术来解决这些问题呢?
第二部分:C++的面向对象特性:封装、继承、多态。 封装构造函数、析构函数初始化列表默认析构函数、拷贝构造函数、new…多态虚函数RTTdynamic_cast和typeid。
第三部分:C++的泛型编程。template、操作符重载函数对象STL数据容器iterater通用算法,等等
“顺藤摸瓜”,从知识树主干广度遍历或深度遍历,得到一棵树的知识树。 最重要的是,当出现一些不知道的知识点时,就会往这颗知识树上挂,这样一来,使得学习变得更加系统和全面。
学习不是为了记忆知识点,而是为了找到一个知识地图,你能在这个地图上通过关键路径找到你想要的答案。

4、小结
本节主要介绍了从源头出发,抓住根本原理,利用知识图工具构建自己的系统知识体系。

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

1、技术学习模板:
1)技术出现的背景、初衷和要达到什么样的目标或是解决什么样的问题。  这个问题很重要,因为学习一个技术的时候,需要知道技术的成因和目标,也就是这个技术的灵魂。如果不知道,那会看不懂这个技术的一些设计理念。
2)这个技术的优势和劣势分别是什么,或者说这个技术的trade-off是什么。任何技术都有好坏,解决一个问题,也会带来新的问题。一般来说,任何设计都有trade-off(要什么和不要什么),所以要清楚这个技术的优势和劣势,以及带来的挑战。
3)这个技术适用的场景。任何技术都有适用场景,离开这个场景,这个技术可能会有很多槽点。所以学习技术要知道这个技术是什么,还有知道适用的场景。场景一般分两个,业务场景和技术场景。

技术的组成部分和关键点。这是技术的核心思想和核心组件了,也是这个技术的灵魂所在了。学习技术的核心部分是快速掌握的关键。
4)技术的底层原理和关键实现。任何一个技术都有其底层的关键基础技术,这些关键技术很可能是其他技术的关键基础技术。所以,学习这些关键的基础底层技术,可以让你在未来很快掌握其他技术。(可参看CoolShell上的Docker底层技术那一系列文章。)
5)已有的实现和它之间的对比。一般来说,任何一个技术都会有不同的实现,不同实现会有不同的侧重。学习不同的实现,可以让你得到不同的想法和思路,对于开阔思维,深入细节非常重要的。

2、举一反三能力训练
 联想能力。这种能力的锻炼需要平时就不停地在思考同一个事物的不同的用法,或联想与之有关的别的事物。对于软件开发和技术学习也一样。
 抽象能力。抽象能力是举一反三的基本技能。平时解决问题的时候,如果能对这个问题进行抽象,就可以获得更多的表现形式。抽象能力需要找到解决问题的通用模型,比如数学就是对现实时间各种问题的建立成数据模型(如:建立各种维度的向量),我们就可以用数学来求解,这也是机器学习的本质。
  自省能力。所谓自省能力就是自己找自己的难看。当你找到一个解的时候,要站在自己的对立面来找这个解的漏洞。有点像左右手互博,这种自己和自己辩论的能力又叫做思辨能力,将自己分裂成正反方、左右方,甚至多方,站在不同的立场上来和自己辩论,从而做到不漏过一个case,从而获得完整全面的问题分析能力。
 
训练:
        对于一个场景,制造出各种不同的问题或难题。
        对于一个问题,努力寻找尽可能多的解,并比较这些解的优劣。
        对于一个解,努力寻找各种不同的测试案例,以图让其健壮

3、总结归纳
开始要多见,可以保留部分知识的不确定性。理解深入后可以对知识回顾和重组,把看到学习到信息,规整好、排列好、关联好,把信息碎片结构化掉,找到规律。简化总结,形成套路、模式或通用方法。
方法:多阅读,读经典方法论图书;
          写博客,学会删减、精炼、归纳信息,抓重点,锻炼化繁为简的能力;
         与聪明人一起共事。

4、实践坚持
实践才能有更好的体会,理解为什么,还有要训练出好的思维方式。如:《Effective C++》和《More Effective C++》
Grow up through the pain.

坚持:
ARTS活动:A-Algorithm是一道算法题;  R-Reivew是读一篇英文文章;
                  Technique/Tips是分享一个小技术;  S-Share是分享一个观点。
把成果晒出来,有成就感的正向循环; 要形成习惯,如吃饭喝水不费力。

5、小结
以上几个模板能够很好地用在平时的学习与工作中,非常棒的方法论。  要点:知识脑图学习模板、举一反三、总结归纳、实践坚持。

四、学习、阅读源码

1、文档 VS 代码
文档:系统、Why、思维方式、结构化、思想、方法、思路、经验
代码:细节
感性认识到理性认识,开始多动手,后面多理论,做漂亮,多交流。

2、如何读源码
有以下前提会更顺畅:
基础知识。相关语言和基础技术的知识。
软件功能。要知道这个软件完成是什么样的功能,有哪些特性,哪些配置项。要先读一遍用户手册,先用一下感受一下。
相关文档。读下相关内部文档,Readname、Release Notes、Design、Wiki等,可以帮助你理解整个软件的方方面面,如果没文档,你只能指望这个软件原作者还在,而且乐于交流。
代码组织结构。也就是代码目录中每个目录是什么样的功能,每个文档是干什么的。如果你要读的程序是某种标准框架下组织的,比如:Java的Spring框架,那么恭喜你,这些代码不难读了。

代码构成列表:
接口抽象定义。任何代码都会有很多接口或抽象定义,其描述了代码需要处理的数据结构或抽象定义,其描述了代码需要处理的数据结构或业务实体,以及之间关系,理清楚这些关系很重要。
模块粘合层。很多代码是用来粘合代码的,如中间件(middle)、Promises模式、回调(Callback)、代理委托、依赖注入等。这些代码模块间粘合技术非常重要,因为它们会把本来平铺直述的代码给分裂开来,让你不容易看明白他们的关系。
业务流程。这是代码运行的过程。一开始,不要进入细节,但需要在高层搞清楚整个业务流程是什么样的,在这个流程中,数据是怎么被传递和处理的。一般来说,需要画程序流程图或时序处理图。
具体实现。了解上面内容能够让你对整个代码框架和逻辑有了整体认识,这个时候,你就可以深入细节,开始阅读具体实现的代码了。对于代码的具体实现,一般来说,知道下面事实有助于你在阅读代码时找到重点。
–代码逻辑。代码有两种逻辑:业务和控制逻辑。分别是真正业务处理逻辑和只是用程序程序流转(如flag类控制变量,多线程处理代码,一部控制代码,远程通讯代码,对象序列化反序列化的代码等。) 两种逻辑要分开,否则会很混乱。详见《编程范式游记》
–出错处理。根据2:8原则,20%代码是正常逻辑,80%是处理各种错误。所以,读代码时,完全可以把处理错误的代码全部删除,这样会留下比较干净和简单的正常逻辑的代码。排除干扰因素,可以更高效地读代码。
–数据处理。只要认真观察,很多代码是倒腾数据。如DAO、DTO,如JSON、XML,这些代码冗长无聊,不是主要逻辑,可以不理。
–重要算法。代码里会有很多重要算法,不一定是排序或搜索算法,可能是一些其他核心算法,如索引表算法、全局唯一ID算法、信息推荐算法、统计算法、通读算法(如Gossip)等。这些核心算法可能非常难读,但它们往往是最有技术含量的部分。
–底层交互。有一些代码和底层系统交互,一般来说是操作系统或是JVM的交互。因此,读这些代码通常需要一定的底层技术知识,不然很难读懂。
5、运行时调试。很多时候,代码只有运行起来,用日志、debug。实际看一下代码运行过程,是了解代码一种很好的方式。

总结一下,阅读代码方法如下:
–一般采用自顶向下,从总体到细节的“剥洋葱皮”的读法;
–画图是必要的,程序流程图、调用时序图、模块组织图…
–代码逻辑归类,排除杂音,明晰主要逻辑。
–debug跟踪下代码是了解代码执行中发生什么的最好方式。

3、小结
探讨了读代码 VS 读文档 的各自收获与适用情况。思想、方法、原理读书, 具体细节读代码。 然后是代码的构成与阅读方法。

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

1、枯燥:如线性代数、操作系统内部原理…抽象度高、很理论
     通过下面的方法来解决。
       这个知识对你来说太高级了,你可能不知道用在什么地方。
       积累感性认识。找一下应用场景,学点更实用的,再回来学理论。
       有反馈,有成就感,带着相关问题去学习会更好。
       找牛人讲解。
2、量大
学到本质原理;带着问题/解决的东西/挑战去学习,找到学习驱动力;学会分享。

3、认真阅读手册。
4、实用技巧
     不同方式学,如看书、听课、创建脑图、写博客、讲课、解决实际问题等待。
     不要被打断;总结压缩,关键点、表格、图示、笔记或脑图。把未知关联到已知。教别人、学以致用、找方法,推导知识;多犯错误,不犯低级错误与重犯错误。

七、参考

源自极客专栏的左耳朵耗子。

你可能感兴趣的:(学习方法)