V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
wh469012917
V2EX  ›  程序员

同事代码写的太烂了怎么办?

  •  
  •   wh469012917 · 2021-09-03 15:22:39 +08:00 · 9631 次点击
    这是一个创建于 1209 天前的主题,其中的信息可能已经有所发展或是发生改变。

    1. 命名不规范

    一个项目中控制器命名能出现好几种变形,一个对的都没有:

    UserContol 、UserControl 、UserContoler 、UserControler
    

    包括模型也是:

    UserMode 、UserModle 、UserModol
    

    变量命名更是离谱,单字母和语言关键字乱用:

    a 、b 、c 、class 、string 、byte 
    

    再然后就是缩写和语意不符合的:

    1. context 缩写成 c
    2. UserImage 缩写成 ui
    3. template 写成了 temple

    数据表和模型名称不一样的:

    1. 表名叫做 user_rule, 模型名叫做 RuleUserModle
    2. 表名叫做 order_mgr,模型名叫做 OrderManageMode
    3. 表名叫做 order_manage,模型名叫做 OrderMgr

    因为命名不规范,他后面出现了很多删除 A 表的数据,却用了 B 表的模型来操作,导致错删~

    字段名称和值不统一的:

    1. 创建时间字段 creat_time 、create_time 、created 、created_time 每个表都不一样
    2. 而且值有保存时间戳,有的保存时间字符串

    2. 业务代码

    如果说命名混乱就算了,至少比较好改,但是业务实现也混乱:

    1. 没有任何封装概念,重复代码都是直接复制粘贴;没有任何分层的概念,控制器-模型一把梭过去,一个控制器方法 300 行起步
    2. getUserById(string username) 命名叫做通过 ID 查询用户,传入的参数却是 username
    3. getUserList() 命名叫做获取用户列表,返回值却是某一个特定条件的单个用户
    4. 所有的请求都不做参数验证,并且也不做逻辑验证。删除操作,都没判断用户是否有权限删除,直接给他删除了,删除了还不算,有些关联的数据不删除,这一下子就出现了一堆的脏数据
    5. 查询启用状态的用户列表,先把所有用户拉出来,然后在代码中遍历循环过滤禁用的用户

    3. 数据库设计

    数据库设计更混乱不多说了,就说几点:

    1. 关联的外键命名没有任何规范,全凭心情;比如订单表上正常情况下要有一个用户 id 字段(一般命名为 user_id),他这个字段命名叫做 user_order,要么就是叫做 user_function,反正就是自己看得懂
    2. 以上好歹设计了外键,有些干脆不设计外键;用户收货地址表上,正常情况要有一个 user_id, 用来标记这个地址是哪个用户的;他直接在用户表上创建了一个 addres 的字段,然后把地址表的 ID 用逗号分隔拼接成字符串,保存到用户表上,每次查询用户地址列表都是取出来分割,然后一条条去查;删除就更暴力了,直接删除地址,用户表的 addres 字段都不更新
    3. orm 默认都支持维护数据的创建时间,以及数据的软删除; 但是他因为创建时间字段命名不规范,orm 默认维护的是 created_at 字段,他表设计是 creat_time,然后在模型中配置的字段又是 create_time,导致框架不会维护,于是就全部自己实现
    4. 数据软删除也是配置错误,然后自己代码中去维护,写的乱七八糟

    公司同事写的代码,是我这么多年来见到的最烂的代码,但是因为人家来的年限资历比较长,也不好意思去提这个事情,有没有啥好的办法,自己重构吗?

    1  2  
    wolfie
        1
    wolfie  
       2021-09-03 15:25:21 +08:00
    各玩各的,项目管理不说话就装哑巴。
    chendy
        2
    chendy  
       2021-09-03 15:29:31 +08:00
    反馈给管事的人解决
    sonyxperia
        3
    sonyxperia  
       2021-09-03 15:30:44 +08:00
    你不是领导就不要多嘴
    ila
        4
    ila  
       2021-09-03 15:32:49 +08:00
    不用你接手,就当做没看到
    wh469012917
        5
    wh469012917  
    OP
       2021-09-03 15:33:39 +08:00
    @ila 关键是我接手了,不然谁管他写的是啥玩意
    bfdh
        6
    bfdh  
       2021-09-03 15:34:52 +08:00
    换同事
    mu1er
        7
    mu1er  
       2021-09-03 15:35:04 +08:00
    看的我都不会写模型名了
    wh469012917
        8
    wh469012917  
    OP
       2021-09-03 15:35:05 +08:00
    @sonyxperia 我也不想多嘴,关键是这个项目我接手了,恶心到人了
    wh469012917
        9
    wh469012917  
    OP
       2021-09-03 15:35:49 +08:00   ❤️ 9
    @mu1er 看了几天我自己都写错了
    ytll21
        10
    ytll21  
       2021-09-03 15:36:13 +08:00
    这么烂的代码,技术负责人如果没有发声的话,那就想一下公司给的钱,有没有足够到让你天天坐在屎边上的地步。如果没有,还呆着干吗?
    sonyxperia
        11
    sonyxperia  
       2021-09-03 15:39:27 +08:00
    @wh469012917 既然交到自己手上了,那就有时间的时候一点点改过来么
    parrotdance
        12
    parrotdance  
       2021-09-03 15:40:41 +08:00
    曾经也因为类似的原因开了一个 repo 专门记录工作中遇到的经典操作...

    https://github.com/parrotdance/worst_code_I_saw

    另外"看了几天我自己都写错了"真是太艹了
    aragakiyuii
        13
    aragakiyuii  
       2021-09-03 15:43:44 +08:00
    快跑
    AlanDSF
        14
    AlanDSF  
       2021-09-03 15:46:54 +08:00
    领导不指示,千万别自己重构。不然最后这个屎山塌了你要负责。
    AlanDSF
        15
    AlanDSF  
       2021-09-03 15:48:06 +08:00
    和你这个一比,我突然觉得之前同事用拼音缩写命名方法变得不是那么屎了
    ouyc
        16
    ouyc  
       2021-09-03 15:48:28 +08:00
    我就想知道你同事怎么用关键字命名变量
    tabris17
        17
    tabris17  
       2021-09-03 15:50:19 +08:00
    把吐槽的话憋在心里或者写在注释里,除非王八退房
    redial39
        18
    redial39  
       2021-09-03 15:50:20 +08:00
    我就写过很多垃圾代码,我现在也还在不断的输出垃圾代码,虽然我从不以写垃圾代码为荣为耻,但我还是依然在写垃圾代码.不为了什么.只是为了混口饭吃...
    顺便看了一下 lz 帖子记录...emmmmm
    szuwl
        19
    szuwl  
       2021-09-03 15:51:01 +08:00
    你是来搞钱的,不是来搞人的,不是你的下属最好不要乱说话,过来人经验。
    HolmesYe123
        20
    HolmesYe123  
       2021-09-03 15:52:24 +08:00
    习惯就好,我同事可以把一个功能写在几个模块里面,乱放。
    wh469012917
        21
    wh469012917  
    OP
       2021-09-03 15:53:02 +08:00
    @ytll21 领导注重功能完成和稳定性,其他的没怎么关心过
    wh469012917
        22
    wh469012917  
    OP
       2021-09-03 15:53:32 +08:00
    @sonyxperia 我现在也是,命名什么的自己慢慢调过来,但是不做大改,特别是数据库,免得背锅
    wh469012917
        23
    wh469012917  
    OP
       2021-09-03 15:54:15 +08:00
    @AlanDSF 对的,我也是只敢做基本的命名调整等等,数据库设计碰都不碰;那个同事倒是说要是觉得设计不合理可以改,不过我不敢动
    wh469012917
        24
    wh469012917  
    OP
       2021-09-03 15:54:48 +08:00
    @AlanDSF 拼音好歹是正常的命名啊,猜猜也能看得懂,我们这边直接用 class byte string 做变量名了
    wh469012917
        25
    wh469012917  
    OP
       2021-09-03 15:55:25 +08:00
    @ouyc string := "foo" byte := "bar" 这样,go 语言允许用关键词做变量名,但是 ide 会给你提示
    wh469012917
        26
    wh469012917  
    OP
       2021-09-03 15:56:01 +08:00
    @redial39 你可以学学我这个帖子里面的垃圾代码,看看能不能更上一层楼
    wh469012917
        27
    wh469012917  
    OP
       2021-09-03 15:56:45 +08:00
    @szuwl 那肯定的,我当然不可能傻到去说人家,也不会去找领导打小报告,反正在屎上堆屎就行了
    sprite82
        28
    sprite82  
       2021-09-03 15:57:15 +08:00
    感觉像是说我的同事,idea 都有单词提示的,他就是要写错的,代码各种复制粘贴,能不公用就不公用。
    一个 Controller 接口能连续写 1000 行,代码文件随随便便就是 4000+行,导致我 idea 卡到爆,打一个空格 cpu 能飙 100%持续好几秒。
    注释和实际执行是相反的
    try catch 不捕获异常,控制台、日志、 出参全看不到具体错误
    用 JSONObject 作为 json 入参接收,如果是表单提交 那好,形参列表十几二十个家常便饭,包括 service 调用也是十几个形参
    调用其他第三方接口,手写 json 字符串 + 号拼接(很多参数)
    配置写死在代码里,上线出问题,就改代码继续发
    分页查询:计算总条数时,select * ... 然后 list.size() 获取总条数,再计算页数(计算这段代码复制了 n 次,也没抽出来)。
    还有很多不想说了
    wh469012917
        29
    wh469012917  
    OP
       2021-09-03 15:57:21 +08:00
    @parrotdance 差点被同化了
    7gugu
        30
    7gugu  
       2021-09-03 16:00:03 +08:00 via iPhone
    让大家 review 代码咯,不要干自己重构这种傻事
    statement
        31
    statement  
       2021-09-03 16:00:56 +08:00
    我觉得和自己也有关系,一般和同事的水平是上下五厘米 /狗头
    wh469012917
        32
    wh469012917  
    OP
       2021-09-03 16:07:51 +08:00
    @7gugu 团队人也不多,代码审核估计推行不开
    whisky221
        33
    whisky221  
       2021-09-03 16:09:49 +08:00
    笑死,看的血压上来了
    noe132
        34
    noe132  
       2021-09-03 16:14:19 +08:00 via Android
    怕不是看了如何写出无人能维护的代码那篇文章正在深刻实践
    yogogo
        35
    yogogo  
       2021-09-03 16:18:50 +08:00
    @sprite82 service 层代码行 2000+倒是很正常
    NexTooo
        36
    NexTooo  
       2021-09-03 16:20:31 +08:00
    这不是我遇到的事情吗
    大半年过去了,同事已经拍拍屁股离职好几个月了,我依然时不时还得为了他遗留的代码擦屁股。。。

    反正我接手第一件事:CodeFormat,连换行、空格都不规范看着太痛苦了
    第二件事就是规范命名,先把乱七八糟没根据意义起名或者拼写混乱的都改了
    然后接着才是慢慢梳理代码……抽出方法,合适的时候直接重构部分模块。都是有空的时候搞搞,确定这块后续还有需求的才改,不然加班都改不完
    iSteven
        37
    iSteven  
       2021-09-03 16:20:48 +08:00
    论 code review 的重要性 [滑稽]
    huntagain2008
        38
    huntagain2008  
       2021-09-03 16:21:45 +08:00
    本人非程序员。
    以前 C#代码我看着别人写 String,我就问他怎么不写成原型的 string 。他跟我说 String 比较快。
    后来我知道技术领队都是让老手先检查一下那人的代码。我就释然了。实际上他会的东西比我多。
    要是以前遇到你写的这样的情况,我早就跑了。
    NexTooo
        39
    NexTooo  
       2021-09-03 16:22:40 +08:00
    代价就是有些大的模块,我只是拆了部分重构之后,屎山有点坍塌的趋势,已经出现好几个原来没有的 bug,复现规律还没找到……摊手。可能回头差不多了直接推倒重构了。
    CodeJr
        40
    CodeJr  
       2021-09-03 16:24:27 +08:00
    解决不了问题,那就解决制造问题的人
    RexG
        41
    RexG  
       2021-09-03 16:24:56 +08:00
    笑死了

    同事:这样公司就离不开我了
    OMGZui
        42
    OMGZui  
       2021-09-03 16:36:25 +08:00
    快跑
    jrtzxh020
        43
    jrtzxh020  
       2021-09-03 16:37:11 +08:00
    我一个前端写的 java 代码估计比他规范~~囧
    back0893
        44
    back0893  
       2021-09-03 16:37:28 +08:00
    能跑就行(
    shangwuli
        45
    shangwuli  
       2021-09-03 16:39:36 +08:00
    重构吧,这就跟定时炸弹一样,拖着拖着哪天就爆了。
    zjsxwc
        46
    zjsxwc  
       2021-09-03 16:43:13 +08:00 via Android
    重构,有 ide 在 symbol 命名替换应该容易
    wh469012917
        47
    wh469012917  
    OP
       2021-09-03 16:44:09 +08:00
    @zjsxwc 命名很重构,配合 IDE 搞起来很快,关键在于数据库结构和业务逻辑实现,不敢碰
    chanchan
        48
    chanchan  
       2021-09-03 16:44:39 +08:00
    他是不是把《如何书写不可维护代码》当圣经
    tiktokxxxx2020
        49
    tiktokxxxx2020  
       2021-09-03 16:48:20 +08:00
    实在想不通,他代码烂和你也没太大关系,反正以后吃亏的是他....
    jiebin
        50
    jiebin  
       2021-09-03 16:50:10 +08:00
    要么忍要么滚,之前我前公司的一个项目就是这样的,项目在我之前 4 个人接手过,每个人的方式都一样,三套代码风格,一下子驼峰,一下子下划线,一下子又一起来,然后我干不到 1 个月就走人了
    l00t
        51
    l00t  
       2021-09-03 16:51:22 +08:00
    类似问题我一般都回:能用就行。

    但你这遇到的也太屎了……
    lizhenda
        52
    lizhenda  
       2021-09-03 16:54:52 +08:00
    看到 ui 缩写惊呆了
    oneisall8955
        53
    oneisall8955  
       2021-09-03 16:59:21 +08:00
    代码和人有一个能跑就行
    stach
        54
    stach  
       2021-09-03 16:59:22 +08:00
    提桶跑路
    neptuno
        55
    neptuno  
       2021-09-03 17:00:08 +08:00
    不改数据库,改变量名和类名吧,至少两边名字一样,数据库各种字段不一样也改不动
    PerFectTime
        56
    PerFectTime  
       2021-09-03 17:02:01 +08:00   ❤️ 3
    🙈 我的 StringBuilder 简写为 sb
    Brentwans
        57
    Brentwans  
       2021-09-03 17:02:06 +08:00
    坚持不挖屎坑给别人,也从不接别人的屎坑。
    Ken9527
        58
    Ken9527  
       2021-09-03 17:08:59 +08:00
    还不走?
    ila
        59
    ila  
       2021-09-03 17:13:14 +08:00
    拉个群,加上你上司和你同事,有问题群里直说。
    NEVERCODE
        60
    NEVERCODE  
       2021-09-03 17:14:21 +08:00
    好家伙,自带混淆。
    wangyzj
        61
    wangyzj  
       2021-09-03 17:15:28 +08:00
    这不是代码不行
    这是英文问题
    liangkang1436
        62
    liangkang1436  
       2021-09-03 17:21:59 +08:00
    @sprite82 感觉你说的是我同事
    lpbname777
        63
    lpbname777  
       2021-09-03 17:28:07 +08:00
    血压升高
    zxCoder
        64
    zxCoder  
       2021-09-03 17:33:45 +08:00
    换个公司
    wh469012917
        65
    wh469012917  
    OP
       2021-09-03 17:45:07 +08:00
    @tiktokxxxx2020 因为我要接手这个项目,咋就没关系了,这就好比别人拉了一坨屎,然后让你吃下去,你说有没有关系呢
    wh469012917
        66
    wh469012917  
    OP
       2021-09-03 17:46:04 +08:00
    @jiebin 不忍也不滚,会根据情况慢慢重构,然后委婉的提一些建设性的调整意见,如果别人能接受最好,接受不了就不提了,各干各的
    wh469012917
        67
    wh469012917  
    OP
       2021-09-03 17:48:16 +08:00
    @neptuno 命名问题好改啊,配合 IDE 一下子就 ok 了,关键的是数据库,这个是个大难题
    wa143825
        68
    wa143825  
       2021-09-03 17:52:11 +08:00
    我一同事也是,xxxId 和 xxxid 混用,同样功能不能内容的列表字段主键用不同的,个人信息头像用 headIcon,他人的用 avatar,本来几个 model 就能搞定,结果写十来个各种继承,而且搞的我各种条件判断,最后太乱了,一模一样的页面我复制两三份。

    项目开工前,我都用协作工具把字段和功能逻辑大致的确定了,结果就他框架方便,我这各种蛋疼。
    wh469012917
        69
    wh469012917  
    OP
       2021-09-03 17:52:32 +08:00
    @jiebin 而且你这个好歹是命名问题,不难改,数据库和业务逻辑垃圾,改都改不了这个才可怕
    Varobjs
        70
    Varobjs  
       2021-09-03 17:53:37 +08:00
    复制粘贴这事
    看公司代码中有一串数字 85399,不是很理解为什么,然后猜测了下,估计是查询一天的范围的数据
    想查 今天 0 点~今天+86400-1 来着,写错成 85399

    然后一堆人复制这段代码,全局搜了三四处不同人写的
    zmxnv123
        71
    zmxnv123  
       2021-09-03 18:00:54 +08:00
    头像是本人吗。
    如果是本人,你说的都对。
    cedoo22
        72
    cedoo22  
       2021-09-03 18:02:08 +08:00
    这很难说,文人相轻, 码农也相轻;
    代码烂一半责任在负责人,一半在程序员;
    darknoll
        73
    darknoll  
       2021-09-03 18:03:15 +08:00
    @wh469012917 这个必须要离职啊
    dqzcwxb
        74
    dqzcwxb  
       2021-09-03 18:38:41 +08:00
    wwlzz
        75
    wwlzz  
       2021-09-03 18:58:51 +08:00
    想一想,为什么会成为同事
    jdhao
        76
    jdhao  
       2021-09-03 19:10:22 +08:00 via Android
    六字真言,要么忍要么滚
    ragnaroks
        77
    ragnaroks  
       2021-09-03 19:52:53 +08:00
    @huntagain2008 估计还是没分析器的时候,现在装了分析器后会提示此处该用 Int32 还是 int 等等
    dingdangnao
        78
    dingdangnao  
       2021-09-03 19:55:15 +08:00
    就三个字:不要管。你只能控制你自己,别人你也管不了,干脆就不要看😂😂😂
    大家都是在大💩山上拉小💩堆,哈哈哈,just works 就行了😂😂😂
    suzic
        79
    suzic  
       2021-09-03 20:24:15 +08:00 via Android
    开会鉴赏一下
    fengpan567
        80
    fengpan567  
       2021-09-03 20:27:27 +08:00
    没有代码评审吗
    yunluw
        81
    yunluw  
       2021-09-03 20:33:11 +08:00
    心疼你 50ns
    leafre
        82
    leafre  
       2021-09-03 20:42:49 +08:00
    千万别离职,这岗位祸害人
    potatowish
        83
    potatowish  
       2021-09-03 20:56:45 +08:00 via iPhone   ❤️ 1
    这种操作很明显是外包的做法,别问我怎么知道的,各种骚操作让人又好气又好笑
    howencilx
        84
    howencilx  
       2021-09-03 21:02:51 +08:00
    这也太随意了吧,他自己看着不难受吗
    hallDrawnel
        85
    hallDrawnel  
       2021-09-03 21:04:19 +08:00   ❤️ 1
    如果需求需要改动到旧代码,就跟 leader 说明情况,适度重构一小片代码出来,脱离原有的路径,隔离出一个范围自己开发。
    如果是新的功能,做非侵入式修改,然后把逻辑嵌入到旧代码里。

    然后写个文档充分说明这个情况,把风险尽量告知相关人,不然出了事情还得背锅。推动 code review,当然有的 leader 自己就很菜,他根本没办法区分什么是好代码什么是坏代码,只是风起飞了把这只猪给吹上去了。
    fiypig
        86
    fiypig  
       2021-09-03 21:06:21 +08:00 via iPhone
    改着改着自己变成那个风格哈哈哈哈
    qiaobeier
        87
    qiaobeier  
       2021-09-03 21:24:53 +08:00
    使用工具,不符合基本规则不让 push 。有条件上 code review 。实话说很影响效率,没见小公司执行这套方案的
    sutra
        88
    sutra  
       2021-09-03 21:39:14 +08:00
    是不是键盘太脏了,有些键有时候按下去不出字符?
    JamChiu
        89
    JamChiu  
       2021-09-03 21:54:37 +08:00 via iPhone
    感同身受😂😂
    bintianbaihua
        90
    bintianbaihua  
       2021-09-03 22:21:16 +08:00
    经历过 ,建议不要随便重构。也不要随便怼人, 做好自己的事情就好了。。
    JamesR
        91
    JamesR  
       2021-09-03 22:52:27 +08:00
    还行,不算烂,至少能看懂。
    当年他写的时候,没人教他怎么写,老板,客户又催得急,只能这样了。
    FerrisChan
        92
    FerrisChan  
       2021-09-04 01:25:33 +08:00
    怎么还看不到 有一个能跑就行( doge
    kuangwinnie
        93
    kuangwinnie  
       2021-09-04 05:43:42 +08:00
    ....自己复制自己的代码这种操作都不管吗?????
    fenglangjuxu
        94
    fenglangjuxu  
       2021-09-04 09:28:12 +08:00
    这样的代码 就有点烂的过分了
    gancl
        95
    gancl  
       2021-09-04 10:56:03 +08:00
    不设计外键是对的啊
    crazycarry
        96
    crazycarry  
       2021-09-04 11:03:30 +08:00
    你就一个 crud 的,就这还指点江山,有那时间看看开源项目吧,觉得自己牛看看 flink,spark,k8s,tidb 的代码。我相信你自己就变 shutup
    suyuyu
        97
    suyuyu  
       2021-09-04 11:28:53 +08:00
    心惊胆战的点进来,怕说的就是我。还好不是-.-
    wh469012917
        98
    wh469012917  
    OP
       2021-09-04 11:57:38 +08:00 via iPhone
    @Varobjs 他格式化时间成字符串,不是用语言的时间库的,而是自己计算~
    wh469012917
        99
    wh469012917  
    OP
       2021-09-04 11:58:08 +08:00 via iPhone
    @crazycarry 不积跬步,无以至千里
    wh469012917
        100
    wh469012917  
    OP
       2021-09-04 11:58:27 +08:00 via iPhone
    @crazycarry 不积跬步,无以至千里,基础的代码质量都搞不好,还能搞得好什么呢
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2383 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 16:08 · PVG 00:08 · LAX 08:08 · JFK 11:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.