1. 开源项目初体验 1. 阅读官网介绍文档(阅读)
有多少人愿意花时间去阅读官网文档? 估计很少,大家有一点知识后就更容易开始,并且用力去做! ! !
在编码的过程中,我会遇到很多奇怪的问题。 当我回去使用搜索引擎解决这些问题时,我发现我自己的使用方式有问题。 其实某个API的用法在demo或者文档中已经解释得很清楚了。 写得非常清楚。 你告诉我,这是天大的冤屈吗?
文档中要重点关注的内容:
1. 开源项目背景
使用什么技术?
提供哪些功能?
解决了什么问题(或核心痛点)?
与同类产品相比有哪些优势?
2. 适用场景
有什么优点?
有什么缺点?
适合什么场景?
哪些场景不适用?
只有明确了适用场景,才能在工作中得心应手。
3、哪些公司在生产中使用
无论有哪个中型以上的公司在生产环境中实施过这个开源项目,都可以从侧面证明这个开源项目有很大的潜力和竞争力,值得你花时间和精力去研究。
例如,使用brpc的公司如下:
4.核心概念及主要结构组成
相信很多朋友能够读懂与自己工作内容相关的开源项目,却无法理解其他领域的开源项目。 不是因为你能力不够,而是因为你缺乏领域知识。
基于现有知识体系学习新的开源项目,需要对新概念、新技术有一个大致的了解,才能更好地理解项目的整体实现思路。 只有读源码才能事半功倍。
例如,阅读lvs源码时,至少要理解以下概念
RS: Real [后端真实服务器]
IP:CIP【远程访问客户端IP】
IP:VIP【用于公告的虚拟IP】
NAT、DR、TUN 模式。
不要一开始就阅读代码。 如果不理解核心概念、核心原理、核心算法,就很难理解代码。
5.尽量阅读官网的英文信息(及时性和准确性较好)
尝试阅读官网的英文信息,无论是时效性还是内容准确性,都比中文科技博客上的内容要好得多。
大家在网上复制博客,尤其是CSDN博客,难免会有错误和遗漏。
密切关注Get等文档,可以帮助你更快上手。
2.了解代码目录结构
下载完源码后,首先看一下代码目录组织结构。 您可以从示例代码或测试代码开始。
例如,base代表基础库,net代表网络库。
demo/:示例代码、示例程序
测试:测试代码
docs:文档目录(类图、流程图、活动图、业务知识相关资料等)
一开始,建议先从示例代码(demo、test)开始,熟悉开源项目的流程或使用方法。
对于不懂的技术点,一定要仔细查找文档,验证其准确性。 技术是一门手艺,容不得马虎。
3.相关视频或ppt
毕竟文档和代码都是静态资源,其所能传达的信息还不够生动。 如果有相关的技术视频一起观看,效果会好很多。
4.查看cmake或构建脚本
网上大部分流行的开源项目,比如C/C++/Go语言相关的项目,都是用cmake或者构建的。
构建代码时,有以下注意事项:
1、查看有哪些依赖库?
2.启用或禁用指定函数的编译宏并将一些宏传递给代码
3、编译出可调试的程序版本,方便后续调试。
4、熟悉开源代码的构建脚本,方便后续的代码修改、编译、调试过程。
2.安装、部署、运行(非常重要!)
好的开源项目都有比较完整的文档。 安装部署文档通常在or doc目录下,一般提供了几种部署方式。
2. 1 yum或apt源码安装 2. 2 rpm或deb包安装 2. 3 源码编译安装部署 2. 4 镜像部署
运行程序! ! !
运行程序! ! !
运行程序! ! !
重要的事情说三遍之后,我们就会对程序运行是否流畅有一个直观的感受。
就我的经验来说,一个项目代码能否成功搭建调试环境,效率有很大不同。
运行后一定要尽量精简自己的环境,减少调试时的干扰信息。 例如,Nginx采用多进程的方式来处理请求。 为了调试和跟踪Nginx的行为,我经常将数字设置为1,这样在调试时就知道要跟踪哪个进程。
也就是为了方便调试,我们会修改开源项目的代码。
开始玩吧,兴奋起来,搭建成功后还要炫耀一下,哈哈
首先,方便直观地了解项目的功能。
其次,方便设置断点进行调试,修改代码,然后调试看是否符合修改预期;
终于可以方便截图了,拍出好看的照片来炫耀,2333~
3. 运行一个简单的例子
目录:示例目录,首先通过示例学习如何使用这个开源项目
3.1 直观感受程序功能
安装部署项目后,最好有Web界面或者数据结果输出等交互界面,这样可以从宏观上熟悉开源项目的一般功能。
然后从微观入手,走向局部实例,注重细节。
通过阅读简单的入门示例,您可以抛开复杂的处理细节和高级功能,让您尽快熟悉项目的主干和核心模块。
3.2 由浅入深分析示例代码
示例根据API的难度分为基础、中级和高级。 我们可以先从基本的例子开始,然后熟悉基本的流程。 我们可以考虑深入研究中级或高级的例子来写出更适合公司业务逻辑的内容。 代码。
简单的例子都会遇到问题,可以通过邮件列表、社区、问题来解决遇到的问题。
3.3 记录下心中的疑惑,带着疑问阅读
在熟悉简单例子的过程中,如果有疑问,先记录问题,然后带着问题阅读源码,解决疑惑。
当你熟悉了简单的例子后,你还可以阅读一些更高级的例子,或者手动修改代码,看看例子是否可以正常运行?
如果公司使用的开源项目中实在没有例子,可以考虑根据公司的需求自己写一个demo例子。
3.4 编写适合公司场景的demo代码
了解demo或代码仅表明您熟悉该API的使用流程和功能边界。 但是,如果你想真正吸收开源代码的知识,并将其转化为自己的知识,就需要根据公司的场景来写demo,并为其做一个demo。 功能验证期间遇到并解决各种问题,将增加对开源项目的技术理解。
4.仔细仔细地阅读文档,并查看单元测试用例 4. 1.在看代码之前仔细阅读文档。
好的开源项目都有完整的文档,比如百度的开源RPC框架brpc
文档目录:
库开发入门指南、代码风格文档、程序命令操作手册、程序中使用的第三方库
类图、流程图、活动图、架构图、设计文档
业务相关基础知识介绍文档
项目技术细节详细介绍
阅读这些文档可以帮助你了解项目的总体设计和结构,阅读源码时不会手足无措。
一定要有耐心,仔细阅读,多读,多实践,多思考,少BB
4.2 仔细阅读测试用例
如果测试用例写得仔细,是值得研究的。
原因是测试用例往往是针对单一场景,构造一些数据来验证程序流程。
test目录:测试目录,学习如何编写单元测试
通过查看单元测试用例,您可以了解如何使用某个类或组件。
5.玩得开心
多种玩法:
您可以通过执行示例来检查效果,也可以修改示例来验证您的想法。
修改test目录下的代码,看看测试代码是否能够通过
例如,在nDPI项目中,当您开始播放时,只能加载一个插件。 熟练后可以加载N个插件;
还有很多地方可以使用开源项目配置文件。 想玩多少就玩多少,但不要在网络环境中玩! ! ! !
先学习如何使用,然后再从源码角度了解实现原理。
6.阅读源码 6.1.明确阅读代码的目的(建议带着疑问阅读)
在开始阅读代码之前,首先要明确阅读的目的:
您需要了解其中一个模块的实现吗? 比如基础模块还是业务模块?基础模块包括内存池、线程池、网络数据发送和接收epoll模型等。
还是需要了解这个框架的大致结构,
你还需要熟悉其中一种算法的实现等等。
只有知道自己内心想要什么,才能更有动力朝着自己的目标努力。
6.2 区分主线和支线
阅读源码时,区分主线和支线
我们先看主线:
如果你想了解一个业务逻辑的实现过程,调用第三方库函数、utils函数、定制的数据结构和算法等,其实你不需要了解它的内部实现;
你只需要了解它的外部接口,以及这些接口的入口和出口参数以及功能,并将这部分视为一个“黑匣子”。
我们再看一下分支线:
在充分了解主线的前提下,可以考虑打开“黑匣子”研究其内部实现,比如看内存池的实现代码、调度器的代码、海量数据包是如何处理的dpdk等
具体方法:
从main函数进入,利用gdb单步追踪,明确一个完整流程的代码调用路径(比如程序初始化)。 这可用于通过调试观察运行时变量和行为。
6.3 选择感兴趣的“分支”进行阅读
这里的分支指的是功能或版本:
从功能上来说:
例如,如果您对网络通信感兴趣,请阅读网络层的代码并深入了解实现细节:
例如,它使用什么库?
采用了什么设计模式?
为什么要这样做等等
如果可能的话,调试详细代码。
从源码版本来看:
没有必要选择最新版本的开源代码来阅读。 如果感觉有点困难,可以选择同一开源项目的旧版本(例如1.0版本)。
此时的项目代码无论是代码量还是复杂度都小了很多,看起来也轻松很多。
6.4 明确核心数据结构
编程=数据结构+算法
因为结构定义了程序的架构,只有确定了结构之后才能进行具体的实现。 就像盖房子一样,数据结构就是房子的框架结构。 如果房子很大,你又不知道房子的结构,你就会在里面迷路。
至于算法,如果是细节部分,暂时不需要深入研究,可以参考上一节《区分主线图和支线图》先了解一下它的入口和出口参数和功能。
Linus 说:“糟糕的程序员关心代码。优秀的程序员关心数据结构以及它们之间的关系。”
因此,在阅读一段代码时,理清核心数据结构之间的关系就显得尤为重要。
6.5 添加日志和单步调试(场景分析)
在阅读文档或者阅读代码的过程中,需要验证一些技术点。
所谓“场景分析”,就是自己构造一些场景,然后通过添加断点、调试语句等方式来分析这些场景下的行为。
我通常的做法是在重要的入口函数上添加断点,然后构建触发场景的调试代码。 当代码在断点处停止时,我可以通过查看堆栈、变量值等来观察代码的行为。
场景分析的好处在于,它不是在项目中大海捞针,而是可以将问题缩小到一个范围,并扩大理解。
这样,我就可以将个人的时间和精力集中在一个小范围内,继续学习,直到我满意为止。
修改源代码添加日志记录和打印可以帮助您更好地理解源代码。
Gdb单步调试和一步一步跟踪是理解源代码的最好方法。
6.6 画图梳理源码逻辑
绘制适当的图表来帮助您理解源代码。 明确主体后,可以将整个流程绘制成流程图或者标准的UML图,以帮助下一步记忆和阅读。
虽然画图很浪费时间,但是对于帮助理解架构和流程很有帮助。
6.7 解决遇到的问题
我相信,经历了前三个阶段之后,你也玩过、玩过各种乱七八糟,但是你心里还是有很多疑问吧?
这个功能实在是太牛逼了,那么它是如何实现的呢?
为什么我的配置文件没有生效?
为什么我的程序崩溃了?
为什么我添加的打印没有被执行?
为什么打印的值与我的预期不符?
好的! 很好!带着这些疑问,去源码中寻找答案吧。
1、先看整体,再看局部,掌握主要逻辑代码,然后逐层深入。
立即陷入太多的实施细节是一个很大的禁忌! ! !
熟悉了主要逻辑后,你就大概可以知道你感兴趣的代码位于整个项目的哪个模块、哪个文件、哪个类了。
是一个怎样的加工流程? 找到具体的代码,逐行分析。 这个过程会持续一段时间。
2.带着问题看代码
系统实现哪些功能,为什么实现这些功能,基于什么业务场景?
3.思考如何实现类似的系统(功能)
如果我被要求实现一个类似的系统,我会如何思考这个问题以及我将如何实现该系统?
然后看看别人是如何实现的,找到两者之间的差距,并不断缩小差距。
7、写笔记,记录想法,促进思考和总结
1.记录解题过程
2.记录好的设计思想,好的编码技巧,以及开源代码中任何你认为好的东西
3、画出整个程序的流程图,帮助你了解程序的整个流程,而不受代码细节的干扰。
4.不断记录源码学习笔记。 做笔记可以帮助你更深入地思考。 过去很多问题只是浅薄的思考,不够深入。
8.复制项目源代码
例如,它包括四种技术:lru、一致性哈希。
第一步:在抄之前,可以对这些技术有一个大概的了解。 例如,什么是LRU? lru解决什么问题? 简单了解lru的实现原理(具体实现稍后深入)
第二步:在抄的过程中,你会发现一些和之前学过的实现原理有什么不同,比如优化或者疑惑。 记录下来并继续复制。
第三步:抄写后,对有疑问的地方寻找信息和人进行沟通。 您必须澄清之前记录的未解决的领域。
9、仿制项目
如果你觉得对项目还不够了解,我推荐一个笨方法,复制项目代码,复制后你就明白了。
如果想进一步学习源码的精髓,可以模仿类似的程序进行练习。
理解这个程序并不意味着你已经掌握了它。 只有当你练习类似的程序时,你才能知道你理解了多少,掌握了多少。
10.教导他人(输出知识)
测试自己是否掌握一门技术,就是输出知识,看看别人能不能理解。
当你熟悉了项目的各个方面后,你就可以在B站开始直播,将你所学到的知识传授给其他人。
输出形式:
1.在csdn博客、知乎、今日头条、微信公众号等平台发表文章
2. 群内技术讨论或微信群讨论