这个问题似乎是不需要讨论了。所有有点经验的程序员都会毫不犹豫的回答,当然是英文。

但我今天偏要来说一说我自己的意见,并不能这么一概而论。

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

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

先说一下第三条,很好理解,比如要用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的程序员,英文还是很重要的。我这篇文章旨在说明新手或者水平还没达到那么高的程序员们,不要硬逼自己,我们量力而行。

2 收藏


直接登录
最新评论
  • vital   2016/07/08

    我去,自问自答啊

  • gege5 游戏编程 2016/07/09

    当然是英文好点,拼音重复的多不说,最关键的是——大部分人拼音不标准啊。我还得读几遍,想好久。

  • hanksbole UE4游戏程序员 2016/07/09

    最讨厌拼音党,一半都是新手,,有一次看见代码里有 public int JB; GetJB() 百思不得其解,去问 才知道 是 级别(JiBie)的问题。。。我差点没倒地吐沫

  • hanksbole UE4游戏程序员 2016/07/09

    拼音党是一个团队产生垃圾的源头

  • 晓雨落风 全栈工程师 2016/07/09

    当然必须是尽量英文啊,像 降龙十八掌/北京西站/耳鼻喉科 这样的非通用/常用词汇才用拼音,所以感觉并不是 用英文还是用拼音,这样的问题本身其提出就显得笼统和偏颇。灵活和提高代码质量才是核心。

    • 当然并不止于英文或拼音。还有很多非英语国家但是使用拉丁字母的国家的程序员是使用自己母语编程的。比如意大利,法国,西班牙等国家的程序员,这对他们来说并不算很大的问题。拼音的最大问题其实还是歧义的问题。

      • gege5 游戏编程 2016/07/12

        法语和英语西班牙本身都是表音文字啊,不存在拼音这样大量同音的情况。

        • 韩语当年去汉字化只剩表音字的时候人们也担心过这个问题,但是现在人们也使用的很习惯了。

          • gege5 游戏编程 2016/07/14

            首先,韩语本身就是不同语系的语言,并不像汉字这样大量同音,虽然也有,但是和英语之类同音情况类似。而且所谓去汉字化又不是把汉字拼音化,只是取消汉字的官方地位罢了,他们的语言一直都是他们自己的拼音文字,后来只是发明了彦文用来书写韩语。

            其次,韩国经过多年实践,已经发现单纯使用彦文是不够的,会有很多表述不清的地方。目前依然要求学习千字文,要学一些基本汉字。在某些领域,比如法律、医学、历史等一些方面依然需要大量使用汉字或者英文或者日文。

            再次,日常能习惯,但不代表程序能照搬。因为日常本来要求就不高,这个程序都要求规范是不同的。比如,日常中很多人的语序都是乱的,行文很多时候标点也是乱用。这在程序中能行吗?这并不是可以类比的事情。

  • lixyz 野生程序员 2016/07/09

    代码不单单是你一个人在看啊,你的队友,甚至你离职之后接手你工作的人,你拼音命名还得去猜拼音的意思,不如英文单词来的直接

  • mudon   2016/07/09

    说这么多,我还是用英文,这样高端,歧义少,还练英文表达,与国际接轨,一直鄙视那些拼音coder,别问我为什么,就好像大家说普通话,你一口方言,并没有大错,就是味不正

    • 有很多表达是中国特有的,翻成英文以后反而很难看懂。不信你去看一下人民日报的海外版。

      我之前写一个软件中用到一个字段是高考分数。我查了很多高考的英文翻译,写出来大家都看不懂。最后发现英文报纸上的翻译就是gaokao。于是我代码里也改成gaokao,大家读起程序代码来舒服多了。

      我反对的其实是翻不出来硬翻的那种。

  • 论坛新人 程序员 2016/07/09

    模型不要用_,尽量用驼峰.

    至于英语还是拼音,只会体现你层次,对系统毫无影响.

  • 论坛新人 程序员 2016/07/09

    你不加班,自有别人替你加班.

    公司没有年终,加不加都无所谓.如果年终有分红,你不加班就不用眼红别人加班的拿得多

  • 龙雀 野生程序员 2016/07/09

    我为何想起了starFarming。。

  • 汉尼拔 程序员 2016/07/10

    虽然我英语不好 但是看拼音是真的有时候不明白变量的意思啊

  • 丁叮 金融 IT 2016/07/11

    这个是情况而定,如果是那种存在set get 方法的 又比较长的翻译成英文,可以用a0,a1,…. b0,b1代替啊,只要你自己都注释好就行了,可以写个这样的代码生成器

  • cedar 纯野生全栈工程狮 2016/07/11

    嗯?还能用拼音做变量。。。。。

    涨姿势了

  • PunCha 程序员 2016/07/11

    楼主写的好。且看我用拼音写的Java版Hello World,通俗易懂:

    写的过程中,碰到的最大的问题就是前鼻音后鼻音需要查下字典

  • -汤迪希 iOS development 2016/07/11

    没办法用英文表达 是你功力不够 最恨的就是a b c x y z 党 其次就是拼音

    • 还是起名规不规范的问题,很多英语编程的人起变量名也用data1,data2,value1,value2,或者foo, bar。如果你不用心,什么语言都没用。

  • 燕归来   2016/07/12

    耳鼻喉科的英文也没有这么长,你当外国人傻啊

  • aaa   2016/07/12

    因为水平不行而选择拼音,那永远都不可能行,就好像你看了好多书,然后说你是新手还是再看看书,那你永远也写不好代码

    • 我更多的是从实用主义的角度来说的。我自己本身是在国外的,我之前尝试过在没有中文输入法的电脑上跟中国朋友聊天。我刚开始打英文,对方打中文,发现沟通极其不顺畅。可能是我英文差,也可能是对方英文差。随后我改用中文拼音和他聊天,发现几乎没有歧义,沟通明显顺畅。

      • aaa   2016/07/15

        我的意思大概是,如果不开始一点点做,就永远也不会好,就好像无数的项目在说重构,但是真正做了的凤毛麟角,不愿意付出代价迈第一步,就永远也不会改的,拼音用的越来越顺之后,想换肯定是越来越不容易,在github上提交代码的时候,没有英文注释这个就太难了

  • oshyn 软件工程师 2016/07/13

    坚决用英文!一般函数方法用动宾结构,类、变量用名词或名词短语,可以将需要命名的用中文描述一句话,放到Google翻译上,从翻译的英文中挑选名词、动词等关键性词语,这与对一个项目建模的时候用一大段话描述之后从中选择关键性主题来构建类、成员、方法等是类似的。对于选择的如果比较长,将单词中元音或重点发音部分选出作为简写。久而久之会丰富很多命名单词及简写,到一定程度基本不用翻译就可以信手拈来了!

  • T_TStaR UI Developer 2016/07/14

    同意楼主的观点。能使用英文还是尽量使用英文。

    用拼音做变量,确实有加密的效果,确实也有易读的特点(某些情况下)。

    但中文的特点就注定了,用拼音只能是一个不完美的解决方案。中文是目前在用的,为数不多的没有字母表的语言(象形文字)。所以很难达到别的语言里,一看到读音就知道是什么词、什么意思。这也就是为什么中文的语音识别难做,而其他语言相对容易很多。

    例子方面,很喜欢那个降龙十八掌的例子,哈。但个人感觉耳鼻喉那个有些不贴切。编程中可能用到耳鼻喉科的机会很少。。就算用到,早就有“官方”缩写 ENT (Ear,Nose,Throat) 来代替了。拿上面写的专业名词,去问本地人,可能有些人都不知道。。这很正常,因为本身就不需要知道。真要是涉及了专业名词,拿拼音去拼,可能也不是最好的解决办法。

    英文中的缩写非常多,应用也很广。举个例子,“用户信息表格” - User Infomation Table 直接缩写成 usr-info-tbl 也是没问题的。一些时候用这样的方式去代替复杂的实义化的命名,也许是种可选方案吧。

    至于在文中提到的格式统一,个人感觉不好绝对化。比如我们的项目(做前端的,Angular)。CONSTANT_XX就是全大写加上snake case。变量都是camelCase,涉及到HTML的Directive都是用camelCase命名,然后kebab-case调用,毕竟HTML不区分大小写。可以说,整体项目中,规则要统一,但也不意味着只能采用一种。

    代码就是为了让别人看懂的。取决于周围的受众,来确定自己的命名策略吧,我觉得。

    感谢楼主分享

    • 对于同一项目里的命名规则统一这点确实很难做到,我也没说清楚。甚至每个项目里的同一种语言都不一定能统一。比如JS因为引用了不同的类库,可能每个模块就会遵循引用类库中的变量名规则。但我们至少要保证我们自己的写的代码中的风格是统一的。

      我以前做php的,经常需要用其他人的代码, 又一直都苦于没有标准。曾经渴望php像ruby那样有一个能说了算的人,帮大家统一标准。直到后来php fig出了一系列psr的规则才好些。

      现在又写JS,又到了一个混乱的世界。连结尾加不加分号都不能统一,我也就不指望别的了。

      • T_TStaR UI Developer 2016/07/14

        js代码规范真的有不少,印象中google上面也有类似的资料,以前看过。我们做angular,用的是john papa的规范。

        确实,js有不同的库和框架,不过命名规范上大同小异。制定出一套适合自己项目的,然后照做就是啦

  • T_TStaR UI Developer 2016/07/14

    另一方面,我觉得,一些人不会用英文命名,或者不能很好地用英文命名,根源在于看的少。多看看开源项目,别人的写法和结构,自然慢慢就会了。

  • Vin_C° ²º¹⁶ 全栈攻城狮 2016/07/14

     

  • coolbirds 软件工程师 2016/07/15

    某些事企业单位 喜欢用拼音 有的挺规范 有的比希腊语还难董