炸毛:请问怎么读源码? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yvettemuki
V2EX    机器学习

炸毛:请问怎么读源码?

  •  
  •   yvettemuki 2019-12-27 18:22:00 +08:00 6392 次点击
    这是一个创建于 2180 天前的主题,其中的信息可能已经有所发展或是发生改变。

    各位大佬,你有没有什么读源代码的经验可以分享? 缘由:在读 mxgraph 源码的时候,一堆计算,好容易炸毛,关键是炸毛后还是一知半解,不会用,请问有什么好的读源码的方法 orz ?

    24 条回复    2019-12-28 23:49:36 +08:00
    14v45mJPBYJW8dT7
        1
    14v45mJPBYJW8dT7  
       2019-12-27 18:25:39 +08:00   4
    由简到难,由外到内,由大到小,由框架到细节
    lazyfighter
        2
    lazyfighter  
       2019-12-27 18:40:26 +08:00   1
    先知道怎么用,然后在知道一个小功能怎么用,然后在知道一个小功能怎么用,然后在知道....................,终于到了最后,把这些小功能串起来就行了一个体系,你就知道这个东西是怎么设计的了,然后在体系的去看代码,你就知道了作者的写代码设计思路
    adkudao
        3
    adkudao  
       2019-12-27 18:44:18 +08:00
    @lazyfighter 你的意思我懂了, 不过这样一来, 感觉稍微大点的项目就要读个大半年甚至几年了
    lazyfighter
        4
    lazyfighter  
       2019-12-27 18:48:31 +08:00
    @adkudao 就我的经验而言,功能与功能之间都是相关联的,尤其是底层提供的基础能力,小功能只是在基础能力上面的扩展,所以入门就好.
    noogler67
        5
    noogler67  
       2019-12-27 18:58:59 +08:00
    我不信楼主如果没学过编译器直接去看能看得懂编译器代码。我个人认为代码是其次的,里面的大体逻辑 /技术点 /算法是最重要的。如果你能明白大体逻辑 /技术点 /算法,代码就很容易。反之就很困难。所以我觉得还是得找一个老师教你,比如尝试看看源代码相关的讲解的书。免责声明:本人并无阅读源代码的经验,看得只是很简单的库(大体逻辑 /技术点 /算法都很简单的库)
    CEBBCAT
        6
    CEBBCAT  
       2019-12-27 20:47:34 +08:00 via Android
    @noogler67 “第一个中英翻译,是上帝赐下的吗?”
    zjsxwc
        7
    zjsxwc  
       2019-12-27 20:50:22 +08:00 via Android   1
    首先是会用,用熟它先,不需要了解源码;
    然后读最初的版本,一般最初的版本是最简单的;
    再者是不断的通过 ide 打断点单步调试看看运行结果和自己的猜测是否一致
    memcache
        8
    memcache  
       2019-12-27 20:55:13 +08:00
    上面的大佬说了我想说的,还是要先用熟了,再去读
    ihtMaaN9b41ewLSU
        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 文件夹里能看明白的
    sleepm
        10
    sleepm  
       2019-12-27 21:58:27 +08:00 via Android
    sourcegraph.com
    先熟悉了用法,再去熟悉代码
    ihciah
        11
    ihciah  
       2019-12-27 23:15:12 +08:00
    zhaogaz
        12
    zhaogaz  
       2019-12-27 23:30:47 +08:00
    我的建议是别读,建议你先搞清楚你为什么要读?你可以先考虑下,回复出来,我们再接着讨论。
    zxCoder
        13
    zxCoder  
       2019-12-27 23:55:45 +08:00
    作为一个菜鸡 我觉得读源码应该带有目的的去读比较好 比如我最近看巨硬的 seal 库,就是因为遇到了某些 bug,通过读源码才弄懂并解决的
    yeya24
        14
    yeya24  
       2019-12-28 00:55:58 +08:00 via iPhone
    我读源码的话 比如什么函数看不懂 基本会去看它的单测 看看这个函数是怎么用的 实在不行就打断点吧 就是比较费时间
    penguinWWY
        15
    penguinWWY  
       2019-12-28 01:15:00 +08:00
    第一步文档、README
    第二步搞清楚构建过程,编译依赖
    第三部执行 testcase、unittest,搞清楚模块的功能,输入输出,重点 API
    第四步构造一份输入,从 main 开始执行,尝试调用指定的功能
    SIGEV13
        16
    SIGEV13  
       2019-12-28 06:44:45 +08:00
    从测试开始看,最快上手
    yvettemuki
        17
    yvettemuki  
    OP
       2019-12-28 10:56:18 +08:00
    @zjsxwc 问题是,在用,但是教学文档太不全了,遇到情况没办法只能看源码怎么做的,才会用(哭
    yvettemuki
        18
    yvettemuki  
    OP
       2019-12-28 10:59:03 +08:00
    @vvsmallv 呃呃呃,我说的是 mxGraph,不是深度学习的,我是前端图形化的 O.O
    fuckshiter
        19
    fuckshiter  
       2019-12-28 11:00:48 +08:00 via iPhone
    先想想为什么去读,读之前想想如果是自己该怎么实现,带着这个去读,对比自己的,这样我觉得比较好读一点
    yvettemuki
        20
    yvettemuki  
    OP
       2019-12-28 11:01:16 +08:00
    @sleepm 6666 这个网站有点东西
    yvettemuki
        21
    yvettemuki  
    OP
       2019-12-28 11:04:43 +08:00
    @zhaogaz 因为不看做不了了 orz,遇到一个功能,有现成的实现方式,但是就是附带在框架里的一个解决方案上,需要读懂了,按着自己的需求来改着用
    971586331
        22
    971586331  
       2019-12-28 17:32:53 +08:00
    先感性再理性
    flynaj
        23
    flynaj  
       2019-12-28 19:16:40 +08:00 via Android
    起码的知识不了解没法看,算法,构架
    zhaogaz
        24
    zhaogaz  
       2019-12-28 23:49:36 +08:00   1
    @yvettemuki 目的明确的话,我猜你应该能看到关键的 函数,或者是方法或者其他的什么东西了。

    在这种情况下,
    1. 先把能看的文档看一下。
    2. 猜一下哪里要出现我要的功能,从对应的入口开始看。
    3. 我一般习惯把源码下载下来。边写注释边看。有时候还会用纸笔画画图。
    4. 如果说代码不是很烂的话,各种命名也有提示作用。

    结合一下你说的运算看不懂。大概有一个这样的解决思路: 比方说 有一个 byte & 0xFF 运算。 这个运算背后是有特定目的的(你查查就知道了)。了解了运算的目的就好搞了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3139 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 74ms UTC 00:19 PVG 08:19 LAX 16:19 JFK 19:19
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86