Soft_Job 板


LINE

这篇满有意思的,牵涉的主题很广,不过有些事情只有一句很难讲清楚 针对中间几点,分享一些我自己的理解 ※ 引述《alihue (wanda wanda)》之铭言: : 看到不错的文章 翻译分享一下 : 原文: : https://chriskiehl.com/article/thoughts-after-6-years : 翻译: : 软体开发六年後我改变想法的事情: : - 如果你的队友经验参差不齐,Typed languages 是比较好的选择 Typed languages 相对容易做程式码 static analysis,在还没跑起来前 就容易找到错误,一些常见的错误甚至有工具可以自动修正,对正确性有帮助 另外在文件不足的状况下,有时候知道参数和 return value 的类别,会比较容易 看出 method 的正确使用方法。 : - Standups 会议以注意新人来说是有用的 : - Sprint retrospectives 如果拿来做真正的流程修正(course correction)是有用的; : 而不是一些敏捷/scum master 拿来浪费大家时间的 应该说 retrospective 本来的目的,就是用来检讨要如何做得更好。 不只是流程,有时後会发生交付的东西,和一开始要求的有落差,就需要厘清 团队的合作是哪个环节发生了问题,或是一开始的 user story 可能根本就弄错了 如果不能针对改进有建设性的讨论,只是流於形式,为开会而开会,确实浪费时间。 : - 软体架构比啥都重要。有好的抽象再烂的实作都不太会弄脏 code base;烂抽象或 : missing layer 可以让 code base 变成一坨屎。 所以在 refactor 或是帮 non-testable legacy code 导入新的测试的时候, 一个有用的策略,就是先添加 abstraction layer 再开始 (Refactor by Abstraction) 新增 abstraction 之後本来高度耦合的 code 就比较容易解开,变得好测试 : - java 没那麽烂 : - Clever code 通常不是什麽好 code;清晰好读(Clarity)的 code 最重要 一般 code 只会被写一次,但是後续会被接手的不同人读很多次,所以好读是必要的 除非 profiling 确认是效能瓶颈,才会用特别的写法去加速,否则可读性比较重要 如果一个 function 不是会执行很多次的热点,选效率差一点但好读很多的写法 对整体效能并不会有影响,不需要过早最佳化。 : - 烂 code 可以被以任何方式写出来 (in any paradigm) : - 所谓的 best practices 是要看上下文,并非通用解。盲目追求会让你看起来像白痴 : - 在你不需要时硬去设计一个 scalable system,你就是烂工程师 这句话乍看比较武断一些,举个具体的例子,假设产品还在早期 proof of concept 阶段,商业模式都不确定,也还没跟潜在客户验证好可行性,这时候赶快做出来 赶快验证点子,如果不行赶快换方向才是最重要的。在这种阶段有很高的机率 几个月後这个专案(甚至公司)就不见了,好的工程师能够针对不同情况 手上有多少资源,做出最适合当下状况的设计。 例如 monolith first: https://martinfowler.com/bliki/MonolithFirst.html 太早为了 scalability 拆分大量不成熟的微服务,反而会有害之後的发展。 : - Static analysis 有用 : - DRY(dont repeat yourself) 是为了避免特定问题,并不是最终追求目标。 一般不喜欢 code duplication,重复的东西会尽量抽出来成 module / class /function 但有种情况例外,就是 unit test,test 的重点要一眼看得出在测什麽, 如果抽出太多细节,反而要一直跳来跳去 trace 还看不出在测什麽,这时候还不如 把重要的细节在每个 test case 都重复一次,让他一目了然 (DAMP principle) 补充: https://enterprisecraftsmanship.com/posts/dry-damp-unit-tests/ : - 一般来说 RDBMS > NoSql : - Functional programming 是另一个工具,不是万用解/灵丹 : 一路走来坚持的观念 : - YAGNI, SOLID, DRY 请按造这个顺序 : - YAGNI:You aren't gonna need it : - SOLID: 某个 OO 原则(单一功能、开闭原则、里氏替换、介面隔离、依赖反转) : - DRY: dont repeat yourself : - 纸笔是最好的开发工具但很少人用 在一开始最前面的设计阶段,用纸笔画系统架构,或是假想的 UI,确实很方便! : - 用乾净/可读(purity)为代价换取实用性是个好方法 : - 狂导入额外的技术不是好方向 : - 直接跟客户/需求端理解需求会比较快又精确 : - "scalable"这个词在码农中有股神秘的力量,仅仅这个字可以让他们陷入疯狂,然後仅 : 仅为了这个字可以做出疯狂的设计 : 有点难翻XD 原文: : The word "scalable" has a mystical and stupefying power : over the mind of the software engineer. : Its mere utterance can whip them into a depraved frenzy. : Grim actions have been justified using this word. : - 虽然叫工程师,但其实很多决策都是跟风(cargo-cult),并不是有严谨的分析、资料数 : 据佐证 : - 大概九成的 PM 明天消失对你都没影响,甚至效率还会变好 : - 当我做了一百场面试後: 面试方法彻底崩坏,我也不知道怎麽做更好 : 没变的观念 : - 会刁 code style, linting rules 或枝微末节的都怪咖 : - Code coverage 跟 code 品质完全没差 这样讲是比较夸大,test coverage 高品质未必好,但是过低品质确实需要担心 重点不是 coverage 有多少 %,而是你测试了什麽 scenarios,是不是有包含到 最重要的功能,是不是连 error handling 都有测试到,这会比较重要。 要伪造很高的 coverage 数字很简单,把一大堆 code 包在一包让他全跑,然後 assertion 的时候检查一个超宽松的条件,这样看起来就会 coverage 100% 了 所以重点确实不是 coverage 多高,而是你测了什麽 : - Monoliths (大概指微服务的反面)系统在大部分情境都是很好的 推荐参考 monolith first: https://martinfowler.com/bliki/MonolithFirst.html 如果有好的 abstraction,都是照 SOLID principle 开发的话,就算是 monolithic 日後需要拆分服务是不至於太难拆,问题就是不良的架构跟写 code 习惯, 把东西全部黏在一包,光一个 class 的功能就拆不开了,更不要说拆服务了 : - TDD 主义者(purists)是最糟糕的存在,他们的脑不能理解现实中存在不同的 workflows TDD 虽然被很多人批评,但我自己使用的感觉他也有很方便的时候 举例来说如果你原本就有 test case,你想要稍微调整现有 class 的行为 那先针对预期行为的改变去调整 test case。或是新增对应的 test case 这是很直觉的 例如你要实做一个新的 RESTful API,input / output 都订好很清楚,这时候先写 test case 完全没问题,而且很直觉也方便。 反之如果你对於 class 该怎麽拆分,或是一些细部的设计还没想好的时候 强迫要先写 test 这个就真比较违反一般人的直觉,执行上很困难 我们不一定要信 TDD,但可以撷取他们的优点,有两点我觉得很重要: 1. 透过先写 Test 你可以「试用」你设计的 API,早期发现 API 设计缺陷 这比都实做完了才发现 API 超难用才要修正要好很多,这个想法很有价值 2. 一定要先跑 test 确认在还没实做的时候,test case 真的会 fail 我自己被这个救过几次。举例来说有些 test framework 会找 function 名字有 test 开头的来跑,有一次我打错名字成 tset,导致这个 test 根本没测到 就很开心的 pass 了,殊不知那段 code 是有问题的,却根本没测到 或是设计的 test case 是有问题的,出错根本不会 fail... TDD 可以非常有效的预防这种状况,而且这种状况是真的会发生。 以上延伸原文,分享一些个人浅见,希望有帮助,欢迎各位先进不吝指正补充 --
QR Code



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.231.158.38 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1630510002.A.6C3.html
1F:推 jasonwung: 推 09/01 23:39
2F:推 CKNTUErnie: 推 09/02 00:30
3F:推 alihue: 推 09/02 00:59
4F:推 Inglenook: 推 09/02 03:24
5F:推 joney641119: 推 09/02 05:15
6F:→ freeunixer: 有神快拜~~ 09/02 05:17
7F:推 art1: 写测试好难,像是演算法的测试到底该怎麽写呢?要怎麽样写测 09/02 05:31
8F:→ art1: 试才能驱动出特定演算法呢? 09/02 05:31
9F:推 taipoo: 谢谢分享 09/02 05:49
10F:推 potatososo: 推 09/02 08:35
11F:推 chchwy: 演算法才是最好测的吧 固定输入就固定输出 09/02 08:44
12F:推 brianhsu: 演算法就像写 online judge 的侧资一样啊,先某个你已经 09/02 09:47
13F:→ brianhsu: 知道的直觉的输入输出,然後再慢慢加上各种边界侧资。un 09/02 09:47
14F:→ brianhsu: it test 不是要你针对每一个 private method 或 functio 09/02 09:47
15F:→ brianhsu: n 都一定要单独测,你也可以把一个完整的演算发当成一个 09/02 09:47
16F:→ brianhsu: 「单元」。 09/02 09:47
17F:推 lemontea0328: 推~ 09/02 10:22
18F:推 vi000246: 推 09/02 10:32
19F:推 freedls: 有神先拜 09/02 10:50
20F:推 frank983612: 推 09/02 10:51
21F:推 ACRRBYEK: 推 务实 09/02 11:16
22F:推 wulouise: 不懂tdd的问题在哪边?为什麽这麽多人反观 09/02 12:47
23F:→ wulouise: *反感 09/02 12:47
24F:推 fantasychese: 推 09/02 12:57
25F:推 EPGo: 推 09/02 13:36
26F:推 bewitchsky: 推 09/02 14:12
27F:推 tbpfs: PCman的作者发文底下一堆有神快拜,子午播放器的作者发文 09/02 14:15
28F:→ tbpfs: 被後辈下指导棋,进对公司真的很重要 09/02 14:15
29F:推 OSDBNetwork: 推 PCman 09/02 14:35
30F:推 jobintan: 给推先,进到错的公司就要赶快找机会跳,跳到对的公司。 09/02 15:19
31F:推 art1: 靠那些测资应该无法驱动出特定演算法吧? 09/02 20:00
32F:推 wulouise: 不了解楼上想表达的意义..演算法不就是输入输出很明确? 09/02 20:46
33F:推 art1: 不同的演算法有不同的时间复杂度,但测资都一样啊 = =|||| 09/02 21:37
34F:→ art1: 要是没有测时间复杂度的测资,不可能驱动出时间复杂度少的演 09/02 21:38
35F:→ art1: 算法吧... 09/02 21:38
36F:→ art1: 虽然我对怎麽测时间复杂度也是没啥头绪... 09/02 21:41
37F:推 alihue: 时间复杂度怎麽会在 unit test 测XD 09/02 21:58
38F:推 brianhsu: 是不是误会了驱动的意思,他并不是指说他会神奇的帮你长 09/02 23:00
39F:→ brianhsu: 出演算法或你的程式码…… 09/02 23:00
40F:→ brianhsu: 而且时间复杂度也不是用「测」的,而是用分析的。 09/02 23:01
41F:推 Raymond0710: 大推TDD那段 09/02 23:16
42F:推 neo5277: 有神兽耶 09/02 23:18
43F:推 bill1992: 推pcman 超罩的 09/03 00:36
44F:推 s0914714: 测试驱动是指先写测试程式再实作功能 09/03 00:40
45F:推 wulouise: Tdd的driven是修饰t.. 09/03 08:03
46F:推 sammythekid: 观念正确真的比什麽都重要。推 09/03 14:13
47F:推 better1995: 太猛啦 09/03 15:21
48F:推 sniper2824: 时间复杂度不是用算的吗 09/03 18:36
49F:推 Kaiji: 推Pcman大神 09/04 08:00
50F:推 nayeonmywife: push 09/04 21:09
51F:推 dreamnook: 09/05 09:33
52F:推 akira01: respectable person 09/06 20:32







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Boy-Girl站内搜寻

TOP