ロジックを一行も書く前から、データは嘘をついていた

長いあいだ、自分の問題はコードの中にあると信じていた。結果がおかしくなると、自分のロジックを、モデルを、誇りに思っていた巧妙な部分を漁って原因を探した。だが本当の犯人は、ほとんどいつもそのすべての一段下に、静かに、検証もされないまま座っていた。データそのものだ。それはきれいに見えた。だが、きれいではなかった。そしてその上に築いたものはすべて、忠実にその嘘を受け継いでいった。

これは存在しうる中で最も退屈な種類の失敗であり、だからこそ危険なのだ。誰も数字の行を監査することに時間を費やしたくない。だから誰もやらず、腐敗は底に居座り、すべてを支えてしまう。

きれいなデータという神話

生の市場データは、安心するほど整然として見える。きちんと並んだ行、秩序立ったタイムスタンプ、まともそうな数字が順番に行進していく。その整然さは衣装にすぎない。実世界のデータは、ときどき壊れる実システムから集められたものであり、自らを名乗らない小さな破損だらけだ。瞬間がただ抜け落ちているギャップ、重複したエントリ、ずれたり噛み合わなかったりするタイムスタンプ、障害中に固まって同じ値を繰り返すもの、ときおり現れるあり得ない数値、まるごとひと続きで微妙にずれている区間。

これらは何ひとつ警告ラベルを付けて届かない。それは良いデータとまったく同じに見える。なぜなら同じきちんとした行の中に座っているからだ。フォーマットは中身が正直でないときでさえ正直であり、ひと目で見えるのはそのフォーマットだけなのだ。

ゴミを入れれば、自信たっぷりのゴミが出てくる

腹に落とすべきなのは、システムはデータが間違っていることを知らないという点だ。知りようがない。渡されたものを何であれ受け取り、破損を、真実に向けるのとまったく同じ几帳面さで処理し、そして腐敗の上に築かれたきれいで自信に満ち、プロフェッショナルに見える結果を生み出す。

罠の全体がまさにそこにある。出力は問題なく見える。破損は、問題箇所を指し示してくれる明白で大声の悲鳴のようなエラーとして伝播しない。それはもっともらしい誤答として伝播する。まったく信じられそうな、直感のチェックを通り抜ける、その上に喜んで次のものを築いてしまう結果として。誤りが表面化する頃には、もし表面化することがあればだが、それは足元の床が固いと前提したいくつもの作業の層の下に埋もれている。

もっともらしさの中に隠れるエラー

ゆっくりと、危険なデータエラーは明白なものではないと学んだ。価格がゼロ、まる一日丸ごと欠落、明らかにナンセンスな値——そういうものは捕まえられる。なぜなら見た瞬間に不合理だからだ。最初の健全性チェックに引っかかる。

実際に痛手を与えるのは、もっともらしいエラーだ。間違っているが、それでも信じられる範囲にきちんと収まっている値。一単位だけずれたタイムスタンプ。上流の何かが黙って推測で埋めたギャップ。これらは持っているあらゆる健全性チェックを真っ直ぐすり抜ける。なぜなら正当なデータとまったく同じに見えるからだ——何か別のものと突き合わせて検証しに行かない限り、真実と見分けがつかない。最も高くつく破損は、正しく見えるだけの礼儀正しさを持った種類のものだ。

私はビルの間違った階をデバッグしていた

恥ずかしくなるほど長いあいだ、何かがおかしな結果になったときの私の本能は、自分のロジックの中に——システムの興味深く洗練された部分、考える価値があると感じていた部分に——バグを探しに行くことだった。バグはほとんど決してそこにはなかった。それは下にあった。データの中に、入力についての、ただ一度も検証する気にならなかったある前提の中に。

私は事実上、基礎を貫いて走る亀裂の出どころを、ビルの上層階で探していた。エレガントなコードを何度も何度も点検し、何も悪いところを見つけられず、ますます当惑していった——なぜなら、そこには何も悪いところがなかったからだ。それは悪い入力を悪い出力へと正しく処理していた、設計どおりにそのまま。ロジックは無罪だった。それが立っていた地面が有罪だったのだ。

データ品質は終わらせられるタスクではない

より謙虚にさせられた気づきのひとつは、データを一度きれいにしてそれで終わり、とはならないということだった。それは幻想だ。新しいデータは届き続け、それは新しい破損とともに届く。あるソースが黙ってフォーマットを変える。上流のプロバイダが障害を起こし、そのギャップを怪しげな何かで後追いで埋める。何か月も信頼できていたものが、ありふれた火曜日に新奇なやり方で壊れる。

データ品質とは、リストにチェックを入れて済ませる一回限りの掃除ではないのだと、私は理解するに至った。それは継続的な規律だ——あらゆる入力に対する疑いの姿勢を永遠に保ち続けること。なぜなら、見張るのをやめた瞬間こそが、新しく独創的な破損が誰にも咎められず歩いて入ってくる瞬間だからだ。

容赦なく検証し、何も信じるな

実務的な解決策は、すべての入力を、きれいだと証明されるまで有罪として扱うことだった。ギャップをチェックする。重複をチェックする。あり得ない値を、着実に前へ進まないタイムスタンプを、実データなら決して起こさないやり方で数字が変化を止める疑わしい区間を、チェックする。そして決定的に重要なのは、これらのチェックをパイプラインの中に直接組み込むことだ。そうすれば、破損は何か月も後になって、もう追跡できない結果の中の説明のつかない奇妙さとして発見されるのではなく、届いた瞬間に玄関先で大声を上げて捕まる。

それは退屈で、防御的で、まったく華のない作業だ。それはまた、下流のすべてが岩の上に築かれるのか砂の上に築かれるのかを決める作業でもある。玄関先での大声の失敗は贈り物だ。受け継いでその上に築いてしまう静かな失敗は、ゆっくり進む大惨事だ。

より深い教訓——基礎が天井を決める

このすべての根底にある原理はシンプルで、容赦がない。上に乗ったモデルがどれほど見事でも、下のデータの腐敗を埋め合わせることはできない。築くものすべての品質は、与えるものの品質によって絶対的に頭打ちになる。悪い入力から推論で抜け出すことはできない。その上に、より自信に満ち、より手の込んだ誤りを生み出せるだけだ。

だから、きれいな入力を保証するという退屈で報われない労働は、私がかつて扱っていたように本当の仕事の下にあるものではない。それは本当の仕事の基礎そのものであり、その上の構造全体は、その土台が正直である分だけしか正直になり得ない。私はかつて、それを飛ばして興味深い部分にたどり着きたかった。今は理解している。下にある退屈な部分が嘘をついているなら、興味深い部分には何の価値もないのだと。

— シグナルなし、リターンなし、投資助言ではありません。