V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yvettemuki
V2EX  ›  机器学习

炸毛:请问怎么读源码?

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

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

    24 条回复    2019-12-28 23:49:36 +08:00
    rimutuyuan
        1
    rimutuyuan  
       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
    上面的大佬说了我想说的,还是要先用熟了,再去读
    vvsmallv
        9
    vvsmallv  
       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   ·   我们的愿景   ·   实用小工具   ·   1130 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 18:44 · PVG 02:44 · LAX 11:44 · JFK 14:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.