如何优雅的阅读开源项目源码

我阅读过一些比较知名的 Python 第三方库的源码,如 Flask、APScheduler、requests 等,虽然不多,但有点浅显的经验可以分享。

使用 tag

一个知名的项目,通常经过较长时间的开发,如 requests、pytest 等,从 github 上拉下来,直接开看,通常会有点闷逼,此时你可以按 tag 方式进行阅读,切到项目比较早期的阶段来看对应的代码。

如何切?

1. 通过 git tag 命令查看当前项目所拥有的 tag。2. 直接通过 git checkout tag_name 进行切换则可,如下图所示。

图中直接切换到 requests 第一个标签 v0.10.0 进行源码阅读,此时的 requests 相对于最新版肯定有很多没有考虑的,但其核心功能是实现好的,我们看源码需要先将这些最关键的掌握,这是精髓。

不必耻于阅读他人源码分析博客

很多知名库已经被很多人分析过了,此时可以先阅读他们的文章,不必为自己看他人源码分析文章而理解这个项目而感到羞耻,没有必要一定要自己从头理解,站在前人基础之上是更好的选择,我写的 Flask 源码分析系列,其实就是在前辈们的文章中理解的。

但再好的源码分析文章其信息含量与真正的源码依旧有一定的差距,所以在阅读他人文章时,对自己感兴趣的地方,可以直接以#TODO 的形式标记一下,后面回过头来看。

学会提问

花时间阅读一个项目的源码,必然是希望从中获得某些收货的,此时可以利用提问的技巧来达到这个目的。在阅读前,简单的定一些自己希望弄明白的问题,一开始只需要定一些简单问题,在阅读源码的过程中,这些问题会被解答,但同样会产生新的问题。

问题如同迷航中的路灯,避免我们迷思到代码中、为了读而读。最郁闷的可能就是一顿猛读后,到头两手空,而提出问题,尝试在源码中找到问题的答案可以从一定程度上避免这些问题,避免你在阅读的过程中深入太过细节的逻辑中。

最小可运行实例

让项目运行起来是快速理解代码的方式,当你想阅读一个项目时,构建出最小的可运行实例,利用 PyCharm 的 debug 功能加以辅助,让你可以穿梭与源码之中,多看变量中的值的变化,理解起来很快。

利用 Structure

如果项目中,对应的类过于庞大,此时可以利用 PyCharm 的 Structure 来概览整个类中的属性与方法,可以让你对这个类快速的有个整体认识。

不必完整的掌握源码

我看很多源码项目时,大致理清楚了整个项目最基本的使用方式,知道了类与类之间的关系,但却不明白这样设计的意义,pluggy 就让我有这样的困惑,我完全可以通过更简单的方式实现一个插件系统,不理解为何 pluggy 库要弄的这么绕。

这其实是正常现象,一是自己功力没到家,人家用来某种设计模式或设计哲学,自己没有接触过,其优势当然无法理解,二是项目在使用的过程中遇到了各种各样的场景需要修改与适配,经过一段时间的修改,项目本身的结构就发生了各种各样的修改,很多方法中都有各类 if 判断用于避免异常的出现,如果自己没有遇到对应的场景,这些异常现象不会被触发,当然无法理解。

所以阅读时,不必特别较真,除非你需要深度使用该库,否则到达一定深度有所收获则可。

变更日志

有时候我们需要深度使用某些第三方库,用于线上某些环境的支持,比如我们团队就定制了 APScheduler,此时就需要对这个库有比较深入的理解,对其异常判断执行的条件要有大致的认识。

如何以一个比较短的路径去理解项目源码呢?

看其变更日志是不错的选择,配合 tag 来看,可以更好的理解当初这个功能的 pr(pull request)为何会被合并进来,主要是解决什么问题或新增该功能的用处等等。

尾部

源码路慢慢,劝君莫独行,还不关注一波。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

懒编程-二两

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值