背景如下: 我们有多个组,我带组 1. 同事 A 不在我的组,属于组 2. 现在同事 A 正在开发一个新项目,他是目前的主力,我安排人配合他一起完成,但目前开发内容上交集很少,拆的比较开。
问题如下: 1.目前已经明确,这个项目开发完之后,全权移交给我组负责后续开发维护,我是第一责任人。 2.最近组里兄弟跟我反馈,这哥们的代码,太过防御性了点,代码几乎是不可维护的。干什么都是梭哈,除了他自己没人看得懂写的是什么。我稍微看了一眼,想在他的代码上加功能我看了都满头大汗,无从下手。 3.这个系统其实有个前身,后来他介入之后,也是这套打法。到后来成功的没办法继续维护了,只能推倒重做一套,继续放任,就是历史重演。
我很想提这个问题,但他又不归我管。他防御性编程其实我不是很在意,别人自有维护饭碗的方式,但是影响到我后续开发了,我就很难受。
现在最困难的是: 这个项目并不是由组 2 的组长带的,而是一个技术老大亲自带的,所以找组 2 组长沟通没用。 至于这个技术老大。emm 说实话不太管事,只管下任务,也不关心代码质量和项目细节,所以跟他反馈等于没说。平时开发告诉他做完了就行,代码 review 他都不做,要不然也不能让这哥们毫无心里负担得这么干。奈何技术老大位高权重资历深厚,咱们也没什么办法。
我现在很想跟上面反馈一下这个问题,但是我这种跨管辖范围的做法总是不太好,而且也不知道提了有没有用。难道就这么把这口屎吃下来不成。
V 友们给出出主意。
![]() | 1 MillaMaxwell 2024-04-17 09:54:09 +08:00 ![]() |
2 IMelon 2024-04-17 09:55:24 +08:00 防御性的代码看起来是什么样的? |
3 yangzzzzzz 2024-04-17 09:55:35 +08:00 直接和他明说啊 不改像上面汇报呗。就说以后代码我这边维护不了 别怪我了。 |
5 ltyj2003 2024-04-17 09:57:13 +08:00 via Android 让他提供开发文档,对程序代码进行说明。 |
![]() | 6 kera0a 2024-04-17 09:57:36 +08:00 via iPhone ![]() 能不能把这哥们请来 V 站开个讲座? |
7 MadSix OP @IMelon 代码不方便贴 怎么说呢,基本就是 1.跟已有项目开发习惯相背,大家什么框架或者方法用的最多,他就不用什么。大家什么写法最多,就不写什么。 2.不拆分不抽象,逻辑一把梭哈,强强耦合,要改个功能得瞻前顾后,牵一发动全身 3.变量名+没注释,懂得都懂 |
8 emSaVya 2024-04-17 09:59:37 +08:00 代码重构列入 kpi 安排工时呗。这不是常规方案吗? |
10 MadSix OP @emSaVya 他的 KPI 不归我定 至于我自己安排人重构。。。这口屎吃的风险太大了,不是他自己来,重构一下总担心出问题。 这哥们最骚的操作是好多判断他交给前端去做,他就在万千返回值中给几个意义不明的 0123. |
![]() | 11 MrYELiex 2024-04-17 10:02:27 +08:00 可能单纯是菜 或者觉得不配用脑子想怎么抽象 写完就完事了 |
![]() | 12 uiosun 2024-04-17 10:04:05 +08:00 ![]() @IMelon 举个例子: OOP 的话,一个 class 三千多行甚至更多,我见过两万多行的(纯代码,不带空行的计算),没有一行注释,message 缩写成 msg 都是奇迹,往往会写成 m 或者 xx (消息的拼音打头)。 这个 m 在不同的行效果是不同的,这会儿是 message ,过几百行是 minute ,等下又变成了 meter 。 里面一部分方法有,一部分方法没有:事务、参数校验、直接抛异常、抛错误代码等等等,不一而足,全凭当时的心情。 说好听点叫防御性代码,说难听点他自己都不一定维护的起来……好代码都长得类似,这种代码那就各有各的风味了…… |
![]() | 13 mrliusg 2024-04-17 10:04:34 +08:00 “又不是不能用” |
14 MadSix OP |
![]() | 16 wusheng0 2024-04-17 10:08:22 +08:00 ![]() 防御性编程是专门的名词吧,你们这么用现在都变成反义词了,后面怎么正常交流 > 防御性编程( Defensive programming )是防御式设计的一种具体体现,它是为了保证,对程序的不可预见的使用,不会造成程序功能上的损坏。 > 它可以被看作是为了减少或消除墨菲定律效力的想法。 防御式编程主要用于可能被滥用,恶作剧或无意地造成灾难性影响的程序上。 |
![]() | 18 devilte 2024-04-17 10:10:19 +08:00 @uiosun #12 假设真看到这样的代码 我都要纠结一下是作者真实水平烂还是作者刻意为之,毕竟刻意写成这样都是反第一反应的 会增加一定的心智负担,真的有人在写防御性代码吗 |
![]() | 20 Patrick6 2024-04-17 10:14:26 +08:00 原来这个是日经贴啊,代码和人有一个能跑就行 |
22 fredweili 2024-04-17 10:15:33 +08:00 强化 code review ,不允许随便 merge |
![]() | 23 yangxiaopeipei 2024-04-17 10:15:41 +08:00 code review 怎么过的 |
24 FrankAdler 2024-04-17 10:16:26 +08:00 via Android 原来代码写的烂还有这么一个高大上的名字 |
![]() | 25 whoosy 2024-04-17 10:19:34 +08:00 ![]() 我认为只是单纯的水平菜,身边技术稍微强点的基本上对代码都有洁癖 |
26 RightHand 2024-04-17 10:19:46 +08:00 via Android 拆分,推出去 |
27 7h3d4wn 2024-04-17 10:21:02 +08:00 把这个人要到你组里来负责后续维护 你的核心问题是以后维护麻烦,那就人跟着项目走 其他没什么更好办法了 |
![]() | 28 liyanan 2024-04-17 10:21:18 +08:00 能不能反噬一下他自己?这个项目维护归属 op 看看能不能换成他,自己种的果子自己吃吧~ |
29 MadSix OP @yangxiaopeipei 描述里说过了 这项目负责人是个万年老大哥,人不做代码 review 而且他位高权重的咱也管不着 |
![]() | 30 h272377502 2024-04-17 10:21:29 +08:00 现在有 ai 了,感觉问题不是很大,让 ai 基于他的代码转化成可维护的,不断校验每步的输出。 |
![]() | 31 foxkiller 2024-04-17 10:23:10 +08:00 你们不 Code Review 啊? |
32 7h3d4wn 2024-04-17 10:23:21 +08:00 换句话说,是系统性问题,或者说,管理问题造成了你当下的 dilemma 你又改变不了整个管理风格,那你基本就只能成全这哥们儿的防御性 |
![]() | 33 yanw 2024-04-17 10:23:57 +08:00 可能单纯就是菜 |
34 MadSix OP |
35 sparklee 2024-04-17 10:25:01 +08:00 我所理解的 防御性编程 是提前返回, 考虑到各种异常情况提前 return, 减少 else 减少条件判断嵌套的写法 |
![]() | 36 chocolate518 2024-04-17 10:25:37 +08:00 这不叫防御性编程吧,没有代码规范就是这样了 如果不想操心就是反正也不是不能跑的心态,如果觉得别扭就推动代码规范 |
![]() | 37 wanguorui123 2024-04-17 10:27:06 +08:00 在包一层外壳继续拉 |
![]() | 38 villivateur 2024-04-17 10:28:04 +08:00 ![]() 禁止污染“防御性编程”词条 |
![]() | 39 mansurx 2024-04-17 10:28:37 +08:00 交叉管理确实没什么办法了,但可以把情况先写在周报里,避免锅从天上来。 后面维护可以考虑引入 ai 解释/重构这段代码……专门克制这种“防御性编程” |
40 S9Yh4wIFsBG7jnE4 2024-04-17 10:29:42 +08:00 世界是一个草台班子 这话没错的 |
![]() | 41 me1onsoda 2024-04-17 10:32:10 +08:00 你跟你技术老大多学学吧,他怎么就 cover 住了呢,带着这么“祸害”走了这么多年? |
![]() | 42 CJ2r4u3EH4lrM7aR 2024-04-17 10:33:18 +08:00 直接跟上级表明,自己组做耗时耗力需要增加大量工时,安排那个人做成本更低。为了避免公司利益损失,请领导出面指明让他维护。 |
43 zhao8681286 2024-04-17 10:33:52 +08:00 我以为是正常逻辑写完了花了 20%的代码其他 80%的用来处理异常情况的防御性编程呢,结果不就是只有自己能看懂的屎山代码吗? |
44 alexsz 2024-04-17 10:34:24 +08:00 @h272377502 我也觉得应该让 AI 解释代码 |
45 MadSix OP ![]() @me1onsoda 跟他学不来,人家根基深厚位高权重。有问题向下施压或者要求公司调动资源重做项目就行了。上一个就这么黄的。人自己又不干活,不用吃屎。 我算哪根葱跟他学,学完就废了 |
![]() | 46 icyalala 2024-04-17 10:37:37 +08:00 这是防御性编程的概念: https://zh.wikipedia.org/zh-cn/防御性编程 这是好事 |
![]() | 47 k9982874 2024-04-17 10:42:16 +08:00 ![]() 你们这流程有问题,接收前拉个验收会,叫上相关负责人和技术主管,一个模块一个模块的过,列出来哪些系统问题和需求问题需要改,说明质量不行拒绝接收。 话说“防御性编程”现在已经是指在项目里拉屎,增加维护难度了么? |
![]() | 48 bianhui 2024-04-17 10:45:52 +08:00 没有改不了的代码,只有改不了的人。在软件工程还没有普及的时候,大家的开发都是一把梭哈 |
![]() | 49 nthin0 2024-04-17 10:47:01 +08:00 理解岔了,我看到的第一反应也是:防御性编程难道不是好事吗 |
50 sofukwird 2024-04-17 10:47:54 +08:00 via Android ![]() 对领导说这位同事的代码水平过高,自己维护不了他的代码 |
![]() | 51 uiosun 2024-04-17 10:48:19 +08:00 |
![]() | 52 junkk 2024-04-17 10:48:36 +08:00 ![]() 防御性编程是防御式设计的一种具体体现,它是为了保证,对程序的不可预见的使用,不会造成程序功能上的损坏。 不是防御开除式编程,拉屎就拉屎,不要重新定义老的词语,什么毛病。 |
![]() | 53 hahiru 2024-04-17 10:50:35 +08:00 应该是菜。 我指的是公司。 如果是国企当我没说。 |
54 F7TsdQL45E0jmoiG 2024-04-17 10:53:18 +08:00 ![]() 这种代码往往能顺利的通过 sonar 的扫描 |
56 ooee2016 2024-04-17 10:56:01 +08:00 @IMelon #2 遇到过所有的方法参数定义都是 void Fun(string a1, string a2, string a3, string a4, string a5); |
![]() | 57 rehoni 2024-04-17 10:56:23 +08:00 ![]() "我现在很想跟上面反馈一下这个问题,但是我这种跨管辖范围的做法总是不太好,而且也不知道提了有没有用。难道就这么把这口屎吃下来不成。" 现状是 1. 你是第一责任人,到时候维护他没事,你背锅 2. 你已经在吃屎了 我觉得 OP 也别管那么多了,他这种行为已经深刻影响了你的利益,不想沦落到代码和你只有一个能跑的话。就低情商,就把事情办得难看,让大家都挂不住面子,当个刺猬。 |
![]() | 58 yuwangG 2024-04-17 11:00:37 +08:00 卷起来 |
![]() | 59 ersic 2024-04-17 11:01:49 +08:00 也许他就是这么菜呢 |
60 cathub86 2024-04-17 11:04:10 +08:00 一模一样了 2 月 20 接受了 一个屎山 要把底层的 es 换成 ck 代码没注释 问他还爱答不理 组长: 有这么难么 就换个组件 不是很简单么 我: 我要理清楚业务流程才能改 代码没注释 组长:那你问啊 人就在你旁边 |
62 Jiajin 2024-04-17 11:10:54 +08:00 还得是 AI 解释代码。 |
![]() | 63 dog82 2024-04-17 11:14:38 +08:00 ![]() 楼主曲解防御性编程的意思了 防御性编程是指编写更稳定更健壮的代码 而不是编写别人看不懂的代码 |
![]() | 65 iphantom 2024-04-17 11:23:58 +08:00 从根本解决呗,找组 2 要这个人到你的组后续他维护被,或者让你组的小弟和他互换。你们两个组可以沟通那没问题,不行就找老大协调呗,把人要回来吧~ |
![]() | 66 cominghome 2024-04-17 11:27:49 +08:00 到底是防御性编程还是人菜,要先搞清楚 |
67 MadSix OP ![]() @iphantom 其实我也知道这是最佳方案,我只是不愿意面对。 甚至老大都找我沟通过了,我如果想换人他是能过来的。不过这么个祖宗我内心不情愿放过来。 要知道这个项目总有没活的时期,到时候不能让他闲着吧?一旦把他放到我其他项目里去了,这玩意就跟传染一样,沾一个染一个 |
![]() | 68 tkHello 2024-04-17 11:30:33 +08:00 保护自己的代码: 在将来的工作中,采取一些防御性编程的措施来保护自己的代码。例如,使用代码水印技术、定期进行代码审查、在代码中添加详细的注释和文档等。 |
![]() | 69 tkHello 2024-04-17 11:31:56 +08:00 采用代码水印技术: 在代码中嵌入独特的标识符或水印,以标记代码的所有者。这样即使代码被剽窃,也可以通过检测水印来识别代码的来源。 |
![]() | 70 chiu 2024-04-17 11:31:59 +08:00 ![]() 所以说 reviewer 是代码库的一道防线 |
71 PN27149 2024-04-17 11:35:02 +08:00 想学学怎么写防御性代码,哈哈 |
73 pqlamz 2024-04-17 11:57:09 +08:00 那他自己怎么维护的啊?看起来,像是源代码自带混淆,无需 proguard/obfuscator 。读源码就是做逆向的感觉吗? |
![]() | 74 cmdOptionKana 2024-04-17 11:57:09 +08:00 老大不急,你急啥,慢慢干呗。 把你遇到的情况详细记录,说明影响工作进度,以能保留证据的形式向上级报告,剩下的事情你就不用管了。 |
![]() | 75 skymei 2024-04-17 11:58:15 +08:00 上家有个同事就是这样,改他的代码真的火大,各种脱裤子放屁,最后加上公司氛围确实不好,我早早的就撤了 |
![]() | 76 cmdOptionKana 2024-04-17 12:01:25 +08:00 ![]() 另外,他不受你管,你可以架空他,他提交的代码你一个字别动,只在外面加 wrapper 来调用,实在不行就自己重写,备注里说明重写的原因,备注里指名道姓批评他。 |
![]() | 77 version 2024-04-17 12:02:24 +08:00 ![]() 直接搞成微服务.提供接口文档.字段注解.管他内部怎么实现..接口性能可以监测...想重构谁的业务.也是很简单的.. |
![]() | 78 cmdOptionKana 2024-04-17 12:04:38 +08:00 @MadSix 能把人调过来,你是老大,还怕小弟?制定一个一视同仁的规定,他的代码不符合要求他重写,屡教不改就可以依法辞退了。 |
79 MadSix OP @cmdOptionKana #78 都是打工的,何苦相互为难,什么老大不老大的。我没兴趣去“矫正”别人,只要不影响到我就行。 如果不是没得选的情况,谁想主动要个祖宗过来还得跟他斗智斗勇。省点心不好么。 |
80 ren5ren6 2024-04-17 12:28:53 +08:00 ![]() 能和他一对一的谈一次么?请吃饭或拉到没人办公室。直接说他不归你管但需要你今后擦屁股的心中隐忧,谈时不要迂回,开诚布公、直接明了,但,一定一定态度和善诚恳。看他当时怎么说、之后怎么做,你自己需要做些什么不就是一定的了吗? |
![]() | 81 chaos93 2024-04-17 12:35:53 +08:00 扔给 GPT |
![]() | 82 zgl263885 2024-04-17 12:39:27 +08:00 via iPhone 目前我接手的项目有个方法 1500 多行代码。但资本家没有少发钱,默默吃着了。 |
83 991547436 2024-04-17 12:51:04 +08:00 写得好又不会加工资,你不能维护关他什么事,除非加钱 |
84 littlewing 2024-04-17 13:01:18 +08:00 不是我理解的 防御性编程,我以为是做了太多 check 影响性能了 |
86 kneo 2024-04-17 13:08:37 +08:00 为什么这种人在你们公司成了主力? |
![]() | 87 lategege 2024-04-17 13:09:01 +08:00 防御性编程最新释义:编写只有自己能懂的代码来预防被公司优化。 |
88 7VO54YYGvw3LOF9U 2024-04-17 13:09:43 +08:00 via iPhone @miraumr 拉个更牛逼的 |
![]() | 90 wolfan 2024-04-17 13:13:01 +08:00 错误作法:V 站求意见。 正确作法:写邮件上报。 |
![]() | 92 calano 2024-04-17 13:14:54 +08:00 扔给 copilot 让优化结构,我用下来发现拆的方法有点过于细了 |
![]() | 93 gesse 2024-04-17 13:23:44 +08:00 |
![]() | 94 huruwo 2024-04-17 13:51:23 +08:00 既然有防御式编程,我想知道进攻式编程是什么样子。 你用你的进攻式编程来突破他的防御式编程不就行了。 |
![]() | 95 gkiwi 2024-04-17 14:09:36 +08:00 我以为的防御式编程,是过度的判断非空,喜欢到处 trycatch... |
![]() | 96 SSSensational 2024-04-17 14:14:20 +08:00 uniswap 的前端代码是防御性编程的典例 |
![]() | 97 iphantom 2024-04-17 14:27:10 +08:00 @MadSix 你本质上是不希望他给你埋坑么 但是现在来看坑肯定有的 那你现在的期望更多是别让自己背锅么 那你现在只能先确认下这个锅让谁来背锅。 所以肯定是这哥们要来背最好。 关于这哥们后续的安排,其实也很明显啊,就是去做对接或者支持类的工作,比如你们组总有一些要支持其他团队的时候,就让他去吧,这样其他组看到这个熊样,为了防止自己背锅,大概率也会重复你的操作,把他要回去,大概就是这哥们就成流水的兵了吧 |
98 FantaMole 2024-04-17 14:51:44 +08:00 大伙儿都不知道你这个项目是怎么样的,技术栈是什么,项目结构是什么样的。大家就算有解决方案,也跟你看屎山代码一样不知道怎么入手,思路只能是在人事安排或者工作职责上想想办法 我提个思路吧,如果不想碰狗屎的话,我假设这个项目是个微服务项目,且开发完成之后改动不会很频繁,然后你说你们项目组之间开发的功能耦合不强,那你现在就要做两个事情: 1. 多 push 测试,趁这个同事还在开发这个项目,尽量多测试,让问题多多暴露出来,让他改好 2. 做项目拆分,把那个同事所有开发的屎山代码都拆分出来,单独成为一个服务,下沉这个服务作为基础服务,没有特殊情况不做修改。以后有功能上的修改或者业务上的变更,调用这个基础服务,在服务接口返回结果的基础上做功能拓展或者业务变更 你说性能问题,牙医 shake it ,代码都成了这个样子 如果实在不行的话,前几年有个很火的折磨游戏,叫做 “和 Bennett Foddy 一起攻克难关”,那你也可以 “和 OpenAPI 一起翻越屎山” |
![]() | 99 Hyakutake 2024-04-17 15:02:28 +08:00 问题很明确,拦不住创建屎山的人,并即将接手屎山。 1. 先试试拦着拉屎的人。向技术老大汇报,让对应组的人改掉,验收后在接。 2. 拦不住就考虑不接。如果没得选择,那看看能不能提前接,在还是一个屎堆的时候就重构了。 3. 接下来,如果想维护好,分两种,屎上雕花或者直接推倒重来。 4. 屎上雕花,就是后续的功能,按规范开发,尽量不动之前的东西。看过了就补一点注释。 5. 直接推倒重来,有资源就把接口在写一遍,没资源扔给 gpt 读代码,然后再重构吧。 |
![]() | 100 ![]() |