Re: [心得] 好的註解是解釋為何需要這段 code

看板Soft_Job (軟體人)作者 (golden bear 5566)時間3年前 (2023/01/15 20:17), 編輯推噓38(38095)
留言133則, 42人參與, 最新討論串2/2 (看更多)
※ 引述《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 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 116.86.64.199 (新加坡) ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1673785027.A.36D.html

01/15 20:44, 3年前 , 1F
推~感謝分享
01/15 20:44, 1F

01/15 21:19, 3年前 , 2F
推 謝謝大大分享
01/15 21:19, 2F

01/15 21:25, 3年前 , 3F
好文推推
01/15 21:25, 3F

01/15 21:57, 3年前 , 4F
沒時間看完整篇文章,這就跟一萬小時變大師的觀點呵呵
01/15 21:57, 4F

01/15 22:43, 3年前 , 5F
01/15 22:43, 5F

01/15 23:12, 3年前 , 6F
推 我註解都看心情 然後畫恐龍註解圖 嘻嘻
01/15 23:12, 6F

01/15 23:59, 3年前 , 7F
講的好
01/15 23:59, 7F

01/16 00:03, 3年前 , 8F
推分享~註解本來就該寫這段在做啥,為啥這樣做
01/16 00:03, 8F

01/16 01:18, 3年前 , 9F
推~上次看這本書好久以前了 看完心得整理好像又讀一遍了
01/16 01:18, 9F

01/16 02:04, 3年前 , 10F
我想要知道函式的功能 和為什麼要用無符號整數來存指標QQ
01/16 02:04, 10F

01/16 08:04, 3年前 , 11F
推,meta data那段講的不錯
01/16 08:04, 11F

01/16 08:45, 3年前 , 12F
分享推
01/16 08:45, 12F

01/16 09:06, 3年前 , 13F
感謝分享~
01/16 09:06, 13F

01/16 09:11, 3年前 , 14F
那需求一直變,後續也要持續維護這段註解嗎?
01/16 09:11, 14F

01/16 09:50, 3年前 , 15F
我記憶力很差 我的註解都是為了讓以後維護的我看得懂這
01/16 09:50, 15F

01/16 09:50, 3年前 , 16F
段code在寫啥
01/16 09:50, 16F

01/16 10:30, 3年前 , 17F
樓上的狀況我也有,只是我都用git取代註解就是了
01/16 10:30, 17F

01/16 10:30, 3年前 , 18F
回 aid:我自己會註解加說是什麼時候的需求、修改的新邏
01/16 10:30, 18F

01/16 10:30, 3年前 , 19F
輯是什麼,程式註解我都會維護
01/16 10:30, 19F

01/16 10:57, 3年前 , 20F
註解是需要維護的,但註解只是輔助工具,理論上不會多到
01/16 10:57, 20F

01/16 10:57, 3年前 , 21F
造成負擔,如果會,可能是程式太亂需要大量註解,或是有
01/16 10:57, 21F

01/16 10:57, 3年前 , 22F
太多沒必要的註解
01/16 10:57, 22F

01/16 11:21, 3年前 , 23F
我註解只會寫特殊的商業邏輯來輔助程式碼的不足~
01/16 11:21, 23F

01/16 11:53, 3年前 , 24F
推樓上
01/16 11:53, 24F

01/16 11:55, 3年前 , 25F
當文件的一環吧
01/16 11:55, 25F

01/16 11:55, 3年前 , 26F
文件要維護,註解當然也要
01/16 11:55, 26F

01/16 12:19, 3年前 , 27F
優文推一個,謝謝分享
01/16 12:19, 27F

01/16 12:28, 3年前 , 28F
註解當然要維護啊,但至少沒維護歷史看得出來
01/16 12:28, 28F

01/16 13:44, 3年前 , 29F
感謝回覆,之前看clean code提到很多寫註解的壞處
01/16 13:44, 29F

01/16 13:44, 3年前 , 30F
,像是接手的人不一定會維護註解、註解缺少維護可
01/16 13:44, 30F

01/16 13:44, 3年前 , 31F
能會過時、誤導等壞處,後來只有TODO我才會寫註解
01/16 13:44, 31F

01/16 13:44, 3年前 , 32F
,寧可後人多跟PM確認新的現狀
01/16 13:44, 32F

01/16 13:45, 3年前 , 33F
不然註解寫出來,也不太有人敢修改、刪除
01/16 13:45, 33F

01/16 13:45, 3年前 , 34F
可能也是個問題
01/16 13:45, 34F

01/16 15:15, 3年前 , 35F
沒寫註解基本上也不應該隨意修改刪除啊,要做的事情是
01/16 15:15, 35F

01/16 15:15, 3年前 , 36F
補測試或是找人釐清需求,再去做變動,註解就是輔助工
01/16 15:15, 36F

01/16 15:15, 3年前 , 37F
程師更好做到這些事
01/16 15:15, 37F

