寫程式是一項社交活動:名字不只要被編譯器讀懂,還要能被人「唸出來」和「找出來」。唸得出來的名字讓 Code Review 與討論順暢,找得到的名字讓維護時能精準定位。這兩件事看似瑣碎,卻決定了名字在真實團隊協作裡好不好用。
🧠 Why It Matters
- 名字要能被朗誦:程式設計是社交活動,一個唸不出來的名字,在 Code Review 或口頭討論時會非常尷尬、難以溝通。像
calcAvgGrd這種被壓縮過的名字,講出來像在唸密碼,兩個人根本沒辦法對著它對話。 - 名字要能被搜尋:單一字母的變數名(如
e)或魔術數字在大型專案中極難被精確定位。你想找出某個常數用在哪裡,卻只能在滿是同樣字元的檔案裡海撈。 - 魔術數字尤其難搜:一個裸露的
7不但沒說明意義,還幾乎無法搜尋——因為程式裡到處都是7,你分不出哪個才是你要找的那個。 - 這是維護期的成本:可朗誦與可搜尋都不是為了「寫的當下好看」,而是為了日後有人要討論它、修改它、追蹤它時,付出的力氣夠小。
NOTE
「唸得出來」是一個很實際的檢驗:試著把這個名字在會議上講給同事聽。如果你會忍不住把它一個字母一個字母拼出來,或是得補一句「就是那個 avg grd 的」,那它就還不夠好。
⚖️ Case Study
前 — 唸不出來的名字
// 在 Code Review 上要怎麼開口討論 calcAvgGrd 和 sGrds?
function calcAvgGrd(sGrds) {
let sum = 0;
for (const g of sGrds) sum += g;
return sum / sGrds.length;
}calcAvgGrd、sGrds 被硬生生擠掉母音,變成一串像密碼的縮寫。它們能通過編譯,卻無法被自然地講出來——討論時只能拼字母,溝通成本瞬間拉高。
後 — 像自然語句一樣好唸
// 清晰、像英文句子,講出來就懂
function calculateAverageGrade(studentGrades) {
let sum = 0;
for (const grade of studentGrades) sum += grade;
return sum / studentGrades.length;
}calculateAverageGrade、studentGrades 讀起來像自然語言,在口頭討論裡可以直接唸出來、彼此對齊。名字沒有變得更「聰明」,只是變得可以被人講。
TIP
母音不是可有可無的裝飾。刪掉母音省下的幾個字元,換來的是一個沒人唸得出來的名字——這筆交易幾乎永遠不划算。
前 — 難以搜尋的魔術數字
// 數字 7 的意義不明,而且很難搜尋(整份程式碼到處都是 7)
function isOverloaded(count) {
return count % 7 === 0;
}7 沒有名字,讀者無從得知它代表什麼;更糟的是當你想找出「這個規則用在哪些地方」時,搜尋 7 會撈出滿滿的雜訊,根本定位不到。
後 — 具名常數,一搜就到
const MAX_CLASSES_PER_STUDENT = 7;
// 語意清晰,而且 MAX_CLASSES_PER_STUDENT 是一個可以被精確搜尋的名字
function isOverloaded(count) {
return count % MAX_CLASSES_PER_STUDENT === 0;
}把魔術數字提取成具名常數後,7 一次就有了意義,也有了一個獨一無二、可被 grep 精確命中的名字。要改上限時只改一處,要追蹤用途時搜尋名字即可。
WARNING
單一字母的名字最大的問題是「搜不到」。在整份程式碼裡找 e,你會被無數個含 e 的字詞淹沒。這正是為什麼即使是很小的變數,只要它需要被搜尋,就值得一個真正的名字。
🔑 Takeaways
- 寫程式是社交活動:名字要唸得出來,才能在 Code Review 與討論中順暢溝通。
- 不要為省幾個字元而刪掉母音——
calcAvgGrd換成calculateAverageGrade才講得出口。 - 名字要搜得到:單一字母(如
e)與魔術數字在大型專案裡幾乎無法被精確定位。 - 把魔術數字提取成具名常數(
7→MAX_CLASSES_PER_STUDENT),一次補上意義與可搜尋性。 - 至於「名字該多長才合適、
i在小迴圈裡為何無妨」,是視野與長度的另一條規則——見 名字長度與視野。
No notes yet — jot your takeaways or Q&A here.