對在代碼中使用中文命名標識符的質疑與迴應

原文在中文編程知乎專欄: 對在代碼中使用中文命名的質疑與迴應

有一部分質疑同樣適用於英文代碼, 比如"從命名看不出類型", "命名可能詞不達意"等等, 另外還有未經證實的"中文代碼導致的未知錯誤"和沒有根據的”比英文代碼運行慢“等等, 就不一一回應了.

沒有好處

答:如之前的13年後的共鳴-在代碼中用中文命名的優勢和問題一文所述,中文命名在很多時候可以更準確,也比英文命名更輕鬆。
如果認爲API以及內部方法/變量的命名無關緊要. 有不少可讀性相關的文章對這個誤區進行了闡述, 比如Writing for Readability

母語命名對代碼清晰度和可維護性的提高在Python3選擇支持非ASCII碼標識符的緣由中也有印證.

2019.10.3 補: 大家對於中文變量名是如何看待的? - V2EX

本土變量意味着我在給變量命名的時候思考時間=0,維護理解額外開銷=0,準確度=100%,對着需求文檔起名就對了

尤其最後一句。源碼中的標識符命名與需求、設計文檔(國內項目絕大多數是中文的)中的一致意味着起名時及其方便,閱讀源碼時也很容易回溯到文檔。

不利於非中文編程者貢獻

答:現狀是, 中文開發者主創的開源庫/框架, 絕大多數的貢獻者也都是中文開發者, 即使非常流行和國際化的框架如vuejs也是如此. 原因肯定是多方面的. 能夠想到的有:

  • 有類似功能的國外開源項目. 作爲外國程序員首選參與的肯定是那些
  • 如果是和中文本身相關的庫, 如結巴分詞, 主要的用戶也是中文開發者, 自然維護的也是

個人也不贊成100%的中文化. 需要和國外交流的項目肯定有. 大膽假設:以中文爲母語的所有程序員,從事的項目中,90%是單人項目(*),剩下的10%中,90%只有同樣是中文爲母語的程序員參與.這樣,只有1%的項目有用英文寫代碼的硬性需要.爲了這1%的需要,而在剩下的99%中使用英文,得不償失.

注: 根據Fun with GitHub repositories statistics, github上的1-contributor repository大約是60%. 當然還有很多項目沒有開源. 上面的90%仍然是假設.

當然希望看到更多的國外開發者參與國人初創的項目. 不過,除去預測得到是否會有國外開發者參與的情況, 剩下的自己發起的項目, 首要考慮的是對自己的開發和維護最有利的編程方式. 因爲在可以預見的將來, 我自己會是最主要的貢獻者. 如果我自己的開發和維護成本隨着項目變大而變得不可持續, 那麼在項目成型和能夠吸引其他開發者參與之前可能就夭折了. 個人的感覺是用中文命名是我更熟悉和容易的方式.

osc上一些即使很熱火的開源框架, 比如JFinal, 大多隻有極少的其他開發者貢獻. 個人認爲一個很重要的原因, 就是代碼閱讀的難度, 而英文命名是一個額外的障礙. 也許對於開發者本人來說, 隨着項目的開展, 一些開始時有些彆扭的英文命名自己也習慣了, 但是對於剛拿到整個代碼的新開發者, 任何不妥當的英文命名都會導致迷惑和時間的浪費. 爲了吸引理論上的國外開發者參與, 而不優先選擇對身邊的中文開發者(包括自己)閱讀代碼有利的編程方式, 個人認爲這種思路是很值得商榷和分情況探討的.

芬蘭人Linus,使用英語而非自己的母語來編寫Linux代碼

答:Linus的母語是瑞典語,根據wiki使用者是八百七千萬。中文(普通話)的母語使用者是九億五千萬。這是一百倍的差距。另外,英語母語使用者是3億六百萬。更重要的是,中文母語使用者基本集中在中國,而英語分佈在不同國家。西班牙語也類似。從人口基礎來看,用中文編程是非常有潛力的。

附上中文註釋就夠了

答:關於註釋和命名, 在個人之前的工作環境裏, 是第一次接觸正式的可讀性審覈. 有個印象是, 審覈員會盡量傾向於減少註釋量, 而強調代碼本身的可讀性(其中最重要的因素之一就是命名). 審覈裏會不時出現"這個方法名已經self-explaining了,註釋就不用了"之類的評語. 雖然沒有當面確認過, 但寫註釋和維護註釋的額外工作量應該也是這種傾向的動因之一.

絕大多數API, 包括標準庫都是英文的

答: 沒錯, 但在代碼中, 自己定義的類/方法/變量佔的篇幅一般都不少於依賴庫(包括標準庫)的方法/類所佔篇幅, 歡迎提供具體統計數據. 可以看看這裏的中英文代碼篇幅的比例. 中文命名帶來的代碼改變是一目瞭然的. 更關鍵的是, 自定義的部分往往是業務邏輯最集中並且最需要可讀性的部分.

如果關鍵詞還是英文, 用中文命名就沒有意義

