各位大佬,你们有没有什么读源代码的经验可以分享? 缘由:在读 mxgraph 源码的时候,一堆计算,好容易炸毛,关键是炸毛后还是一知半解,不会用,请问有什么好的读源码的方法 orz ?
1
rimutuyuan 2019-12-27 18:25:39 +08:00 4
由简到难,由外到内,由大到小,由框架到细节
|
2
lazyfighter 2019-12-27 18:40:26 +08:00 1
先知道怎么用,然后在知道一个小功能怎么用,然后在知道一个小功能怎么用,然后在知道....................,终于到了最后,把这些小功能串起来就行了一个体系,你就知道这个东西是怎么设计的了,然后在体系的去看代码,你就知道了作者的写代码设计思路
|
3
adkudao 2019-12-27 18:44:18 +08:00
@lazyfighter 你的意思我懂了, 不过这样一来, 感觉稍微大点的项目就要读个大半年甚至几年了
|
4
lazyfighter 2019-12-27 18:48:31 +08:00
@adkudao 就我的经验而言,功能与功能之间都是相关联的,尤其是底层提供的基础能力,小功能只是在基础能力上面的扩展,所以入门就好.
|
5
noogler67 2019-12-27 18:58:59 +08:00
我不信楼主如果没学过编译器直接去看能看得懂编译器代码。我个人认为代码是其次的,里面的大体逻辑 /技术点 /算法是最重要的。如果你能明白大体逻辑 /技术点 /算法,代码就很容易。反之就很困难。所以我觉得还是得找一个老师教你,比如尝试看看源代码相关的讲解的书。免责声明:本人并无阅读源代码的经验,看得只是很简单的库(大体逻辑 /技术点 /算法都很简单的库)
|
7
zjsxwc 2019-12-27 20:50:22 +08:00 via Android 1
首先是会用,用熟它先,不需要了解源码;
然后读最初的版本,一般最初的版本是最简单的; 再者是不断的通过 ide 打断点单步调试看看运行结果和自己的猜测是否一致 |
8
memcache 2019-12-27 20:55:13 +08:00
上面的大佬说了我想说的,还是要先用熟了,再去读
|
9
ihtMaaN9b41ewLSU 2019-12-27 21:49:44 +08:00
@yvettemuki 不难啊 mxnet 主要代码在 src 目录 python perl 都是接口
src/operator 里实现 nn 的核心代码 nn 都是由最简单的运算符(operator)构成的, 比如 linear, conv; src/operator/nn 里是由运算符构成的网络层,比如 fc, softmax 层; src/operator/optimizer_* 是优化器,比如 SGD, Adam 其他都是更细节的东西了 nnpack 是用来优化加速计算的 还有分布式计算, 存储部分的实现 粗看 mxnet 的 operator 设计和 caffe 类似,不是 pytorch 那样自动求导的,而是自己写 Backward 部分 总之深度学习框架都很类似, mxnet 考虑到工业级部署所以代码量大点, 如果楼主已经熟悉了深度学习, 至少 operator 文件夹里能看明白的 |
10
sleepm 2019-12-27 21:58:27 +08:00 via Android
sourcegraph.com
先熟悉了用法,再去熟悉代码 |
11
ihciah 2019-12-27 23:15:12 +08:00
|
12
zhaogaz 2019-12-27 23:30:47 +08:00
我的建议是别读,建议你先搞清楚你为什么要读?你可以先考虑下,回复出来,我们再接着讨论。
|
13
zxCoder 2019-12-27 23:55:45 +08:00
作为一个菜鸡 我觉得读源码应该带有目的的去读比较好 比如我最近看巨硬的 seal 库,就是因为遇到了某些 bug,通过读源码才弄懂并解决的
|
14
yeya24 2019-12-28 00:55:58 +08:00 via iPhone
我读源码的话 比如什么函数看不懂 基本会去看它的单测 看看这个函数是怎么用的 实在不行就打断点吧 就是比较费时间
|
15
penguinWWY 2019-12-28 01:15:00 +08:00
第一步文档、README
第二步搞清楚构建过程,编译依赖 第三部执行 testcase、unittest,搞清楚模块的功能,输入输出,重点 API 第四步构造一份输入,从 main 开始执行,尝试调用指定的功能 |
16
SIGEV13 2019-12-28 06:44:45 +08:00
从测试开始看,最快上手
|
17
yvettemuki OP @zjsxwc 问题是,在用,但是教学文档太不全了,遇到情况没办法只能看源码怎么做的,才会用(哭
|
18
yvettemuki OP @vvsmallv 呃呃呃,我说的是 mxGraph,不是深度学习的,我是前端图形化的 O.O
|
19
fuckshiter 2019-12-28 11:00:48 +08:00 via iPhone
先想想为什么去读,读之前想想如果是自己该怎么实现,带着这个去读,对比自己的,这样我觉得比较好读一点
|
20
yvettemuki OP @sleepm 6666 这个网站有点东西
|
21
yvettemuki OP @zhaogaz 因为不看做不了了 orz,遇到一个功能,有现成的实现方式,但是就是附带在框架里的一个解决方案上,需要读懂了,按着自己的需求来改着用
|
22
971586331 2019-12-28 17:32:53 +08:00
先感性再理性
|
23
flynaj 2019-12-28 19:16:40 +08:00 via Android
起码的知识不了解没法看,算法,构架
|
24
zhaogaz 2019-12-28 23:49:36 +08:00 1
@yvettemuki 目的明确的话,我猜你应该能看到关键的 函数,或者是方法或者其他的什么东西了。
在这种情况下, 1. 先把能看的文档看一下。 2. 猜一下哪里要出现我要的功能,从对应的入口开始看。 3. 我一般习惯把源码下载下来。边写注释边看。有时候还会用纸笔画画图。 4. 如果说代码不是很烂的话,各种命名也有提示作用。 结合一下你说的运算看不懂。大概有一个这样的解决思路: 比方说 有一个 byte & 0xFF 运算。 这个运算背后是有特定目的的(你查查就知道了)。了解了运算的目的就好搞了。 |