开源项目背景,采用了什么技术?解决了什么问题?优点是什么?缺点是什么?
尽量看官网英文的资料,从时效性和内容准确性上都要比中文技术博客的内容要好的多。
重点关注下Get Started和Example之类的文档
在下载源代码之后,先看下代码目录组织结构,可先从示例代码或测试代码入手。
如base代表基础库,net代表网络库,demo/example代表示例代码,tests:测试代码
docs:文档目录(类图,流程图,活动图,业务知识相关资料等)
好的开源项目,其文档都比较完备,安装部署文档一般会在README中,甚至提供rpm安装包和docker镜像
将程序运行起来!!!
将程序运行起来!!!
将程序运行起来!!!
程序运行起来有,我们就有了直观感受。
玩起来,嗨起来,搭建成功后必须装逼起来,哈哈
重要的事说三遍,程序运行起来,首先是便于从全局上体会项目的功能,其次方便下断点调试,修改代码,再调试,查看是否符合修改的预期;最后,方便截图,截牛逼的图去吹牛逼,333~
example目录:例子目录,先通过例子上手学会如何使用此开源项目
安装部署好项目,成功运行并体会项目功能后,从总体转到局部example例子
简单的入门例子,抛开了复杂的处理细节和高级特性,便于尽快熟悉项目的主干和核心模块。
简单例子都遇到问题,可用邮件列表、社区、Issue来解决遇到的问题。
熟悉简单例子的过程中,对于有疑问的地方先记录下问题,后面带着问题去阅读源代码解决心中疑问
熟悉简单例子后,也可阅读些高级点的例子,或手动修改代码看看例子是否能正常运行?
如果公司使用的开源项目实在没有example例子,可考虑自己根据公司需求编写一个demo例子
一个好的开源项目是有完善的文档的,比如百度开源的RPC框架brpc
docs目录:
编译入门指南,代码的风格文档,程序的命令操作手册,程序中采用的第三方库
类图,流程图,活动图,架构图,设计文档
业务相关基础知识介绍文档
项目技术细节详细介绍
阅读这些文档可以了解该项目的大体设计和结构,读源码的时候不会无从下手。
务必要耐心好好的看,多看多实践多思考,少BB
test目录:测试目录,学习下单元测试是如何写的
通过看单元测试用例,可了解到某个类或某个组件是如何使用的?
各种玩:
执行example中的例子查看效果,也可以修改example中的例子来验证自己的想法。
修改test目录中的代码,看看测试代码是否能通过
比如nDPI项目,开始玩时,可以只加载一个插件,玩熟练后可以加载N个插件;
开源项目配置文件也有很多可以玩的地方,尽情的玩,但是千万别在线上环境玩!!!!
先学会如何使用,然后再去从源代码角度理解原理的东西。
开始阅读源代码,有以下方法:
阅读源代码时,尝试理清一次正常运行的代码调用路径,这可以通过debug来观察运行时的变量和行为。
比如你对网络通讯感兴趣,就阅读网络层的代码,深入到实现细节,如它用了什么库,采用了什么设计模式,为什么这样做等。如果可以,debug细节代码。
修改源码加入日志和打印可以帮助你更好的理解源码。
适当画图来帮助你理解源码,在理清主干后,可以将整个流程画成一张流程图或者标准的UML图,帮助记忆和下一步的阅读。
相信经过前面三个阶段,你已经是各种玩,各种瞎折腾,心里还是有很多疑问吧?
这个功能真牛逼,是如何实现的呢?
我的配置文件为什么没有生效呢?
程序为什么被我搞挂了呢?
我添加的打印为什么没有被执行?
打印的值为什么不符合我的预期?
好!很好!带着这些你心里的问题,去源代码中找答案吧
1.先总体后局部,把握好主体逻辑代码,然后再逐层深入下去
一上来就陷入太多的实现细节是大忌!!!
2.熟悉主体逻辑后,你大概能知道你感兴趣的代码处于整个项目中的什么模块,什么文件,什么类中
是个什么样的处理流程,定位到具体代码,一行行的分析它
这个过程会持续一段时间,今天你感兴趣这个问题,明天感兴趣那个问题。
3.带着问题去看代码,一个系统实现了什么功能,为什么要实现这些功能,是基于什么业务场景?
如果要我来实现一套类似的系统,我会如何来考虑问题,如何来实现这套系统?
然后再看看别人是如何实现的,找到两者之间的差距,并不断缩小之间的差距。
1.记录解开问题谜团的过程
2.记录下开源代码中好的设计思想,好的代码技巧,以及任何你觉得好的东西
3.画整个程序的流程图,有利于理解程序的整个流程,而不被代码的细节所干扰。
4.坚持记录源代码学习笔记,记笔记能够有助于更深入的思考,以前很多问题只是浅层思考,不够深入
如果感觉自己对于项目理解的还不到位,我推荐一个笨方法,抄项目代码,抄着抄着你就懂了。
如果想进一步深刻的学习到源代码的精髓,可以仿写一个相近的程序进行操练。
理解了这个程序并不表明掌握了这个程序,只有在操练一个相近的程序时,才知道你到底理解了多少,掌握了多少
当自己对项目的方方面面都很熟悉后,可以在B站上开直播,将自己所学的知识传授给他人。