Phil Karlton 说过一句被程序员引用了三十年的话:”计算机科学只有两件难事——缓存失效和命名。”

你上次花五分钟纠结一个变量名是什么时候?

大概就是今天。

你以为你在起名,其实你在暴露自己

来,做个实验。看这行代码:

let data = fetchData();

再看这行:

let unpaidOrdersFromLastWeek = fetchOverdueOrders({ since: 7 });

区别在哪?不是命名习惯好坏的问题——是你到底有没有想清楚这坨东西是什么。

data 这个名字出现的时候,通常意味着写代码的人自己也不知道这个变量到底承载了什么。它不是命名能力差,是思考深度不够。你还没搞清楚它是什么,怎么可能给它起个好名字?

命名是思维清晰度的X光片。代码写得好不好,扫一眼变量名就知道了。

一个让人不安的数据

程序员的时间都去哪了

微软研究院做过一个实验:程序员70%的工作时间花在阅读代码上,其中40%的时间花在理解命名——搞清楚这个 tmp、那个 flag、还有那个 handler2 到底是干嘛的。

换算一下:一个程序员每天8小时,有2.24小时在破译同事(或三个月前的自己)留下的命名谜语。

更扎心的数据:好命名的代码库比差命名的代码库,bug率低28%。不是因为命名能杀bug,是因为能看懂代码的人更容易发现bug——你连代码在干嘛都看不懂,怎么发现它干错了?

所以每次你花5秒随手起个 temp 然后赶着去写下一行,你不是在省时间。你是在写一封加密情书——收件人是三个月后的自己,而那时候你已经忘了密码。

高速公路路标理论

高速公路路标理论

我有个类比特别好用:变量名就像高速公路上的路标。

好的路标长这样:“南京 180km”。你瞟一眼就知道方向对不对、还有多远。

差的路标长这样:“前方有个地方”。你看了等于没看,还得停下来打开地图确认。

代码里的 userList 就是”南京180km”——一眼就知道这是用户列表。而 arr 就是”前方有个地方”——到底是什么的数组?用户?订单?报错信息?天知道。

这里有个反直觉的经济学:你在命名时”节省”的那10秒思考时间,会以10倍代价转嫁给每一个未来的代码读者。一个变量被命名一次,但被阅读几十上百次。你”省”了10秒,未来的读者们累计要多花100秒去猜。

这笔账,怎么算都亏。

三个立刻能用的命名框架

三个命名框架

好消息是:命名这事儿有套路。三个框架,今天看完,下一行代码就能用。

框架一:反转测试

方法很简单:写完一个名字,假装把它遮住,只看上下文——有几种可能的解释?

超过一种?名字不及格。

试试看:你写了个函数叫 process()。遮住名字,看函数体——处理支付?处理图片?处理用户注册? process 这个词约等于”做事”,跟没说一样。你不如直接叫它 doSomething(),至少坦诚。

改成 resizeUploadedAvatar(),再做反转测试——遮住名字看函数体,只有这一种解释。通过。

框架二:作用域比例法则

一句话版本:变量活多久,名字就该多长。

循环里的 i,三行之后就死了,叫 i 天经地义。你给它起名 currentIterationIndex,同事会觉得你按行数算工资。

但一个活了200行的变量还叫 x?那是在制造悬疑小说——读者翻到第180行时已经完全忘了第20行的 x 是个什么东西。

规律是这样:

  • 3行作用域 → inok 够用
  • 30行作用域 → retryCountuserList 比较合适
  • 300行作用域 → maxDatabaseConnectionTimeoutInSeconds 虽然长到离谱,但每次读到都不用查文档

框架三:动词-名词公式

函数命名的万能句式:动词 + 名词(+ 条件)。读出来应该像一句正常的话。

  • getUserById() — “根据ID获取用户”,一句话说清楚
  • validateEmailFormat() — “验证邮箱格式”,没有歧义
  • sendPasswordResetEmail() — “发送密码重置邮件”,八岁小孩都能懂

如果一个函数名怎么都拼不成一句通顺的话,别怪名字——大概率是这个函数干了太多事。你不是有命名问题,你是有设计问题。

顺带送一个黄金法则:如果你需要写注释解释一个东西”是什么”,说明名字取砸了。 好名字自带说明书。注释应该用来解释”为什么这么做”,而不是”这是什么”。

5分钟 vs 5天

高手花5分钟起名,一次写对。三个月后回来看代码,像看一封写给未来自己的情书——字字清晰,句句温暖。

新手花5秒起名,然后花5天debug。三个月后回来看代码,像考古——flag2 控制什么?tmp3 存的啥?data 是哪个 data?线索全断了。

命名不性感。它不会让你肾上腺素飙升,不会让你想发朋友圈炫耀。但你review过的每一份让你舒服的代码,背后都站着一个愿意多花10秒想名字的人。

下次在 data 脱口而出之前,停一下。问自己:这东西,到底是什么?

能回答这个问题的人,写出来的代码不会差。