add how to read code

This commit is contained in:
Fengda HUANG 2016-11-21 12:35:13 +08:00
parent 43a14fef20
commit 0fda63e9f8
11 changed files with 240 additions and 0 deletions

86
chapters/09-read-code.md Normal file
View file

@ -0,0 +1,86 @@
如何以“正确的姿势”阅读开源软件代码
===
> 所有让你直接看最新源码的文章都是在扯淡,你应该从“某个版本”开始阅读代码。
我们并不建议所有的读者都直接看最新的代码,正确的姿势应该是:
- clone某个项目的代码到本地
- 查看这个项目的release列表
- 找到一个看得懂的release版本如1.0或者更早的版本
- 读懂上一个版本的代码
- 向后阅读大版本的源码
- 读最新的源码
最好的在这个过程中,**可以自己造轮子来实现一遍**。
## 阅读过程
在我阅读的前端库、Python后台库的过程中我们都是以造轮子为目的展开的。所以在最开始的时候我需要一个可以工作并且拥有我想要的功能的版本。
![it-works-cms.png](./img/it-works-cms.png)
紧接着,我就可以开始去实践这个版本中的一些功能,并理解他们是怎么工作的。再用`git`大法展开之前修改的内容可以使用IDE自带的Diff工具
![pycharm-diff.jpg](./img/pycharm-diff.jpg)
或者类似于`SourceTree`这样的工具,来查看修改的内容。
在我们理解了基本的核心功能后,我们就可以向后查看大、中版本的更新内容了。
开始之前,我们希望大家对版本号管理有一些基本的认识。
## 版本号管理
我最早阅读的开始软件是Linux而下面则是Linux的Release过程
![linux-history.png](./img/linux-history.png)
表格源自一本书叫《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它。
![clone-flask.png](./img/clone-flask.png)
二、从Release页面找到它的早期版本
![flask.png](./img/flask.png)
三、 从上面拿到它的提交号`8605cc3`然后checkout到这次提交查看功能。在这个版本里一共有六百多行代码
![flask-0.1.png](./img/flask-0.1.png)
还是有点长
四、我们可以找到它的最早版本:
![flask-init.png](./img/flask-init.png)
然后查看它的`flask.py`文件,只有简单的三百多行,并且还包含一系列注释:
![flask-init.png](./img/flask-init.png)
五、接着,再回过头去阅读
- 0.1版本
- 。。。
- 最新的0.10.1版本

View file

@ -2351,6 +2351,93 @@ def get_points(usernames):
真看不出来两者有什么相似的地方 。。。。
如何以“正确的姿势”阅读开源软件代码
===
> 所有让你直接看最新源码的文章都是在扯淡,你应该从“某个版本”开始阅读代码。
我们并不建议所有的读者都直接看最新的代码,正确的姿势应该是:
- clone某个项目的代码到本地
- 查看这个项目的release列表
- 找到一个看得懂的release版本如1.0或者更早的版本
- 读懂上一个版本的代码
- 向后阅读大版本的源码
- 读最新的源码
最好的在这个过程中,**可以自己造轮子来实现一遍**。
## 阅读过程
在我阅读的前端库、Python后台库的过程中我们都是以造轮子为目的展开的。所以在最开始的时候我需要一个可以工作并且拥有我想要的功能的版本。
![it-works-cms.png](./img/it-works-cms.png)
紧接着,我就可以开始去实践这个版本中的一些功能,并理解他们是怎么工作的。再用`git`大法展开之前修改的内容可以使用IDE自带的Diff工具
![pycharm-diff.jpg](./img/pycharm-diff.jpg)
或者类似于`SourceTree`这样的工具,来查看修改的内容。
在我们理解了基本的核心功能后,我们就可以向后查看大、中版本的更新内容了。
开始之前,我们希望大家对版本号管理有一些基本的认识。
## 版本号管理
我最早阅读的开始软件是Linux而下面则是Linux的Release过程
![linux-history.png](./img/linux-history.png)
表格源自一本书叫《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它。
![clone-flask.png](./img/clone-flask.png)
二、从Release页面找到它的早期版本
![flask.png](./img/flask.png)
三、 从上面拿到它的提交号`8605cc3`然后checkout到这次提交查看功能。在这个版本里一共有六百多行代码
![flask-0.1.png](./img/flask-0.1.png)
还是有点长
四、我们可以找到它的最早版本:
![flask-init.png](./img/flask-init.png)
然后查看它的`flask.py`文件,只有简单的三百多行,并且还包含一系列注释:
![flask-init.png](./img/flask-init.png)
五、接着,再回过头去阅读
- 0.1版本
- 。。。
- 最新的0.10.1版本
#GitHub连击
##100天

BIN
img/clone-flask.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

BIN
img/flask-0.1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 476 KiB

BIN
img/flask-init.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 537 KiB

BIN
img/flask.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

BIN
img/it-works-cms.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

BIN
img/linux-history.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 337 KiB

BIN
img/pycharm-diff.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 313 KiB

View file

