Soft_Job 板


LINE

※ 引述《alihue (wanda wanda)》之铭言: : 转自推特 : https://twitter.com/BenLesh/status/1372562839475470336?s=20 : Add comments about WHY code exists, not what it does. : The code is right there, we know what it does. : 注解应该用来解释这段 code 的背景需求/含意, : 而不是把 code 表面上的意思再讲一次 上周在重构某段程式码时,其中一位同事在 code review 中建议把某个注解删掉,另一 个同事看到这个评论时,在下面留了言说他认为不应该删掉,於是我们就拉了一个小讨论 ,聊在程式码中写注解这件事。 因为这个经验,我回去重翻史丹佛电脑科学教授 John Ousterhout 写的《A Philosophy of Software Design》一书,并整理了笔记。该教授的观点是认为程式码写注解有很多好 处,但不是任何地方都该写注解。 在版上找到这篇之前有版大发的文,基本上跟 John Ousterhout 教授的观点一样, 就是注解要解释背後的「为什麽」,而不是把程式码做的事重复说一次。 ------ (以下是我读完该章节後整理的笔记) ------ ## 网志好读版: http://bit.ly/3WdTo1b 每当提到在程式中写注解 (comments),你大概会在网路上看到两派人马,有人觉得应该 要写注解;又有另一群人觉得程式码应该要写得够清楚,如果有注解就代表写不够清楚, 应该要重构而不是加注解。当然除了这极端的两派人马外,多数人都是在中间,部分的程 式码写注解,但不会全部都写。 关於写注解这件事,在 《A Philosophy of Software Design》 书当中也有谈及。John Ousterhout 教授的观点是,如果注解写得好,将有效改善整体的系统设计。假如你是反 注解派的人,或许可以一起来读读他为什麽这麽认为。 ## 程式本身写得够清楚,就不用注解吗? 「程式本写得够清楚,就不用注解」是很多人认为不该写注解的第一大理由。然而程式本 身或许可以清楚表达该程式码做的事,但不能解释「为什麽」要这样写,也不能解释在什 麽情境可能比较适合某个方法。对於这些相对後设 (meta) 的内容,注解就是很好的帮手 。 更进一步说,好的软体设计,应该要把复杂度藏起来,要藏起复杂度,我们需要抽象化, 让其他使用该段程式码的开发者,可以不用去管背後的细节。因此,如果一个开发者,还 要去读程式的细节才能懂如何用该函式或方法,那就失去抽象化的意义。写注解可以让其 他开发者,不用去读程式里头的细节也知道如何用该函式或方法,这才能达到抽象化的意 义。因此不论程式本身写的清楚与否,好的抽象化搭配好的注解,都是对整个程式库的维 护有帮助的。 ## 别说你没时间写注解 在开发时,很多开发者会认为写注解的优先顺序比较低,因此会想把时间花在写新功能, 而不是为已经开发好的功能写注解。然而在软体开发中,永远有写不完的功能,如过说因 为要开发新功能而没时间写注解,就永远不会有注解。从长远的角度来看,这样的代价是 程式库的可维护性会降低。如果从效益与成本的角度来看,写注解的时间,会远比其他开 发者花在弄懂没注解的程式所花的时间要少很多。 ## 不要找其他不写注解的理由 很多开发者也会找其他理由不写注解。例如认为注解如果没随着程式更新,反而会误导人 ;或者是因为过去读过别人写的注解觉得没用,就认为注解没有用。这些都是外部因素, 无法证成注解本身没有效益。此外这些都是可以透过好的流程而解决的,所以作者认为不 要找这些理由不写注解,而是要去打造更好的流程来改善这些问题。 ## 写注解的好处 上面谈了这麽多,大概可以看出 John Ousterhout 教授有强烈的观点认为要写注解。不 过回过头来说,写注解有什麽好处呢? 他认为最大的好处在於注解可以捕捉到程式码没办 法传达的资讯,这能够让未来要维护这段程式码的开发者,能够更快速地上手。特别对於 团队中加入的新成员,程式码中的注解可以大幅降低读程式的认知负担 (cognitive load),以及减少未知。 如果没有记录下这些脉络与原因,未来的开发者就不会知道为什麽当初是这样写,这变得 只能猜测原作者的意图。这不仅更耗时,也可能会因为理解错原本的意图,导致在维护该 段程式码时出错。很多时候,未来要维护程式码的是自己,许多人在写完某段程式码几个 月後,可能忘了自己当初为什麽这样写,所以写注解不仅是帮助其他开发者,也很可能是 在帮助未来的自己。 ## 注解该写什麽? 虽说 John Ousterhout 教授的观点是认为写注解对软体设计有帮助,但他也同意不是什 麽都该写成注解。他认为只有在程式码中不显而易见的才该写注解 (comments should describe things that aren’t obvious from the code)。 在软体设计中最重要的抽象化,即是提供一个更简易的思考方式,让开发者可以不用深入 过於细节的部分。即使开发者可以透过细读程式码来了解其如何运作,但这样做太花时间 。John Ousterhout 教授的观点认为开发者应该要不读程式码内容,即可理解模组提供的 抽象化,而注解是能够协助做到这样的方法。 ## 不要重复程式码本身 前面提到,注解应该要讲「为什麽」这样写,而不是讲程式码在做什麽。毕竟程式码本身 就代表程式码在做的事,如果注解在写一次,会是多此一举。下面是书中提到的负面教材 ,基本上注解就是把程式码做的事情。 ptr_copy = get_copy(obj) # Get pointer copy if is_unlocked(ptr_copy): # Is obj free? return obj # return current obj if is_copy(ptr_copy): # Already a copy? return obj # return obj thread_id = get_thread_id(ptr_copy) if thread_id == ctx.thread_id: # Locked by current ctx return ptr_copy # Return copy 要怎麽判断你写的这段注解是不是跟程式码本身一样? 书中提到,在你写完注解後可以问 问自己「如果某个之前没读过这段程式码的人,能不能看着这段注解写出程式码?」如果 可以的话,就代表注解只是在描述程式码,而不是在解释为什麽这样写该段程式码。因此 ,在写完注解後,可以再比对一下程式码与注解,如果重复就真的不推荐写。 ## 从读者的角度出发 最後 John Ousterhout 教授提到,写注解要从程式码读者的角度出发,要思考有哪些关 键资讯是读者不知道的。特别是在程式码审查 (code review) 时,如果你写的某段程式 码让别人说很难懂,或者某个资讯让别人说并不显而易见,这时候不要去跟对方争,而是 去想为什麽对方会有困惑,以及你可以如何靠注解让程式码更好被理解。 (文末备注:这个章节本身有很多范例,但为了避免笔记变太长,就仅有放其中一个。有 兴趣透过案例更具体了解作者的观点的话,推荐直接买这本书来读)。 -- 南漂一不小心漂到了新加坡 https://www.explainthis.io/zh-hant/singapore --
QR Code



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 116.86.64.199 (新加坡)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1673785027.A.36D.html
1F:推 FukadaKyoko: 推~感谢分享 01/15 20:44
2F:推 S2067030: 推 谢谢大大分享 01/15 21:19
3F:推 ohmylove347: 好文推推 01/15 21:25
4F:推 prag222: 没时间看完整篇文章,这就跟一万小时变大师的观点呵呵 01/15 21:57
5F:推 iamOsaka: 推 01/15 22:43
6F:推 derekjj: 推 我注解都看心情 然後画恐龙注解图 嘻嘻 01/15 23:12
7F:推 holebro: 讲的好 01/15 23:59
8F:推 viper9709: 推分享~注解本来就该写这段在做啥,为啥这样做 01/16 00:03
9F:推 drajan: 推~上次看这本书好久以前了 看完心得整理好像又读一遍了 01/16 01:18
10F:推 wei115: 我想要知道函式的功能 和为什麽要用无符号整数来存指标QQ 01/16 02:04
11F:推 zrna0515: 推,meta data那段讲的不错 01/16 08:04
12F:推 aaa1234136: 分享推 01/16 08:45
13F:推 lou01: 感谢分享~ 01/16 09:06
14F:推 aidansky0989: 那需求一直变,後续也要持续维护这段注解吗? 01/16 09:11
15F:推 vi000246: 我记忆力很差 我的注解都是为了让以後维护的我看得懂这 01/16 09:50
16F:→ vi000246: 段code在写啥 01/16 09:50
17F:→ leolarrel: 楼上的状况我也有,只是我都用git取代注解就是了 01/16 10:30
18F:推 hobnob: 回 aid:我自己会注解加说是什麽时候的需求、修改的新逻 01/16 10:30
19F:→ hobnob: 辑是什麽,程式注解我都会维护 01/16 10:30
20F:→ t64141: 注解是需要维护的,但注解只是辅助工具,理论上不会多到 01/16 10:57
21F:→ t64141: 造成负担,如果会,可能是程式太乱需要大量注解,或是有 01/16 10:57
22F:→ t64141: 太多没必要的注解 01/16 10:57
23F:推 chatnoir: 我注解只会写特殊的商业逻辑来辅助程式码的不足~ 01/16 11:21
24F:→ knives: 推楼上 01/16 11:53
25F:推 fiiox3: 当文件的一环吧 01/16 11:55
26F:→ fiiox3: 文件要维护,注解当然也要 01/16 11:55
27F:推 yuinami: 优文推一个,谢谢分享 01/16 12:19
28F:推 wulouise: 注解当然要维护啊,但至少没维护历史看得出来 01/16 12:28
29F:推 aidansky0989: 感谢回覆,之前看clean code提到很多写注解的坏处 01/16 13:44
30F:→ aidansky0989: ,像是接手的人不一定会维护注解、注解缺少维护可 01/16 13:44
31F:→ aidansky0989: 能会过时、误导等坏处,後来只有TODO我才会写注解 01/16 13:44
32F:→ aidansky0989: ,宁可後人多跟PM确认新的现状 01/16 13:44
33F:→ aidansky0989: 不然注解写出来,也不太有人敢修改、删除 01/16 13:45
34F:→ aidansky0989: 可能也是个问题 01/16 13:45
35F:→ foreverk: 没写注解基本上也不应该随意修改删除啊,要做的事情是 01/16 15:15
36F:→ foreverk: 补测试或是找人厘清需求,再去做变动,注解就是辅助工 01/16 15:15
37F:→ foreverk: 程师更好做到这些事 01/16 15:15
38F:→ foreverk: 很多人不写注解或是不喜欢文件以及测试的理由都是要多 01/16 15:21
39F:→ foreverk: 维护的工,但往往省略掉这些以後,是花更多的时间开会 01/16 15:21
40F:→ foreverk: ,或是慢慢变技术债 01/16 15:21
41F:推 fiiox3: “不一定会维护“这为啥要算注解的缺点.... 01/16 18:24
42F:→ fiiox3: 整个软体开发一堆东西都有人不维护= = 01/16 18:25
43F:→ foreverk: 另外需求一直变并不是不写注解的理由,不写就是用人脑 01/16 19:09
44F:→ foreverk: 记忆,没纪录还可能记错,基本上就是赌这个未爆弹不会 01/16 19:09
45F:→ foreverk: 炸到你而已 01/16 19:09
46F:推 aidansky0989: 修改删除是指注解,因为不及时更新注解就会随需求 01/16 19:33
47F:→ aidansky0989: 变动过时,可能造成误导而非指引 01/16 19:33
48F:→ gobears5566: 这本书作者的论点跟 foreverk 大说的蛮相近的 01/16 19:46
49F:→ gobears5566: 这位史丹佛教授在书中最开始就提到,他不认同蛮多 01/16 19:46
50F:→ gobears5566: Clean Code 里面提到的观点,但他也不觉得自己的就 01/16 19:47
51F:→ gobears5566: 适合在所有脉络。所以他的书名是 a philosophy 01/16 19:47
52F:→ gobears5566: 而不是 the philosophy 01/16 19:47
53F:→ foreverk: 如果指得是不敢修改或删除注解,那就代表改code的人并 01/16 20:38
54F:→ foreverk: 没有完全掌握这项功能,改善方式应该是增加掌握度,而 01/16 20:38
55F:→ foreverk: 不是舍弃注解本身 01/16 20:38
56F:推 jay123peter: 推 01/16 21:54
57F:推 lovdkkkk: 假如有好好写 commit 讯息,再写个简单 script 可以过滤 01/16 21:55
58F:→ lovdkkkk: 时间/档案/行数/关键字/作者 找出相关 commit 也不错 01/16 21:56
59F:→ moom50302: 好的程式不需要注解,你说得都是文件应该要做到的 01/17 00:18
60F:推 gggaaammm: 推 01/17 00:48
61F:→ foreverk: 不写注解很常伴随着不写文件,最常见的第二个理由就是 01/17 02:09
62F:→ foreverk: 认为好程式不需要注解/文件,可是一些特殊商业逻辑所产 01/17 02:09
63F:→ foreverk: 生的程式,他不好但他是因应当时时空背景而生,这类情 01/17 02:09
64F:→ foreverk: 况还不写,那就是上面我说的未爆弹 01/17 02:09
65F:→ foreverk: 楼上说的commit也是应该要好好写的一点,甚至应该pr也 01/17 02:17
66F:→ foreverk: 好好写,不想维护一整份文件的话,更应该从这些细节去 01/17 02:17
67F:→ foreverk: 提升程式可维护性 01/17 02:17
68F:→ leolarrel: 写注解这种事就是谁当老板就听谁的... 01/17 10:12
69F:→ leolarrel: 现实世界就是阶级,书再怎麽卖学校再有名都没用 01/17 10:14
70F:推 vi000246: 如果有些重构会搬移程式码到不同的专案或档案 01/17 14:12
71F:→ vi000246: 这时git的纪录也很难追踨 01/17 14:12
72F:推 lovdkkkk: 一个方式是搬家时旧的留着标 deprecated, see also... 01/17 20:43
73F:→ lovdkkkk: 留个线索给人查 01/17 20:44
74F:→ superpandal: 不认同 为什麽不是精简化实现而是把有复杂度的东西藏 01/17 22:18
75F:→ superpandal: 起来 这团code怎麽乱七八糟都没差反正有注解? 现在 01/17 22:19
76F:→ superpandal: 一堆东西坑很多就是这样来的 包含框架 01/17 22:21
77F:→ superpandal: 甚至语言底层本身如果你不去仔细研究也会被坑到 01/17 22:21
78F:→ superpandal: 写程式有两种方式 一种是把程式写的很简单 明显不容 01/17 22:22
79F:→ superpandal: 易有缺陷 一种是写的很复杂 让别人看不出有明显的缺 01/17 22:22
80F:→ superpandal: 陷 01/17 22:23
81F:→ superpandal: 依照这样搞你边写没写可以模糊焦点的注解 还可以边藏 01/17 22:24
82F:→ superpandal: bug和洞 01/17 22:25
83F:→ superpandal: s/没写// 01/17 22:26
84F:→ kyoe: 有没有可能一段程式复杂到需要注解的时候就是应该再拆分它然 01/18 00:48
85F:→ kyoe: 後把功能单一化的时候? 01/18 00:48
86F:→ foreverk: 我的经验是,通常不是程式复杂到需要注解,而是因应特 01/18 06:42
87F:→ foreverk: 殊需求而出现的程式需要,他可能写死很多地方,程式风 01/18 06:42
88F:→ foreverk: 格明显不符,或根本是粪code,但暂时需要 01/18 06:42
89F:推 strlen: 我们非英语系国家 不然解法就是在method名称上取一个好一 01/19 08:28
90F:→ strlen: 点的名称让大家所见即所得 然後一个method尽量只做一件事 01/19 08:28
91F:→ strlen: 但一堆人英文不好ABC狗嘎D method名称乱取一通 01/19 08:29
92F:推 htury: 好文,推注解是要说明为什麽,而不是干什麽 01/19 14:05
93F:→ loadingN: 有一种状况就是我不知道为什麽,所以我写了它干什麽... 01/19 15:09
94F:推 silence0925: // [MOLYXXXXXX] 01/19 17:28
95F:→ superpandal: 复杂和不复杂还是不复杂好多了 复杂本身也会掩盖程式 01/19 20:02
96F:→ superpandal: 真实的目的 学着用本身是种痛苦不说 学到的东西也是 01/19 20:04
97F:→ superpandal: 皮毛 也没什麽高深的哲学用来提升自己 就是硬塑造的 01/19 20:06
98F:→ superpandal: 技术壁垒 01/19 20:08
99F:→ superpandal: 不复杂就容易追踪程式码 再差也差不过一堆你不爬文就 01/19 20:11
100F:→ superpandal: 不知道怎麽回事的东西 01/19 20:11
101F:推 wulouise: 写code一样注解新手满容易犯,Review别人code有助进步 01/19 23:23
102F:推 timofEE: 推 01/22 18:55
103F:推 RickyWdrUm: 感谢分享~ 01/23 07:35
104F:推 friends29: 推 01/24 09:14
105F:→ layer0930: 注解不写…,那其实等於没写过什麽重要的东西。所以才 01/24 14:43
106F:→ layer0930: 养成不写注解 01/24 14:43
107F:推 xluds24805: 当你觉得这段 code 未来会有人来问你为什麽这样写时, 01/27 12:10
108F:→ xluds24805: 就代表该留点注解了 01/27 12:10
109F:推 ph90119: 推 01/27 16:53
110F:推 viper9709: 推楼楼上 01/27 17:47
111F:→ superpandal: 重要的东西照样不写 要写其实文档好过注解 01/28 05:18
112F:→ superpandal: 就现况来看清晰好了解的注解根本没有 因为人人 01/28 05:19
113F:→ superpandal: 都不爱写 都是叫别人写颐指气使 01/28 05:20
114F:→ superpandal: 自己要写堆三阻四 给人制造障碍 01/28 05:20
115F:→ superpandal: 要看那堆垃圾注解 不如程式本身简单质量好 01/28 05:25
116F:→ superpandal: 看到最後还是自己分析程式比较快 01/28 05:40
117F:→ t64141: 注解优於文件的点在於修改出出程式时可以一并集中修改, 01/28 22:35
118F:→ t64141: 不需要大老远去找文件出来改。另一方面,在不愿写注解的 01/28 22:36
119F:→ t64141: 情境下,更不可能愿意去翻找并维护离程式码更遥远的文件 01/28 22:36
120F:→ t64141: 。 01/28 22:36
121F:→ t64141: 除非在包含系统整体设计与脉络时,另外管理的文件才会展 01/28 22:38
122F:→ t64141: 现出优势 01/28 22:38
123F:→ superpandal: 注解是分散的 你改一个以为相关的不用改? 01/29 23:17
124F:→ superpandal: 文档具有统一性更好些 大专案重要的是整体架构 01/29 23:18
125F:→ superpandal: 注解表达的是片面的 只是讲述区块的程式 01/29 23:18
126F:→ superpandal: 你也不可能逐字讲解 本身表达力就不足 01/29 23:19
127F:→ superpandal: 至於找文件...一个quick open 01/29 23:21
128F:→ superpandal: 快捷键就打开了好吗 还可以内文检索 01/29 23:22
129F:→ superpandal: 如果会vi/vim那就更强了 01/29 23:24
130F:→ foreverk: 我想两个都有是比较理想的情况,虽然实际情况很常两个 01/30 15:00
131F:→ foreverk: 都没有 01/30 15:00
132F:→ rxforever: 没什麽好说的 从来没有删掉注解的 02/16 23:22
133F:→ rxforever: 除非注解写错了 02/16 23:22







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灯, 水草

请输入看板名称,例如:BuyTogether站内搜寻

TOP