学习开源项目,个人最佳实践

最近奥运会,中国仍是依然 NB,尤为前两天的男子百米半决赛、决赛,完全被苏神点燃了。程序员

说是亚洲奇迹,一点也不为过。redis

看比赛,有好的,也有气人的,好比裁判,裁判适当照顾东道主也能忍了,可是有时候太过度了,直接选择性眼瞎。算法

说到选择性眼瞎,我想的一个事情。数据库

我们干程序员的,常常须要应用、研究一些开源组件。研究开源组件,就少不了去看资料、看源代码。在看代码、学习的过程当中,我们可不能像那些眼瞎的裁判,我们须要高效的学习:看清全局、主要脉络、关键细节。缓存

这篇文章就和你们说说我本身高效学习的方法。安全

对我而言,作好这件事的关键就在于问本身七个问题。架构

问题1. 组件解决了什么问题

问这个问题的目的是明确组件的问题域,任何组件的出现都是为了解决某类问题的。并发

咱们在职业生涯里,遇到的技术问题实际上是有限的。面对这些有限的问题,咱们熟悉的组件越多,解决问题的思路和办法就越多。当你对某种技术问题,有着比别人更多的思路和办法,那天然而然,你的技术话语权就会越大。高并发

以我曾经深刻研究过的 druid(阿里的开源数据库链接池)组件为例:性能

druid 要解决的问题本质实际上是如何下降应用和中间件交互所消耗的时间成本。

知道了 druid 要解决的问题,咱们就等于知道了它的核心主题。druid 的主要技术思路,所有都是围绕着这个核心主题来实现的。

好比,druid 自己的 LRU 策略、对一些关键对象的缓存、竞争资源的高效率利用……都是围绕着这个核心问题来设计和落地的。

同时,咱们明确了 druid 要解决的问题后,若是咱们对如今 jedis 这套东西不满意,是否是就能够利用 druid 的技术思路,从新设计和实现一套新组件,去替代 jedis,以便下降和 redis 交互的时间成本呢?

问题2. 组件有什么优势

确认了组件须要解决的问题,只是第一步。一套开源组件,每每项目都比较庞大。因此,就得想个办法分而克之,分出各个具体的知识点去学习。

而这些知识点,每每和官方文档宣传的组件优势能够对上。

好比,druid 的官方文档是这么说的:

从上面这幅图,就能够看出来,druid 有以下几个特色:

  1. 能被监控
  2. 容易扩展
  3. 性能优秀
  4. 稳定性好
  5. 安全
  6. 运行期问题容易排查

这些就是咱们要去学习的各个知识点。

问题3. 组件的主干和分支都是哪些

知道了组件的优势,就等同于知道了须要学习的知识点。但是,知识点若是多而杂,就须要确认好哪些学哪些不学?哪些先学哪些后学?

那么,组件的主干和分支就须要分解出来,以便定出学习计划。而划分出主干和分支,就须要综合咱们前面说的组件要解决的问题。

经过前面的学习,咱们知道 druid 解决的是下降中间件的时间成本,也知道了它的特色:

  1. 能被监控
  2. 容易扩展
  3. 性能优秀
  4. 稳定性好
  5. 安全
  6. 运行期问题容易排查

此时,咱们的学习计划就是:先学习 druid 是如何实现高性能的;高性能后,若是咱们研究 druid 是为了后续在工做中应用,那么,能被监控这个特色就是下一个要学习的知识点。

因此,这一问,是为了拟定学习计划而问。

问题4. 组件的这些优势是如何实现的

在上个问题以后,咱们就能够分步骤的进行学习了。学的怎么样,就须要经过这个问题,来考察本身是否真的学懂了这些知识点。

回到 druid 上,让人满意的答案就是,咱们能用本身的话去总结出每一个知识点的技术实现。好比:

问:druid 的监控是如何实现的?

答:druid 经过本身实现 JDBC API 自身提供的 PooledConnection、Connection、Statement、ResultSet接口,得到了能够在这些接口的关键方法中植入统计的能力。统计的数据会按期采样后存储在某些命名叫作 xxxStat 的对象里,供后面展现使用。

问:druid 是如何实现扩展的?

答:能扩展的实现方式是第三方实现 druid 提供的一个 Filter 接口后,再被配置到 druid 的配置文件里。这样就会在 DruidDataSource 初始化的时候,去读取并初始化这些实现了 Filter 接口的实例。初始化后的 Filter 会在后面 druid 从建立数据库链接到执行 SQL 语句再到释放链接这一系列步骤后,被不断的链式执行。

就这样,分知识点回答出让本身满意的答案,就等同于考核了本身对每一个知识点学习的质量,若是回答不满意,就再去查漏补缺便可。

