你们都是怎么阅读同事遗留的屎山代码的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jokechen
V2EX    职场话题

你们都是怎么阅读同事遗留的屎山代码的?

  •  1
     
  •   jokechen 2023-10-17 20:16:16 +08:00 3499 次点击
    这是一个创建于 729 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这周进了一个新项目,接受了以前同事遗留的代码。我所接手的代码都是一些简单的业务操作,比如账单的生成、合同的签订等。这些代码包含但不限于以下特征,让我读起来非常挠头:

    • 一个方法 1000 多行
    • if else 套了不下 7 层
    • 前辈致力于在一个方法里写下所有业务逻辑
    • 有部分错误注释

    。。。

    是你的话该如何读这些代码呢?

    我曾经试着让 chatgpt 帮我阅读梳理,可能我的 prompt 写的有问题,他也很难帮我将整体逻辑梳理清楚。

    请问您有什么好的建议或者 prompt ?

    第 1 条附言    2023-10-17 22:10:02 +08:00
    屎山代码不可避免,接到手上了也是没有办法的。
    本帖还是希望各位朋友提供一些可以快速梳理代码整体逻辑的方法。
    最好有借助 ai 的方法。
    39 条回复    2023-11-21 22:06:40 +08:00
    swuzjb
        1
    swuzjb  
       2023-10-17 20:17:54 +08:00
    能不读就不读。
    chuck1in
        2
    chuck1in  
       2023-10-17 20:18:50 +08:00   3
    听起来像是一份年薪百万的工作
    KMpAn8Obw1QhPoEP
        3
    KMpAn8Obw1QhPoEP  
       2023-10-17 20:36:32 +08:00 via Android
    我目前的感受就是没办法 六字真言贴显示器旁边 然后硬着头皮一点点 debug 一点点看 尤其是祖传 Java 屎山表达能力差得一比 写了十来行只干了一件事 大部分 if 都在判断空指针 但凡用一下 optional 和 stream 也不至于那么恶心的 就是没有 就硬 for each+if
    wwlzz
        4
    wwlzz  
       2023-10-17 20:38:46 +08:00
    不用全部理解,按需求/bug 来,加断点调试,添加日志,测试用例等
    jokechen
        5
    jokechen  
    OP
       2023-10-17 20:40:10 +08:00   2
    还有一个问题,有些接口的入参能有 100 多个
    KMpAn8Obw1QhPoEP
        6
    KMpAn8Obw1QhPoEP  
       2023-10-17 20:44:40 +08:00 via Android
    @jokechen 真猛 突然觉得我手头的屎山靓丽了许多
    zzNucker
        7
    zzNucker  
       2023-10-17 20:45:22 +08:00
    100 多个入参也太离谱了
    Kirscheis
        8
    Kirscheis  
       2023-10-17 21:07:52 +08:00
    我这有一堆前辈留下的无文档 LabView 程序,目前谁都看不懂,所以我选择整个封装当盲盒用,新需求另建山头。。。
    zjp
        9
    zjp  
       2023-10-17 21:21:40 +08:00
    看正文感觉还好啊,硬看就是了
    看到#5 ,对不起,超出能力范围了
    sadfQED2
        10
    sadfQED2  
       2023-10-17 21:27:03 +08:00 via Android
    断点调试,一行一行的跟一遍就懂了。
    darkengine
        11
    darkengine  
       2023-10-17 21:43:16 +08:00
    不要读懂他, 要改的时候各种绕路, 例如在上边包一层, 这样就能得到一个更大的屎山了.
    NothingExist
        12
    NothingExist  
       2023-10-17 21:47:42 +08:00
    删库重写:)
    jonty
        13
    jonty  
       2023-10-17 21:59:42 +08:00
    @zzNucker #7 这不是屎山,这已经是特色了
    KMpAn8Obw1QhPoEP
        14
    KMpAn8Obw1QhPoEP  
       2023-10-17 22:21:49 +08:00 via Android
    @sadfQED2 调用栈太深的断点调试其实也不理想 复杂点的只过一遍肯定不够 正手来一个 step over 可能一下子跳了一大段逻辑 反手 step into 个几次回来都找不到北
    dddd1919
        15
    dddd1919  
       2023-10-17 22:28:27 +08:00
    @jokechen 人类早期训练 AIGC ?
    HUZHUANGZHUANG
        16
    HUZHUANGZHUANG  
       2023-10-17 23:46:05 +08:00   1
    有时候只能本人读懂的原因是存在一些不再需求文档上的代码
    v2eb
        17
    v2eb  
       2023-10-17 23:50:13 +08:00
    先理解业务吧, 有流程图啥的就好了。
    x86
        18
    x86  
       2023-10-17 23:58:24 +08:00
    这种写法叫人工混淆加密,一般公司顶梁柱才写的出,优点是别人难以看懂接盘顶替自己...
    KMpAn8Obw1QhPoEP
        19
    KMpAn8Obw1QhPoEP  
       2023-10-18 00:15:46 +08:00 via Android
    @x86 有没有另外的可能 比如他自己都维护不下去 只好先甩手跑路了…
    zhangjuanzi
        20
    zhangjuanzi  
       2023-10-18 08:51:49 +08:00
    不会仔细读,大概了解一下,碰到需求再定位到要改的地方改了就完事了,也不会想着去优化。而且我也挺喜欢这种代码的,在这种代码上做需求一般会给的时间多点,自己快速做完剩下的时间就做别的。
    8355
        21
    8355  
       2023-10-18 09:08:01 +08:00   1
    用常规运行结果反推,不要读全部,以最小的改动代价完成本次需求,能不动就不动。
    ytmsdy
        22
    ytmsdy  
       2023-10-18 09:16:49 +08:00
    不看!反正看了也看不懂,就算看懂了也不敢去改。
    把业务了解清楚就好了,如果出现 bug ,直接 debug 进入调试模式。针对 bug 的场景用 if 特殊处理,其他部分不动!
    处理屎山项目的原则就是,能不动就不动,就算要动也只加,不删除。
    ma836323493
        23
    ma836323493  
       2023-10-18 09:17:25 +08:00
    抽丝剥茧慢慢来, 前人为了省事打了各种补丁, 我视情况而定, 要有工匠精神
    COOOOOOde
        24
    COOOOOOde  
       2023-10-18 09:25:13 +08:00
    不读, 当成黑盒。
    nenseso
        25
    nenseso  
       2023-10-18 10:01:04 +08:00
    我觉得要有能力改屎山代码,首先要对业务非常熟悉。
    xxiaowangwang
        26
    xxiaowangwang  
       2023-10-18 10:10:42 +08:00
    只要钱到位,屎壳郎就是我。
    haitaoli
        27
    haitaoli  
       2023-10-18 10:12:54 +08:00 via iPhone
    我也一样 虽然没你手里这么屎 不过我太菜了 也是几个同事断断续续的写了好几年 一行注释都没有 而且之前写这个的人已经离职的差不多了 一点都不想看 摆烂了
    ZGame
        28
    ZGame  
       2023-10-18 10:14:19 +08:00
    厌恶屎山,接受屎山,理解屎山,成为屎山
    haitaoli
        29
    haitaoli  
       2023-10-18 10:15:48 +08:00 via iPhone
    @haitaoli 而且交给我活的时候 也没有需求 之前这一块是和另一个功能耦合在一块的 现在让我从里面解出来 差不多就是重写一遍吧 现在直接卡在读代码这一步 读不懂代码 就不知道需求 不知道需求 就没法写
    zw1one
        30
    zw1one  
       2023-10-18 10:19:22 +08:00
    告诉领导和产品,这玩意儿看不了,一改全是坑,挖坑的人全跑了,重写吧。
    woshihgs
        31
    woshihgs  
       2023-10-18 10:29:18 +08:00
    @ZGame #28 超越屎山
    bfdh
        32
    bfdh  
       2023-10-18 10:30:29 +08:00
    目前没有这个烦恼,因为我就是那个写屎山代码,然后交给同事的人。

    回到楼主问题,我的做法一般是先问清楚业务,从业务反推代码。
    jokechen
        33
    jokechen  
    OP
       2023-10-18 10:38:48 +08:00
    @bfdh 比较麻烦的就是懂业务的人也全跑了,也就是说我们这边好多产品经理都是新接手的。昨天产品经理有一个需求不太明白,找到我说“兄弟,你从代码里帮我看下,这部分需求实现过没?”
    ---
    今天我已经有些佛性了,因为开始慢慢的有测试找我提一些问题了。
    这样我能跟着测试的逻辑一起熟悉代码。。。。
    beisilu
        34
    beisilu  
       2023-10-18 10:42:46 +08:00
    理论上跑起来加断点慢慢来是可以熟悉的。
    但是实际情况是跑都跑不起来
    iOCZ
        35
    iOCZ  
       2023-10-18 10:54:41 +08:00
    @jokechen 提交表单是字段比较多的一种可能,但是要填 100 多个字段也是没有用户体验了。假如说要上报设备信息,字段很多,那完全可以一个 JSON 字段搞定。
    sankooc
        36
    sankooc  
       2023-10-18 16:48:58 +08:00
    我以前接手过一个 callback 地狱的项目 那一个酸爽
    imqiyue
        37
    imqiyue  
       2023-10-18 17:06:54 +08:00
    边骂边看…
    abelmakihara
        38
    abelmakihara  
       2023-10-20 11:41:11 +08:00
    之前接过的无非就是东拆西拆让它的可读性变强 可以复用
    动里面逻辑那是万万不敢的 最多就是继续加 ifelse
    unregister
        39
    unregister  
       2023-11-21 22:06:40 +08:00
    我的工资就是我的精神损失费
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3563 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 10:27 PVG 18:27 LAX 03:27 JFK 06:27
    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