@ -166,6 +166,10 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf
</ul></li>
<li><a href="#邻近算法与相似用户">邻近算法与相似用户</a></li>
</ul></li>
<li><a href="#如何以正确的姿势阅读开源软件代码">如何以“正确的姿势”阅读开源软件代码</a><ul>
<li><a href="#阅读过程">阅读过程</a></li>
<li><a href="#示例">示例</a></li>
</ul></li>
<li><a href="#github连击">GitHub连击</a><ul>
<li><a href="#天">100天</a><ul>
<li><a href="#天的提升">40天的提升</a></li>
@ -2133,6 +2137,69 @@ pipe.execute()</code></pre></div>
0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. ]</code></pre>
<p>真看不出来两者有什么相似的地方 。。。。</p>
<h1 id="如何以正确的姿势阅读开源软件代码">如何以“正确的姿势”阅读开源软件代码</h1>
<blockquote>
<p>所有让你直接看最新源码的文章都是在扯淡,你应该从“某个版本”开始阅读代码。</p>
</blockquote>
<p>我们并不建议所有的读者都直接看最新的代码,正确的姿势应该是:</p>
<ul>
<li>clone某个项目的代码到本地</li>
<li>查看这个项目的release列表</li>
<li>找到一个看得懂的release版本如1.0或者更早的版本</li>
<li>读懂上一个版本的代码</li>
<li>向后阅读大版本的源码</li>
<li>读最新的源码</li>
</ul>
<p>最好的在这个过程中,<strong>可以自己造轮子来实现一遍</strong></p>
<h2 id="阅读过程">阅读过程</h2>
<p>在我阅读的前端库、Python后台库的过程中我们都是以造轮子为目的展开的。所以在最开始的时候我需要一个可以工作并且拥有我想要的功能的版本。</p>
<figure>
<img src="./img/it-works-cms.png" alt="it-works-cms.png" /><figcaption>it-works-cms.png</figcaption>
</figure>
<p>紧接着,我就可以开始去实践这个版本中的一些功能,并理解他们是怎么工作的。再用<code>git</code>大法展开之前修改的内容可以使用IDE自带的Diff工具</p>
<figure>
<img src="./img/pycharm-diff.jpg" alt="pycharm-diff.jpg" /><figcaption>pycharm-diff.jpg</figcaption>
</figure>
<p>或者类似于<code>SourceTree</code>这样的工具,来查看修改的内容。</p>
<p>在我们理解了基本的核心功能后,我们就可以向后查看大、中版本的更新内容了。</p>
<p>开始之前,我们希望大家对版本号管理有一些基本的认识。 ## 版本号管理</p>
<p>我最早阅读的开始软件是Linux而下面则是Linux的Release过程</p>
<figure>
<img src="./img/linux-history.png" alt="linux-history.png" /><figcaption>linux-history.png</figcaption>
</figure>
<p>表格源自一本书叫《Linux内核0.11(0.95)完全注释》,简单地再介绍一下: - 版本0.00是一个hello,world程序 - 版本0.01包含了可以工作的代码 - 版本0.11是基本可以正常的版本</p>
<p>这里就要扯到《GNU 风格的版本号管理策略》:</p>
<p>1项目初版本时版本号可以为 0.1 或 0.1.0, 也可以为 1.0 或 1.0.0,如果你为人很低调,我想你会选择那个主版本号为 0 的方式; 2当项目在进行了局部修改或 bug 修正时,主版本号和子版本号都不变,修正版本号加 1 3. 当项目在原有的基础上增加了部分功能时,主版本号不变,子版本号加 1修正版本号复位为 0因而可以被忽略掉 4当项目在进行了重大修改或局部修正累积较多而导致项目整体发生全局变化时主版本号加 1 5另外编译版本号一般是编译器在编译过程中自动生成的我们只定义其格式并不进行人为控制。</p>
<p>因此,我们可以得到几个简单的结论: - 我们需要阅读最早的有核心代码的版本 - 我们需要阅读1.0版本的Release - 往后每一次大的Release我们都需要了解一下</p>
<h2 id="示例">示例</h2>
<p>以Flask为例</p>
<p>一、先Clone它。</p>
<figure>
<img src="./img/clone-flask.png" alt="clone-flask.png" /><figcaption>clone-flask.png</figcaption>
</figure>
<p>二、从Release页面找到它的早期版本</p>
<figure>
<img src="./img/flask.png" alt="flask.png" /><figcaption>flask.png</figcaption>
</figure>
<p>三、 从上面拿到它的提交号<code>8605cc3</code>然后checkout到这次提交查看功能。在这个版本里一共有六百多行代码</p>
<figure>
<img src="./img/flask-0.1.png" alt="flask-0.1.png" /><figcaption>flask-0.1.png</figcaption>
</figure>
<p>还是有点长</p>
<p>四、我们可以找到它的最早版本:</p>
<figure>
<img src="./img/flask-init.png" alt="flask-init.png" /><figcaption>flask-init.png</figcaption>
</figure>
<p>然后查看它的<code>flask.py</code>文件,只有简单的三百多行,并且还包含一系列注释:</p>
<figure>
<img src="./img/flask-init.png" alt="flask-init.png" /><figcaption>flask-init.png</figcaption>
</figure>
<p>五、接着,再回过头去阅读</p>
<ul>
<li>0.1版本</li>
<li>。。。</li>
<li>最新的0.10.1版本</li>
</ul>
<h1 id="github连击">GitHub连击</h1>
<h2 id="天">100天</h2>
<p>我也是蛮拼的虽然我想的只是在GitHub上连击100~200天然而到了今天也算不错。</p>