1.安装
这里的安装并不是对着手册执行一下命令,而是要通过安装过程,获取到如下一些关键的信息:
- 这个系统的依赖组件,而依赖的组件又是系统设计和实现的基础;
- 安装目录也能够提供一些使用和运行的基本信息;
- 系统提供了哪些工具方便我们使用(带着问题去学习效率是最高的)。
2.运行
安装完成后,我们需要真正将系统运行起来,运行系统的时候有两个地方要特别关注:命令行
和配置文件
,它们主要提供了两个非常关键的信息:
- 系统具备哪些能力(提供哪些可配置化的参数,这些参数是做什么的以及不同的配置带来的影响是什么);
- 系统将会如何运行。
3.原理研究
在完成前两个步骤后,我们对系统已经有了初步的感觉和理解,此时可以更进一步去研究其原理。其实在研究命令行和配置项的时候已经涉及一部分原理了,但是并不是很系统,因此我们要专门针对原理进行系统性的研究。这里的关键就是系统性
三个字,怎么才算系统性呢?主要体现在如下几个方面:
3.1关键特性的基本实现原理
每个应用广泛的开源项目之所以能够受到大众的欢迎,肯定是有一些卖点的,有一些它们的应用场景,常见的有高性能、高可用、可扩展等特性,那到底这些项目是如何做到其所宣称的那么牛的呢?这些牛的地方就是我们需要深入学习的地方
3.2优缺点对比分析
只有清楚掌握技术方案的优缺点后才算真正的掌握这门技术,也只有掌握了技术方案的优缺点后才能在架构设计的时候做出合理的选择。优缺点主要通过对比来分析,即:我们将两个类似的系统进行对比,看看它们的实现差异,以及不同的实现优缺点都是什么。
3.3 如何系统性学习一个开源项目
- 通读项目的设计文档:例如 Kafka 的设计文档,基本涵盖了消息队列设计的关键决策部分;Disruptor 的设计白皮书,详细的阐述了 Java 单机高性能的设计技巧(官方文档是学习一个项目的必须资料)。
- 阅读网上已有的分析文档:多对比一些,同一个东西,每个人的理解并不一定相同。
- Demo 验证:如果有些技术点难以查到资料,自己又不确定,则可以真正去写 Demo 进行验证,通过打印一些日志或者调试,能清晰的理解具体的细节。
4.测试
测试一定要在原理研究之后做,不能安装完成立马就测试!原因在于如果对系统不熟悉,很可能出现命令行、配置参数没用对,或者运行模式选择不对,导致没有根据业务的特点搭建正确的环境、没有设计合理的测试用例,从而使得最终的测试结果得出了错误结论,误导了设计决策
5.源码分析
源码研究的主要目的是学习原理背后的具体编码如何实现,通过学习这些技巧来提升我们自己的技术能力。如 Redis 的 RDB 快照、Nginx 的多 Reactor 模型、Disruptor 如何使用 volatile 以及 CAS 来做无锁设计、Netty 的 Zero-Copy 等,这些技巧都很精巧,掌握后能够大大提升自己的编码能力
怎么学习
如果感觉自己时间和精力不够,与其蜻蜓点水每个开源项目都去简单了解一下,还不如集中精力将一个开源项目研究通透,就算是每个季度只学习一个开源项目,积累几年后这个数量也是很客观的;而且一旦你将一个项目研究透以后,再去研究其他类似项目,你会发现自己学习的非常快,因为共性的部分你已经都掌握了,只需要掌握新项目差异的部分即可
网友评论