问题5. 组件的系统设计思路是什么

咱们学习了各个零散的知识点以后并不够,由于学习一套开源组件,原理是基础,系统设计则是骨架。

明白了技术点,只是对当编码高手有用,可是当你本身设计组件的时候,你的底气在哪里呢?答案就在这些你看过的开源组件的系统设计思路上。

因此,把知识点融合起来造成一个总体,再去推断出系统的设计思路,对咱们成为一名优秀的架构师,是有很是大的帮助的。

好比,经过各个知识点的深刻学习,融会贯通后,我认为 druid 的设计思路以下:

若是之后遇到为公司底层构造一套池化中间件对象的需求时,这种设计思路天然就成了我设计的重要模板之一。

问题6. 组件的缺点是什么

为何会问组件的缺点?由于在我如此了解了一套组件以后,却仍是免不了误用和踩坑,这其中最严重的就是,生产环境在组件出现问题以后,咱们却没有紧急预案。

这种现象的缘由就是没有去深刻思考过一套技术的利弊。问组件的缺点,就会迫使咱们去深刻思考利弊,从而在之后不论是应用组件,又或者是去根据学习到的知识本身实践,都能胸有成竹,从容以对。

回到 druid 身上,当咱们去读它源码的时候,思考一下:

durid 的这些实现真的就是完美的吗?

那确定不是, 好比:

  • druid 的采样功能不少时候咱们并不须要,可是因为 druid 的实现是写死在实现的关键代码里的,因此没法自由的对其进行插拔。这时候,就要注意,采样可能形成的内存占用问题。

  • druid 是对 JDBC API 作了层层封装的,在这些封装中 druid 又添加了不少本身的实现。可是,这些实现很难避免bug,然而因为有这些封装,就会致使 Bug 很难查,又或者很难本身改。这时候,就须要在测试环境,把 druid 的日志级别调成 DEBUG 级别,而后仔细观察日志,看看是否有什么不可知的风险。

因此,这一问,是为了深度思考,让咱们在任何新技术的学习和实战时,都能成为最稳定的那个仔。

无论之后咱们模仿仍是应用 druid,就能提早预测到风险,从而重点监控,提早准备预案。

问题7. 和同类别的组件之间有什么区别

当学习完了组件,知道了组件的优缺点,理解了组件的运行原理,明白了组件的设计思路以后,一切就完整了吗?

对不起,还不够。

由于咱们还缺少一种东西,就是学习的拓展,即学习的广度。

学习组件,咱们除了知道它要解决的问题域外,还须要知道它在同类组件中的地位。

为何?由于之后咱们去任何一个稍微成规模的公司后,须要面临一个问题,内部的竞争。

好比,咱们写了一套消息治理中间件。若是想提高本身的技术话语权,就须要在全公司,和同类产品竞争。竞争胜出了,本身的职业生涯就有了巨大发展的可能。

回到 druid 上,在SpringBoot2.0时代,druid 出现了巨大的竞争对手——HiKariCP。

而 HiKariCP 之因此能胜出,是由于它排除了 druid 使用的公平锁,使得性能提高了大约 70%

经过 druid 和 HiKariCP 的比较和学习,咱们就能更加深刻的理解高并发,能更有效率的去压榨出系统的性能。

经过 druid 和 HiKariCP 做者之间的互相较量,咱们还能明白如何去更好的对比竞品,去展示最为关键的数据指标,一举赢得胜利。

以上列举的七个问题,是我为了解决高效高质研究开源组件,获得的最佳实践。

总结一下:

  • 先经过问组件解决了什么问题,去肯定本身的学习目的和思考边界。
  • 再问组件有什么优势,以及主干和分支是哪些,去拟定出学习计划。
  • 再后,经过问组件的优势是如何实现的,去考察本身的学习质量。
  • 而后,经过问组件的系统设计思路是什么,让本身讲学到的各类独立的知识融汇贯通,打形成体系。
  • 最后,经过问组件的缺点是什么以及和竞品的区别去迫使本身在学习以外,再行深度思考和广度思考,对学习进行查漏补缺以及进一步提高学习质量,打造出更为突出的知识体系。

IT这行业是须要不断学习的,而高效高质量学习,是让咱们的职业生涯走的更稳更顺的关键所在。

但愿这篇文章对你们有帮助,看完若是以为有收获,请帮忙随手点个赞。


你好,我是四猿外。

一家上市公司的技术总监,管理的技术团队一百余人。

我从一名非计算机专业的毕业生,转行到程序员,一路打拼,一路成长。

我会把本身的成长故事写成文章,把枯燥的技术文章写成故事。

欢迎关注个人公众号,关注后能够领取高并发、算法学习资料。

相关文章
相关标签/搜索