这个问题似乎是不需要讨论了。所有有点经验的程序员都会毫不犹豫的回答,当然是英文。但我今天偏要来说一说我自己的意见,并不能这么一概而论。

 

据某网站调查,给变量命名是程序员每天最头疼的事。所以可见不论英文或中文,给变量命名都非易事。我先给出我自己的命名规则:

  • 对所有需要阅读你代码的人来说,变量名没有歧义
  • 在此基础上越短越好
  • 对整个项目来说形式统一

 

先说一下第三条,很好理解,比如要用camel case 就都用camel case,要用下划线就都用下划线。这个就不多说了。

 

根据我的规则,变量名到底是用英文还是拼音,并没有太大关系。

 

首先一点,我们要确定阅读你代码的人群。其实这也是很多程序员说要用英文做变量名的最主要原因。很多代码是需要跨国家或地区合作的,或者需要和全世界分享的。那么,英文无疑是最好的选择。但还有很多情况下,代码只需要一部分人看懂,或者在极端一点,只需要你自己看懂,那么就只需要保证一点就可以了,那就是没有歧义。

 

我看过一些日本程序员的代码,他们很多人都是大大方方的直接用平假名的罗马注音来命名变量。因为人家本来就是只给日本程序员看的,我们偷看本来就是不对的。人家用平假名给变量起名,还变相的相当于给程序加密了呢。说道这里,我仿佛意识到了为什么日本没有大的国际IT公司了,但是不得不说,他们自己国内的IT公司的水平,其实一点也不比美国的差的。

 

有些观点认为,程序具有天生的需要给全世界共享的需求。这点我也不是很认同,也有其他具有类似属性的东西,比如论文。那我们是不是所有的论文都要用英文写,中文的论文就一点价值都没有了呢?

 

也有些人不用拼音的原因是用拼音的歧义较多。比如biaoGe可能是表格,也可能是表哥。这一点其实在韩语去汉字化过程中很多人都提到过。韩语的书写文字中之前存在大量的汉字,在二战后,韩国和朝鲜几乎同时改革文字,将韩语中的汉字全部去掉,只留下韩语本身的注音字符。(那些符号相当于拼音,所以只要你学会那些符号的念法和拼法,就能读出所有的韩语了)刚开始人们有些不习惯,但是现在已经很少有歧义了。因为理解一个词的意思不光取决于读音,还取决于上下文语境。你说提交biaoGe,和我的biaoGe,相信大部分人都能理解第一说的是表格,第二个说的是表哥。其实程序跟文章一样,也是有语境的。如果想将拼音本身进一步消歧,也是有办法的,比如在拼音后面加上声调,biao3ge2,这样一下就能读出是表格了。

 

刚才说了为什么可以用拼音做变量名,接下来再说一些不宜使用英文做变量名的情况。

  • 英文不好的程序员,用英文做变量名反而容易闹笑话。

很多英文好的程序员指责一些英文不好的程序员变量名不用英文,这就像你看到一个人在用美图秀秀修图,然后去指责他为什么不用photoshop啊?还说英文不好可以去查字典嘛,或者上网查啊。

我们在网上经常嘲笑一些神翻译,比如把“干货”翻译成“fuck goods”,这明显就是上网机器翻译的。而英文不好的程序员上网查的话,很容易起出类似的变量名。到时候反而不如写gan1huo4能让人看懂。

如果一个团队的负责人要求团队成员必须用英文做变量名,请在招人的时候就把英文好作为一个必须的要求。

 

2,有些中文的词汇是无法翻译成英文的,翻译了反而让人摸不着头脑。我之前做过一段时间的网页游戏,很多网页游戏是中国武侠题材的。比如要写一个方法是降龙十八掌,如果你硬要翻译成beatingDragon18Palms,我不知道有多少人能看得懂。这就像之前中国翻译地名和路名,将北京西站翻译成Beijing west train station还是翻译成Bei Jing Xi Zhan呢?我们都理解用字母是为了外国人书写方便,但是使用的时候,对象却大部分是中国人。比如一个外国人拿着写着这两种翻译的纸条给出租车司机,让司机开到指定地点,哪种翻译更能达到目的呢?

 

有些人说用拼音可以,但千万不要用拼音首字母。我倒是觉得只要没有歧义,用拼音首字母也是可以的。比如降龙十八掌的方法完全可以写成xl18z,在有上下文的情况下,是完全可以看懂的。这些东西也可以约定俗成,比如程序员们都知道i18n是代表internationalization,就是多语言国际化。这个就符合我命名规则里面的第二条,越短越好。

 

还有些时候词汇确实有英文,但是太难太偏,大部分中国程序员都看不懂,但程序又只有中国的团队看,这种情况也可以使用拼音。比如很多医学词汇,像otorhinolaryngological department 耳鼻喉科,你这样英文写出来,所有读你程序员的人都得抱个字典读你程序。

 

最后我也要承认,只要能用英文的时候还是要尽量用英文。因为英文是计算机的母语。很多框架比如ruby on rails和仿照rails的cakephp,都是convention over configuration,就是让你尽量不要自己配置规则,而要用框架已经约定俗成的规则。他们规定了数据库表名必须是下划线复数,model名称必须是camelcase单数,controller名称又是camelcase的复数,这样就只能使用英语了。

 

还有很多文档也都是只有英文版的,想上stackoverflow上问个问题,也得用英文问。在github上跟人切磋也还是得用英文。所以想成为牛B的程序员,英文还是很重要的。我这篇文章旨在说明新手或者水平还没达到那么高的程序员们,不要硬逼自己,我们量力而行。