01/16 15:21, 3年前 , 38F
很多人不寫註解或是不喜歡文件以及測試的理由都是要多
01/16 15:21, 38F

01/16 15:21, 3年前 , 39F
維護的工,但往往省略掉這些以後,是花更多的時間開會
01/16 15:21, 39F
還有 54 則推文
01/19 17:28, 3年前 , 94F
// [MOLYXXXXXX]
01/19 17:28, 94F

01/19 20:02, 3年前 , 95F
複雜和不複雜還是不複雜好多了 複雜本身也會掩蓋程式
01/19 20:02, 95F

01/19 20:04, 3年前 , 96F
真實的目的 學著用本身是種痛苦不說 學到的東西也是
01/19 20:04, 96F

01/19 20:06, 3年前 , 97F
皮毛 也沒什麼高深的哲學用來提升自己 就是硬塑造的
01/19 20:06, 97F

01/19 20:08, 3年前 , 98F
技術壁壘
01/19 20:08, 98F

01/19 20:11, 3年前 , 99F
不複雜就容易追蹤程式碼 再差也差不過一堆你不爬文就
01/19 20:11, 99F

01/19 20:11, 3年前 , 100F
不知道怎麼回事的東西
01/19 20:11, 100F

01/19 23:23, 3年前 , 101F
寫code一樣註解新手滿容易犯,Review別人code有助進步
01/19 23:23, 101F

01/22 18:55, , 102F
01/22 18:55, 102F

01/23 07:35, , 103F
感謝分享~
01/23 07:35, 103F

01/24 09:14, , 104F
01/24 09:14, 104F

01/24 14:43, , 105F
註解不寫…,那其實等於沒寫過什麼重要的東西。所以才
01/24 14:43, 105F

01/24 14:43, , 106F
養成不寫註解
01/24 14:43, 106F

01/27 12:10, , 107F
當你覺得這段 code 未來會有人來問你為什麼這樣寫時,
01/27 12:10, 107F

01/27 12:10, , 108F
就代表該留點註解了
01/27 12:10, 108F

01/27 16:53, , 109F
01/27 16:53, 109F

01/27 17:47, , 110F
推樓樓上
01/27 17:47, 110F

01/28 05:18, , 111F
重要的東西照樣不寫 要寫其實文檔好過註解
01/28 05:18, 111F

01/28 05:19, , 112F
就現況來看清晰好了解的註解根本沒有 因為人人
01/28 05:19, 112F

01/28 05:20, , 113F
都不愛寫 都是叫別人寫頤指氣使
01/28 05:20, 113F

01/28 05:20, , 114F
自己要寫堆三阻四 給人製造障礙
01/28 05:20, 114F

01/28 05:25, , 115F
要看那堆垃圾註解 不如程式本身簡單質量好
01/28 05:25, 115F

01/28 05:40, , 116F
看到最後還是自己分析程式比較快
01/28 05:40, 116F

01/28 22:35, , 117F
註解優於文件的點在於修改出出程式時可以一併集中修改,
01/28 22:35, 117F

01/28 22:36, , 118F
不需要大老遠去找文件出來改。另一方面,在不願寫註解的
01/28 22:36, 118F

01/28 22:36, , 119F
情境下,更不可能願意去翻找並維護離程式碼更遙遠的文件
01/28 22:36, 119F

01/28 22:36, , 120F
01/28 22:36, 120F

01/28 22:38, , 121F
除非在包含系統整體設計與脈絡時,另外管理的文件才會展
01/28 22:38, 121F

01/28 22:38, , 122F
現出優勢
01/28 22:38, 122F

01/29 23:17, , 123F
註解是分散的 你改一個以為相關的不用改?
01/29 23:17, 123F

01/29 23:18, , 124F
文檔具有統一性更好些 大專案重要的是整體架構
01/29 23:18, 124F

01/29 23:18, , 125F
註解表達的是片面的 只是講述區塊的程式
01/29 23:18, 125F

01/29 23:19, , 126F
你也不可能逐字講解 本身表達力就不足
01/29 23:19, 126F

01/29 23:21, , 127F
至於找文件...一個quick open
01/29 23:21, 127F

01/29 23:22, , 128F
快捷鍵就打開了好嗎 還可以內文檢索
01/29 23:22, 128F

01/29 23:24, , 129F
如果會vi/vim那就更強了
01/29 23:24, 129F

01/30 15:00, , 130F
我想兩個都有是比較理想的情況,雖然實際情況很常兩個
01/30 15:00, 130F

01/30 15:00, , 131F
都沒有
01/30 15:00, 131F

02/16 23:22, , 132F
沒什麼好說的 從來沒有刪掉註解的
02/16 23:22, 132F

02/16 23:22, , 133F
除非註解寫錯了
02/16 23:22, 133F
文章代碼(AID): #1Zm-x3Dj (Soft_Job)
文章代碼(AID): #1Zm-x3Dj (Soft_Job)