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

简介: 对常见的对在编写代码时用中文命名标识符的反对声音进行小结, 并作针对回应. Q&A of programming with naming in Chinese.

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

没有好处

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

不利于非中文编程者贡献

答:现状是, 中文开发者主创的开源库/框架, 绝大多数的贡献者也都是中文开发者, 即使非常流行和国际化的框架如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原意也没有‘循环’的意思,中文接近“只要”或者“当”。这恰恰说明了英文编程语言的设计与英文语法和词意的相关性。不懂英文的开发者在学习时就只能强记这些关键词(虽然也不是大麻烦),但假想这些关键词如果开始就是中文,那么肯定会更容易理解,也省去了强记的一步。

中文输入太慢, 降低开发效率

答: 首先, 如果考虑推敲命名的时间, 对母语是中文的程序员, 中文命名应该比能够更恰当更快, 综合各种因素哪种方式写代码更快还待实践证实. 其次, 鉴于开发过程在整个软件生存周期中只占一小部分, 其他的部分(设计,调试,测试,维护)从良好的可读性获取的利远大于开发效率可能降低的弊.
为避免频繁切换中英文: 为了在输入中文的同时不用切换就可以输入特殊符号(){};等等, 搜狗输入法支持"中文时使用英文标点"

会有各种汉字编码问题导致乱码

答:汉字编码问题不仅限于代码, 使用的越少越不利于问题解决. 多数问题能通过使编码一致避免, 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) { ... }").

相关文章
|
SQL DataWorks NoSQL
DataWorks报错问题之datax mongodb全量迁移报错如何解决
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
|
10月前
|
Linux 测试技术 计算机视觉
AlphaPose复现配置教程
本文是AlphaPose姿态估计系统的复现配置教程,包括在Ubuntu22.04系统下的环境配置、依赖安装、AlphaPose代码获取与安装、权重文件替换、预训练模型下载以及测试运行的详细步骤。
463 1
AlphaPose复现配置教程
|
5月前
|
Ubuntu 计算机视觉 C++
Ubuntu系统下编译OpenCV4.8源码
通过上述步骤,你可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使你能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
150 30
|
4月前
|
存储 人工智能 自然语言处理
Lindorm作为AI搜索基础设施,助力Kimi智能助手升级搜索体验
月之暗面旗下的Kimi智能助手在PC网页、手机APP、小程序等全平台的月度活跃用户已超过3600万。Kimi发布一年多以来不断进化,在搜索场景推出的探索版引入了搜索意图增强、信源分析和链式思考等三大推理能力,可以帮助用户解决更复杂的搜索、调研问题。 Lindorm作为一站式数据平台,覆盖数据处理全链路,集成了离线批处理、在线分析、AI推理、融合检索(正排、倒排、全文、向量......)等多项服务,支持Kimi快速构建AI搜索基础设施,显著提升检索效果,并有效应对业务快速发展带来的数据规模膨胀和成本增长。
|
7月前
|
存储 人工智能 自然语言处理
AI经营|多Agent择优生成商品标题
商品标题中关键词的好坏是商品能否被主搜检索到的关键因素,使用大模型自动优化标题成为【AI经营】中的核心能力之一,本文讲述大模型如何帮助商家优化商品素材,提升商品竞争力。
821 62
AI经营|多Agent择优生成商品标题
|
11月前
|
存储 缓存 自然语言处理
(三)JVM成神路之全面详解执行引擎子系统、JIT即时编译原理与分派实现
执行引擎子系统是JVM的重要组成部分之一,在JVM系列的开篇曾提到:JVM是一个架构在平台上的平台,虚拟机是一个相似于“物理机”的概念,与物理机一样,都具备代码执行的能力。
237 1
|
10月前
|
Kubernetes 关系型数据库 MySQL
k8s练习--通过NFS+PV+PVC+POD,部署一个MySQL服务,并将MySQL的数据进行持久化存储
本文档介绍了如何使用Kubernetes (K8s)、NFS、PersistentVolume (PV)、PersistentVolumeClaim (PVC)和Pod来部署并实现MySQL服务的数据持久化存储。Kubernetes是一个用于自动化部署、扩展和管理容器化应用的强大平台。NFS作为一种网络文件系统协议,能够使Kubernetes集群中的Pod跨节点访问共享文件。PV和PVC机制则提供了持久化的存储解决方案,确保数据即使在Pod生命周期结束后仍得以保留。
502 0
|
11月前
|
存储 关系型数据库 MySQL
PolarDB产品使用问题之如何进行私有化部署PolarDB-X
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
安全 API
OpenAI邮箱API发送邮件注意事项
使用OpenAI邮箱API需注意API密钥安全,避免泄露;确保邮件内容合法合规,不发送垃圾邮件;设置正确发件人信息,防止被视为垃圾邮件;确认收件人信息准确;控制发送频率;保持内容格式规范;记录发送日志;并先进行发送测试。遵循这些提示可确保邮件发送顺利。
|
11月前
|
JavaScript 前端开发 CDN
使用jQuery Validate进行表单验证详解
使用jQuery Validate进行表单验证详解