如何以“正确的姿势”阅读开源软件代码

之前想过写这篇文章,但是没有想到一个好的内容、好的突破点。在《GitHub 漫游指南》指南里,我们提到过《如何在GitHub“寻找灵感(fork)”》,但是并不是关于阅读源码的好文章。

我们并不建议所有的读者都直接看最新的代码,正确的姿势应该是:

  • clone某个项目的代码到本地
  • 查看这个项目的release列表
  • 找到一个看得懂的release版本,如1.0或者更早的版本
  • 读懂上一个版本的代码
  • 向后阅读大版本的源码
  • 读最新的源码

最好的在这个过程中,可以自己造轮子来实现一遍

阅读过程

在我阅读的前端库、Python后台库的过程中,我们都是以造轮子为目的展开的。所以在最开始的时候,我需要一个可以工作,并且拥有我想要的功能的版本。

紧接着,我就可以开始去实践这个版本中的一些功能,并理解他们是怎么工作的。再用git大法展开之前修改的内容,可以使用IDE自带的Diff工具:

或者类似于SourceTree这样的工具,来查看修改的内容。

在我们理解了基本的核心功能后,我们就可以向后查看大、中版本的更新内容了。

开始之前,我们希望大家对版本号管理有一些基本的认识。

版本号管理

我最早阅读的开始软件是Linux,而下面则是Linux的Release过程:

表格源自一本书叫《Linux内核0.11(0.95)完全注释》,简单地再介绍一下:

  • 版本0.00是一个hello,world程序
  • 版本0.01包含了可以工作的代码
  • 版本0.11是基本可以正常的版本

这里就要扯到《GNU 风格的版本号管理策略》:

1.项目初版本时,版本号可以为 0.1 或 0.1.0, 也可以为 1.0 或 1.0.0,如果你为人很低调,我想你会选择那个主版本号为 0 的方式; 2.当项目在进行了局部修改或 bug 修正时,主版本号和子版本号都不变,修正版本号加 1; 3. 当项目在原有的基础上增加了部分功能时,主版本号不变,子版本号加 1,修正版本号复位为 0,因而可以被忽略掉; 4.当项目在进行了重大修改或局部修正累积较多,而导致项目整体发生全局变化时,主版本号加 1; 5.另外,编译版本号一般是编译器在编译过程中自动生成的,我们只定义其格式,并不进行人为控制。

因此,我们可以得到几个简单的结论:

  • 我们需要阅读最早的有核心代码的版本
  • 我们需要阅读1.0版本的Release
  • 往后每一次大的Release我们都需要了解一下

示例

以Flask为例:

一、先Clone它。

二、从Release页面找到它的早期版本:

三、 从上面拿到它的提交号8605cc3,然后checkout到这次提交,查看功能。在这个版本里,一共有六百多行代码

还是有点长

四、我们可以找到它的最早版本:

然后查看它的flask.py文件,只有简单的三百多行,并且还包含一系列注释。

五、接着,再回过头去阅读

  • 0.1版本
  • 。。。
  • 最新的0.10.1版本

原文发布于微信公众号 - phodal(phodal-weixin)

原文发表时间:2016-05-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏互联网杂技

利用机器学习把草图自动生成HTML

项目地址 https://github.com/ashnkumar/sketch-code 可以先clone到本地

19520
来自专栏企鹅号快讯

如何将机器学习的模型部署到NET环境中?

【IT168 资讯】对于以数据为中心的工程师来说,Python和R是数据中心最流行的编程语言之一。但是,它们并不总是构建应用程序的其余部分的语言。这就是为什么你...

32390
来自专栏撸码那些事

使用缓存的正确姿势

15070
来自专栏hotqin888的专栏

ONLYOFFICE权限开发之一

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

29540
来自专栏Python小屋

Python使用标准库urllib模拟浏览器爬取网页内容

爬取网页内容的第一步是分析目标网站源代码结构,确定自己要爬取的内容在哪里,这要求对HTML代码有一定了解,对于某些网站内容的爬取还需要具有一定的Javascri...

13010
来自专栏运维一切

正向代理访问腾讯云cos时http405的问题

当使用正向代理请求cos资源的时候,cos对http协议的支持会比较严谨,“宽容性”不够。可能对http协议更加谨慎一点反而更好吧

25070
来自专栏我的小碗汤

nginx学习之模块

这里注意了,虽然修改的是default.conf,但是检查的时候始终还是加载nginx.conf,否则报错:

8820
来自专栏计算机视觉

Automatic Photo Adjustment Using Deep Neural Networks 论文实验训练测试部分

安装双系统ubuntu和cuda和 dl_image_enhance安装部分教程,这个小哥哥写的很好 我写下安装cuda_convent_plus和训练测试...

352100
来自专栏后端技术探索

Nginx从入门到学会(4.事件处理)

有人可能要问了,nginx采用多worker的方式来处理请求,每个worker里面只有一个主线程,那能够处理的并发数很有限啊,多少个worker就能处理多少个并...

7710
来自专栏撸码那些事

使用缓存的正确姿势

缓存是现在系统中必不可少的模块,并且已经成为了高并发高性能架构的一个关键组件。这篇博客我们来分析一下使用缓存的正确姿势。

52960

扫码关注云+社区

领取腾讯云代金券