从0开始:如何看懂源码

这几年开源项目是越来越火,很多技术大会或是论坛上也都有提到某某开源项目。
不得不承认了解、参与开源项目,无论是解决工作上的问题,还是对个人的提升都很有帮助。
要谈到开源项目,就不得不提起开源项目最大的托管所,也是我们的交友平台 GitHub。
我刚好最近在网上看到一张图,把 GitHub 介绍的明明白白,这里分享给大家。
图片源于网络
如果还有不知道 GitHub 是什么的小伙伴赶紧去百度一下啦,反正以后你也离不开它。
不再扯闲篇了,咱们接着聊开源项目的事。

为什么要看开源项目

在我看来,看开源项目的原因有二。

第一是工作中总会碰到一些问题,无论是 Google 还是百度,无论是 StackOverFlow 还是个人博客,总是找不到解决问题的思路。

这个时候只能去翻源码。

而这些源码大多托管在 GitHub 上,就是所谓的开源项目。

在这个方面我不是什么开源达人,也还是个小菜鸟,摸着石头过河,但经过这几年的磨练,大体上知道咋看,后面会分享一些看源码的技巧。

第二就是惨兮兮的自学党需要开源项目来丰富自己的经历,来开拓自己的眼界。

在个人的学习方面,开源项目也可以帮你破开学了无用的瓶颈,还可以从中吸取大佬们的经验和用法,一石二鸟。

至于用用 GitHub 上一些开源的黑科技可不适用这,除非你对某个项目特别特别感兴趣,想要更进一步了解,甚至参与其中。

无论为什么要看开源项目,有一点是值得肯定的,多看一定对自己是有益的。

看开源项目有哪些难

说实话,开源项目可不是你说看就能看的懂的。

想我当初第一次接触成系统的项目代码,愁的我头发都掉了好多。

现在反过头去看当初的我,还能坚持在这一行,真的是付出了不少努力。

我总结了一下为啥那时候我看源码会这么难,这里分享给大家。

代码量大且复杂

先不论你所看代码的好坏,就说一个写的很好项目代码,依旧很难阅读。

一个成系统的项目代码,不是你刚开始学习时接触的那些几十、几百行代码。

它代码量之大,代码结构之复杂,根本不是新手可以搞定的。

知乎上有个大佬(wsivoky)之前是这么说看源码的。

搞项目,看源码要面对的是下面这乱糟糟的一坨。

源于wsivoky的知乎回答
而读代码就是找到这一坨连线中两个节点可能存在的路径。
这对新手而言一点也不友好。
我看有些人一上来就让别人去读开源项目,去看源码提升自己,这种建议就很迷,这就像是让一个刚看了大学物理的人去造原子弹一样,毫无意义。
当然 GitHub 上还有很多适合新手的开源项目,短短几百行近千行代码,就能实现一个很有趣的功能。
这对小白们巩固自己掌握的技术还是很有帮助的。
别人的代码很难读

有些时候你要问,为什么程序猿们喜欢自己造轮子,不是自己的轮子好用,而是别人的轮子不是太难看,就是看不懂。

开源项目尤其是这样。

一个稍大一点的开源项目,除非是那种文档极其良心,代码极其规范的优质品,都不适用于新手学习。

当然,这也源于开源的弊端。

  • 首先开源项目本身是免费的,作者没有义务为你详细解释某某实现过程,而项目文档本身又相当乏味枯燥。

  • 其次就是开源本身倾向于更新一些的技术,可能都是大牛们私下里的尝试。这可不是你在学习时接触到的那些朴实又稳定的旧技术.

所以对初学者而言,读代码的学习方式是极力不推荐的,我还是认为学习一项技术应该先读书或看教学视频,然后自己去大胆实践。
至于接触开源项目(优质)也是最后一步要走的。

看源码的思路和方法

我在看源码这条路上其实走了不少弯路,就像当初看源码为了理解某一个功能,光 IDE 上就有十几个标签页,跳来跳去,看的我只想着放弃,心态崩了就。
下面是我思考的一些读源码的方法,只是我的个人看法哈。
带着目的去读
为什么最先提出来,是因为这是我犯的最大的错误,踩过的最无辜的坑。
我当时的情况是跟着书上敲了敲代码,自己也能写个小网站,实现一些常见功能,然后就陷入了瓶颈,不知道该做什么。
我混论坛的适合发现很多人都说应该看源码,我就漫无目的的瞎看,现在想想真的是浪费时间。
看源码和你自己写代码一样,你得先有明确的目的。
如果像我以前那样漫无目的的读代码,我觉得是很难有好结果的。
还是之前那个比喻,项目代码是一坨缠绕起来的线,而你的目的就是一个线头,一个源码的切入点。
假设你想了解这个项目中某一功能是怎么实现的,那这个功能就是你的切入点。
记得借助 IDE 强大的跳转功能,按代码跳转的顺序读下来,把这个黑匣子中的一角搞清楚,你就会对整个项目熟悉很多。
然后利用这些个突破口深入了解这个项目,顺藤摸瓜解决问题。
如何看源码

