作者del680202 (HANA)
看板Soft_Job
标题Re: [讨论] 写程式的追求?
时间Wed May 7 07:09:46 2025
※ 引述《neo5277 (I am an agent of chaos)》之铭言:
: 纯粹对工作上来说
: 好抽换,好接手(易阅读),好维护(包含升级,测试
好接手,易阅读…
我想到一个故事
几年前有个同事,号称国中时期就开始接案写代码
clean code,DDD滚瓜烂熟,对coding极度洁癖
印象比较深的是入职时说了句:我看到不规范的代码会非常生气
上工第一案子,设计一个工具网站,拆了七个GitHub repo
Micro services, grpc当年流行的工具全套了一轮
说是将低耦合,高内聚做到极致
其中一个repo 甚至只放了一个utils
後来来了另一个人接手
改个功能要先看懂七个repo之间关联,跟找大秘宝似的
在review code阶段,还埋个彩蛋,发现了隐藏的第八个repo
新来的同事说改不动了,就算加个menu都很麻烦
心一横,提案该网站功能也不复杂,全部打掉重做
就自己埋头花了两周重做了那个网站加迁移
工程师追求的很简单,(自己)好阅读,(自己)好维护就行了
-----
Sent from JPTT on my iPhone
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.194.179.86 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1746572988.A.7B5.html
1F:推 marra: 推"寻宝游戏"!XD 05/07 07:23
2F:→ nh60211as: 确实,设计得乱七八糟但是连文件都不写 05/07 07:27
3F:推 lianpig5566: 寻宝XDD 05/07 08:11
4F:→ gname: 哇... 高内聚低耦合已经不知道多少年没听到了... 05/07 08:35
5F:→ Ekmund: 那依然是个很好的概念 只是要知道 过犹不及R 05/07 09:30
6F:推 Lordaeron: [自己] 是对的。 05/07 09:43
7F:推 kurtsgm: 这种就Overengineering 我之前遇过一个同事也这样 05/07 09:50
8F:→ kurtsgm: 要维护这种code有够痛苦 跟义大利面code半斤八两 05/07 09:51
9F:推 VScode: 我最後trace code是用全域搜寻 懒得找定义了 根本找不到 05/07 10:32
10F:推 ypps6055: 这种设计以我的认知,根本不算好阅读好维护,有些人曲 05/07 11:21
11F:→ ypps6055: 解这个意思了 05/07 11:21
12F:→ ypps6055: 过度拆分本身就导致维护管理困难,要跨一堆专案来看更 05/07 11:24
13F:→ ypps6055: 称不上好阅读,有的人会因为书上或个人的强迫症导致变 05/07 11:24
14F:→ ypps6055: 成这样然後认为自己的东西很简洁乾净 05/07 11:24
15F:推 accessdenied: 现在一堆人跟风什麽都 DI,全部都是 interface 找 05/07 11:44
16F:→ accessdenied: 不到实作,找到後也会发现99%根本只有一个 class 05/07 11:44
17F:→ accessdenied: 实作,浪费後人多少生命时间。 05/07 11:44
18F:→ accessdenied: 而且 DI 的存在不就是为了单元测试隔离相依?结果这 05/07 11:44
19F:→ accessdenied: 99%写 DI 的专案里根本完全没有单元测试的专案!妈 05/07 11:45
20F:→ accessdenied: 的写心酸的喔? 05/07 11:45
21F:推 TPAsavelove: 老实说我是觉得开发时程吃紧根本不用做什麽interface 05/07 12:21
22F:→ TPAsavelove: 功能稳定跟拆多少没太多关系... 05/07 12:21
23F:推 lonelytea: 这篇真的有写实 05/07 12:39
24F:推 zyxx: 没文件的专案都是大便 文件很烂的专案跟大便没两样 05/07 12:40
25F:推 ck237: 推 寻宝游戏 05/07 12:45
26F:推 stepnight: 太真实 05/07 12:51
27F:推 Lhmstu: 寻宝游戏,笑死 05/07 13:04
28F:→ Lipraxde: over design 了 05/07 13:07
29F:推 k7ji91ab5m: 确实是过油不及啦 还是要抓平衡 05/07 14:09
30F:推 kuosos520: 我最怕遇到接手一大堆搞自动化Gen code的神人专案 05/07 14:13
31F:→ kuosos520: ,每次要改都不知道从哪里改,结论就是一路摆烂到 05/07 14:13
32F:→ kuosos520: 重构 05/07 14:13
33F:→ tofuflower: 如果改一个功能七个 repo 都要动,那叫做高耦合。高 05/07 14:42
34F:→ tofuflower: 内聚低耦合不是这样搞的 05/07 14:42
35F:→ ssccg: DI并不需要拆interface,最基本的用途应该是让物件生命周期 05/07 14:42
36F:→ ssccg: 能跟着某个context又不用自己new,倒不完全是为了测试 05/07 14:42
37F:→ ssccg: interface都是等有第二种实作再重构抽的 05/07 14:43
38F:推 SHANGOYANYI: 他可能以前是写ejb的… 05/07 14:48
39F:推 kattte: 我也遇过一个,做了三个月,产出0,整天跟人吵架 05/07 15:50
40F:→ devilkool: .NET的Mock Library几乎都只能Mock interface跟 05/07 17:38
41F:→ devilkool: virtual method,不然我也不想弄这麽多interface 05/07 17:39
42F:推 strlen: 改个东西要了解七大密宝叫什麽低耦合?这完全是人的问题 05/07 17:55
43F:→ strlen: 低耦合的标准 其实就看程式语言本身的功能就懂啦 05/07 17:56
44F:→ strlen: 每天都在用一堆内建函式 完全不需要理解函式怎麽运作的吧 05/07 17:59
45F:→ strlen: 只要知道用它会发生啥事就好 每个模组就应该设计成这样 05/07 17:59
46F:→ strlen: 没办法达成这种效果 低耦合都马自己讲 05/07 18:00
47F:→ strlen: 所以之前才说 要搞敏捷 搞agile 搞clean code 搞设计模式 05/07 18:00
48F:→ strlen: 不是你说了算 你说clean就clean?是要大家来吵架决定的 05/07 18:01
49F:→ strlen: 真正好维护的code 就是团队紧密沟通(吵架)才弄得出来的 05/07 18:02
50F:→ strlen: 但是齁 基本上工程师都马文人相轻啦 看不起别人 都觉得别 05/07 18:02
51F:→ strlen: 人写得都垃圾 又自以为最聪明 其它人都低能 大头症工程师 05/07 18:02
52F:→ strlen: 满街都是 这样态度要合作?要吵架?有得吵了 呵呵 05/07 18:03
53F:→ strlen: 吵到最後还有EQ不好的开始砍人勒 怕爆 05/07 18:03
54F:推 qwe78971: 两周的工作量 可以弄到8个 也是人才 05/07 18:56
55F:推 luke72: 这个设计是为了以後团队成长到几万人在开发这个专案 05/07 20:05
56F:推 internetms52: 很同意前几楼说的,DI本来可以方便测试,结果一个 05/07 20:07
57F:→ internetms52: 测试也没见到,XD 05/07 20:07
58F:推 luke72: 8个repo算少了,我接手过一个single page app快100 repo 05/07 20:08
59F:→ luke72: 大量的DI,说要重复使用,各种抽换 05/07 20:10
60F:→ luke72: 结果连angular升版都做不到,整个砍掉重做 05/07 20:11
61F:→ luke72: (原作者做不到) 05/07 20:11
62F:推 abccbaandy: 拆越多通常问题也越多,比那种几千行的还难维护 05/07 21:50
63F:推 brianwu1201: 寻宝游戏,笑死 05/07 22:12
64F:→ superpandal: 功能本来就要做成显示调用 隐藏实作细节的没有不是垃 05/07 22:54
65F:→ shooter555: 等到规模够大才有差 05/07 22:56
66F:→ superpandal: 圾的 难以追踪也学不到东西 很可惜很多语言的DI是隐 05/07 22:56
67F:→ superpandal: 式的 好的程式就是minimal外加不写死保留点弹性 05/07 22:58
68F:→ superpandal: 简单来讲就是可爱 但不利不被取代 主要是做成lib而非 05/07 23:02
69F:→ superpandal: 弄微服务 这东西多数人用不到 全用http也很惊悚 05/07 23:04
70F:推 viper9709: 这种就标准过度设计,杀鸡用牛刀... 05/08 00:20
71F:推 umidaisuki: 这篇很写实XD 05/08 00:22
72F:推 yuidzeon: 我超讨厌微服务的 服务够大就会拆部门了啊 等到那时候再 05/08 00:23
73F:→ yuidzeon: 拆就好了 除非是业务需求需要切出去 (例如某个服务预期 05/08 00:23
74F:→ yuidzeon: 会有大量流量要扩展) 现在一堆为拆而拆的 真的找 log 都 05/08 00:23
75F:→ yuidzeon: 跟在找大秘宝一样... 05/08 00:23
76F:→ saladim: 会写function+struct就很神了 真的 不止写code 还有一堆 05/08 02:52
77F:→ saladim: 流程之神 加个三层检查才能进code, 解个bug开新branch 搞 05/08 02:54
78F:→ saladim: 很多毛 有两层做的有效的话就很好了 05/08 02:55
79F:推 leftless: cleancode前几页就说写程式是社交活动 然後他只会生气 05/08 03:04
80F:→ leftless: 叫他会去重看 05/08 03:05
81F:推 marra: "是要大家来吵架决定的" XD 05/08 04:17
82F:→ strlen: 我自己是觉得不要眼高手低啦 能让你慢慢吵架写一个超赞程 05/08 10:28
83F:→ strlen: 式的环境几乎不存在 大家平常忙死了谁要管你啊 如果你是香 05/08 10:29
84F:→ strlen: 香妹子工程师那还愿意花点时间跟你交流交流 但平常遇到都 05/08 10:29
85F:→ strlen: 马肥宅占九成 说个话都能闻到口臭 谁想蕉流 05/08 10:30
86F:→ strlen: 所以还是照着团队的写法跟着写 绝不会错 05/08 10:30
87F:→ strlen: 大家怎麽写 你就模仿大家怎麽写 不要在那边乱 标新立异 05/08 10:31
88F:→ strlen: 要搞东搞西你的理想国自己side project爱怎玩就怎玩 05/08 10:31
89F:推 gino0717: 桑原老师说过 架是要两个人才能吵的 05/08 11:55
90F:→ Suleika: 这就是标准的over design看过书不可能做出这种东西 05/08 12:36
91F:推 transforman: 大秘宝XD 05/08 14:38
92F:推 as6633208: 这个叫架构魔怔,设计时都会说扩充多方便,实际上扩充 05/08 17:46
93F:→ as6633208: 次数不到两次,然後要加个新功能极为麻烦 05/08 17:46
94F:→ as6633208: 重剑无锋,大巧不工,越是符合原生的应用,逻辑越简单 05/08 17:49
95F:→ as6633208: 又能达到目标越好,抽象注入太多一堆魔怔,最後都是只 05/08 17:49
96F:→ as6633208: 有原设计者看得懂,後人接到改个几次觉得很怪就重新打 05/08 17:49
97F:→ as6633208: 掉了,真正可以留下来後人会维护的code,反而都是没什 05/08 17:49
98F:→ as6633208: 麽抽象的架构的code 05/08 17:49
99F:推 tsaigi: over design 真的不行 05/08 18:11
100F:推 awenracious: 就跟正规化一样 你过度正规化只会找自己麻烦而已且 05/08 18:14
101F:→ awenracious: 没必要 05/08 18:14
102F:→ alan3100: 这只是你单纯没接手dependency management跟IDE吧 05/08 23:46
103F:→ alan3100: 2个礼拜能做出来的东西 如何over design到看不懂 05/08 23:46
104F:推 viper9709: 推跟过度正规化一样+1 05/09 00:36
105F:推 jen1121: 这叫the show 05/09 00:47
106F:→ Lordaeron: spring framework:.....我教的... 05/09 07:25
107F:推 Csongs: 确实 05/09 09:03
108F:→ Lordaeron: 凡事都加个interface,就spring 起的头,然後蔓延出去. 05/09 09:58
109F:→ b85040312: 一个 repo 只放一个 utils 是三小! 05/09 17:24
110F:推 abccbaandy: 关spring啥事? 他实作通常不只一个好吗... 05/09 23:25
111F:→ acgotaku: 其实选对 IDE 这些都不算是问题拉 认真的 05/09 23:58
112F:→ acgotaku: 大型专案,挂个十来个 dependancy 是家常便饭 05/09 23:59
113F:→ acgotaku: 不要搞不清楚概念乱设计,那种对 clean 一只半解的才恐怖 05/10 00:04
114F:→ acgotaku: 遇过那种一个 lib 做抽象,然後实践实作在各种 lib 中 05/10 00:06
115F:→ acgotaku: 的垃圾,开新 method 没重复名称功能全凭运气 05/10 00:07
116F:推 notimenofree: 太多这种案例了 头很痛 05/10 05:49
117F:→ superpandal: spring写的通常实作确实一个居多 没什麽多实作的应用 05/10 08:10
118F:→ superpandal: 情境的 05/10 08:12
119F:→ superpandal: ide多专案切换就是个麻烦了 编译执行debug都是麻烦 05/10 08:17
120F:→ superpandal: 跨专案字串补全 搜档案都是 05/10 08:21
121F:→ superpandal: 界面开新method然後物件已经有该method? 05/10 08:27
122F:→ superpandal: 没听懂你讲什麽 这种东西应该是会报错的 05/10 08:36
123F:→ superpandal: 而且实作为何要独立一包lib? 05/10 08:46
124F:→ ssccg: spring自己是很多interface,但用spring写东西根本用不到 05/10 15:16
125F:→ ssccg: interface吧,spring的一个恶名不就是动态改你的class生成 05/10 15:18
126F:→ ssccg: proxy,实际在跑的bytecode跟你写的东西不同吗? 05/10 15:18
127F:→ ssccg: 连直接呼叫的method都能被偷改了,干麻用inteface? 05/10 15:22
128F:→ superpandal: 最多是替换实现 执行时改原来的类需要一些java底层知 05/10 20:53
129F:→ superpandal: 识 通常就只是外面套一层用反射去hack 05/10 20:54
130F:→ TaiwanUp: 搞不好他只是在练功 刻意练习 05/11 11:04
131F:推 pttano: 你是不是在臭某网红? 05/11 17:48
132F:推 jackypan1989: KISS 05/11 21:19
133F:→ SuperTaco: (自己) 05/12 16:02
134F:推 fish0112: 只有一个git repo跟很多repo 我支持很多repo.... 05/14 00:50
135F:→ fish0112: All in one真的很恶心... 05/14 00:50