如何学习源码 | 如何高效学习一个新知识
正文:共1256字
预计阅读时间:2min30s
什么时候看源码
对于复杂的开源项目,一上来就看源码是不合理的,可能导致效率低下,适得其反。
往往看一个开源项目源码前,我们会经历以下几个阶段:
- 刚接触一个开源项目,跟着官方文档,运行一些demo实例
- 在工作项目中应用、实践、踩坑
- 能够熟练使用,了解它的一些设计思想,但是还不知道设计原理
经历过以上几个阶段后,就是开始看源码的最佳时期
如何看源码
1. 检索收集信息
如果你不是一个走在行业最前端的人,那么你踩过的坑,一定有前人踩过。你想学的东西,也一定有前辈早已研究透彻。
如果一定有人走过我们要走的路,那么我们就应该利用好这个互联网大世界,在踏出征途前,先从无数优秀前辈身上,汲取一些“旅行攻略”。
不光是学习源码,对于绝大多数我们即将要做的事情来说,检索收集信息都应该是第一步,甚至要放在计划制定之前。
学习开源项目源码之前,带着它的名称 + “如何学习” 作为关键词,检索信息,对于我们程序员,甚至可以先搜一搜这个项目相关的面试题。
这有助于我们用最短的时间,去了解这个项目最值得我们学习的地方,让我们更加清楚我们想要什么;也有助于我们收集学习资料,提高学习效率。
2. 宏观了解
从全局的视角去了解整个项目,这有助于形成整体的知识结构,上来就从细微处硬啃,效率极低。
可以从以下几个方面着手:
- 项目的背景
- 项目解决的问题
- 浏览代码仓库,了解其Issue报告规则、PR规则、贡献规则、开发环境...
- 源码的目录结构
- 项目的元数据。例如package.json,看看项目的依赖/脚本
- 构建方式,运行环境,入口,构建输出
- 项目的历史版本和当前版本的区别,未来的发展方向
- 项目的技术选型:项目的技术依赖,优化方案,类型控制,格式检查,代码规范,API接口设计,单元测试等
3. 重点切入
有了你对项目的熟练使用,有了对项目设计思想的了解,有了对项目整体的认知,那么我们就可以开始带着问题细啃源码,去了解这个项目的重点的实现原理。
- 比如这个项目最重要的核心思想,是如何实现的;
- 比如你在实践中经常踩坑的点,是如何产生的;
- 比如那道最高频的面试题,面试官到底想考我们什么;
- 比如那些你在实践中经常用到的特性,是如何实现的
- ...
带着这些切入点去看源码,逐一击破,最终就可以建立一个完整的知识体系。
4. 模仿实现
当掌握了项目的宏观结构 + 重点特性的实现原理后。就可以开始自己动手,尝试实现一个类似的简单小项目。
这个项目不需要完整的重复造轮子,不需要完美的关注细节,只需要把我们所学到的结构应用其中,把关键特性模仿实现即可。
这个过程有助于我们查漏补缺,在自己动手踩坑的过程当中,把学到知识融会贯通。
5. 开源贡献
当我们掌握了知识之后,根据费曼的以教为学的方法,我们最后应该做的就是输出
。比如:
- 输出学习总结
- 反馈项目社区:参与共建,做开源贡献,解决issue,做插件开发
举一反三
这套方法其实适用于绝大多数知识体系的学习
- END -
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python 技巧篇-开头注释怎么写最好,开头注释需要包含什么,开头注释的重要性
- 在CentOS8下安装Python3和ansible
- 开发一个属于自己的Spring Boot Starter
- 如何让Tomcat使用APR连接器
- VueJS中使用前端虚拟接口Mock.js
- CentOS7下源码安装MySQL 8.x
- 最新!中国天气网api接口调用,key获取方式,数据请求秘钥获取,城市id获取方法
- Jmeter接口压测快速入门
- 超简单!Qt Designer插入图片,styleSheet加入图片,Qt加入背景图片
- 关于领域模型转换的那些事儿
- Windows图标显示异常解决方法。桌面图标异常,开始菜单图标异常,任务栏图标异常。图标缓存位置。
- Python基本语法与数字类型
- Qt Designer设置背景图片、颜色不影响其它组件小技巧,控件层级设置,组件的继承,styleSheet设置样式。
- 搭建高可用的Harbor
- PyQt5 技术篇-控件长宽度、高度设置,组件大小设置,组件尺寸查看。