高效学习 ######## 01 | 端正的学习态度 为什么需要端正的学习态度 没有端正的学习态度,学习可能是一件得不偿失的事情,事倍功半,很难获得真正的收获 时间容易被没有营养的事情占据,快速、简单、轻松的事情给人带来的快感更强烈 快餐文化盛行,绝大多数人都急于速成,心态比较浮燥,对事物不求甚解,“什么都懂,依然过不好这一生” 学习是逆人性的事情,需要持续付出,让人感到痛苦,随时想要放弃 什么是端正的学习态度 有目标、方向 有方法、技能 有行动、坚持 贯穿着不断思考探索实践 目标、方向 找到方法 学习是为了找到通往答案的路径和方法,是为了拥有无师自通的能力 找到原理 思考、理解整个事情的内在本质、逻辑和原理,复杂变得简单,问题一通百通 了解自己 找到未知的自己,发现自己的不足和上升空间,从而才能让自己成长 改变自己 改变自己的思维方式,改变自己与生俱来的那些垃圾和低效的算法,行动实践,反思改善,获得成长 方法、技能 被动学习变为主动学习,不是盲目的追求阅读的数量与速度 思考、探索 总结、归纳 讨论 实践 教授他人 浅度学习变为深度学习 知识采集 获取信息源头 破解表面信息的内在本质 多方数据印证 知识缝合 连接记忆:把信息组织起来 逻辑推理:把知识连成地图,成为结构体知识 知识梳理:用自己的理解反述出来 技能转换 举一反三:不断地反思、思辨 实践和练习:与不同年龄段人讨论 传授教导 02 | 源头、原理和知识地图 挑选知识和信息源 优质的信息源,让你事半功倍 是第一手资料,原汁原味,没有被添油加醋 有佐证、数据、引用,或是权威人士或大公司生产系统背书的资料 加入自己的经验和思考,引人深思的文章 信息源推荐 google搜索 Stack Overflow问题 wiki定义 Medium文章 注重基础和原理 基础和原理无比重要,经过长时间的考验,是人类历史的智慧结晶,会影响对事物的理解,“勿在浮沙筑高台” 基础和原理会给我们带来很多启示和帮助,许多技术一通百通 学习基础和原理,类似于“蓄力拉弓射箭”,枯燥、工作用不到,但为了未来学得更快 使用知识地图 从知识主干进行深度和广度遍历,联想记忆得到整个知识树 将未知的知识点挂到知识树的合适位置,学习更为系统全面 使用知识树不是为了记忆那些知识点,而是为了找到知识地图,可以快速的检索想要的答案 03 | 深度,归纳和坚持实践 系统的学习 模板 背景:技术出现的背景、初衷 目标:要达到什么样的目标,或是要解决什么样的问题 优劣势:这个技术的优势和劣势分别是什么,或者说,这个技术的trade-off是什么 适用场景:业务场景,技术场景 核心组成及关键点:技术的核心思想和核心组件,学习技术的核心部分是快速掌握的关键 底层原理和关键实现:学习这些关键的基础底层技术,可以让你未来很快地掌握其它技术 已有实现与之对比:学习不同的实现,可以让你得到不同的想法和思路,对于开阔思维,深入细节是非常重要的 举一反三 联想能力:这种能力的锻炼需要你平时就在不停地思考同一个事物的不同的用法,或是联想与之有关的其他事物 抽象能力:把现实世界的各种问题建立成数据模型,用数学来求解(机器学习的本质) 自省能力:自己和自己辩论的能力,获得完整全面的问题分析能力 训练 对于一个场景,制造出各种不同的问题或难题 对于一个问题,努力寻找尽可能多的解,并比较这些解的优劣 对于一个解,努力寻找各种不同的测试案例,以图让其健壮 总结归纳 本质上是信息重构的过程 将信息规整、排列、关联,将碎片化知识结构化 找规律,找相通,找共同,进行简化归纳总结 形成套路,模式,通用方法 训练 模仿聪明人,比如经典的方法论图书,身边的朋友 写博客,将信息删减、精炼、归纳 讲给别人听,接收批评和反馈 实践出真知 学以致用,才能对学到的东西有更深的理解 吃自己的狗粮,你才能够有最真实的体会。实践是很累很痛苦的事,但只有痛苦才会让人反思,而反思则是学习和改变自己的动力 坚持不懈 坚持形成成果并晒出 把坚持变成一种习惯,像吃饭喝水 04 | 如何学习和阅读代码 代码&文档 代码:what、how、detail 想要知道让机器干了什么,看代码 学习编码技巧 需要感性认识时 文档/书:what、how、why 想要知道为什么这么搞,看文档/书 了解一种思想,一种方法,一种原理,一种思路 需要理性认识时 阅读源码前的准备 拥有基础知识 相关的语言和基础技术的知识 了解软件功能 读一遍用户手册,知道这个软件完成的是什么样的功能,有哪些特性,哪些配置项 让软件跑起来,自己使用并感受 读过相关文档 读一下相关的内部文档,明白整个软件的方方面面,例如:Readme、Release Notes、Design、Wiki 如果软件没有文档,和软件作者交流 了解代码的组织结构 代码目录中每个目录完成什么功能 很好的IDE 可以查看代码间相互的调用 reference 的工具,提升代码阅读效率(例如:Visual Studio) 阅读源码的技巧 从总体开始,总体认识整个代码框架和逻辑, 接口抽象定义 描述了代码需要处理的数据结构或者业务实体,以及它们之间的关系 模块粘合层 这部分代码用来粘合代码,将平铺直叙的逻辑割裂,增加阅读难度 例如中间件(middleware)、Promises 模式、回调(Callback)、代理委托、依赖注入等 业务流程 一开始不要进入细节,在高层搞清业务流转,及数据如何传递及处理 一般需要画流程图、时序图、模块组织图 到具体细节,排查杂项,关注主要逻辑 代码逻辑,将控制逻辑和业务逻辑拆分 控制逻辑包括flag类的控制变量、多线程处理代码、异步控制代码、远程通讯代码、对象序列化反序列化代码 出错处理,将错误处理代码全部删掉 20%正常处理,80%异常处理,排除干扰项,更高效阅读代码 数据处理,各种数据转换,不是主要逻辑,不用关注 重要的算法,非常难读,但最具技术含量 底层交互,一般和操作系统或JVM交互,需要一定的底层知识,否则没必要读 运行时调试,最好的了解过程的方式 运行起来才知道具体发生了什么,使用日志或debug断点跟踪 源码项目推荐 opengrok 05 | 面对枯燥和量大的知识 为什么会有枯燥的知识 不知道有什么用的知识,没有兴趣 太抽象太底层的知识,太难理解 如何学习枯燥的知识 学习时不要被打断,给自己创造能够专注学习的空间和时间 教的方式学,高标准可以学的更好,做到百问不倒 学习需要有反馈,带着问题去学习,增加成就感 先学习应用场景,再回来学习理论,从感性认知到理性认知 写博客,总结压缩知识,挑出关键点构建成可以快速关联检索的内容,思维导图、图示、表格等 未知关联到已知,学得更扎实,思考更深刻 用不同的方式学习同一个知识 输入:图文并茂的书籍/资料、视频课程、面对面课程、牛人讲解 输出:教授他人 学以致用,多犯错误(非低级,非重复) 实践有真实的体会、细节、具体问题,让人重新思考,深度学习 错误会带来更深刻的认识 不要记忆,要找到推导知识的方法 如何面对大量知识 饭一口一口吃,知识一点一点学,只要你坚持一直在进步,总有一天把所需知识都学到手 学无止境,一定要学到本质、原理,这些东西不容易变,学习是最好的投资 找到源源不断的动力去学习 带着问题、挑战去学习,解决问题、完成挑战,提升兴奋度和成就感 知识分享,心得、过程、笔记,找到同行的人或读者