yvettemuki

炸毛:请问怎么读源码?

  •  
  •   yvettemuki · Dec 27, 2019 · 6682 views
    This topic created in 2340 days ago, the information mentioned may be changed or developed.

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

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

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

    结合一下你说的运算看不懂。大概有一个这样的解决思路: 比方说 有一个 byte & 0xFF 运算。 这个运算背后是有特定目的的(你查查就知道了)。了解了运算的目的就好搞了。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3067 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 466ea39e · 61ms · UTC 14:16 · PVG 22:16 · LAX 07:16 · JFK 10:16
    ♥ Do have faith in what you're doing.