V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MadSix
V2EX  ›  职场话题

同事防御性编程影响项目怎么办

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

    背景如下: 我们有多个组,我带组 1. 同事 A 不在我的组,属于组 2. 现在同事 A 正在开发一个新项目,他是目前的主力,我安排人配合他一起完成,但目前开发内容上交集很少,拆的比较开。

    问题如下: 1.目前已经明确,这个项目开发完之后,全权移交给我组负责后续开发维护,我是第一责任人。 2.最近组里兄弟跟我反馈,这哥们的代码,太过防御性了点,代码几乎是不可维护的。干什么都是梭哈,除了他自己没人看得懂写的是什么。我稍微看了一眼,想在他的代码上加功能我看了都满头大汗,无从下手。 3.这个系统其实有个前身,后来他介入之后,也是这套打法。到后来成功的没办法继续维护了,只能推倒重做一套,继续放任,就是历史重演。

    我很想提这个问题,但他又不归我管。他防御性编程其实我不是很在意,别人自有维护饭碗的方式,但是影响到我后续开发了,我就很难受。

    现在最困难的是: 这个项目并不是由组 2 的组长带的,而是一个技术老大亲自带的,所以找组 2 组长沟通没用。 至于这个技术老大。emm 说实话不太管事,只管下任务,也不关心代码质量和项目细节,所以跟他反馈等于没说。平时开发告诉他做完了就行,代码 review 他都不做,要不然也不能让这哥们毫无心里负担得这么干。奈何技术老大位高权重资历深厚,咱们也没什么办法。

    我现在很想跟上面反馈一下这个问题,但是我这种跨管辖范围的做法总是不太好,而且也不知道提了有没有用。难道就这么把这口屎吃下来不成。

    V 友们给出出主意。

    第 1 条附言  ·  248 天前
    感觉大家关注的焦点变成了
    “防御性编程”的概念用的不对。
    谢谢各位的科普,这东西什么意思我是懂的,确实如某一层朋友所说,这是我“爱重新定义老词语”的臭毛病。
    接受批评。
    大家就先暂时不要关注字词解释了,我下次一定改
    第 2 条附言  ·  236 天前
    感谢大家的建议和批评
    最终还是决定从我这拉一个人出来把他换过来,以后打算安排他专职维护这一块了
    123 条回复    2024-04-18 15:59:31 +08:00
    1  2  
    MillaMaxwell
        1
    MillaMaxwell  
       248 天前   ❤️ 9
    只能在他的代码旁边再拉一坨大的了
    IMelon
        2
    IMelon  
       248 天前
    防御性的代码看起来是什么样的?
    yangzzzzzz
        3
    yangzzzzzz  
       248 天前
    直接和他明说啊 不改像上面汇报呗。就说以后代码我这边维护不了 别怪我了。
    MadSix
        4
    MadSix  
    OP
       248 天前
    @miraumr 拉完还是我自己擦啊,后续开发维护我是第一责任人
    ltyj2003
        5
    ltyj2003  
       248 天前 via Android
    让他提供开发文档,对程序代码进行说明。
    kera0a
        6
    kera0a  
       248 天前 via iPhone   ❤️ 53
    能不能把这哥们请来 V 站开个讲座?
    MadSix
        7
    MadSix  
    OP
       248 天前
    @IMelon 代码不方便贴
    怎么说呢,基本就是
    1.跟已有项目开发习惯相背,大家什么框架或者方法用的最多,他就不用什么。大家什么写法最多,就不写什么。
    2.不拆分不抽象,逻辑一把梭哈,强强耦合,要改个功能得瞻前顾后,牵一发动全身
    3.变量名+没注释,懂得都懂
    emSaVya
        8
    emSaVya  
       248 天前
    代码重构列入 kpi 安排工时呗。这不是常规方案吗?
    qinfengge
        9
    qinfengge  
       248 天前
    @MadSix #7 能这么写那该说不说也挺牛逼的
    MadSix
        10
    MadSix  
    OP
       248 天前
    @emSaVya 他的 KPI 不归我定
    至于我自己安排人重构。。。这口屎吃的风险太大了,不是他自己来,重构一下总担心出问题。
    这哥们最骚的操作是好多判断他交给前端去做,他就在万千返回值中给几个意义不明的 0123.
    MrYELiex
        11
    MrYELiex  
       248 天前
    可能单纯是菜 或者觉得不配用脑子想怎么抽象 写完就完事了
    uiosun
        12
    uiosun  
       248 天前   ❤️ 4
    @IMelon 举个例子:

    OOP 的话,一个 class 三千多行甚至更多,我见过两万多行的(纯代码,不带空行的计算),没有一行注释,message 缩写成 msg 都是奇迹,往往会写成 m 或者 xx (消息的拼音打头)。

    这个 m 在不同的行效果是不同的,这会儿是 message ,过几百行是 minute ,等下又变成了 meter 。

    里面一部分方法有,一部分方法没有:事务、参数校验、直接抛异常、抛错误代码等等等,不一而足,全凭当时的心情。

    说好听点叫防御性代码,说难听点他自己都不一定维护的起来……好代码都长得类似,这种代码那就各有各的风味了……
    mrliusg
        13
    mrliusg  
       248 天前
    “又不是不能用”
    MadSix
        14
    MadSix  
    OP
       248 天前
    @qinfengge
    @mrliusg

    如果我也是看戏的,我也能说一句那确实牛逼。但我这下真有一头牛了,这口屎我吃下去怎么受得了
    MadSix
        15
    MadSix  
    OP
       248 天前
    @uiosun
    “说好听点叫防御性代码,说难听点他自己都不一定维护的起来……”
    快问我这个项目为什么重做
    wusheng0
        16
    wusheng0  
       248 天前   ❤️ 28
    防御性编程是专门的名词吧,你们这么用现在都变成反义词了,后面怎么正常交流

    > 防御性编程( Defensive programming )是防御式设计的一种具体体现,它是为了保证,对程序的不可预见的使用,不会造成程序功能上的损坏。
    > 它可以被看作是为了减少或消除墨菲定律效力的想法。 防御式编程主要用于可能被滥用,恶作剧或无意地造成灾难性影响的程序上。
    MadSix
        17
    MadSix  
    OP
       248 天前
    @wusheng0 下次加上引号
    devilte
        18
    devilte  
       248 天前
    @uiosun #12 假设真看到这样的代码 我都要纠结一下是作者真实水平烂还是作者刻意为之,毕竟刻意写成这样都是反第一反应的 会增加一定的心智负担,真的有人在写防御性代码吗😂
    qianckjuan
        19
    qianckjuan  
       248 天前   ❤️ 1
    项目要过来自己人全写,或者把项目推出去
    Patrick6
        20
    Patrick6  
       248 天前
    原来这个是日经贴啊,代码和人有一个能跑就行
    handpr
        21
    handpr  
       248 天前
    @MadSix #10 和我现在上手的项目一样.举个例子.之前的后端让前端自己写死控制哪个按钮显示不显示
    fredweili
        22
    fredweili  
       248 天前
    强化 code review ,不允许随便 merge
    yangxiaopeipei
        23
    yangxiaopeipei  
       248 天前
    code review 怎么过的
    FrankAdler
        24
    FrankAdler  
       248 天前 via Android
    原来代码写的烂还有这么一个高大上的名字
    whoosy
        25
    whoosy  
       248 天前   ❤️ 2
    我认为只是单纯的水平菜,身边技术稍微强点的基本上对代码都有洁癖
    RightHand
        26
    RightHand  
       248 天前 via Android
    拆分,推出去
    7h3d4wn
        27
    7h3d4wn  
       248 天前
    把这个人要到你组里来负责后续维护
    你的核心问题是以后维护麻烦,那就人跟着项目走
    其他没什么更好办法了
    liyanan
        28
    liyanan  
       248 天前
    能不能反噬一下他自己?这个项目维护归属 op 看看能不能换成他,自己种的果子自己吃吧~
    MadSix
        29
    MadSix  
    OP
       248 天前
    @yangxiaopeipei 描述里说过了
    这项目负责人是个万年老大哥,人不做代码 review 而且他位高权重的咱也管不着
    h272377502
        30
    h272377502  
       248 天前
    现在有 ai 了,感觉问题不是很大,让 ai 基于他的代码转化成可维护的,不断校验每步的输出。
    foxkiller
        31
    foxkiller  
       248 天前
    你们不 Code Review 啊?
    7h3d4wn
        32
    7h3d4wn  
       248 天前
    换句话说,是系统性问题,或者说,管理问题造成了你当下的 dilemma
    你又改变不了整个管理风格,那你基本就只能成全这哥们儿的防御性
    yanw
        33
    yanw  
       248 天前
    可能单纯就是菜
    MadSix
        34
    MadSix  
    OP
       248 天前
    @foxkiller
    描述里说过了
    我们的其他开发都是做的,但这个项目是技术老大哥“亲自”负责。人不怎么管事,代码 review 也不做。位高权重我们也管不着
    sparklee
        35
    sparklee  
       248 天前
    我所理解的 防御性编程 是提前返回, 考虑到各种异常情况提前 return, 减少 else 减少条件判断嵌套的写法
    chocolate518
        36
    chocolate518  
       248 天前
    这不叫防御性编程吧,没有代码规范就是这样了 如果不想操心就是反正也不是不能跑的心态,如果觉得别扭就推动代码规范
    wanguorui123
        37
    wanguorui123  
       248 天前
    在包一层外壳继续拉💩💩💩
    villivateur
        38
    villivateur  
       248 天前   ❤️ 13
    禁止污染“防御性编程”词条
    mansurx
        39
    mansurx  
       248 天前
    交叉管理确实没什么办法了,但可以把情况先写在周报里,避免锅从天上来。

    后面维护可以考虑引入 ai 解释/重构这段代码……专门克制这种“防御性编程”
    S9Yh4wIFsBG7jnE4
        40
    S9Yh4wIFsBG7jnE4  
       248 天前
    世界是一个草台班子 这话没错的
    me1onsoda
        41
    me1onsoda  
       248 天前
    你跟你技术老大多学学吧,他怎么就 cover 住了呢,带着这么“祸害”走了这么多年?
    Jame00001
        42
    Jame00001  
       248 天前
    直接跟上级表明,自己组做耗时耗力需要增加大量工时,安排那个人做成本更低。为了避免公司利益损失,请领导出面指明让他维护。
    zhao8681286
        43
    zhao8681286  
       248 天前
    我以为是正常逻辑写完了花了 20%的代码其他 80%的用来处理异常情况的防御性编程呢,结果不就是只有自己能看懂的屎山代码吗?
    alexsz
        44
    alexsz  
       248 天前
    @h272377502 我也觉得应该让 AI 解释代码
    MadSix
        45
    MadSix  
    OP
       248 天前   ❤️ 1
    @me1onsoda 跟他学不来,人家根基深厚位高权重。有问题向下施压或者要求公司调动资源重做项目就行了。上一个就这么黄的。人自己又不干活,不用吃屎。
    我算哪根葱跟他学,学完就废了
    icyalala
        46
    icyalala  
       248 天前
    这是防御性编程的概念: https://zh.wikipedia.org/zh-cn/防御性编程
    这是好事
    k9982874
        47
    k9982874  
       248 天前   ❤️ 2
    你们这流程有问题,接收前拉个验收会,叫上相关负责人和技术主管,一个模块一个模块的过,列出来哪些系统问题和需求问题需要改,说明质量不行拒绝接收。

    话说“防御性编程”现在已经是指在项目里拉屎,增加维护难度了么?
    bianhui
        48
    bianhui  
       248 天前
    没有改不了的代码,只有改不了的人。在软件工程还没有普及的时候,大家的开发都是一把梭哈
    nthin0
        49
    nthin0  
       248 天前
    理解岔了,我看到的第一反应也是:防御性编程难道不是好事吗😂
    sofukwird
        50
    sofukwird  
       248 天前 via Android   ❤️ 1
    对领导说这位同事的代码水平过高,自己维护不了他的代码
    uiosun
        51
    uiosun  
       248 天前
    @wusheng0 不,大佬你这是“防御性编程”,我们不考虑编程,单纯的“防御性代码”

    还是有区别的,虽然扣文字很无聊,但楼主遇到的这种人,连代码都没写好,更别提编程/软件工程了……
    junkk
        52
    junkk  
       248 天前   ❤️ 4
    防御性编程是防御式设计的一种具体体现,它是为了保证,对程序的不可预见的使用,不会造成程序功能上的损坏。

    不是防御开除式编程,拉屎就拉屎,不要重新定义老的词语,什么毛病。
    hahiru
        53
    hahiru  
       248 天前
    应该是菜。
    我指的是公司。
    如果是国企当我没说。
    F7TsdQL45E0jmoiG
        54
    F7TsdQL45E0jmoiG  
       248 天前   ❤️ 1
    这种代码往往能顺利的通过 sonar 的扫描
    MadSix
        55
    MadSix  
    OP
       248 天前
    @hahiru 一针见血,很到位,我的互联网嘴替
    ooee2016
        56
    ooee2016  
       248 天前
    @IMelon #2 遇到过所有的方法参数定义都是 void Fun(string a1, string a2, string a3, string a4, string a5);
    rehoni
        57
    rehoni  
       248 天前   ❤️ 2
    "我现在很想跟上面反馈一下这个问题,但是我这种跨管辖范围的做法总是不太好,而且也不知道提了有没有用。难道就这么把这口屎吃下来不成。"
    现状是
    1. 你是第一责任人,到时候维护他没事,你背锅
    2. 你已经在吃屎了
    我觉得 OP 也别管那么多了,他这种行为已经深刻影响了你的利益,不想沦落到代码和你只有一个能跑的话。就低情商,就把事情办得难看,让大家都挂不住面子,当个刺猬。
    yuwangG
        58
    yuwangG  
       248 天前
    卷起来
    ersic
        59
    ersic  
       248 天前
    也许他就是这么菜呢
    cathub86
        60
    cathub86  
       248 天前
    一模一样了 2 月 20 接受了 一个屎山 要把底层的 es 换成 ck 代码没注释 问他还爱答不理
    组长: 有这么难么 就换个组件 不是很简单么
    我: 我要理清楚业务流程才能改 代码没注释
    组长:那你问啊 人就在你旁边
    cathub86
        61
    cathub86  
       248 天前
    @cathub86 更骚的是 有很多功能是半成品 就提交了 我问他 他说 那你改一下行了 不是很简单么
    Jiajin
        62
    Jiajin  
       248 天前
    还得是 AI 解释代码。
    dog82
        63
    dog82  
       248 天前   ❤️ 1
    楼主曲解防御性编程的意思了
    防御性编程是指编写更稳定更健壮的代码
    而不是编写别人看不懂的代码
    MadSix
        64
    MadSix  
    OP
       248 天前
    @dog82 感谢指出 请看附言
    iphantom
        65
    iphantom  
       248 天前
    从根本解决呗,找组 2 要这个人到你的组后续他维护被,或者让你组的小弟和他互换。你们两个组可以沟通那没问题,不行就找老大协调呗,把人要回来吧~
    cominghome
        66
    cominghome  
       248 天前
    到底是防御性编程还是人菜,要先搞清楚
    MadSix
        67
    MadSix  
    OP
       248 天前   ❤️ 2
    @iphantom 其实我也知道这是最佳方案,我只是不愿意面对。
    甚至老大都找我沟通过了,我如果想换人他是能过来的。不过这么个祖宗我内心不情愿放过来。
    要知道这个项目总有没活的时期,到时候不能让他闲着吧?一旦把他放到我其他项目里去了,这玩意就跟传染一样,沾一个染一个
    tkHello
        68
    tkHello  
       248 天前
    保护自己的代码: 在将来的工作中,采取一些防御性编程的措施来保护自己的代码。例如,使用代码水印技术、定期进行代码审查、在代码中添加详细的注释和文档等。
    tkHello
        69
    tkHello  
       248 天前
    采用代码水印技术: 在代码中嵌入独特的标识符或水印,以标记代码的所有者。这样即使代码被剽窃,也可以通过检测水印来识别代码的来源。
    chiu
        70
    chiu  
       248 天前   ❤️ 1
    所以说 reviewer 是代码库的一道防线
    PN27149
        71
    PN27149  
       248 天前
    想学学怎么写防御性代码,哈哈
    mazz
        72
    mazz  
       248 天前
    @mrliusg 罗.jpg
    pqlamz
        73
    pqlamz  
       248 天前
    那他自己怎么维护的啊?看起来,像是源代码自带混淆,无需 proguard/obfuscator 。读源码就是做逆向的感觉吗?
    cmdOptionKana
        74
    cmdOptionKana  
       248 天前
    老大不急,你急啥,慢慢干呗。

    把你遇到的情况详细记录,说明影响工作进度,以能保留证据的形式向上级报告,剩下的事情你就不用管了。
    skymei
        75
    skymei  
       248 天前
    上家有个同事就是这样,改他的代码真的火大,各种脱裤子放屁,最后加上公司氛围确实不好,我早早的就撤了
    cmdOptionKana
        76
    cmdOptionKana  
       248 天前   ❤️ 1
    另外,他不受你管,你可以架空他,他提交的代码你一个字别动,只在外面加 wrapper 来调用,实在不行就自己重写,备注里说明重写的原因,备注里指名道姓批评他。
    version
        77
    version  
       248 天前   ❤️ 1
    直接搞成微服务.提供接口文档.字段注解.管他内部怎么实现..接口性能可以监测...想重构谁的业务.也是很简单的..
    cmdOptionKana
        78
    cmdOptionKana  
       248 天前
    @MadSix 能把人调过来,你是老大,还怕小弟?制定一个一视同仁的规定,他的代码不符合要求他重写,屡教不改就可以依法辞退了。
    MadSix
        79
    MadSix  
    OP
       248 天前
    @cmdOptionKana #78 都是打工的,何苦相互为难,什么老大不老大的。我没兴趣去“矫正”别人,只要不影响到我就行。
    如果不是没得选的情况,谁想主动要个祖宗过来还得跟他斗智斗勇。省点心不好么。
    ren5ren6
        80
    ren5ren6  
       248 天前   ❤️ 1
    能和他一对一的谈一次么?请吃饭或拉到没人办公室。直接说他不归你管但需要你今后擦屁股的心中隐忧,谈时不要迂回,开诚布公、直接明了,但,一定一定态度和善诚恳。看他当时怎么说、之后怎么做,你自己需要做些什么不就是一定的了吗?
    chaos93
        81
    chaos93  
       248 天前
    扔给 GPT
    zgl263885
        82
    zgl263885  
       248 天前 via iPhone
    目前我接手的项目有个方法 1500 多行代码。但资本家没有少发钱,默默吃着了。
    991547436
        83
    991547436  
       248 天前
    写得好又不会加工资,你不能维护关他什么事,除非加钱
    littlewing
        84
    littlewing  
       248 天前
    不是我理解的 防御性编程,我以为是做了太多 check 影响性能了
    MadSix
        85
    MadSix  
    OP
       248 天前
    @991547436 写的好会加的
    kneo
        86
    kneo  
       248 天前
    为什么这种人在你们公司成了主力?
    lategege
        87
    lategege  
       248 天前
    防御性编程最新释义:编写只有自己能懂的代码来预防被公司优化。
    7VO54YYGvw3LOF9U
        88
    7VO54YYGvw3LOF9U  
       248 天前 via iPhone
    @miraumr 拉个更牛逼的
    MadSix
        89
    MadSix  
    OP
       248 天前
    @kneo 要是有人能代我去问问老板这个问题就好了 我是不敢问
    wolfan
        90
    wolfan  
       248 天前
    错误作法:V 站求意见。
    正确作法:写邮件上报。
    MadSix
        91
    MadSix  
    OP
       248 天前
    @lategege 请见附言
    calano
        92
    calano  
       248 天前
    扔给 copilot 让优化结构,我用下来发现拆的方法有点过于细了
    gesse
        93
    gesse  
       248 天前
    huruwo
        94
    huruwo  
       248 天前
    既然有防御式编程,我想知道进攻式编程是什么样子。

    你用你的进攻式编程来突破他的防御式编程不就行了。
    gkiwi
        95
    gkiwi  
       248 天前
    我以为的防御式编程,是过度的判断非空,喜欢到处 trycatch...
    SSSensational
        96
    SSSensational  
       248 天前
    uniswap 的前端代码是防御性编程的典例
    iphantom
        97
    iphantom  
       248 天前
    @MadSix 你本质上是不希望他给你埋坑么 但是现在来看坑肯定有的 那你现在的期望更多是别让自己背锅么 那你现在只能先确认下这个锅让谁来背锅。 所以肯定是这哥们要来背最好。
    关于这哥们后续的安排,其实也很明显啊,就是去做对接或者支持类的工作,比如你们组总有一些要支持其他团队的时候,就让他去吧,这样其他组看到这个熊样,为了防止自己背锅,大概率也会重复你的操作,把他要回去,大概就是这哥们就成流水的兵了吧····
    FantaMole
        98
    FantaMole  
       248 天前
    大伙儿都不知道你这个项目是怎么样的,技术栈是什么,项目结构是什么样的。大家就算有解决方案,也跟你看屎山代码一样不知道怎么入手,思路只能是在人事安排或者工作职责上想想办法

    我提个思路吧,如果不想碰狗屎的话,我假设这个项目是个微服务项目,且开发完成之后改动不会很频繁,然后你说你们项目组之间开发的功能耦合不强,那你现在就要做两个事情:

    1. 多 push 测试,趁这个同事还在开发这个项目,尽量多测试,让问题多多暴露出来,让他改好

    2. 做项目拆分,把那个同事所有开发的屎山代码都拆分出来,单独成为一个服务,下沉这个服务作为基础服务,没有特殊情况不做修改。以后有功能上的修改或者业务上的变更,调用这个基础服务,在服务接口返回结果的基础上做功能拓展或者业务变更

    你说性能问题,牙医 shake it ,代码都成了这个样子

    如果实在不行的话,前几年有个很火的折磨游戏,叫做 “和 Bennett Foddy 一起攻克难关”,那你也可以 “和 OpenAPI 一起翻越屎山”
    Hyakutake
        99
    Hyakutake  
       248 天前
    问题很明确,拦不住创建屎山的人,并即将接手屎山。
    1. 先试试拦着拉屎的人。向技术老大汇报,让对应组的人改掉,验收后在接。
    2. 拦不住就考虑不接。如果没得选择,那看看能不能提前接,在还是一个屎堆的时候就重构了。
    3. 接下来,如果想维护好,分两种,屎上雕花或者直接推倒重来。
    4. 屎上雕花,就是后续的功能,按规范开发,尽量不动之前的东西。看过了就补一点注释。
    5. 直接推倒重来,有资源就把接口在写一遍,没资源扔给 gpt 读代码,然后再重构吧。
    bojackhorseman
        100
    bojackhorseman  
       248 天前   ❤️ 1
    "防御性编程"指防止他人参与的编程
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2783 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 12:37 · PVG 20:37 · LAX 04:37 · JFK 07:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.