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