谈谈如何高效学习开源项目

随着蓬勃发展的开源时代的到来,为了减小开发成本,提升开发效率,愈来愈多的公司使用各类开源项目,做为开发者,若是能充分利用好开源项目中的资源,不只能提升实践能力,专业知识水平,还能从中其中学到的优秀的架构思想。html

本文将提供一些学习开源项目的思路,相信看了这篇文章,小白也可学习读懂开源项目,没必要再对着高大上的开源项目望而生畏,浅尝辄止。面试

1 学习的价值

总结起来,学习开源项目的价值主要包括如下几点:算法

  • 专业水平的提高 不少通用的专业知识,在专业领域内去到哪一个公司都能通用,特别是底层方面的知识,能够在开源项目中学到,好比多线程处理、网络通讯、操做系统处理等。 举个例子,经过学习Redis 的 RDB 持久化模式的“会将当前内存中的数据库快照保存到磁盘文件中”,能够学习到其实就是在操做系统fork一个子进程来实现,再继续深刻的话,就涉及到父子进程机制, copy-on-write 技术。

这些专业知识之间是能够联系起来的而且像一颗大树同样自我生长,可是当没理解透彻,天然无法产生联系,也就不可以自我生长了。当咱们对开源项目的关键的点理解清晰,知识也随着自我生长,也就如滚雪球同样能够滚起来了。数据库

  • 解决问题能力的提高

经过学习开源项目的实现,出现线上问题时,能够快速定位问题症结所在,经过修改配置或者修改源代码来解决;或者当业务需求没有合适的开源项目能知足时,能够改造现有的开源项目来知足业务。 做为要优秀开发,避免陷入“API操做工”的被动局面,学习开源项目的一个很重要目的就是知道其功能点是如何实现且优化的,学习其中的知识比如公式的推导过程,掌握基本API使用比如会数学公式能够应付考试,可是理解好的推导过程根据有助于记忆和理解,知其然也要知其因此然,当遇那些无法套公式的状况下,咱们也知道如何解决。设计模式

  • 思惟的提高

经过学习成熟的开源项目的优秀架构,能够总结和理解一些软件设计经常使用的架构思路,例如实现高可用,主要是经过集群的数据冗余,例如Kafka集群,HDSF集群;实现可扩展能够考虑把变化层和不变层隔离,把业务实现抽象化,例如Spring的预留的一些可扩展接口。bash

2 常见错误观点

学习开源项目有一些常见的错误观点,致使新手容易望而生畏而轻易放弃,或者浪费大量时间而收获不大:markdown

学习开源项目是架构师,技术大牛的事,我做为新手根本难以学会,就算学了也用不到。
复制代码

学习是一个过程,不是一朝一夕就能够成为大牛的,可是只要踏出第一步,总会有可能实现的大牛梦想的;另外一方面,经过不断复盘不断总结,加以合适的方法论指导,相信是能够有所收获的,能力获得提高的。 学习以后对于逻辑思惟,知识体系的构建有相信会有很大提高,即便项目没用到具体的开源项目,之后遇到相关问题能够举一反三,触类旁通,也是一种进步。网络

数据结构和算法很重要,我只要学习这项目中的2方面就能够了
复制代码

不要只盯着数据结构和算法,这2点在开源项目中并无那么重要,例如Netty中的超时队列是基于红黑树来实现的,咱们其实只须要知道这一点就够了,除非须要改造这方面的功能。更重要的是理解系统的设计,功能的实现方案。数据结构

一头扎进源码进行学习
复制代码

不少新手笃信社区论坛流行的一句话“Talk is cheap, show me the code”,一头扎进源码阅读,却最后陷入源码的泥潭中,在层层代码函数跳转中迷失了方向。多线程

其实学习开源项目应该是自顶而下的,最底层的源码应该是最后才开始学习,在此以前,须要学习项目相关架构设计方面的知识,有了这些知识,就仿佛数据库有了索引,按照知识索引来进行源码针对性突破,如巡航导弹精准爆破,天然比地毯式轰炸更起到事半功倍的做用。

3 学习的4个层次

根据学习理解的深刻程度不一样,能够把学习分为4个层次

