起名5秒debug5天:命名才是编程第一技能
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行作用域 →
i、n、ok够用 - 30行作用域 →
retryCount、userList比较合适 - 300行作用域 →
maxDatabaseConnectionTimeoutInSeconds虽然长到离谱,但每次读到都不用查文档
框架三:动词-名词公式
函数命名的万能句式:动词 + 名词(+ 条件)。读出来应该像一句正常的话。
getUserById()— “根据ID获取用户”,一句话说清楚validateEmailFormat()— “验证邮箱格式”,没有歧义sendPasswordResetEmail()— “发送密码重置邮件”,八岁小孩都能懂
如果一个函数名怎么都拼不成一句通顺的话,别怪名字——大概率是这个函数干了太多事。你不是有命名问题,你是有设计问题。
顺带送一个黄金法则:如果你需要写注释解释一个东西”是什么”,说明名字取砸了。 好名字自带说明书。注释应该用来解释”为什么这么做”,而不是”这是什么”。
5分钟 vs 5天
高手花5分钟起名,一次写对。三个月后回来看代码,像看一封写给未来自己的情书——字字清晰,句句温暖。
新手花5秒起名,然后花5天debug。三个月后回来看代码,像考古——flag2 控制什么?tmp3 存的啥?data 是哪个 data?线索全断了。
命名不性感。它不会让你肾上腺素飙升,不会让你想发朋友圈炫耀。但你review过的每一份让你舒服的代码,背后都站着一个愿意多花10秒想名字的人。
下次在 data 脱口而出之前,停一下。问自己:这东西,到底是什么?
能回答这个问题的人,写出来的代码不会差。