V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gujianbo
V2EX  ›  程序员

如何看懂 github 上的开源项目

  •  
  •   gujianbo ·
    gujianbo · 2014-04-25 17:03:27 +08:00 · 28148 次点击
    这是一个创建于 3625 天前的主题,其中的信息可能已经有所发展或是发生改变。
    RT,github上有很多优秀的开源项目,如nginx、mysql、hadoop、spark、tair。对此比较敬仰,但是就是不知道怎么看懂,求解
    37 条回复    2016-11-25 09:05:13 +08:00
    shenmimu
        1
    shenmimu  
       2014-04-25 17:10:00 +08:00
    Pixeller
        2
    Pixeller  
       2014-04-25 17:10:07 +08:00
    - -你写的这个也很难看懂.
    shenmimu
        3
    shenmimu  
       2014-04-25 17:10:20 +08:00
    shenmimu
        4
    shenmimu  
       2014-04-25 17:10:55 +08:00
    @Pixeller 是一个开发手册啊 起码是中文的 可以有点思路;)
    Pixeller
        5
    Pixeller  
       2014-04-25 17:11:31 +08:00
    @shenmimu 我说lz.
    gujianbo
        6
    gujianbo  
    OP
       2014-04-25 17:15:24 +08:00
    @Pixeller 纳尼,难道我表达不清楚吗
    gujianbo
        7
    gujianbo  
    OP
       2014-04-25 17:15:45 +08:00
    @shenmimu thanks
    coolcfan
        8
    coolcfan  
       2014-04-25 17:20:26 +08:00
    没有必要一上来就看这么大的吧,有很多精巧的小项目的。
    Mutoo
        9
    Mutoo  
       2014-04-25 17:25:34 +08:00   ❤️ 3
    xdeng
        10
    xdeng  
       2014-04-25 17:31:33 +08:00
    你需要 Source Insight 3.5
    simpx
        11
    simpx  
       2014-04-25 17:45:57 +08:00
    分享一下个人经验总结,就是硬着头皮,逐个函数、逐个文件的理解过去,遇到不懂的就google,懂了的就在旁边写上注释,碰到复杂逻辑,拿出草稿纸画流程图,从函数、文件到模块,最后慢慢能复述出大致的逻辑和经典的细节。
    说白了,没有看不懂的代码,只有不够强的动力。
    aszxqw
        12
    aszxqw  
       2014-04-25 17:47:46 +08:00   ❤️ 2
    本来就是很难啃的东西。
    如果想顺利的看懂一般需要几个条件,就拿nginx来说吧。
    1. 熟悉c语言
    2. 平时就是在开发网络服务
    3. 经常使用nginx。

    之前有个同事对nginx源码熟读了很多,原因就是他就是专门开发server的,而且他读源码的时候经常修改nginx源码调试跑看看效果。

    如果完全不是一个方向的话,比如如果你是搞前端js的话,感觉硬啃server源码恐怕很难,建议还是看别人的源码详解或者之类的读书笔记看起。
    simpx
        13
    simpx  
       2014-04-25 18:08:02 +08:00   ❤️ 15
    补充一下经历,来公司前我的经验局限于web后端开发,对系统底层了解很浅,也没有C相关经验。

    工作内容是开发维护一个机制类似nginx,c实现的网络框架,涉及到epoll、socket、并发等。因为是内部项目,没有文档,也没有谁指导,只能硬着头皮自己读懂它。

    几乎每一个函数调用、每一个tcp选项我都Google了一遍,一边查资料一边写注释,因为是框架,逻辑比较复杂,我画流程图、写总结用了两本草稿本,这个时候觉得纸比电脑好用太多。

    一个月左右,我从gcc都不会用,到能把80%经常用到的模块原理和流程复述出来。应该没人会知道,之前我连TCP和UDP的区别都不清楚。

    我以前也尝试过很多次,去阅读一些开源项目,但往往看到一半就觉得太难、无聊而看不下去。

    现在我明白,以前说到底是动力不足。如果有一份不得不读的代码,用好Google和纸,哪怕是汇编,也是可以读懂的。
    21grams
        14
    21grams  
       2014-04-25 18:29:51 +08:00   ❤️ 4
    首先

    需要
    alexapollo
        15
    alexapollo  
       2014-04-25 18:34:00 +08:00
    RTFSC
    alexapollo
        16
    alexapollo  
       2014-04-25 18:35:47 +08:00   ❤️ 2
    看一个东西,一般都要循序渐进。

    先了解它的整体架构,搞清楚为什么要用这样的架构;
    然后再了解架构中的各个组件,组件提供的主要功能与各个组件之间的交互;
    然后深入组件中的某个模块,分析模块的用途,理解模块所涉及的理论;
    最后才是看模块中的代码,分析代码流程,交互走向,验证之前的分析,得到具体结论。

    四步做完,基本上就可以假冒相应软件的作者了。
    tonyup
        17
    tonyup  
       2014-04-25 18:39:20 +08:00
    @simpx 有相同感受。当遇到某些冷门问题发现Google无力的时候,这时只能找相关源码来看了,由于需求强烈(工作需要),这时看源码的感觉/态度会完全不同
    gujianbo
        18
    gujianbo  
    OP
       2014-04-25 18:41:16 +08:00
    @simpx 谢谢大神,解答的太赞了
    leyle
        19
    leyle  
       2014-04-25 18:50:35 +08:00 via Android
    可以尝试从小工具开始,比如wget aria2c axel less more ls ,我就是从axel 开始的,刚开始时,连strcpy()都要man 一下,后面读的越多,笔记做的越多,了解的越多,速度就上来了,对软件,写法,一些逻辑,都有了进一步的理解了,就尝试阅读更复杂一些的软件代码了
    shenmimu
        20
    shenmimu  
       2014-04-25 18:54:04 +08:00
    @Pixeller 啊你们的头像都太萌啦 我脸盲
    PotatoBrother
        21
    PotatoBrother  
       2014-04-25 19:05:51 +08:00
    学习你想要看懂的项目的语言
    Akagi201
        22
    Akagi201  
       2014-04-25 19:56:22 +08:00   ❤️ 1
    上面都太牛了, 我告诉lz吧, 我应届毕业然后在公司做嵌入式开发,主要是网络编程多线程这些, 4000多个文件吧(包括开源代码), 花了7个月才搞懂, 自己增减模块. lz自己掂量着看吧, 呵呵, 不过我现在很"牛X", 自己创业单干无压力, 呵呵, 我觉得起步慢点好, 当然我是比较稳的类型
    Akagi201
        23
    Akagi201  
       2014-04-25 20:00:02 +08:00
    @Mutoo
    Akagi201
        24
    Akagi201  
       2014-04-25 20:00:35 +08:00
    @Mutoo 有类似的优秀教学网站求推荐
    liuxurong
        25
    liuxurong  
       2014-04-25 21:55:01 +08:00
    @Mutoo thanks!


    @simpx 你智商很高的感觉。我们模仿不来
    Taivas
        26
    Taivas  
       2014-04-25 22:14:23 +08:00
    学习了。
    TangMonk
        27
    TangMonk  
       2014-04-25 22:33:51 +08:00
    @simpx 对,只要有动力,什么代码都可以读。
    csx163
        28
    csx163  
       2014-04-25 22:40:14 +08:00
    @Mutoo URL的那个✓很萌啊
    hitsmaxft
        29
    hitsmaxft  
       2014-04-26 00:19:03 +08:00
    1, 你功底不足
    2, 你想太多

    如果你想看懂优秀的作品, 首先你需要一定程度的"优秀"

    所以你现在需要的就是好好学习, 多写代码多思考, 另外从不那么复杂的作品看起, 最好在2k以内, 把自己功底提升上去.
    greatghoul
        30
    greatghoul  
       2014-04-26 09:14:54 +08:00
    如果目前的项目你看不懂,就找一个能看懂的看。
    kehr
        31
    kehr  
       2014-04-26 17:30:16 +08:00
    @alexapollo 说的很赞。但也有问题。

    第一,开源项目很少有专门介绍架构设计的文档。(资历浅,这真没见过...)需要你自己在看源码的过程中逐步递进的理解,自己总结。

    第二,「最后才是看模块中的代码」我觉得不能放在最后。alexapollo 的步骤说的很对,但是每一步并不是独立的。边看模块中的代码边理解模块的功能和与其它模块之间的交互,能够让自己对项目的结构更清晰。当然也不要一下通读全部,函数知道它的输入输出,模块知道它的功能,先建立起一个对项目的宏观认识。

    说白了就是要照 alexapollo 说的几条来回倒腾,反复几遍,一定会有感觉的。

    改一改源码,跑起来看看效果,都是不错的方法。

    方法很多,贵在坚持。(我也就看过一个项目源码,当初很痛苦,现在很幸福。)
    alexapollo
        32
    alexapollo  
       2014-04-26 20:49:30 +08:00
    @kehr
    这个回复是copy自我的openstack知乎回答的……所以你可以对号入座
    其实说起来就是自顶向下逐层展开,自底向上逐层归纳。
    当然,如果能加入项目,直接contribute某一个模块,肯定是会更快的了解整个项目。
    dopcn
        33
    dopcn  
       2014-04-28 16:17:54 +08:00
    扯远一点,提高情商就行
    情商帮你在看到一大堆毫无头绪的代码时冷静下来,首先理智分析自己这样看是否必要,如有必要那就大问题化小,小问题化无问题。一切归咎于是否有能力在遇到困难时控制自己的情绪
    wyj2046
        34
    wyj2046  
       2014-04-28 18:46:50 +08:00
    @simpx 赞这句
    没有看不懂的代码,只有不够强的动力
    深有体会
    wyj2046
        35
    wyj2046  
       2014-04-28 18:49:06 +08:00
    @simpx 最近的经历和你太像了
    不过好处是虽然没有文档 但是还有活字典:)
    anubiskong
        36
    anubiskong  
       2014-04-29 18:03:58 +08:00
    先会用, 找到喜欢的项目, 从自己最了解的功能下手找到相关代码一头钻进去, 然后慢慢扩展到其他功能
    zempty
        37
    zempty  
       2016-11-25 09:05:13 +08:00
    首先把你的智商提上去,再把相关语言的基础打扎实。这个问题就不攻而破
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3102 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 12:56 · PVG 20:56 · LAX 05:56 · JFK 08:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.