中文编程
首发于中文编程

对在代码中使用中文命名的质疑与回应

原文:对在代码中使用中文命名的质疑与回应

有一部分质疑同样适用于英文代码, 比如”从命名看不出类型”, “命名可能词不达意”等等, 另外还有未经证实的”中文代码导致的未知错误”和没有根据的”比英文代码运行慢“等等, 就不一一回应了.

没有好处

答:如之前的13年后的共鸣-在代码中用中文命名的优势和问题一文所述,中文命名在很多时候可以更准确,也比英文命名更轻松。 如果认为API以及内部方法/变量的命名无关紧要. 有不少可读性相关的文章对这个误区进行了阐述, 比如Writing for Readability

母语命名对代码清晰度和可维护性的提高在Python3选择支持非ASCII码标识符的缘由中也有印证.

不利于非中文编程者贡献

答:现状是, 中文开发者主创的开源库/框架, 绝大多数的贡献者也都是中文开发者, 即使非常流行和国际化的框架如vuejs也是如此. 原因肯定是多方面的. 能够想到的有:

  • 有类似功能的国外开源项目. 作为外国程序员首选参与的肯定是那些
  • 如果是和中文本身相关的库, 如结巴分词, 主要的用户也是中文开发者, 自然维护的也是

个人也不赞成100%的中文化. 需要和国外交流的项目肯定有. 大胆假设:以中文为母语的所有程序员,从事的项目中,90%是单人项目(*),剩下的10%中,90%只有同样是中文为母语的程序员参与.这样,只有1%的项目有用英文写代码的硬性需要.为了这1%的需要,而在剩下的99%中使用英文,得不偿失.

注: 根据Fun with GitHub repositories statistics, github上的1-contributor repository大约是60%. 当然还有很多项目没有开源. 上面的90%仍然是假设.

当然希望看到更多的国外开发者参与国人初创的项目. 不过,除去预测得到是否会有国外开发者参与的情况, 剩下的自己发起的项目, 首要考虑的是对自己的开发和维护最有利的编程方式. 因为在可以预见的将来, 我自己会是最主要的贡献者. 如果我自己的开发和维护成本随着项目变大而变得不可持续, 那么在项目成型和能够吸引其他开发者参与之前可能就夭折了. 个人的感觉是用中文命名是我更熟悉和容易的方式.

osc上一些即使很热火的开源框架, 比如JFinal, 大多只有极少的其他开发者贡献. 个人认为一个很重要的原因, 就是代码阅读的难度, 而英文命名是一个额外的障碍. 也许对于开发者本人来说, 随着项目的开展, 一些开始时有些别扭的英文命名自己也习惯了, 但是对于刚拿到整个代码的新开发者, 任何不妥当的英文命名都会导致迷惑和时间的浪费. 为了吸引理论上的国外开发者参与, 而不优先选择对身边的中文开发者(包括自己)阅读代码有利的编程方式, 个人认为这种思路是很值得商榷和分情况探讨的.

芬兰人Linus,使用英语而非自己的母语来编写Linux代码

答:Linus的母语是瑞典语(Interview: Linus without Linux),根据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里用中文编写代码, 中英混用是不可能避免的.

上面列出的之外, (转载)发展中文编程的意义:让大众化编程促进软件产业的建设的"对一些质疑中文编程的解答"一节也对很多质疑作出了回应.

没有先例

答: 这是一位台湾开发者在Python中用台湾方言(当然我们也看的懂)命名的自然语言处理工具: github.com/sih4sing5hon 项目成型于2013年, 代码目测数万行.


2018-07-18更新

中文比英文更难以理解

答: 比如zhihu.com/question/2802. 问题是, 无论从什么角度说, 中文也是中国人的母语, 而母语优势已经由前面的"没有好处"一节说明. 退一万步说, 即使这个命题成立, 也只能用来说明中国人用中文作为母语导致了理解效率落后. 而不能说明中文命名不适合于国人.


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) { ... }").

文章被以下专栏收录

    在所有编程语言和领域中尝试编写中文代码,开发相关工具,总结经验,一致代码风格。包括中文命名,汉化现有语言,创造中文语法的编程语言等等。作为最熟悉的母语,用来编写代码会让代码更容易被自己和母语相同的其他开发者理解。基于英文的编程语言和框架中,使用中文命名有时有技术问题。希望这里为后人趟雷,填坑。多数现有API是英文的,这里也会对其中一些常用的进行汉化。当然,这里也会对基于中文的编程语言进行探讨。包括汉化基于英文的编程语言,以及创造新的编程语言。