TT Lab
开始
学习 学习路径 课程

面对陌生系统

同一个词在三套系统里是三个意思

在 TT Lab 中继续学习

一句话总结

对于“活跃客户有多少”这个问题,三个人可以给出三个数字,而且三个可能都对。如果不把术语绑定到标识符上,之后所有的数字都会悄无声息地错位。

为什么需要它

到了现场的第二天前后,你会被叫去开会。有人问“上个月的活跃客户有多少”,销售负责人说 3.4 万,计费负责人说 3.1 万,运营负责人说 2.6 万。三个人用诧异的眼神互相看着。

其实谁都没有错。销售系统统计的是客户表中状态字母为 A 的行,计费系统统计的是可以计费的账户,运营系统统计的是最近 30 天内登录过的人。这三个定义在各自的业务中都是对的。错的是相信一个词已经涵盖了三个定义。

这种错位之所以可怕,是因为它不会表现为错误。查询成功,仪表板画出数字,报告照常打印。它暴露的时刻,通常已经是用这个数字做出决定之后了。

工作原理

解决办法不是禁止某些词。人们会继续说“客户”,也应该继续说。取而代之的是建立一张把词和标识符连起来的表。逐行写明一个术语在每个系统里是以什么条件选取了哪张表的哪一列,从那时起,数字即使对不上也能得到解释。

对照表的一行要包含四项:系统、表、标识符列,以及条件。缺了条件,这张表只有一半的用处。因为“活跃”的差别不在表,而在条件。

建好表之后,要用数字来确认:测量同名的集合在每个系统里有多大,以及两个集合重叠多少。重叠用交集和差集来看,如果想压缩成一个数字,就用杰卡德(Jaccard)系数。

자카드 계수 = |A 교집합 B| / |A 합집합 B|

1.0  두 집합이 완전히 같다        — 이름이 같아도 괜찮다
0.8  대체로 같고 한쪽이 조금 넓다  — 경계 조건을 확인한다
0.0  겹치는 것이 없다             — 같은 이름을 쓰면 안 되는 관계다

该代码块中的韩文依次说明:杰卡德系数等于 A 与 B 的交集除以 A 与 B 的并集;1.0 表示两个集合完全相同,名称相同也无妨;0.8 表示大体相同、一边略宽,需要确认边界条件;0.0 表示没有任何重叠,这是不能使用同一个名称的关系。

这里还有一个大多数人会栽跟头的地方:要比较两个集合,先得确定什么才算“同一个”。假设用邮箱来关联人。销售系统里是 User07@Example.com,计费系统里是 user07@EXAMPLE.COM,运营系统里是末尾带空格的 user07@example.com 。这三个能算同一个吗?

RFC 5321 的第 2.4 节对这个问题给出了准确的答案:邮件地址的本地部分(local part,@ 之前)区分大小写(MUST BE treated as case sensitive)。而域名遵循 DNS 的规则,所以不区分。按规范来说,User07@Example.com 和 user07@example.com 是不同的地址。同一节接着还写道,实际区分本地部分的大小写会损害互操作性,因此不建议这样做。

所以现场使用的规范化只有两种。

哪一种正确,不由文档决定,而是由这位客户的系统决定。重要的不是选择本身,而是把选定的规则写下来,并且在所有统计中使用同一条规则。换了规则,重叠情况就会整个不同:上面的三个系统按规范来看,没有一个人是重叠的,而全部转为小写后,几乎全部重叠。

在现场相遇的样子

第一,“名称不同但其实相同”比“名称相同但其实不同”更常见。销售称之为 email,计费称之为 billing_email,运营称之为 login_email,三者指的却是同一个人。名称不同,所以没有人去对照,也就没有人知道同一个人在三个系统里出现了三次。

第二,完全不同的东西也可能用了同一个名称。仓库运营团队用“订单”这个词表示仓库作业指令。销售的 300 条订单和运营的 180 条订单,没有一条是重叠的。这种关系,杰卡德系数为 0,一眼就能看出来。只要有这张表,5 分钟就能查明的事,因为不知道而白白摸索了 2 周。

第三,把对照表写在会议纪要里,它就会消失。要把它作为文件保存,并让汇总工具读取这个文件。这样,术语定义变化时,数字也会一起变化;如果没有变化,就说明有人没有修改对照表。

第四,发现冲突后,不能马上着手去改。提议把三个系统的“活跃”定义统一起来,就等于提议同时改变三个团队的业务。第一周要做的不是统一,而是在每份报告里写明用了哪个定义。

实际工作中真正重要的事

下一项实验要做什么

拿到(虚构的)Hana 流通的三个系统装在同一个文件里的快照。用对照表写明三个系统分别把“客户”“活跃”“订单”对应到哪张表的哪一列、按什么条件选取,测量集合的大小,并两两比较得出重叠。然后分别按规范和按系统的实际行为各做一次标识符规范化,看答案如何整个改变。评分器会在每次以不同的表和值生成的数据库上真实运行你的汇总程序,并核对数字。最后把“同名不同集合”和“异名同集合”区分开,写成报告提交。