Re: [讨论] 写程式的追求?

楼主: HZYSoft (PCMan)   2025-05-15 15:53:40
※ 引述《del680202 (HANA)》之铭言:
: ※ 引述《neo5277 (I am an agent of chaos)》之铭言:
: : 纯粹对工作上来说
: : 好抽换,好接手(易阅读),好维护(包含升级,测试
: 好接手,易阅读…
: 我想到一个故事
看到你的故事,让我想起好多当年犯过的错误
: 几年前有个同事,号称国中时期就开始接案写代码
: clean code,DDD滚瓜烂熟,对coding极度洁癖
: 印象比较深的是入职时说了句:我看到不规范的代码会非常生气
我年轻的时候也这样,但做久了慢慢可以理解凡事都是 trade-off
写得很漂亮,却没商业价值的 code,根本没人在用,
对比写得很乱,却实际有大量使用者的 code,很难说哪个是比较好的。
刚进业界第一份工作,很认真的帮每个 function 写满注解跟 API doc,
努力遵循各种 best practice,几个月后专案取消了,这 code 从来没上 production
对比那些可怕的 legacy code,每天都好好的运行着赚钱的服务。
后来开始懂得要考量 business 的需求,有时候牺牲一点品质,抢占先机是必要之恶
: 上工第一案子,设计一个工具网站,拆了七个GitHub repo
这我当年刚学 git/github 也做过,把个巨大专案拆了十几个 repo,
原先要解决的问题是,希望每个元件可以降低耦合,容易独立使用,分开 deploy。
随着时间,逐渐发现各个元件需要共用的东西越来越多,互相 dependency 逐渐变多
这时候各个元件之间需要正确的版本,才能互相搭配,管理起来却成了噩梦
有些直接 include 就能用的东西,拆在两个 repo 挂 submodule 变得很难维护
build rules / makefile 也因此复杂了起来,最后有点后悔一开始把他们拆开。
体验过就能理解为何很多大公司最后走向 monorepo 架构,全公司专案都在一个 repo
其中一个经典案例就是 google,几乎全公司所有 code 在一个巨无霸 repo 内。
不同程式互相引用,就少有版本管理问题,开发的复杂度降低很多。
: Micro services, grpc当年流行的工具全套了一轮
: 说是将低耦合,高内聚做到极致
刚进业界的时候,我也是刚学了 microservice,很开心地把手上系统全拆了
拆分得很干净,每个服务都可以分开扩展,一开始还觉得这是 best practice
后来学到血泪教训。因为业务的改变,需求大幅度改变了。原先的拆分并不合适
反而让开发、测试、跟部署变得复杂,印证了 "monolith first" 的建议!
在早期需求还不明朗的时候,全部塞在一起,其实不是坏事,延迟到真正出现扩展需求
再来拆分,会比过早拆分要好。这跟不要 premature optimization 感觉很像。
就跟一开始学 OOP 都狂写 interface,后来才发现根本没有其他 implementation
白白多了一堆无谓的继承,最后又发现需要不同的行为,于是换了 interface
本来定义的抽象化不但没用到,还因为要保持相容,造成日后扩充的阻碍。
后来就学到 "concrete first",不要起手式就急着开 abstract interface,
可以延后到真的有需要再来做,有时候反而会更合适。
做久了慢慢对这些东西有不同的感受,best practice 通常要放在特定情境下才是 best
如果很清楚自己做了什么 trade-off,违反它们不见得是错误的。
: 其中一个repo 甚至只放了一个utils
: 后来来了另一个人接手
: 改个功能要先看懂七个repo之间关联,跟找大秘宝似的
: 在review code阶段,还埋个彩蛋,发现了隐藏的第八个repo
: 新来的同事说改不动了,就算加个menu都很麻烦
: 心一横,提案该网站功能也不复杂,全部打掉重做
: 就自己埋头花了两周重做了那个网站加迁移
两个礼拜是不是没算到写 test 跟重作 QA 的时间 XD
写 code 相对快,大部分开发时间本就都花在其他地方
这种大霹雳式的重写,通常是很危险的 XD
: 工程师追求的很简单,(自己)好阅读,(自己)好维护就行了
:
作者: keke0421 (zrae)   2025-05-15 16:29:00
简单一句话: 不要过早完美化。技术服务业务,随服务演进
作者: oherman (qq)   2025-05-15 16:39:00
PCMAN大神
作者: kuosos520 (kkk)   2025-05-15 16:44:00
只能推
作者: Romulus (Säubern Mode)   2025-05-15 16:54:00
on demand做 而refactor的时候需要test避免你改错That's why unit tests are important
作者: NTUTM04 (TM终号机)   2025-05-15 17:03:00
确实
作者: jackflu (jackflu)   2025-05-15 17:30:00
感谢大大分享
作者: superpandal   2025-05-15 17:41:00
写不写的漂亮与市场反应是两件事情 这与公司经营和高层思想才有关系 写的好不代表一定花时间但为了不让资本嚣张 我赞同有时可以这么做
作者: ybite (小犬/小B)   2025-05-15 17:46:00
我认为 一个专案的基础架构 开发蓝图 工时 要能准确估算跟执行真的都需要高度经验工作而言 重要的事是怎么在日期限制内交出及格的作品什么要取舍 什么一定要做到
作者: superpandal   2025-05-15 17:47:00
有时也不一定是资本嚣张 是高层嚣张
作者: AvatarH (Avatar Hsieh)   2025-05-15 18:38:00
推这篇,句句是实务
作者: moon2519 (~X~X~)   2025-05-15 18:57:00
至少你走过来了,辛苦了
作者: tomsangotw (铜三过TW)   2025-05-15 19:19:00
推大神
作者: blackcan (太平李荣浩)   2025-05-15 20:28:00
上古神兽推推
作者: genius945 (添财)   2025-05-15 20:51:00
推,虽然层级有差但鲁蛇做久了感想完全一样
作者: ko00385331 (智子)   2025-05-15 20:56:00
感谢分享 看完觉得茅塞顿开
作者: richardz (卍罪爱卍)   2025-05-15 21:09:00
最近也有这种感觉,会开始要求自己做到best practice,但老实说这是必经之路吧,经历过凡事都要求完美的路,才会知道哪些可以放弃不用
作者: Walkers (walkers)   2025-05-15 21:55:00
大神推推 都是血和泪的教训
作者: whyhsu (whyhsu)   2025-05-15 22:08:00
作者: accessdenied (存取违规)   2025-05-15 22:17:00
best 根本就不存在,完全是商业手法的误导,欺骗初学者以为只要看到 best 学就对,自己就会变成 best这个世界只有 suitable practice ,最合适的,没有最好的
作者: ikachann (喵喵)   2025-05-15 22:20:00
很多都这样 一开始能动最重要,真的有闲稳定下来后才是重构的部分
作者: neo5277 (I am an agent of chaos)   2025-05-15 22:41:00
神兽来了快拜一下~~~interface 还是看语言跟框架用啊
作者: a90100 (能)   2025-05-15 23:20:00
推这篇,这几年工作下来的经验也是如此,尤其碰到专案需求变动快速的时候,这篇的经验会更实用
作者: stepnight (桃卡武康)   2025-05-15 23:56:00
interface 跟 DDD 就是互相成就遵从到后来都魔怔了,一堆过度设计的场景
作者: ghost90331 (Yang)   2025-05-16 00:00:00
先存活下来再想着如何变好但活太久改不动就又是另外一回事了QQ
作者: viper9709 (阿达)   2025-05-16 00:48:00
推这篇~很有同感+1
作者: TonyQ (自立而后立人。)   2025-05-16 02:00:00
作者: HmmHmm (凝结的时间)   2025-05-16 04:54:00
推推
作者: marra (Marra)   2025-05-16 05:38:00
认真分享,给推!
作者: descent (“雄辩是银,沉默是金”)   2025-05-16 08:41:00
那些指导的书看一本就好, 程式写多了就有自己的体会再看那些书也有不同的体验
作者: buffon (简 单)   2025-05-16 08:53:00
神出没
作者: yuinami (yuinami)   2025-05-16 09:12:00
谢谢前辈分享
作者: LINGZ (肥兔小钦)   2025-05-16 09:49:00
神来了,必须盖楼推!
作者: realbout (萨摩诃)   2025-05-16 09:56:00
trade-off
作者: rog43 (Ed)   2025-05-16 10:06:00
大神要拜一下 感谢分享
作者: oiukjyhntgb (POI)   2025-05-16 10:57:00
显灵
作者: hobnob (hobnob)   2025-05-16 10:59:00
只能推了
作者: chyl13579 (阿帅)   2025-05-16 11:25:00
大神出没,推一个!
作者: devilkool (对猫毛过敏的猫控)   2025-05-16 11:33:00
作者: v86861062 (数字人:3)   2025-05-16 12:08:00
推推
作者: abc21086999 (呵呵)   2025-05-16 12:37:00
居然是PCMAN,给推
作者: slowwalker (慢行者)   2025-05-16 14:23:00
作者: shibin (喜饼)   2025-05-16 14:39:00
推,好奇问,那如果是为了 UT 而弄的 interface 呢?
作者: Dix123 (小蔡)   2025-05-16 15:38:00
PCMAN!!!!!!!!!!!!!!!!!
作者: joewang85 (天才大人)   2025-05-16 17:38:00
作者: strlen (strlen)   2025-05-16 17:55:00
其实最主要的问题在于 工程师都很自闭的自己搞东搞西像这些经历 是不是当初在拼了命分拆小模组前 召集团队所有人开个会蕉流蕉流 应该就有资深的会跟你说 确定要这样吗
作者: fgh81113 (阿景)   2025-05-16 18:01:00
资深不代表有决定权 end
作者: strlen (strlen)   2025-05-16 18:01:00
设计本来就没有圣杯 大家吵架出来的就是最佳解 至少团队里的人都方便 这样就行了 不同团队有不同作法但工程师喔 大多都觉得太麻烦了 太无聊了 没空 别烦我 你说的我都不同意 我觉得XXXOOO就是最棒的 是尼不懂 哈不过就算乱写一通其实也没差啦 听说OpenAI里也全都乱写哪有时间code review吵架 东西先上先赢R 抢快比什么都重要
作者: bartd0037308   2025-05-16 18:57:00
推推推
作者: lchcoding   2025-05-16 19:13:00
可是吵架很累馁我水瓶,我爱好和平有吵架以外的方法吗?
作者: strlen (strlen)   2025-05-16 19:56:00
有 那就是长官或资深说怎么做 你就怎么做
作者: lchcoding   2025-05-16 20:07:00
好吧!那看状况吵好了
作者: Boska ( )   2025-05-16 20:40:00
大神推
作者: gino0717 (gino0717)   2025-05-16 20:52:00
桑原老师说过 架是要两个人才能吵的
作者: seal0112   2025-05-16 21:29:00
作者: johney719 (揪泥)   2025-05-16 22:24:00
PCMan推一个
作者: rtoday (rtoday)   2025-05-16 22:48:00
推大神
作者: TaiwanUp (以运动为本的道路环境)   2025-05-16 23:09:00
Google用内部工具Blaze直接否决高耦合 才能不吵架
作者: strlen (strlen)   2025-05-17 00:11:00
那基本上就算是长官或资深说你要怎么做 你就得怎么做XD
作者: qoozxc789 (呵呵)   2025-05-17 01:14:00
深有同感
作者: Suleika (Suleika)   2025-05-17 02:25:00
推神兽
作者: leon1757tw (leon1757o)   2025-05-17 02:56:00
作者: prag222 (prag)   2025-05-17 07:12:00
oop重点写接口做啥?会写的直接上手
作者: jhjhs33504 ( )   2025-05-17 13:23:00
看需求吧 有场景是要把code喂给编译器看那就另当别论
作者: jay123peter (萧瑟风雅)   2025-05-17 16:33:00
作者: shortoneal (不告诉你咧)   2025-05-17 19:04:00
该怎么切没有个圣杯,但核心就是要为爽跟快爽 = 好维护好追问题,快 = 开发不会相依性一堆绑手脚虾拆但是会往反方向前进的,就是吵 = =
作者: nfsong (圖書館我來了)   2025-05-17 21:18:00
作者: attacksoil (击壤)   2025-05-17 22:28:00
有时候写interface是怕把依赖方向搞烂 有建议吗
作者: gilingking (精灵游侠)   2025-05-18 01:30:00
大神推推
作者: imhaha (嘿嘿)   2025-05-18 08:27:00
推推
作者: yang5d2008 (小羊)   2025-05-18 12:10:00
好猛
作者: r8106087 (水清无鱼)   2025-05-18 17:32:00
作者: lchcoding   2025-05-18 20:48:00
谢 strlen,gino0717,TaiwanUp,shortoneal4位大大提供的方向
作者: h44256 (YOYO你好)   2025-05-19 00:09:00
谢谢大大分享!讲的超清楚
作者: Samuellu (JellyFish水母鱼)   2025-05-19 10:39:00
朝圣
作者: wistful96 (wistful96)   2025-05-19 12:47:00
作者: Eide (艾德)   2025-05-19 22:46:00
作者: youcanfindit (枪士)   2025-05-20 00:55:00
作者: tim96tim (小踢)   2025-05-20 09:18:00
谢分享
作者: f0915034335 (技能)   2025-05-20 17:33:00
推,这些真的是慢慢工作才会理解到的
作者: iamOsaka (欧沙卡)   2025-05-20 19:25:00
作者: knme (knem)   2025-05-20 19:42:00
作者: cchao28   2025-05-20 22:41:00
感谢分享
作者: s860134 (s860134)   2025-05-21 08:34:00
按需求服务 还有渐进式的抽出共用
作者: tsaigi (菜鸡)   2025-05-21 11:00:00
但c#要mock的话不是一定要interface吗? 不测试的话的确是不用interface啦
作者: jennya (Jennya)   2025-05-22 01:58:00
热爱尝试当下流行的新工具新理论的工程师,常常也是团队主力,很难找到理由阻止他们尝试新事物
作者: CH1SIR (永远吃不胖)   2025-05-22 12:29:00
作者: Inglenook (城市苦守)   2025-05-27 18:01:00
好奇Google 那样要怎么管理不同套件之间的相依性? 如果都要保持所有test全过的话 几乎不太可能推新功能?
作者: markbex (马克杯)   2025-05-27 23:12:00
推 这如人月神话所说,软件之中“没有银弹”
作者: Demonic1013 (工具人)   2025-05-29 00:00:00
专业

Links booklink

Contact Us: admin [ a t ] ucptt.com