怎么阅读学习源代码

2020-02-09 23:18:33 +08:00
 lynn0977
想通过阅读一些开源项目,提高自己的知识水平,怎样学比较高效,希望大家分享一下自己的方法和经验。
8026 次点击
所在节点    Python
28 条回复
netty
2020-02-10 11:06:25 +08:00
@secondwtq
王老师提到的,洞察到最关键的东西,最近刚好写了一篇文章,我觉得有点类似,分享一下:
《掌握这些,你也能徒手实现 ArrayList、Vector 和 Stack 》
https://mp.weixin.qq.com/s/zhDLb3vpbb70abXyFfucww

不想看文章的,就看里面这段总结吧:
写到这里,我们来总结一下掌握本篇内容的核心步骤:
1.学会数组的基本操作,重点是插入、删除和扩容;
2.基于数组的基本操作,完善并实现 ArrayList ;
3.在 ArrayList 的基础之上,对所有方法加上同步原语 synchronized,实现 Vector ;
4.继承 Vector,利用的几个基本方法,实现 Stack 的入栈出栈操作。
通过以上几个步骤,能够更加高效的学习,更好的理解 ArrayList、Vector 和 Stack 这几个类的实现原理。
netty
2020-02-10 11:07:23 +08:00
@qiumaoyuan
最后还要尝试去对关键逻辑自己实现一下
ofooo
2020-02-10 13:55:28 +08:00
要是王垠把他的几百行的深度学习框架开源出来就好了。。。。
wanglufei
2020-02-10 14:10:23 +08:00
@ofooo 怎么能让你偷学,然后出去装 X(手动狗头)
Youen
2020-02-10 16:52:11 +08:00
可以从测试入手, 跟着测试代码进去

随便看看也是有收获的, 比如提高自己的代码"品味", 看到一些代码新姿势等..
chenqh
2020-02-10 17:00:36 +08:00
看源代码我看的好慢,我看 tornado 断断续续看了一年,感觉还是生的不行
encro
2020-02-11 21:11:46 +08:00
非常好的题目,根据你的题目我刚写了一篇短 Blog。

如何通过阅读源代码学习?
https://c4ys.com/archives/2034

分为三个部分:
1,有选择的阅读
2,阅读步骤
3,学习的要点

总体思路是带着问题学习。
YiyangILiu
2020-05-16 10:00:52 +08:00
这个问题我也有感觉。我的想法是:

1. 一定要带着好奇心和问题阅读框架,看得少没关系,看懂是目的
2. 第一遍看最好手写一遍
3. 看懂一步再看下一步
4. 很多时候因为自己没参与封装的过程,经常出现看到一个点牵扯出三个新的不懂的点。或者更通俗地说,应该深度优先阅读还是广度优先阅读呢?我的方法是,只多看一层。
比如 pandas DataFrame 类中一个 rename 方法( https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.rename.html),函数本身有 8 个 arguments,在 example 中用到了两个 arguments,别的都是默认。那我不熟悉这个方法的话,看 doc 不仅看用到的 2 个 arguments,另外的没用到的 6 个也要学学怎么用。但是更深入一层呢?比如 level 这个参数,如果不懂 pandas 中的 MultiIndex 概念是不能理解它的。那要不要为了理解这个参数去再深入一层,学习 MultiIndex 的概念和用法呢?这时就可以考虑一下,我既然没用过 MulitiIndex,我不理解没关系。这个简单的例子就是深度一层的含义。

最近一直在阅读一个中小型框架的源码( github 总代码 6K 行左右),是深度学习方面的。这个框架的作用是用两行实现一个 2K 行左右的自然语言处理模型。
其中第一行是实现一个分词器,也就是 tokenizer,这个 tokenizer 在框架内的实现大约 300 行,其内又有方法若干。第二行是实现一个语言模型,模型在框架内的实现大约 900 行。其内又有方法若干。
最终,我使用好奇心和一点一点手写的办法,把这些给复现出来了。写完后发现自己很多一开始不理解的问题迎刃而解了。我对模型处理的流程比较理解了,让我复述一遍没问题。但是内部的数学运算还不能说特别理解,很多当时复现的时候就一知半解。

比如 keras.backend.reshape()( https://www.tensorflow.org/api_docs/python/tf/keras/backend/reshape), tensorflow.einsum()( https://www.tensorflow.org/api_docs/python/tf/einsum),这些函数说实话不难,看例子都能看懂,但是当实操的时候,特别是操作一些四维的 Tensor 的时候,我就犯迷糊了,每个维度都有自己的物理含义,比如 sequence_length 是句子长度, hidden_size 是特征维等等。只能说不断地看不断学。

我觉得之前一个答案说得好,看源代码就像迭代学习一样,每看一点就理解深一点,想看一遍就会基本不可能。其实世界上大多数事情都是这样,学习是个渐进的过程,特别是前沿的东西,都是在渐进中提高的。
就比如 github 某个成熟项目源代码量 10k,但是翻 commits 记录,addition 至少是 lines of code 的 3-4 倍。10k 量级源代码,addition 40k 左右是正常的。不可能有哪个框架从 0 写到完成没有修改的。有经验的框架作者如此,学习者就更不能好高骛远了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/643318

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX