[心得] 「命名」這個問題的本質
《程式英文》 https://github.com/EngTW/English-for-Programmers 上週跨過了
「GitHub 500 星」的里程碑,在此整理一下這 12 週以來的心得。
* 討論了 64 個與程式寫作有關的英文字
* 每週新主題的熱門程度不一,點閱人次分佈在 3000 ~ 5000
* 每週流量有大約 10% 是重訪既有主題
---
* Google 文件 https://bit.ly/2GvWwV2
* GitHub 討論區 https://bit.ly/321ResR
---
# 「命名」這個問題的本質
寫程式時,「好的命名」的作用可說是:
* 以精練的文字引導程式碼讀者的大腦聚焦在最重要的相關知識與經驗上
* 進而掌握程式碼的 How & Why
「好的命名」很重要,但「命名得好」很難,我將「命名的難處」歸納如下:
* 缺乏學習誘因
* 就「寫程式的當下」來說,最低限度的要求/短期報酬最高的目標,可說是「
寫出能用的程式」。
* 而「可讀性/好的命名」的短期報酬相對地低。
* 缺乏練習環境
* 就「語法、邏輯」來說,取得意見回饋很容易;可以用程式語言工具檢查語法
,可以演算驗證邏輯。
* 而「可讀性/命名」的品質評鑑是相對地困難。
* 缺乏技術指導
* 在這個時代可以找到許多「命名常規(convention)」的資料,是很有用的「語
法(syntax)、格式(format)」參考資料;同時,也有相當的資料在探討「命名
的原則」及討論「命名案例」。
* 而「命名的語意(semantics)」的資料相對地少。
---
那麼,要如何克服上述的難處?我的看法如下:
## 學習誘因
誘因(incentive)、動機(motivation)是個很大的題目,這裡先談個人容易著手的
方向:「管理工作記憶區、調節情緒」,也就是降低「問題的複雜度、覺得困難的
情緒」對動機的負面影響。
易言之,如果目前無法做到「一次寫出能用又好讀的程式」,試試分成「寫出能用
的程式」、「寫出好讀的程式」兩個步驟來做。
可以參考 Test-Driven Development (TDD) 工程方法的原則,先寫出「能用、好
掌握、好測試的程式」,再來改善程式的可讀性(後面會探討實作方法)。
另一方面,「團隊文化、報酬制度」是個人相對難著力的方向,因為那通常不是技
術問題,而是商業問題。
## 練習環境
這個時代有不少「語法檢查工具」,但幾乎沒有「語意檢查工具」;目前我能想到
的替代品有三:
* Pair Programming
* Code Review
* 社群討論
* 例如這一系列文章
* 或我開設的 https://github.com/EngTW/English-for-Programmers/issues
或許,將來有一天,《程式英文》累積了足夠了「命名」知識與經驗,可以試著開
發出某種「命名語意檢查工具」,但目前還是得依賴人腦。
## 技術指導
這個時代有很多很棒的書與參考資料,但我發現既有的參考資料在「命名的語意」
這方面相對的薄弱。而對母語非英語的我們來說還有「英文語意」這個門檻。
經過過去 12 週的嘗試,我發現從語源學(etymology)的角度可以有效地釐清英文
字的語意;《程式英文》會繼續探討「程式命名常用字」的語意、字面上的意思
denotation vs. 使用情景中的意思 connotation 、語法、格式。
另一方面,我從學術論文著手,看看學界是怎麼研究「程式命名」這個題目;以下
是我最近讀的資料的歸納整理:
### 「命名」的方法
0. 當你想要命名一個東西時
1. 你想要傳達的概念有哪些?例如:
* 需求,這東西的目的為何?它被用來解決什麼問題?
* 情境,這東西的上下文為何?
* 地雷,這東西有什麼違反直覺、違反業界常規的地方?
* 參考 https://www.ptt.cc/Soft_Job/E.tVOteXD-lQcA ,還有
哪些概念會讓你覺得需要為它寫註解?
2. 把這些概念記錄下來
* 不要在意文法、不要在意用字、不要在意篇幅長短
* 先粗略地大量蒐集資料,之後再來精練品質
3. 避開「知識的詛咒」,例如:
* 暫時離開這個工作環境,讓你的大腦忘掉這一切
* 或著,找人跟你 pair programming, code review, 討論
4. 把那些概念依重要性排序
* 就團隊文化、業界常規來說,有哪些概念是獨特到要特別說出來的?
5. 就最重要的概念來說,有哪些字可以代表該概念?
6. 用那些字來組合出那東西的名字
7. 找人 code review, 評估你想出來的名字的品質,是否能做到:
* 以精練的文字引導程式碼讀者的大腦聚焦在最重要的相關知識與經驗上
* 進而掌握程式碼的 How & Why
參考資料:
* Feitelson, D., Mizrahi, A., Noy, N., Shabat, A. B., Eliyahu, O., &
Sheffer, R. (2020). How Developers Choose Names. IEEE Transactions on
Software Engineering.
### 「鑑定命名品質」的方法
* 命名要適合放在工作記憶區的大小
* 一般人腦大約能同時掌握 3 ~ 4 個概念與那些概念之間的關係
* 一般人腦的「一看就懂」是指在約 2 秒內能看懂一個概念
* 母語為英語者,一般閱讀速度是約 1 秒 4 個英文字
* 命名要精練(concise),例如:
* 假設我們想要命名「輸出檔案的名稱」變數
* `output_file_name` 是個好名字,它 正確 且 精練
* `file_name` 會是個 正確 但 不精練 (不嚴謹) 的名字
* `foo` 是 不正確 也 不精練
* 命名要一致(consistent)
* 假設某程式中, `file` 在某個地方代表「檔案名稱」,
* 在另一個地方代表「檔案指標(pointer)」,
* 這是不一致的
* 這裡的問題是「同一個名稱 對應到 多個概念」
* 假設某程式中, `file` 在某個地方代表「檔案名稱」,
* 在另一個地方, `file_name` 也代表「檔案名稱」,
* 這也是不一致的
* 這裡的問題是「多個名稱 對應到 同一個概念」
參考資料:
* Deissenboeck, F., & Pizka, M. (2006). Concise and consistent naming.
Software Quality Journal, 14(3), 261-282.
---
我還在慢慢消化這些學術論文;如果對我的閱讀筆記有興趣的話,可以看看這些:
* https://www.facebook.com/twy30/posts/2641704649413183
* https://www.facebook.com/twy30/posts/2641828296067485
* https://www.facebook.com/twy30/posts/2630596570523991
* https://www.facebook.com/twy30/posts/2592785380971777
* https://www.facebook.com/twy30/posts/2630521400531508
* https://www.facebook.com/twy30/posts/2630473677202947
除了「命名的語意」外,現有的「命名常規」資料似乎也很少提到「型別(type)」
對「程式可讀性」的影響;這也是個很有趣的研究方向。
---
# 結語
「命名」這個題目很有趣,像是在打造一把鑰匙,可以打開讀者的大腦倉庫,提取
出一整個世界。
有任何關於軟體工程、程式設計的英文相關問題都很歡迎提出來討論;很多很有趣
的研究方向、靈感其實都是來自於讀者提問、意見回饋。
在此感謝所有參與討論的網友 :)
--
推,命名依照用途而非內容物,就能提昇精鍊度
推,這些討論很受用
推推
推推,謝謝分享~
優文 有看有推
謝謝各位的欣賞 :)
※ 編輯: AmosYang (136.56.13.184 美國), 10/05/2020 02:04:53想問_和-的差異
如果你是指 var_name 與 var-name 這兩種寫作風格的差異, * 我目前尚未看到任何認知科學研究主張哪種比較好、怎麼個好法。 * 我目前看到的多是「在這個文化生態圈中,就是習慣這樣寫」。 --- 很像是「小數點」的情形;例如 * 10,000.00 ← 台、美、日等國家習慣用 "." 來當小數點 * 10.000,00 ← 歐洲、一些非州國家則是用 "," 來當小數點 沒有資料說哪種比較「好」,就是文化習慣。 參考資料:
https://en.wikipedia.org/wiki/Decimal_separator※ 編輯: AmosYang (136.56.13.184 美國), 10/05/2020 04:29:36
感謝你
推推
推
謝謝各位的欣賞 :)
※ 編輯: AmosYang (136.56.13.184 美國), 11/08/2020 12:56:4164
[閒聊] 主要角色命名有相同邏輯/根據的作品ㄤㄤ 話說 有些動漫畫作品 角色在命名的時候 為了配合作品或玩哏 都會用相同的資料來源或根據 像是48
[問卦] 寫程式要怎麼命名?安安 小弟程式社畜拉 小弟我從小就有命名困難症 玩網遊第一天就是在取名中度過得 最近PTT開放註冊我也因為想不出新唉低所以沒去註冊29
[問卦] 姓隋孩子怎麼命名?阿肥開始寫程式後才發現 命名是門學問啊,還很深 寫程式花最長的時間就是思考如何命名變數 扯遠了 隋棠的孩子好像不姓隋,沒有從母姓20
Re: [問卦] 如何一句話證明自己C++很強有一天被同事叫去問 template<size_t... Ns> void apply_for(std::integer_sequence<size_t, Ns...>) { (apply(Ns),...); }16
[請益] 欄位或是變數改名這邊想請問各位前輩系統維護上常常遇到的一個問題 就是程式中的變數或是資料表欄位命名的"變更" 我不確定是不是一開始我的設計的想法就錯了 通常我在設計時,會將使用者的操作"畫面"與系統中的命名盡量保持一致, 討論起來比較有共通的語言,尤其是在一些專有名詞的欄位命名上。X
[問題] 寶可夢的命名規則寶可夢的命名不免讓人覺得疑惑 以歷代電氣鼠來看 有以XX鼠來命名的: 電飛鼠 咚咚鼠X
Re: [討論] 請大家聊聊靜態語言的缺點這個問題實在是匪夷所思 以認知科學的觀點看,當然是靜態型別優於動態型別呀! 就像offer文在討論薪水,在那邊 N 來 N 去 在許多重要性質不確定的情況下,很多東西是很難精確的下判斷的 不過如果貴圈的專注層次不在這裡,不在乎,那也就無所謂5
[問卦] 命名swift程式語言的人是開swift嗎是這樣的 潮潮iPhone 的iOS系統 撇除舊時代的object-c 跟毛還沒長齊的SwiftUI 目前主流是swift 想問命名swift名稱的人3
[軟體] 命名居然會影響spotlight搜尋?無意間發現一件事 某些命名方式會讓mac的spotlight搜尋不到檔案或資料夾 像是 命名「m1批踢踢」 搜尋ok 「p m1批踢踢」 搜尋ok 「pp m1 批踢踢」搜尋ok