如何看懂 github 上的开源项目 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
gujianbo
V2EX    程序员

如何看懂 github 上的开源项目

  •  
  •   gujianbo
    gujianbo 2014-04-25 17:03:27 +08:00 28857 次点击
    这是一个创建于 4186 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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     Solana     5552 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 08:53 PVG 16:53 LAX 01:53 JFK 04:53
    Do have faith in what you're doing.
    ubao 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