答: 用中文命名帶來的好處是不分編程語言的, 甚至英文關鍵詞和中文的顯著區別可能帶來額外的可讀性增強. 另外, 至少短期內(5-10年), 英文關鍵詞的編程語言還將在市場中佔有不可忽視的份額, 在這個階段使用中文命名是一條代價小而收益相對立竿見影的途徑.

編程語言本身和英文語法無關

答: 雖然和英文自然語言相去甚遠, 但仍然有不少設計是帶着很多英文風格的. 如: 空格作爲分隔符; for…in等用法帶有英文語法特色. for原意並沒有循環的意思,而更接近”對於",這在”for(A in B)“的語法中更明顯,對應中文接近”對於B中的那些A“。while原意也沒有‘循環’的意思,中文接近“只要”或者“當”。這恰恰說明了英文編程語言的設計與英文語法和詞意的相關性。不懂英文的開發者在學習時就只能強記這些關鍵詞(雖然也不是大麻煩),但假想這些關鍵詞如果開始就是中文,那麼肯定會更容易理解,也省去了強記的一步。

中文輸入太慢, 降低開發效率

答: 首先, 如果考慮推敲命名的時間, 對母語是中文的程序員, 中文命名應該比能夠更恰當更快, 綜合各種因素哪種方式寫代碼更快還待實踐證實. IDE工具的輔助也可能使輸入效率提升甚至超過英文輸入: 用實例來看中文編程代碼輸入效率問題. 另外, 由於命名可讀性的提升, 可以省去更多註釋.

更不可忽視的是, 鑑於開發過程在整個軟件生存週期中只佔一小部分, 其他的部分(設計,調試,測試,維護)從良好的可讀性獲取的利遠大於開發效率可能降低的弊. 設計時可以直接由業務描述(中文的)直接映射到構架/接口的命名(省去了英文翻譯的一步), 調試/測試/維護可以因爲代碼可讀性的提高而減低理解和學習代碼的成本.

爲避免頻繁切換中英文: 爲了在輸入中文的同時不用切換就可以輸入特殊符號(){};等等, 搜狗輸入法支持”中文時使用英文標點”

會有各種漢字編碼問題導致亂碼

答:漢字編碼問題不僅限於代碼, 使用的越少越不利於問題解決. 多數問題能通過使編碼一致避免, UTF8和GBK互轉的問題(實例)可能會在長時間內存在。用中文命名能使這些問題更加凸顯,促進問題解決,而不是拖延迴避.

基於在各種語言/框架中的實踐, 只要框架本身支持中文命名, 還沒有發現任何由於採用中文命名導致的程序問題.

看多了中文程序會影響英文學習,以及程序員前程

答:就像搞學術的需要的時候自然逼着看英文刊物,有硬性需要的時候自然會去看國外網站。如果這就會影響,那麼也許本來就不那麼需要。

中英混用的問題

比如Java中有個迴避不掉的問題JavaBeans規範一定要使用set/get命名。maven版本號的 -SNAPSHOT 特殊語義,舊junit中需要測試的方法必須以test開頭等

答: 確實在實踐中碰到混用的情況, 個人基本上是能用多少中文就用多少. 比如這裏set/get和中文混用,個人覺得可以接受。如果想在Java裏用中文編寫代碼, 中英混用是不可能避免的.

沒有先例

答: 這個 2017 年的 quora 答案(Alan Mellor’s answer to Has any serious project been written in a non-English-based programming language?)提到西門子(德)/愛立信(瑞典)內部有儘量用母語命名的 C/C++項目. 以及布拉格看到的一本編程書中的示例代碼也是用母語命名.

開源項目中也有不少. 這是一位臺灣開發者用Python開發的自然語言處理工具: 臺灣言語工具 項目成型於2013年, 代碼目測數萬行.

最初在編程語言中添加支持 Unicode 的功能, 也應該有各個非英語母語國家/地區開發者的推動力量.

2018-07-18更新

中文比英文更難以理解

答: 比如假設中國人最先開發電腦和設計程序語言,那麼各種程序語言會使用漢字嗎?. 問題是, 無論從什麼角度說, 中文也是中國人的母語, 而母語優勢已經由前面的"沒有好處"一節說明. 退一萬步說, 即使這個命題成立, 也只能用來說明中國人用中文作爲母語導致了理解效率落後. 而不能說明中文命名不適合於國人.

2018-07-22更新

“我們在用C++,Java,Python編程,不是在用英文編程”

答: 這是很常見的一個說法, 比如這裏. 之前的"沒有好處"和"編程語言本身和英文語法無關"等節已經闡述了命名和編程語言語法和自然語言直接的關係. 如果還不夠說服力, 也許可以看看國外非英語母語的開發者. Linus(Linux作者)的回答(原文在Interview: Linus without Linux): “我一直用英文編程”. 而且他還提到編程語言都是基於英文的. 節選如下:

Question: What language did you use in comments to Linux while you were a student?
Torvalds: English. I’ve always programmed in English. All the books were in English, and the programming-languages tend to be somewhat English-based too (i.e. “while (x) { … }”).

上面列出的之外, (轉載)發展中文編程的意義:讓大衆化編程促進軟件產業的建設也對一些質疑作出了迴應

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章