理论篇
现状
开源项目对团队和业务有很大好处,但对于技术人员来说,如果只是简单的采取“拿来主义”,那就变成一个陷阱:看似很快的使用开源项目实现了需求,但自己的技术水平并没有什么提升;甚至可能出现看起来用了很多开源项目,知道很多项目名称,但是技术水平止步不前。
ps:虽然使用了开源项目,实现了需求,知道了很多开源项目,但是一问三不知。
认知误区
很多技术同学也想深入学习一把,学习一些业界成熟和优秀的开源项目。比如:Kubernetes、Redis、MySQL、Kafka、EL(F)K、Nginx...
误区1:我的业务中没有用它(Kubernetes、Redis、MySQL、Kafka、EL(F)K、Nginx...),不使用的话很难深入了解。
误区2:数据结构和算法很重要,我只要研究里面的数据结构和算法就够了,比如Nginx的红黑树。
误区3:一头扎进源码逐行阅读。
ps:上面的认知导致望而生畏,浪费了大量时间还没有多大的收获。
正确认知
不管是什么身份,都是可以从开源项目中学到很多东西。
不要只盯着数据结构和算法。
采用自顶向下的学习方法,源码是最后一步。
ps:不要一上来就去看源码,而是要先掌握了功能、原理、关键设计之后再去看源码,看源码的主要目的是为了学习其代码的写作方式,以及关键技术的实现。
自顶向下
- 安装
- 通过具体的安装过程,获取如下的关键信息。
- 这个系统的依赖组件,而依赖的组件是系统设计和实现的基础。
- 安装后的目录也能够提供一些使用和运行的基本信息。
- 系统提供了哪些工具方便我们使用。
- 运行
- 安装完成之后,需要将系统运行起来,运行系统的时候有2个地方需要特别的关注:命令和配置文件,他们主要能告知我们系统具备哪些能力和系统将会如何运行。这些信息是我们窥探系统内部运行机制和原理的一扇窗口。
- 原理研究
- 完成安装和运行之后,我们队系统有初步的感觉和理解,这个时候我们进一步的研究原理。在研究命令和配置的时候涉及到一部分的原理,但是不系统,我们需要进行系统性的研究。
- 关键特性的基本实现原理,每个流行的开源项目为什么能够受到大众的欢迎,肯定是有一些卖点的,常见的有高性能、高可用、可扩展性等,那到底这些项目是如何做到其所宣称的那么牛的呢?这些牛 X 的技术实现就是我们要学习的地方。
- 优缺点对比分析,只有清楚掌握技术方案的优缺点后才算真正的掌握这门技术,也只要掌握了技术方案的优缺点后才能在架构设计的时候做出合理的选择。我们选择使用类似的系统进行对比,看看实现差异,以及不同的实现优缺点是什么。
测试,测试一定要在原理研究之后做,不能按照立马就测试。
源码研究,不建议通读所有源码,这样会很耗费时间。除了阅读源码之外,自己可以写Demo调用基础库完成一些简单的功能。
ps:通常情况下,上面5个步骤的前3个步骤是在研究开源项目的时候必要的。在准备开始采用开源项目的时候,第4步需要去实施,第5步可以每个季度去看一个开源的项目,不断积累。
实战篇
模板
1、安装 | 依赖组件 | |
目录结构 | ||
提供的工具 | ||
2、运行 | 命令 | |
配置文件 | ||
3、原理研究 | 关键特性的基本实现 | |
优缺点对比 | ||
4、测试 | 使用前测试 | |
5、源码研究 | 关键代码 |
Nginx学习
1、安装 | 依赖组件 | pcre(重写rewrite)、zlib(gzip压缩)、openssl(证书) |
目录结构 | logs/(日志)、conf/(配置相关)、sbin/(命令)、html(50x、index.html页面) | |
提供的工具 | 暂无 | |
2、运行 | 命令 | [root@chons nginx]# nginx -h nginx version: nginx/1.11.12 Options: |
配置文件 | worker_processes(nginx worker进程,一般设为cpu核数)、 error_log(错误日志存放的目录,日志级别有debug, info, notice, warn, error, crit)、user(默认运行用户是nginx)、pid(进程pid存放位置)、 | |
3、原理研究 | 关键特性的基本实现 | 红黑树管理定时器、多路复用、Linux epoll、sendfile 、负载均衡和反向代理 |
优缺点对比 | 红黑树 vs B树,select、poll、epoll对比 | |
4、测试 | 使用前测试 | |
5、源码研究 | 关键代码 |