大家有什么比较好的“看源代码”的套路么?尤其是比较大的项目 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
yazoox
V2EX    程序员

大家有什么比较好的“看源代码”的套路么?尤其是比较大的项目

  •  
  •   yazoox 2020-03-26 14:32:30 +08:00 5459 次点击
    这是一个创建于 2029 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如,要去接手一个项目,已经有大约几十万行(可能上百万行)代码。

    怎么入手,查看源代码,了解整个软件 /产品运行,能够更快的熟悉和上手呢?

    难道“直接一个文件一个文件硬看源代码”?兄弟姐妹们,有没有啥方法或者套路?

    谢谢!

    28 条回复    2020-03-29 20:25:15 +08:00
    shawndev
        1
    shawndev  
       2020-03-26 14:36:01 +08:00 via Android   1
    看 release 对应的 tag,从第一个 release 开始看
    saltbo
        2
    saltbo  
       2020-03-26 14:38:10 +08:00   1
    从功能对应到实现吧。 我习惯先了解功能,然后猜想这功能怎么实现的,然后去查代码验证自己的猜想。
    yazoox
        3
    yazoox  
    OP
       2020-03-26 14:49:23 +08:00
    @saltbo 这个主意不错,我去试试。
    hoyixi
        4
    hoyixi  
       2020-03-26 14:56:44 +08:00
    对着设计和开发文档看,是最省心的。

    如果没有文档,先有个整体概貌,然后对着功能看。
    star7th
        5
    star7th  
       2020-03-26 15:19:06 +08:00
    如果是 web 项目的话,我有一点体会。
    先从产品上了解这个项目是干嘛的,有什么功能。列出来,把功能从大到小细分。然后,打开代码,找到路由文件,根据路由文件判断哪个功能对应哪个文件。然后挑一下重点功能看看。接下来可以在做需求中熟悉了。
    sumarker
        6
    sumarker  
    PRO
       2020-03-26 15:22:13 +08:00
    首先看看项目整体是一个什么项目,
    然后看看之前的项目需求文档,如果没有文档可以问问之前的人历史的功能
    再看看代码的风格,
    然后重点看可能要修改的部分。
    gz911122
        7
    gz911122  
       2020-03-26 15:32:33 +08:00
    我的习惯是不看,
    有需求了照着界面反推.
    把 app/web 玩一下知道啥功能是干啥的在哪就行了
    waiaan
        8
    waiaan  
       2020-03-26 15:37:06 +08:00
    一般从改 bug 开始入手
    huisezhiwei
        10
    huisezhiwei  
       2020-03-26 15:56:12 +08:00
    1 、观察项目的依赖库:
    java 的 pom,build.gradle ; 前端的 webpack ; android 的 manifest ( ios 不懂,但应该也有)。
    相对新一些的项目,都会使用非常多的打包工具或者开箱即用的框架。如果不事先对工具链有一个初步的认实,很多自动化的配置看源码是找不到的。

    2 、观察项目的代码(包、层级)结构:
    一个项目的代码如何组织规类,很大程度上能够体现编程思想 。 例如经典的 MVC,MVP,DDD 。 知晓这些可以帮你较快的找到你希望首先了解的代码实现 。

    3 、寻找接口路由、逻辑入口配置
    任何软件的核心都是对外提供服务, 想要了解和学习,找到业务的入口是第一步。 通常较大的项目,为了降低维护成本。都会将接口、页面路由等配置进行统一的管理,并配以注解。

    4 、善用 IDE 的 debug
    走到这一步, 剩下的就是体力活了。 如果能将项目顺利运行起来。 利用 IDE 的 debug 功能 ,可以了解进程、调用堆栈、接口实现类等单纯看源码无法了解,却又非常重要的信息。

    5 、不要发散思维,不要深入研究
    以上……
    sniperking1234
        11
    sniperking1234  
       2020-03-26 15:57:01 +08:00
    先了解项目的功能,然后化繁为简,把主要流程找出来。一般核心代码行数不多,其他的都是处理边缘情况的代码。
    murmur
        12
    murmur  
       2020-03-26 16:02:17 +08:00
    这种一般我就不看了,实在沉不下心,我会找别人的指南,看一下核心流程和重要功能实现,然后去对应代码核对一遍,就当我看过了。。
    Greendays
        13
    Greendays  
       2020-03-26 16:02:46 +08:00
    如果是 web 项目的话,就把当前需要用到的路由找出来,顺着看下去吧。感觉也没有什么特别有效的办法
    longjiahui
        14
    longjiahui  
       2020-03-26 16:06:03 +08:00
    通常如果能“用”的话 就先看看怎么用
    然后 根据接口入手
    littleMaple
        15
    littleMaple  
       2020-03-26 16:09:19 +08:00
    我阅读源码有一个诀窍,会重度使用 IDE 的「折叠」和「展开」功能,在扁平的文本上抽象出不同的抽象层级,就可以自己自由地在各个抽象层级之间跳跃,在关注某一抽象层级的时候不需要看到其下底部抽象层级的细节而分心,很好用.

    另外有一个开源工具也专注做类似这样的事情,将完全扁平的代码文本转换成概念化的抽象树,名为 SourceTrail: https://www.sourcetrail.com/
    sadfQED2
        16
    sadfQED2  
       2020-03-26 16:14:29 +08:00 via Android
    难道没人先看数据库设计吗,知道数据库设计后再看各个功能的实现
    chinvo
        17
    chinvo  
       2020-03-26 16:16:56 +08:00
    善用带静态分析或者 lsp 的 IDE

    从一个小功能的入口开始, 一层层分析.

    基本上项目整体的风格应该是差不多的, 分析一个小功能就能对整体有个差不多的认知了.
    littlewing
        18
    littlewing  
       2020-03-26 16:43:10 +08:00 via iPhone
    先会用
    再针对性地看
    slyang5
        19
    slyang5  
       2020-03-26 16:51:51 +08:00
    看单元测试吧。
    xuanbg
        20
    xuanbg  
       2020-03-26 17:07:29 +08:00
    上万行代码的项目,就没必要去啃这堆屎了。除了恶心一下自己外,你什么也得不到。迫不得已要修 bug,根据日志直接找相关代码就行了。
    hauzi
        21
    hauzi  
       2020-03-26 17:26:16 +08:00
    还是要分功能模块分析的,底层和业务分开,一层一层的扒。
    bigjack
        22
    bigjack  
       2020-03-26 17:30:42 +08:00
    最好是做需求,才能熟悉的快,光研究代码没什么意义
    CismonX
        23
    CismonX  
       2020-03-26 17:33:36 +08:00   2
    推荐王垠的一篇博客,作为这一问题的回答:
    http://www.yinwang.org/blog-cn/2020/02/05/how-to-read-code
    我觉得讲得还是挺中肯的
    balamiao
        24
    balamiao  
       2020-03-26 17:40:47 +08:00
    先看网络框架~
    yilai
        25
    yilai  
       2020-03-26 23:39:33 +08:00
    先了解整体实现的逻辑,然后自己构思一个大框,再去看
    yazoox
        26
    yazoox  
    OP
       2020-03-27 09:04:39 +08:00
    @littleMaple 兄弟,你说的这个 IDE 是啥?这个是特别的功能么?
    thx.
    littleMaple
        27
    littleMaple  
       2020-03-28 17:20:02 +08:00
    @yazoox 大部分 IDE 或者文本编辑器应该都支持这个功能,因为这是个很基础的功能,英文名叫 fold / expand,一般都在菜单栏的编辑选项卡下面有显示,你可以看看你用的软件有没有。这里是一个关于该功能的维基页面 https://www.wikiwand.com/en/Code_folding
    SmiteChow
        28
    SmiteChow  
       2020-03-29 20:25:15 +08:00
    文档,必须有,不然你只能管中窥豹
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1543 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 16:32 PVG 00:32 LAX 09:32 JFK 12:32
    Do have faith in what you're doing.
    ubao msn 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