内容参考极客时间从零开始学架构,在看了华仔的那篇文章后,总结了一些东西,主要从几个方面来提炼下:
1. 提取文章观点
2. 写一点自己的思考
文章内容
拒绝拿来主义
一些错误的观点
- 只有参与开源项目开发的人才能真正理解
- 我的项目没有使用Redis,不用的话很难深入理解
- 数据结构和算法很重要,我只需要研究数据结构和算法就够了
- 逐行阅读源码
观点一:不管什么身份,都可以从开源项目中学到更多
- 例如学习Redis的网络模型,不一定要成为Redis开发,只需要具备一定的网络基础,再阅读Redis源码,就可以学习到Redis单进程的Reactor模型
观点二:数据结构和算法在开源项目中不是特别重要
观点三:采取自顶向下的学习方法,源码应该是最后一步
- 掌握基本的功能,原理,关键设计之后再去看源码
- 看源码的目的是为了学习代码的写作方式,以及关键技术的实现
举例:Redis的RDB持久化模式是怎么保存内存快照的,在Linux中是fork一下子进程
自顶向下学习
- 安装
- 安装查看依赖,猜想假设
- 例如Redis只有一个bin目录,那么要去猜想一些问题
- Redis没有conf是怎么配置的
- Redis日志怎么保存
- 查看系统提供的工具
- 运行
- 系统具备哪些能力
- 系统会如何运行
- 尝试去了解熟悉命令行工具,例如参数配置项作用和原理,去试错
- 原理研究
- 如何才算是系统性呢?
- 关键特性的基本实现原理(这个项目的高性能是如何做到的)
- 例如Memcache是如何实现的?
- Libevent
- 要去掌握memcache的网络模型,需要
- 多路复用
- Linux Epoll
- Reactor模型
- 多线程
- 优缺点对比
- 如何才算是系统性呢?
- 原理研究的手段
- 通读项目的设计文档:例如Kafka的设计文档
- 阅读网上已有的分析文档(尽可能多阅读几篇)
- DEMO验证:通过写DEMO去进行验证
- 测试
- 基于一些案例做测试
- 去试错,调整参数
- 源码研究
- 源码研究的目的是学习原理背后的具体编码实现,通过学习技巧来提升我们的技术能力
- 不要阅读全部的源码
思考实战
最近在做一个发送邮件的功能,本来打算自己写一个工具类,看了一个开源项目,比较满足自己的需求,就看了文档,去使用了,项目代码量不大,就去看了下代码,到此总结一下。
首先是看了文档,知道怎么使用
下载了源码,去跑了一些Test,有了一个直观的感受
了解一些关键的类,从两方面来看
1. 工具本身封装的一些类,例如涉及Excel的一些类,如Workbook,Sheet,Row等
2. 工具自己的一些关键类
因为本身项目代码比较少,我也了解Excel的一些类,以及自己最初想做的思路就是Annotation来做,看了项目之后感觉主体思路还是比较接近的,看起来也比较容易,主要是以下步骤:
- clone源码
- 使用Test,Debug跟着进去,找到核心的方法以及自己想去学习的一些方法:
- 例如怎么处理Annotation的
- 对于Class的处理,使用反射还是自省
- 主要流程是什么
- 然后自己去写了Test去熟悉
- 前提是这个项目代码量不太大…
总结
本篇文章主要就是想发下华仔的文章,自己以前学习大型项目的源码其实很少坚持下来,代码真是太多了,例如Dubbo,ES,Netty,Spring等一些项目的代码即使是开发者也不一定能全部掌握,所以也有一些经验总结,就是并不要求全,先去看文档,然后去用,最后再去看代码,看代码不要看全部,而是重点关注几点:
1. 编程手法
2. 异常处理
3. 核心功能实现
在学习的过程中一定要思维活跃:
1. 去猜
2. 去试错
3. 去写QuickStart
- 分享一篇知乎文章: 源码阅读技巧
网友评论