• 请不要在回答技术问题时复制粘贴 AI 生成的内容
gujianbo
V2EX  ›  程序员

如何看懂 github 上的开源项目

  •  
  •   gujianbo ·
    gujianbo · Apr 25, 2014 · 29392 views
    This topic created in 4404 days ago, the information mentioned may be changed or developed.
    RT,github上有很多优秀的开源项目,如nginx、mysql、hadoop、spark、tair。对此比较敬仰,但是就是不知道怎么看懂,求解
    37 replies    2016-11-25 09:05:13 +08:00
    Pixeller
        2
    Pixeller  
       Apr 25, 2014
    - -你写的这个也很难看懂.
    shenmimu
        3
    shenmimu  
       Apr 25, 2014
    shenmimu
        4
    shenmimu  
       Apr 25, 2014
    @Pixeller 是一个开发手册啊 起码是中文的 可以有点思路;)
    Pixeller
        5
    Pixeller  
       Apr 25, 2014
    @shenmimu 我说lz.
    gujianbo
        6
    gujianbo  
    OP
       Apr 25, 2014
    @Pixeller 纳尼,难道我表达不清楚吗
    gujianbo
        7
    gujianbo  
    OP
       Apr 25, 2014
    @shenmimu thanks
    coolcfan
        8
    coolcfan  
       Apr 25, 2014
    没有必要一上来就看这么大的吧,有很多精巧的小项目的。
    Mutoo
        9
    Mutoo  
       Apr 25, 2014   ❤️ 3
    46fo
        10
    46fo  
       Apr 25, 2014
    你需要 Source Insight 3.5
    simpx
        11
    simpx  
       Apr 25, 2014
    分享一下个人经验总结,就是硬着头皮,逐个函数、逐个文件的理解过去,遇到不懂的就google,懂了的就在旁边写上注释,碰到复杂逻辑,拿出草稿纸画流程图,从函数、文件到模块,最后慢慢能复述出大致的逻辑和经典的细节。
    说白了,没有看不懂的代码,只有不够强的动力。
    aszxqw
        12
    aszxqw  
       Apr 25, 2014   ❤️ 2
    本来就是很难啃的东西。
    如果想顺利的看懂一般需要几个条件,就拿nginx来说吧。
    1. 熟悉c语言
    2. 平时就是在开发网络服务
    3. 经常使用nginx。

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

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

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

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

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

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

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

    需要
    alexapollo
        15
    alexapollo  
       Apr 25, 2014
    RTFSC
    alexapollo
        16
    alexapollo  
       Apr 25, 2014   ❤️ 2
    看一个东西,一般都要循序渐进。

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

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


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

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

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

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

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

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

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

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