学习的4个层次

  • 基础学习 对项目有一个大概性、基础性的了解,好比项目是什么,有什么做用,大概怎么用,解决了什么问题。 在面试中,很多初入职场的人的简历写到用到众多的技术框架,实际上每每仅仅只到了这个层次,再深刻往下问,便支支吾吾答不上来了。

  • 检视学习 对项目有一个系统性的了解,系统的各方面功能,基本原理,优缺点,使用场景,各配置项、API使用。 在实际工做中,若是做为一个团队的普通成员,达到这个级别已经能够知足基本业务开发需求,可是若是想有更高的技术追求,仅仅到此是不够的。

  • 分析学习 在检视学习的基础上,对开源项目的各项性能参数,各自场景性能调优有比较全面的了解和实践经验。 到达这个层次,在项目生产中,已经有独当一面的能力,有必定能力承担核心主力开发的角色。

  • 主题学习 在分析学习的基础上,对开源项目的关键功能模块的源码有所了解,可以根据实际须要封装、修改源码,或者借鉴项目造出新的轮子。 到达这个层次,每每有必定能力承担技术负责人、技术带头人的角色。

4 学习的4个步骤

针对上面提到的学习的层次,下面介绍如何“自顶而下”学习,来达到这4个层次。

4.1 基础性了解学习

目标是达到基础学习的层次,对项目有大概性的了解,包括项目背景,解决的问题场景,项目功能,使用场景,基本的API使用。经过查找官方文档、相关博客、视频资料学习便可。

经过对系统有大概性了解以后,会天然而然有一些疑问,例如实现的原理,优缺点等,后续学习带着这些疑问进行学习会更高效。

4.2 系统性学习与实践

目标是达到检视学习的层次,对项目有系统性、全面性的了解,包括项目的功能、组成模块、基本原理、使用场景、配置项、API使用、与其余相似项目的优缺点比较等。

方法步骤以下:

  • 1 安装运行 按照相关文档,安装运行项目。在这个过程当中,须要关注:

    • 系统的依赖组件 由于依赖组件是系统设计和实现的基础,能够了解系统一下关键信息,例如 Memcached最重要的依赖是高性能的网络库 libevent,咱们就能大概推测 Memcached 的网络实现应该是 Reactor 模型的。
    • 安装目录 常见的安装目录是conf存放配置文件,logs存放日志文件,bin存放日志文件,而不一样项目有些特殊目录,好比Nginx有html目录,这种目录能促使咱们带着相关疑问继续去研究学习,带着问题去学习效率是最高的。
    • 系统提供的工具 须要特别关注命令行和配置文件,它们提供2个很是重要的关键信息,系统具有哪些能力和系统将会如何运行。这些信息是咱们学习系统内部机制和原理的一个观察窗口。 一般状况下,若是对每一个命令行参数和配置项的做用和原理基本掌握了解的话,基本上对系统已经很熟悉了。实践中,能够不断尝试去修改配置项,而后观察系统有什么变化。
  • 2 系统性研究原理与特性 这点至关重要,由于只有清楚掌握技术的原理特性,才能算真正掌握这门技术,才能作架构设计的时候作出合理的选择,在这个过程当中,须要重点关注:

    • 关键特性的基本实现原理 关键特性是该开源开源项目流行的重要卖点,常见的有高性能、高可用、可扩展等特性,项目是如何作到的,这是咱们须要重点关注的地方。

    • 优缺点比对分析 优缺点主要经过对比来分析,即:咱们将两个相似的系统进行对比,看看它们的实现差别,以及不一样的实现优缺点都是什么。典型的对比有 Memcached 和 Redis、Kafka和ActiveMQ、RocketMQ的比较。

    • 使用场景 项目在哪些场景适用,哪些场景不适用,业界适用常见案例等。

在此阶段能够经过学习官方技术设计文档文档,架构图,原理图,或者相关技术博客,一般比较热门的开源项目都有不少分析文档,咱们能够站在前人的基础上避免重复投入。但须要注意的是,因为经验、水平、关注点、使用的版本不一样等差别,不一样的人分析的结论可能有差别,甚至有的是错误的,所以不能彻底参照。一个比较好的方式就是多方对照,也就是说看不少篇分析文档,比较它们的内容共同点和差别点。

同时,若是有些技术点难以查到资料,本身又不肯定,能够经过写Example进行验证,经过日志打印、调试、监测工具观察理解具体的细节。例如能够写一个简单程序使用Netty,经过抓包工具观察网络包来理解其中的实现。

4.3 系统测试

若是是只是本身学习和研究,能够参考网上测试和分析的文档,可是若是要在生产环境投入使用必须进行测试。由于网上搜的测试结果,不必定与本身的业务场景很契合,若是简单参考别人的测试结果,极可能会得出错误的结论,或者使用的版本不一样,测试结果差别也比较大。

