命名很重要

2016-02-18 余晟 余晟以为 余晟以为

你能记住Linux中做符号链接的命令吗?刚开始用的时候,我怎么也记不住到底源文件在前面还是要生成的链接在前面。于是我一狠心,把模板给背了下来,这才算解决了问题。

ln option target linkname

后来我发现,搞不清楚ln的竟然不是我一个人,而且有人背了模板还是搞不清,这就有点奇怪了。我再仔细问下去,原来他背的模板是这样的。

ln option source target

比较两个说明模板,你发现target的意思竟然是相反的。在上面指的是“被链接的文件”,下面指的是“要创建的链接”。所以当target和source一起出现的时候,混淆就难免产生了。但是如果target配合linkname一起出现,再要混淆可就不容易了。

这个故事告诉我们,取名字看起来是小事,其实真不是小事。在上面这个例子里,还可以查查例子解决。但是遇上其他的例子,估计就要让人抓狂了。

在不少的系统里,表示重量的变量命名为weight,时间的变量命名为time,这似乎是没有问题的。我就遇到过这样的系统。不幸的是,这个系统分很多模块,需要多人协作开发,许多业务规则又不是程序员明白的,于是问题就来了:有时候weight的单位是克,有时候是千克,有时候是磅,还有时候是安士。要命的是,不管单位是什么,变量名都是weight。同样的问题也出现在时间上,很多时候根本不知道time的单位是秒还是毫秒,每次都要查阅文档、仔细核对才敢动手。

被这类问题困扰了很久以后,我下命令将所有的这类变量都改掉,必须在命名上包含单位。重量不能叫weight,而应该叫weightInKg,weightInGram,weightInPound;时间不能叫time,而应该叫timeInMS,timeInSecond;类似的长度也必须是lengthInCM, lengthInMeter等等。刚开始还有人不理解,觉得这样是白费力气,每次写变量名都要多敲字符。过了一段时间,大家终于都理解了这样做的好处。

其实我相信,用weight命名重量,用time命名时间,这种做法到处都有。1999年美国宇航局的火星气象卫星任务失败,就是因为开发程序时,一队工程师使用了公制单位,另一队工程师使用了英制单位。如果他们使用了简洁易懂、不会混淆的命名,这样的悲剧可能就不会发生。

当然,取合适的名字有时候并不简单,甚至直接从英文翻译过来,也会因为语境不同而引起混淆。以前点点网抄袭tumblr时,把帮用户推荐信息的功能直接命名为“雷达”,因为tumblr上的英文就是radar。可是对中文用户来说,谁看到“雷达”会想到这是用来探索自己感兴趣信息的呢?还有邮箱Web界面中都有个功能是“放弃当前输入的内容”,英文一般写作Discard很容易理解,QQ邮箱中这个按钮命名为“关闭”就让人很抓狂——这是要关闭整个页面吗?我的建议是把这个按钮命名为“作废”,据我做的小范围调查,大家对“作废”的理解不会存在疑义。

很多时候,要想取一个简单直观的名字,有足够的生活经验和联想力反而比懂外文要有用。很多人都见过一种跨在管子上的固定螺栓,如今说“U形螺栓”大家都知道,但我一直好奇,在大多数人没接触过英文的年代,这种螺栓叫什么名字呢?有天我遇到一位老师傅才恍然大悟:原来这叫“骑马螺栓”。人骑在马上,两条腿从两边垂下来,正是一个U形。虽然现在说“U形”大家都知道怎么回事,但未必这类名称一定要和U挂上勾,U-turn直译过来是“U形转弯”,但其实大家都知道,这就是“调头”。


最后说一下写这篇文章的由头。亚马逊中国今天推出了Kindle电子书的不限量阅读服务,每个月收费12元。我第一时间把这个消息告诉我爸,想着这样他每月看电子书可以少花点钱了,哪知道他一句话就让我笑到肚子疼了:就是亚马逊给你办了个借书证,收费是每个月12块钱嘛。