联系支持

我们通过电子邮件回复,通常两天内。

为防止滥用,Google reCAPTCHA 会检查这次提交,其间会向 Google 传输数据。脚本只在你打开此表单时才加载。

← 全部文章

没有任何东西会写入的那几个字段

这里的计数器主表有 166 436 行,还有若干看起来很要紧的字段。其中三个是 lastdomainfirstdomainuserdomain。它们里面装着数据:

lastdomain在 15 525 行里非空
firstdomain在 15 457 行里非空
userdomain在 2 982 行里非空

没有任何东西会写入它们。整个代码库里没有一条语句设置过这三个中的任何一个。这些值来自本服务的上一代,冻结在它停止运行时的样子,而此后创建的每一行都是空的。

为什么这比一个空字段更糟

一个完全空的字段显然是死的。没有人会在它上面搭东西,没有人会拿它出报表,没有人会花一个下午琢磨它是什么意思。

一个在 9 % 的行里有值的字段是个陷阱。它看起来像一个有时被填、有时不被填的字段——而这对一个字段来说完全正常。发现它的人会合理地推断:存在某条规则决定它什么时候被设置,然后开始去找那条规则。规则并不存在。

而且这些过时的值并没有被收在沉睡的行里、待在伤不到人的地方。在带有 lastdomain 的那些行中,有 1 613 行属于今年仍在更新的计数器。一个带着十年前记下的域名的活计数器,和一个带着当前域名的活计数器,看上去分毫不差。

更糟的是这些数据看着可信。它们是域名,看起来就像计数器的域名,而一个按它们做连接的查询确实会返回行。它回答的是一个关于早已向前走了的网络的问题。

怎么快速判定

去搜写入,不要搜名字。一个字段名会出现在 SELECT 列表里、在表结构导出里、在旧的迁移脚本里、在注释里——这些都证明不了任何事情。真正定案的是:有没有任何一条 INSERTUPDATE 提到它。这次搜索花一分钟,而且它的结论性是围着代码读来读去所达不到的。

第二道检查是数据本身:如果带值的最新一行已是数年之前,那这个字段就是化石,不管代码看起来在说什么。

它们为什么还在

删掉一个字段很便宜,但不是免费。这些行每一行都属于某个人的计数器,其中有些从 2006 年一路不间断地跑到今天,而在这样一张表上改结构之前,安全的做法是有一份你真正还原过一次的备份,而不是仅仅生成过一份。在这件事本身值得做之前,三个没人用的字段除了造成困惑之外不花什么代价。

于是改成把它们记录下来。这条注记没有一个显而易见的去处——这个数据库的表结构只存在于运行中的数据库里,仓库里没有任何一个文件写着它——所以它去了一个真会有人绊到的地方:读取计数器行的那个类里,正好在这几个字段经过的位置。一条写在没人打开的文件里的注记不算文档。它只有躺在路上,才能把一个陷阱变成一个脚注。

广告