复习之“怎么看开源代码”
1313
2024.07.17
2024.10.31
发布于 北京市

0 背景

在项目中,我们往往需要一些开源项目来支撑起项目的快速发展,一路到产品生产发布。这个过程中,我们只知道怎么用,往往是不够,无法进行更好的改造适配项目(二开),修改BUG,排查问题等;这就涉及到必须掌握开源项目的实现原理、使用的技术细节、关键点。

其实,这个也是在过去面试过,别人问过我的问题。也算是一种分享交流吧,如果有什么不对的,大家多讨论交流

1 怎么开头

往往很多朋友拿到开源项目第一时间就去找到main函数的入口开始看代码;或者打开搜索引擎搜xxx如果使用/xxx讲解/xxx源代码解析。回头再看一下源代码的代码量,少的几千上万,多的光源代码文件都上千,代码至少几十万打底,这种代码杂看啊。
一下就泄气,只能尽量找到自己需要用的部分来重点看看,尝试修改修改。但是又有另一个问题,自己怎么能确定自己找到的部分就是自己想要的那部分?很有可能一顿看,一顿弄,最后发现压根就不是,浪费时间/精力😂(没错,以前我就是这么了解开源项目的)

先看文档!!!

是的,先看开源项目给的出文档。这个方法是我目前来看了解开源项目最好的办法了(一家之言,欢迎大家分享指教其它方法)。
一般我们可以通过看开源项目的文档能了解到项目的:

  1. 该开源项目是做什么的。
  2. 如何使用(快速融入到自己的项目中)
  3. 软件使用的到主体技术栈
  4. 主要的功能点,应用的场景
  5. 软件的整体结构(一般大的项目分拆分成多个不同的部分)
  6. 项目实现的原理
  7. 对应的依赖条件(自身的局限性/生态等)

了解了这些其实再回过头来看源代码就会更从容一些。就像有了一份地图,也知道自己在什么地方,要去哪里,走哪条路,都可以从地图上找到,不致于迷路。

我知道,很多人跟我一样英文不好,看英文的文档比较费劲。除了提升自己的英文水平,其实可以利用翻译软件/插件之类的通过翻译的方式,先对项目进行大概的了解,即使翻译得没那么准确,但是先看懂个七七八八的,也总比闷头去看源代码要好得多。如果是那种比较热门的开源软件,也可以搜一下对应的中文版本(很多热心的朋友会免费翻译出来)。

还有就是有些开源软件,本身是有官网的。在项目里可能介绍的文档没那么全,需要自己跳到开源软件的官网,更进一步的了解;特别是里面提到的概念、名词,还有对应的含意之类的,这些都需要了解的;当这些概念、名词出现在源代码的注释里面的时候就能很流畅的知道作者的用意。有的开源软件甚至还有对应的论文,这也是需要去看的,因为涉及论文的,是这个开源项目的灵魂点(项目的可行性),一定一定一定要看!!!

比如我最近在使用的 GmSSL ,是由关志老师带领的团队做的关于国密的开源软件,除从GitHub上的文档查看基本信息外,也挂出了对应的官网,官网也给出了更多关于GmSSL相关的文档,这些文档就涉及到我上面说能了解到的内容。
有了这些了解,使用起该开源软件就会得心应手许多。
image.png
image.png

2 看源代码

有了前期的对项目的整体了解,就可以开始看源代码了。
但是也不是一下就扎到main里去了。代码是线性的,但是代码结构不是;更像是网状结构,这调那调/相互交叉,这很容易被饶晕,摸不清逻辑结构。
最好是带着问题(目标)去读源代码(记得先查查文档有没有提到相应的问题),甚至是带着问题和答案一起去读源代码(在开源的文档里,作者会提到为什么会这么做,这么做的好处是什么);以点带面作为切入点来梳理出对应代码结构和逻辑结构。
一些热门的项目网上会对应的分享,也可以借鉴一下,也能省点部分分析的时间。
在看源代码的过程中,我们可以通过一些工具,把源代码的流程图、时序图、结构图、重点算法、涉及的原理、关联关系等等(可以利用官方给出的文档,做反向印证),给画出来,写下来,也更有利用我们对开源项目的了解。
通过这种方式慢慢的积累自己对源代码的了解,随着时间的增多,代码了解的加深,对该开源项目会越来越了解,甚至提出自己的想法,加入到开源项目里去。

一些问题

1、有些开源软件没有对应的文档怎么办?

说真的,像这种没有文档的开源软件,说明本身应用的地方不多,属于比较小众化的开源。对应的代码量应该也不会多。没办法,只能通过硬看代码的方式来对其进行了解;不过看代码也要讲究策略,先看整体,再看细节;再从细节反向印证结构(带问题,也就是找细节)。
多多利用工具记录过程,梳理结构,没办法,人脑的容量就那大。

2、看源代码很费时间和精力怎么办?

咱就是吃这碗饭的,没办法,费时费力这是客观条件。如果领导给的时间有限,先可以先找领导协商,客观的评估;如果领导不讲理,那就先把开源项目先应用起来,细节问题/优化问题往后拖。
这个时候其实最能体会到互联网的分享精神了。如果刚好使用的开源项目已经被人解读过,确实能省出不少时间;不过需要注意的是,分享出来的相当于把饭喂到自己嘴里,但是咀嚼和消化还是得靠自己。

评论 (1)