在我写下一行逻辑之前,我的数据就已经在撒谎
很长一段时间里,我都坚信问题出在我的代码里。每当结果不对,我就去翻查自己的逻辑、模型,还有那些我引以为傲的精巧部分。可真正的元凶几乎总是潜伏在这一切之下的某一层,安静而无人问津:数据本身。它看上去很干净,其实并非如此。而我在它之上构建的一切,都忠实地继承了这个谎言。
这是世上最枯燥的一类故障,恰恰因此才如此危险。没有人愿意花时间去审查一行行的数字。于是没人去做,腐烂就一直躺在最底层,支撑着上面的一切。
干净数据的神话
原始市场数据看上去整洁得令人安心。整齐的行、有序的时间戳、一个接一个排着队、看起来合情合理的数字。这份整洁是一身伪装。从偶尔会出故障的真实系统里采集来的真实数据,布满了不会自报家门的小型损坏:缺口处某些时刻干脆缺失、重复的条目、漂移或错位的时间戳、在宕机期间冻结并重复的数值、偶尔出现的不可能的数字、整段被悄悄挪离原位的数据。
这一切都不会附带警告标签。它看上去和好数据一模一样,因为它就坐在同样整齐的行里。格式是诚实的,哪怕内容并非如此,而格式正是你一眼所能看到的全部。
垃圾进,自信满满的垃圾出
需要内化的一点是:系统并不知道数据是错的。它无从知道。你递给它什么,它就处理什么,对待损坏数据时所用的勤勉,与对待真相时分毫不差,然后它会在腐烂之上产出一份干净、自信、专业模样的结果。
整个陷阱就在这里。输出看起来没问题。损坏并不会以那种显眼、尖叫着把你指向问题的错误形式传播。它以貌似合理的错误答案的形式传播——那些结果完全可信,能通过你的直觉检验,让你乐呵呵地在它之上构建下一样东西。等到错误终于浮出水面时(如果它还会浮出来的话),它早已被层层工作埋住,而这些工作全都假定脚下的地面是坚实的。
藏在合理性里的错误
我慢慢明白,危险的数据错误并不是那些显而易见的。价格为零、整整一天的数据缺失、明摆着是胡扯的数值——这些你能抓住,因为它们一眼看上去就荒谬。它们会触发第一道理智检验。
真正伤到你的,是那些貌似合理的错误。一个错了、但仍稳稳落在可信范围内的数值。一个差了一个单位的时间戳。一个被上游某处悄悄用猜测填上的缺口。这些会径直穿过你所有的理智检验,因为它们看上去和合法数据一模一样——若不专门拿别的东西去核对,它们与真相无从分辨。最昂贵的那种损坏,是礼貌到让自己看起来正确的损坏。
我一直在排查这栋楼里错误的那一层
在一段长得令人难堪的时间里,每当结果出现异常,我的本能就是去逻辑里找 bug——去系统里那个有趣、精巧、我觉得值得琢磨的部分里找。可 bug 几乎从来不在那儿。它在下面,在数据里,在某个关于输入的假设里,而那个假设我压根从没费心去验证过。
实际上,我是在一栋楼的顶层四处搜寻一道裂缝的源头,而那道裂缝其实贯穿在地基里。我会一遍又一遍地检查那些优雅的代码,什么毛病都找不出来,然后愈发困惑——因为它本来就没毛病。它在完全按设计,正确地把坏输入处理成坏输出。逻辑是无辜的。它所立足的地面才是罪魁。
数据质量不是一件能做完的任务
更让人谦卑的领悟之一是:你不能把数据清理一次就甩手不管。那是幻想。新数据源源不断地到来,而它带着新的损坏到来。某个数据源悄悄改了格式。某个上游提供方宕机,然后用一些可疑的东西回填缺口。某个稳定运行了几个月的东西,会在某个平平无奇的周二,以一种全新的方式坏掉。
我渐渐明白,数据质量不是一次性、能从清单上勾掉的清理工作。它是一种持续的修行——一种对每一个输入永远保持怀疑的姿态,必须永远维持下去,因为你停止盯防的那一刻,恰恰就是一种全新又有创意的损坏畅通无阻地走进来的那一刻。
无情地校验,什么都不要相信
实际的解法,是把每一个输入都当作有罪的,直到它被证明干净。检查缺口。检查重复。检查不可能的数值,检查那些没能稳步向前推进的时间戳,检查那些可疑的区段——某个数字以真实数据绝不会有的方式停止变化。而至关重要的是,把这些检查直接构建进流水线里,让损坏在大门口、在它到达的那一瞬间就被响亮地抓住,而不是几个月后才被发现,化作某个你再也追溯不出来路的结果里那股无法解释的怪异。
这是繁琐、防御性、毫不光鲜的活儿。但它也正是决定下游一切究竟建在岩石上还是沙子上的那件活儿。大门口一次响亮的失败是一份礼物。一次被你继承下来、并在其上层层构建的无声失败,则是一场缓慢的灾难。
更深的教训:地基决定了天花板
这一切之下的原理,简单而不留情面。无论顶层模型多么出色,都无法弥补底层数据的腐烂。你所构建的一切,其质量都被你喂给它的东西的质量绝对地封顶。你没法靠推理摆脱坏输入;你只能在它们之上产出更自信、更精致的错误。
所以,保证输入干净这件枯燥、不讨好的劳作,并不像我过去对待它那样,低于真正的工作。它就是真正工作的地基,而上面的整座结构,永远只能和那个基座一样诚实。我过去总想跳过它,直奔有趣的部分。如今我明白了:如果底下那个枯燥的部分在撒谎,有趣的部分一文不值。
— 没有信号,没有收益,不构成投资建议。