首页 > 如何快速读懂开源代码?
头像
编程指北
编辑于 2020-12-05 09:42
+ 关注

如何快速读懂开源代码?

最近刚好在读Python部分源码,这几条建议应该能帮你更好的阅读开源项目

不管是阅读公司项目代码还是开源代码,都不要一开始一头扎进代码里,试图通读源码,这绝对会陷入无止境的细节。

建议先找项目的架构设计和整体流程框架的文档来看,先从顶层设计入手,掌握这个软件整体结构,它有哪些功能特性,它涉及到的关键技术、实现原理等。

接下来才是逐渐厘清模块、函数之间关系,调用图。

这个时候不建议深入看每个函数,只需要做到对整体流程有所把控即可。

RUN起来

真正去阅读的时候,最好的方式,先按着程序员正常的方式DEBUG执行跟踪一遍,也就是先跑起来,去搭建跑起来的环境这个过程也是会让你熟悉这个项目所依赖一些东西。

调试

调试一般跟找Bug差不多,两种手段:

  • 打日志
  • 断点

这两种有些适用场景不同,可以互相结合着使用,比如我最近在看cpython源码中,关于对象的那部分,那我就可以通过修改PyObject_Print函数,然后在其它地方调用,打印出运行时对象的一些我关注的信息。

把控关键数据结构和函数

我们说“程序=算法+数据结构”,我实际的体会是数据结构用得更多,其实不少开源项目也大多是if、else堆起来的,算法只会用到最核心的地方,但是数据结构会到处都需要。

我们可以把项目中一些核心的函数、类、数据结构逐一拿下,因为这些关键的代码往往是理解项目细节的关键。

从小的开始

最好是一些「小而美」的代码,小是指代码量少,最好就几千行,这样我们能够充分把控,美则是指代码实现写得很优雅。

我们都知道提高审美能力很重要的一环就是多看美的东西,好的设计。

那写代码也是一样的,自己学完基本语法,写出来的代码大概停留跑起来的水平。

这时候去看看大佬写的代码,你绝对会惊呼 卧槽,还能这样?

这样的代码有哪些呢?

如果你是大一的同学,我推荐你去看看 Linux 内核中关于链表的实现,简直特么太妙了,平常我们定义链表不都是这样嘛

struct Node {
   int data;
   struct Node* next;
}

但是这个存在的问题就是,每个想用链表存储的结构体,我们都得去写一遍,遍历、插入、删除的逻辑,显然太low了。

那 Linux kernel 中就用宏和指针变换,在对用户自定义数据结构侵入性很小的情况下,实现了其它语言中模板的功能。

相信我,看完,你会学到很多骚操作的,后面找机会写一下这块。

又比如学完 C 语言,你会不会觉得 C 中的字符串有点不灵活,那推荐你去看看 Redis 中关于动态字符串的设计--SDS。

这些代码都不长,也不难理解,但是看完对于提升我们的编码能力是有很大帮助的,这就是小而美。

提倡看源码,不是让你直接上手就啃什么 Nginx、Sqlite、Redis的源码,这些都是几万级别的代码量,一般初学者

即使要啃,我给你说个好办法,这些东西目前来看,代码量都是几万几十万的级别,有点不友好,你可以去 github fork 下来。

然后回退到第一个 commit,从第一个 commit 开始看起,看到第一个完整的版本。

也不一定非要第一个commit,反正大概理念就是尽可能看早期的具备了核心功能的版本,因为很多项目其实都是在不断完善、添加特性,但是最核心的一定是第一个MVP的实现。

这个过程也是能学到不少东西的,看看罗马都是怎么建造成的。

关注一个模块

比如我最近在研究「对象」,就去看了下Python中对象的实现,那对我最重要的就是object.c和object.h这些相关的文件,其它诸如parser、runtime就不是我关注的重点,我也不可能挨着挨着把python源码看完。

我是想通过看源码学习现代语言中对象的实现,那么就只需要关注与这部分相关的代码。

特别是开源项目每个文件上方,都有一个概要性的描述,我推荐把这样的注释看了,有助于帮助我们理解设计思路的大方向。

工具

工欲善其事必先利其器,看代码一定少不了到处跳转,这部分可以找个跳转方便的现代IDE就可以了。
比如 IDEA、Pycharm、Vscode、source insight 之类都可以。

冬天码字不易,觉得有帮助的,帮我点个赞哟~ 笔芯~~

以上文章来自我的知乎回答。
觉得不错的话,欢迎帮我知乎点个赞呗~

如何快速读懂开源代码?

全部评论

(1) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

近期热帖

热门推荐