要特别注意的是,测试必须创建在对这个开源项目有系统性了解的基础上,不能安装完就立马测试,不然可能会由于配置项不对,使用方法不当,致使没有根据业务的特色搭建正确的环境、没有设计合理的测试用例,从而使得最终的测试结果得出了错误结论,误导了设计决策。

下面提供测试常见的思路参考,须要根据具体项目具体业务进行测试用例的设计。

  • 核对每一个配置项的做用和影响,识别出关键配置项
  • 进行多种场景的性能测试
  • 进行压力测试,连续跑几天,观察 CPU、内存、磁盘 IO等指标波动
  • 进行故障测试:kill,断电、拔网线、重启 100 次以上、倒换等

4.4 关键源码学习

钻研、领悟该项目的各类设计思想与代码实现细节,基本定位是“精通”,精益求精,学无止境。这是大神们追求的境界。若是但愿成为团队技术担当、项目社区的重要贡献者,则应当以这个层次做为努力的目标。

代码不只是读,还要理和试,有的人连API都没有调用过,上来就看代码,觉得省了时间,实际是迈向自我摧残。

对源码进行理和试的关键以下:

  • 1 在IDE拿到调用栈 在IDE里读。IDE里能够方便跳转,查看定义,比起网页上看效率高得多。 经过IDE工具,运行example程序进行跟踪调试,经过打断点能够获得程序运行的调用栈。 尽量编译调试。能调试的代码,几乎没有看不懂的。

  • 2 把调用栈画下来 把代码的调用逻辑梳理出来以后,再经过画图工具,把代码的图画出来,能够画:流程图、类图、调用图、时序图,更具实际状况选择最有表现力的图。

此外,平时多了解一些设计模式。这样看到名字里有proxy,builder,factory之类的,就心照不宣了。横向分层,纵向分块。代码都是分模块的,有的是core,有的是util,parser之类的,要知道看的是哪一层,那一块。

有的小项目分层不明显,也没必要强求。要看的不仅是语法上的技巧,更重要的是设计上的思路和原理。读没读懂,最简单的标准是,假如给充足的时间,有没有信心写出一个差很少的东西来

5 步骤总结

实际实践操做中,完整执行上面5个步骤花费时间就长,一般状况下,前面2个步骤,在研究开源项目的时候都必不可少,第3个步骤能够在工做中打算采用开源项目才实施,第4个步骤在有必定的时间和精力下灵活安排时间作。

与其每一个项目蜻蜓点水去简单了解,不如集中火力把一个项目研究吃透,即便半年才吃透一个,积累几年以后数量仍是很可观的。并且不少项目的思想是共同的,例如高可用方案、分布式协议等,研究透一个,再研究相似项目,会发现学习速度很是快,由于已经把共性的部分掌握了,只须要再研究新项目差别的部分。

同时,在学习的过程当中,须要不断总结,复盘,输出学习笔记,一方面锻炼逻辑思惟能力,一方面有利于创建知识索引,过一段时间回顾的时候经过索引能够快速从新掌握知识,不容易遗忘。

6 面向新手友好的几个开源项目推荐

介绍理论以后,下面就是须要经过实践来检验了,下面介绍服务端开发常见的几个比对对新手友好,并且资料比较多的开源项目参考:

  • Spring

    Spring做为业界最流行的框架,其重要性不言而喻。须要注意的是,因为Spring的生态圈很是庞大,精力有限,建议新手先选最简单的模块进行入门,例如Spring JDBC Template,Spring IOC, Spring AOP, Spring MVC

  • Mybatis

MyBatis 做为业界流行的优秀持久层框架,支持普通 SQL 查询,存储过程和高级映射,代码量不大,网上相关源码解析的资料也比较多,项目的代码质量也是比较高,值得一读。

  • Elastic-Job

    Elastic-Job做为一个当当网开源的分布式任务调度解决方案,其社区活跃度,受欢迎程度较高,经过学习,能够对分布式一些通讯、调度方面的知识有所掌握。

  • Dubbo

Dubbo是阿里巴巴公司开源的一个高性能优秀的服务治理框架,使得应用可经过高性能的RPC 实现服务的输出和输入功能。Dubbo在17年年末从新启动维护,在业务普遍使用,通读了解源码,在服务治理,分布式协议方面的技术实力相信会有质的飞跃。

更多精彩,欢迎关注做者公众号【分布式系统架构】

参考

从0开始学架构 —— Alibaba 李运华

如何高效的学习掌握新技术

学习开源项目的若干建议

我是如何阅读开源项目的源代码的

相关文章
相关标签/搜索