我自己给看源码的过程分成了三个阶段,但必须要说的是,每个阶段都一定要将程序跑起来。

程序员这行毕竟算是工科,理论必须得和实践结合。

第一阶段

这一阶段是刚接触项目的阶段,你首先要做的,就是让你的代码跑起来。

只有跑起来的程序,你才能知道这个项目是干嘛的,这个项目提供了什么功能。

同时这一阶段也需要我们了解整个项目大致用了哪些技术点。

这是最困难的地方,也是你查漏补缺,提升技术的好时机。

靠谱点的开源项目都会在 README 中写上如何部署,这个看源码的小伙伴一定要多加留意。

如果你对所需的技术点都有了大概的了解,借助开源项目的文档,摸清楚开源项目的整体框架。

比如哪部分是负责网络通信,哪部分是实现逻辑认证,哪部分是与前端交互,把大的模块先分出来。

第二阶段

第二阶段就是我们之前说的带着目的去读代码,去跑代码,去改代码。

你就可以从一个模块入手,借助IDE,学会下断点,并尝试修改代码。

我们不光是参与其中,通过程序的直观变化了解所看代码职责,甚至主动的创造 Bug。

比如我们可以注释掉一些代码,再试着跑跑,看看程序有什么反应。

是崩溃了,还是某些功能不能用了。

如果是程序崩溃了,那就看看程序是在哪里死掉了,如果是某些功能不能用了,那就可以判断这部分代码和这个功能间的关系。

第三阶段

重复上个阶段,让你把源码的伪装一层一层拆开,你就能理解整个框架了。

而第三阶段的读代码就是为了研究在解决问题时,别人的项目中用到的某一技术,或是一些巧妙的构思。

为什么用这个技术,又是如何实现的,都是我们该思考学习的。

当然你也可以了解到作者的代码风格、命名习惯等等,想参与这个项目开发的小伙伴们就可以更进一步的探索。

注意事项
  • 看源码是一个痛苦而又有收益的事,对此你一定要有耐心,很多地方比较难想,不妨多看几遍。

  • 把握好读代码时的颗粒度,每行都去细读是不现实的,这样只会让你见木不见森,而粗读可能会漏掉许多关键点。

  • 了解常用的设计模式是必要的,因为很多开源大佬写代码时都默认了这些,如果你听都没听说过,你组织代码时就会变得很乱。

  • 好记性不如烂笔头,一定要学会注释,跑程序中出现的问题和想法,记得要及时记录。当然在理解整个框架的过程,流程图也要画起来,这些收益远比你想象的多。

推荐几个开源项目

我推荐几个我之前就看过的 Python 开源项目,不适合老鸟,倒是很多刚入门的小伙伴可以多了解一下。

faif/python-patterns:

用 Python 实现一些设计模式的例子。
地址:
https://github.com/faif/python-patterns
pallets/click:
click 是 flask 里面提供命令行功能的组件,这里推荐是因为当初我就是从这个开始看 flask 源码的,网上的相关博客和资料也挺多的,感兴趣的可以看看。
地址:
https://github.com/pallets/click
bottlepy/bottle:
bottle 是一个极轻量的 Web 框架,长度好像也就 4k 多行,如果时间充裕的小伙伴不妨多看看。
地址:
https://github.com/bottlepy/bottle
aosabook/500lines:
500lines 是一些大牛们用不到 500 行的代码实现一个功能,里面涉及的东西有很多,对于爬虫来说更是必看:协程、异步、aiohttp(某一 HTTP 框架)等等都有涉及,就连 Python 之父都是该项目的作者之一。
地址:
https://github.com/aosabook/500lines

总结

后来我自己看这篇文章,发现不单单适用于接触开源项目,入职以后你熟悉公司老的项目都是这般流程。

困难总是有,办法总比困难多,读源码对个人提升是毋庸置疑的,这种耐下性子就能有收获的好事,干嘛让它白白溜走。

还是那句,学路慢慢,咱一起进步呗~

(0)

相关推荐