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

小 心 任 何 二 次 接 手 的 代 码

  •  1
     
  •   MoeMagicMango ·
    moyoez · 38 天前 · 10791 次点击
    这是一个创建于 38 天前的主题,其中的信息可能已经有所发展或是发生改变。

    上周接手了个项目,老板说大部分项目都不能工作,本来是以维护的价格来处理接手这一段代码的

    没想到坑比我想的还多,这是其中展示通用的一部分,大部分出于保密性就不能透露了

    开篇惊喜

    image.png

    我滴妈欸,你说这是 Python 新手练手的代码我都信了,这是家公司的代码???

    Interface 乱飞

    image.png

    怪不得会跑路

    能跑就行的逻辑

    Cookie 生成逻辑

    image.png

    给 User 生成 Cookie 用的,不是 用 个 JWT 会要了命吗?这么写干嘛啊

    image.png

    而且最草的一点,Cookie 存在 MYSQL 数据库 里面

    大哥,这人一多不得打穿数据库啊(

    image.png

    每个请求都要往数据库请求一次,妈欸

    硬编码 +++++

    存心不给维护啊,写硬编码写了十几处

    image.png

    image.png

    image.png

    image.png

    最后

    已经在重新写这一套玩意了,真的太哈人了

    第 1 条附言  ·  38 天前
    害怕,第一次发的贴子火起来了

    大致看了下各位的回复,确实,代码评价之处确实带入了我自己修改的个人恩怨了,而且存在自身经验不足,并且认为“应当这样做才是合理的”,算是我自己经验不足的问题

    发这贴子也是一时整的无语了 (实际上是接了三套 两客户界面 + 一 后端)
    太多的硬编码改起来血压挺高的,莫名其妙查出来这一块硬编码,有一说一也挺头疼的,大晚上 DEBUG 为此血压高了几次

    不过也说得对,能用就行,哎
    112 条回复    2024-10-16 15:10:48 +08:00
    1  2  
    jkjoke
        1
    jkjoke  
       38 天前
    加钱,必须加钱
    Elaina
        2
    Elaina  
       38 天前
    这就是传说中的防御性编程么🤣🤣🤣
    xmumiffy
        3
    xmumiffy  
       38 天前 via Android
    接手价至少得是重写的 2 ~ 3 倍起跳😂
    coolfan
        4
    coolfan  
       38 天前   ❤️ 2
    main1 main2 main3🤣
    JoeDH
        5
    JoeDH  
       38 天前
    什么项目
    MoeMagicMango
        6
    MoeMagicMango  
    OP
       38 天前
    @JoeDH 一个软件的解析项目,爬虫系
    vasto
        7
    vasto  
       38 天前
    倒很正常,就是新手写的
    MoeMagicMango
        8
    MoeMagicMango  
    OP
       38 天前
    @vasto 但这已经是商业项目,要赚钱的(
    falcon05
        9
    falcon05  
       38 天前 via iPhone
    一般吧
    geligaoli
        10
    geligaoli  
       38 天前
    你是没见过真烂的 python 代码,这些例子都算是上上等的模范代码了。那些代码可怕的程度超乎想象。每个接口的处理都是复制粘贴的一路到底,没有函数的概念。所有的变量基本都是全局的,包括类里面的也是到处直接读写。业务里用的所有内容都放一张表里,字段多的全用拼音首字母加数字,表的索引几十个。到处共享数据还丝毫没有锁的概念。
    zhenjiachen
        11
    zhenjiachen  
       38 天前 via iPhone
    session 存 db 是正常操作,每次访问更新 session 的过期时间也是正常操作。你可以看看 spring session 的分布式 session 。不会 Python ,但是这种代码在 Java 里面应该还算正常。
    Maboroshii
        12
    Maboroshii  
       38 天前 via Android   ❤️ 1
    挺简洁的,至少一眼就能看明白。不差了
    Reficul
        13
    Reficul  
       38 天前   ❤️ 1
    我以为啥呢,基操。

    年纪大了之后,现在再看这种程度的代码已经毫无波澜了。
    chenqh
        14
    chenqh  
       38 天前
    唯一的问题也就就是 check_expire_time 好像是扫表吧,
    maocat
        15
    maocat  
       38 天前 via iPhone
    fastapi+sqlmodel 挺前卫的啊
    xiri
        16
    xiri  
       38 天前   ❤️ 9
    “#写一个接口,当这个接口接收到请求后 ...”
    很明显的面向 AI 编程,写个注释让 AI 帮忙写逻辑🤣
    aycclm
        17
    aycclm  
       38 天前
    正常,商业代码这种情况多的很,能 RUN 就行(程序员或者代码)
    ntedshen
        18
    ntedshen  
       38 天前
    萌新确实不建议摸二手代码,会崩世界观的。。。

    这可读性。。。看着挺好的,只有那个遍历 user 的方法即使看着注释也很迷惑。。。
    业务写多了手上没屎才是奇怪事,老板要能把维护项目谈成重写项目那属实是老板的能力可嘉,不过不一定会给你第二次机会。。。
    看 op 效率(加班情况)怎么样了。。。
    IvanLi127
        19
    IvanLi127  
       38 天前   ❤️ 13
    这代码还成吧,这才哪到哪。除了代码结构问题,其他关于实现的吐槽都需要有实际瓶颈才有得说,现在这样未必不行,反到 op 有点偏执了。
    IzayakI
        20
    IzayakI  
       38 天前
    你的代码还不够变态
    zerovoid
        21
    zerovoid  
       38 天前 via Android
    应该没人接帮人改 bug 的活吧,重新做一套都比这省时省力,二开也是保证接手的代码能运行,然后尽量不动原来的代码。
    Track13
        22
    Track13  
       38 天前 via Android   ❤️ 2
    这才到哪,我接手的前端项目,那煞笔二次封装 element-ui 连双向绑定都没有。全部参数和随机密码一样。
    到处是 arr1 ,arr2 互相循环修改数组,然后得出 obj1 ,obj2 。但文件组件 5000 行起。😭
    guanhui07
        23
    guanhui07  
       38 天前 via iPhone
    见过更恶心的
    lcbp
        24
    lcbp  
       38 天前   ❤️ 1
    cookie 和 token 有本质区别,token 也不是只有 jwt 。

    过期时间通过 get 扫表确实是问题,应该后台定时任务。

    见过几十层 if 的吗?缩进都换屏了。
    Bingchunmoli
        25
    Bingchunmoli  
       38 天前 via Android
    @zhenjiachen 不正常,如果是 jwt 存 redis 如果是 session 序列化文件和 db 有什么关系
    zhtyytg
        26
    zhtyytg  
       38 天前   ❤️ 1
    @Track13 点了,水平不够又喜欢二次封装,用起来头都大了。
    sagaxu
        27
    sagaxu  
       38 天前
    这代码质量还算不错了,比我接手过的大部分代码强 10 倍。

    Cookie 存 DB 也是正常操作,小公司也不会有性能瓶颈,DB 打不死的。硬编码也看什么东西,API 请求地址之类的不太会更新的东西,写死也不影响可维护性。
    zhenjiachen
        28
    zhenjiachen  
       38 天前 via iPhone
    0xD800
        29
    0xD800  
       38 天前
    等用户多写死了 就有活继续优化了呀
    BeijingBaby
        30
    BeijingBaby  
       38 天前
    [又不是不能用,又不是不能跑]
    967182
        31
    967182  
       38 天前
    大哥,你这系统有多少用户啊,就打穿数据库了
    dayeye2006199
        32
    dayeye2006199  
       38 天前
    菜鸡我一概推荐 django ,而不是 flask 和 fastapi 这种 free form 的。
    其实 spring 也差不多 django 这个意思,给你框死死的,水平高低整出来的活都差不多。

    最怕就是 flask / fastapi 这种,新手写简直要了命
    k9982874
        33
    k9982874  
       38 天前 via Android
    你这比我司运营了 10 几年的项目好多了,就说一点我们这项目技术栈横跨了 php ,java ,nodejs ,golang ,lambda ,每个技术栈都是在正在火的时候老板赶时髦要求加的,你就说牛不牛 b 吧
    sn0wdr1am
        34
    sn0wdr1am  
       38 天前
    主打一个够用就好。

    俗称屎山代码。
    anakinsky
        35
    anakinsky  
       38 天前
    存 db 正常啊,又不是人均百万并发,哈哈🤣
    zydxn
        36
    zydxn  
       38 天前
    这注释不像是给人看的,像是给 AI 生成用的 prompt
    wupher
        37
    wupher  
       38 天前
    我还见过更疯的。

    本来一个 DB 查询能搞定的事,硬写成 for 循环,一个个来查。

    关键最后发现查了还没什么用。找产品建议取消显示这个字段,注释掉 for 查询,速度一下就上去了。
    aarontian
        38
    aarontian  
       38 天前
    其实我也想说 cookie 存数据库是基操,不是热门 toC 项目没那么容易打穿,也不用引入 redis 啥的
    v2orz
        39
    v2orz  
       38 天前
    又不是不能用
    我就认识一个老板,先花钱从同行公司买一个版本代码(原版本也不咋地),招了一个全职 Java 开发做二开,工资 4000
    你猜 2 年之后这个代码变成什么样了?

    就这样,老板在业务稳定后,为了节约成本,把这 4k 的兄弟也开了,月 2000 块找了个兼职
    kpsanmao
        40
    kpsanmao  
       38 天前
    深深赞同,最近接了个私活,一个小程序商城,后端是拿 dedecms 5.3 - 5.6 ,反正还没到 5.7 的版本 N 次开发的。

    那都不知道多少手了,我在里面看到了"送水"、"考试"、"广告联盟"、"商城"等 N 多的内容。前端传来的参数没有任何过滤,数据库操作类每个人一个封装一个,一个函数里可能调用了多个数据库操作类的方法,比如获取一条记录有的叫 get_one ,有的叫 getOne ,有的叫 first ,有的叫 find 。而这个公司拿着这个服务端的代码,号称完全自主开发,已经干了 14 年了。

    我真不知道怎么坚持下来的,就那参数不过滤,还做商城,没人干他们吗?我实在理解不了。脑袋都要大了,中途有 N 次想要退钱不干了,好在还是坚持下来了,又往屎山上拉了一泡。
    user100saysth
        41
    user100saysth  
       38 天前
    草台班子,整个世界都是
    seedhk
        42
    seedhk  
       38 天前
    @kpsanmao 兄弟,请问下,私活哪里接比较合适啊
    Tink
        43
    Tink  
       38 天前 via Android
    老板在找几个人都搞不了,最后还得找原开发
    Lightbright
        44
    Lightbright  
       38 天前 via Android
    挂我是吧,晚上别睡太死
    cccvno1
        45
    cccvno1  
       38 天前
    可能屎见多了,看这么短的代码甚至有点眉清目秀😂
    cndenis
        46
    cndenis  
       38 天前
    你能轻松看懂说明这代码已经是及格以上的水平了, 可以了.

    而且你说这是爬虫, 那代码就是针对性的, 没有复用可能, 硬编码完全没问题.

    你不会觉得一个爬微博的虫只要改个域名就能爬抖音吧, 如果不能改的话, 写死微博的域名有啥问题
    llsquaer
        47
    llsquaer  
       38 天前
    觉得还行啊,楼主看能发个修改过的对比下,学习学习
    wangxiaoer
        48
    wangxiaoer  
       38 天前 via iPhone
    看起来的确挺烂。但是 session 存数据库这个不算问题,多台服务器不用考虑负载均衡的模式。
    imnpc
        49
    imnpc  
       38 天前
    代码没问题的 这个估计也是找人做的急活 功能都实现了 而且做的爬虫的话 根本不会有大规模用户

    什么样的需求 给的什么样的报价 写什么样的代码
    woodfizky
        50
    woodfizky  
       38 天前
    已经不算很差了,不过确实项目结构还不成形。
    起码这个 BaseModel 应该是 pydantic 的 BaseModel 吧,起码知道用显式定义属性的类。

    我知道的个别同事都是字典用到天昏地暗。
    一个字典几十个键值对,还有嵌套的,不管大部分属性能不能用到,反正就从头用到尾,好几层调用方法都要把这个祖传字典传进去,修改里面的值。
    还有所有业务,涉及到数据库的,也不知道怎么配置 ORM 的,反正就一条语句一个事务。

    接手的那个同事,接手了几个月,改 bug+优化+改造,头发都白了几百根。
    zgsi
        51
    zgsi  
       38 天前
    又不是不能用
    rlds
        52
    rlds  
       38 天前
    看了这代码,比我们那些项目好多了。。
    ugpu
        53
    ugpu  
       38 天前
    代码没问题. 挺规范的.
    又不是什么大工程 临时爬虫项目而已 以后要改得地方多着呢 这不 OP 就改了吗?.
    看项目就几个文件几个代码
    我内心已经对这些毫无波澜
    ma46
        54
    ma46  
       38 天前
    如果你觉得这就是屎山, 那你是没见过真正的屎山
    CodeCodeStudy
        55
    CodeCodeStudy  
       38 天前
    还好吧,不算太烂
    superchijinpeng
        56
    superchijinpeng  
       38 天前
    代码没啥问题,简洁明了
    harryWebb
        57
    harryWebb  
       38 天前
    你这个得加钱,你还要重新写,也许这代码运行一段时间公司倒闭了就没了

    也很正常

    你没遇到过当年我遇到 php 得代码,和 html 混写,啥都混一起,那个是真的雷人
    gimp
        58
    gimp  
       38 天前
    能跑就行
    HywelXu
        59
    HywelXu  
       38 天前
    刚被一个烂尾项目坑过,说是维护就好,加几个接口而已。
    没想到改着改着就等于重新写了一遍 既不讨客户喜,还不赚钱。
    再也不要干这种活儿了。
    haneki
        60
    haneki  
       38 天前
    代码和人有一个能跑就行。
    HashV2
        61
    HashV2  
       38 天前
    @geligaoli 是的 这个已经算好的了,起码能知道是干什么的,我现在接手的无注释、一个方法几百行的代码才是炸裂,我准备梳理完逻辑直接重构了,真改不了一点。
    wowawesome
        62
    wowawesome  
       38 天前
    属于能跑就行
    cxe2v
        63
    cxe2v  
       38 天前
    1. 这个代码帮老板挣到钱了吗?
    2. 你写的优雅代码能帮老板挣到更多利润吗?
    radishear
        64
    radishear  
       38 天前
    看着这种代码就控制不住的想骂
    BlackSiao
        65
    BlackSiao  
       38 天前
    @Maboroshii 还真是,我不是科班出身的,大学的时候写的代码和这个比也差不多了
    charlie21
        66
    charlie21  
       38 天前
    3. 老板挣钱给你买法拉利了吗?
    991547436
        67
    991547436  
       38 天前
    ai 写的
    Latin
        68
    Latin  
       38 天前
    能跑就行 另外这个代码算很整洁了
    raphaelsoul
        69
    raphaelsoul  
       38 天前
    其实还好 这都算中规中矩的了
    xcai007
        70
    xcai007  
       38 天前
    也有可能是公司的问题。。。
    NO9527
        71
    NO9527  
       38 天前
    每天访问量个位数的话,存 db 也就这样了
    lwlizhe
        72
    lwlizhe  
       38 天前
    竟然还给你写注释,良心啊~~🐶
    Xi
        73
    Xi  
       38 天前
    这是人情世故代码,考验老板,也恶心下一位接手的人。
    就算你花大精力重构了代码,要是之后项目再次不能工作,老板很大可能会觉得你的水平和之前的差不多,这就是所谓的吃力不讨好。
    Felldeadbird
        74
    Felldeadbird  
       38 天前
    问题不大,能跑就好了。
    钱给够,多屎我都可以在上面雕花。
    yh7gdiaYW
        75
    yh7gdiaYW  
       38 天前
    看起来除了 main1 2 3 4 有点难绷外,其他的还不错了,他甚至还写了注释
    querysecret
        76
    querysecret  
       38 天前
    不是啥大事,up 应该工作 5 年内,哈哈,大于这个数应该见怪不怪了
    cbythe434
        77
    cbythe434  
       38 天前
    main2 main3 main4....main7 ,main 届 goat
    winterbells
        78
    winterbells  
       38 天前
    这个好歹有板有眼,知道是干嘛的

    以前重构某日企车厂 app 的三手代码。页面接收一堆参数,最后应该显示两个按钮,结果一通处理显示了 4 个,他们的处理方法就是直接加 size = 2 。反正 mock server 的数据是固定的。几十个页面全部都是这种写法,有什么 if else 还是 when 条件的,最后强行设置结果就行了。

    从代码看一手的时候是有真正逻辑的,二手的时候可能是修 bug 或者改设计,直接就真正的放飞自我了
    utre938722
        79
    utre938722  
       38 天前
    现在写代码 本着能用就行了
    ColdBird
        80
    ColdBird  
       38 天前
    看的我都笑死了,真是绷不住了。
    我对垃圾代码是真的零容忍,但是很多人都是抱着又不是不能跑的心态写代码的,没啥办法
    angryfish
        81
    angryfish  
       38 天前   ❤️ 1
    我觉得写得挺好的呀。
    1.你看他是爬虫的,为啥有那么多 main ,因为每次爬虫变了,就复制粘贴一个新的。这种方法简单快捷,后来者还能清晰看到历次的变化。
    2.简单几个文件就实现了老板的功能,肯定实现得很快,老板看到漏出欣慰的笑容。
    3.经过几手了,还在他的基础上变更,证明确实好用。
    总得来说,结构清晰,还有注释,这代码我得给 90 分。
    www12222
        82
    www12222  
       38 天前
    防御型编程,小公司就得这么写,写下去位置越来越稳
    ieliwb
        83
    ieliwb  
       38 天前
    代码写的好能当饭吃吗🙄
    drwebco
        84
    drwebco  
       38 天前
    没必要喷,

    1.你是使用 jwt 包,人家这叫自己实现 session ,你为何认为使用别人的轮子就比自己实现产生了优越感?自己实现的性能比不上开源轮子也情有可原。

    2.还有 jwt 有弊端,它是无状态的,服务端无法控制它掉线,也许他想使用这种 sission 状态能从服务端控制,也需你会说,为啥不用 redis ,或放在内存? 咋了,内存不是系统开销啊?

    3.你说的每次调用都要查询一次数据库,怎么你每次打开一个页面,不都去查询一次数据库的么,顺带就把 cookie 给查了,至少不额外占用连接数据库和销毁的开销,系统额外开销也不会多大。
    reseen
        85
    reseen  
       38 天前
    @cndenis 赞同
    lmshl
        86
    lmshl  
       38 天前
    这代码写的挺不错的啊,没看出来哪里有问题
    cominghome
        87
    cominghome  
       38 天前
    看着像是有一定基础的程序员跨语言写的
    leeyuzhe
        88
    leeyuzhe  
       38 天前
    这才哪到哪?可读性都挺好的
    Whitroom
        89
    Whitroom  
       38 天前
    还得是 fastapi + sqlmodel ,用框架提高了烂代码的可读性😂
    qW7bo2FbzbC0
        90
    qW7bo2FbzbC0  
       38 天前
    二次接手的代码就像被修了两次的电子产品,多次转院的病人一样
    mwuxlcanrh
        91
    mwuxlcanrh  
       38 天前
    正常,要对此保有平常心。而且能不动就不要动。
    chenqh
        92
    chenqh  
       38 天前
    只要不是高分发,cookie 都可以存 db 的吧.至少数据库有界面,有什么问题,好查许多
    scys
        93
    scys  
       38 天前
    整个代码我硬是看不出‘大’问题。看价钱,维护就维护的态度。如果只是让这个代码跑起来,不负责其他,不难。
    gesse
        94
    gesse  
       38 天前
    能说这种代码是烂代码的,可能入行没多久,或者是常年在大厂流水线打螺丝 😄
    wangjiang
        95
    wangjiang  
       38 天前
    这个代码,我感觉还行
    Marszm
        96
    Marszm  
       38 天前
    这就是 AI ,gpt 。。。牢美最好以后都拿这玩意开发系统。
    masterclock
        97
    masterclock  
       38 天前
    看起来没啥大问题,似乎只是一个小项目,随便写写凑合一下
    janpun
        98
    janpun  
       38 天前
    从不接手二手代码,因为耗费的精力是新开发的几倍,客户不会理解的
    kpsanmao
        99
    kpsanmao  
       38 天前
    @seedhk 我是之前的同事介绍的,我跟你说我都怀疑是这个同事嫌烦推给我的。
    Building
        100
    Building  
       38 天前 via iPhone
    感觉挺清晰明了的,有没有可能你自以为优化了半天下一任一接手也觉得你写的是垃圾呢
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3414 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 11:05 · PVG 19:05 · LAX 03:05 · JFK 06:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.