メニュー

公開日:
6 min read
エンジニアリング

オフショア開発地獄絵図 その3:ログを配列で代用する狂気

オフショア開発地獄絵図 その3:ログを配列で代用する狂気のイメージ

よくある質問 (FAQ)

オフショア開発で作られたマーケティングツールの問題点は何でしたか?

DMからLPへの誘導システムで、アクセス解析がおかしいという問題が発生しました。実装を確認すると、アクセスログを記録せず、メール詳細データの顧客IDリストに追加するだけの実装でした。

通常のマーケティングツールではどのようなアクセス解析が可能ですか?

適切に設計されたシステムでは、顧客ごとのアクセス回数、時間帯別アクセス数、リピート率、滞在時間などのマーケティングの基本データが全て取得できます。

ログを取らない実装の具体的な問題点は何ですか?

ログを取らないため、「誰が何回アクセスしたか」という最も重要な情報が失われます。顧客Aが2回、顧客Bが1回アクセスした場合も、顧客C、D、Eが1回ずつアクセスした場合も、同じ顧客数とアクセス数に見えてしまいます。

データベース設計の問題点は何でしたか?

contact_ids[]という配列フィールドを使用しており、データベースの第一正規形(一つのフィールドには一つの値)に違反していました。これにより検索不可能、集計不可能、整合性なし、スケーラビリティゼロという問題が発生しました。

第一正規形とは何ですか?

1970年代にE.F.Coddが提唱した、リレーショナルデータベースの基本中の基本です。一つのフィールドには一つの値という原則で、これを守らないと検索や集計が困難になります。

ログがないことで永遠に不可能になることは何ですか?

顧客分析(誰が何回アクセスしたか)、時系列分析(いつアクセスが集中するか)、効果測定(キャンペーンの成果測定)、問題調査(トラブル時の原因究明)が永遠に不可能になります。

なぜログの記録が重要なのですか?

データは後から作れないからです。集計は後からでもできますが、記録していないデータは永遠に失われます。これは大学の情報系学部や専門学校でも教える基本的な概念です。

プロローグ:新たな絶望

都道府県がランダムに並ぶCRMを修正し、数万件のデータをJSONで送るメール配信機能に呆れ、勝手にダウングレードされたDBに怒りを覚えた。

もう驚くことはないと思っていた。俺が甘かった。

クライアントから新たな相談が来た。DMからLPへの誘導システムについてだ。

「アクセス解析がおかしいんです」

また始まった。今度は何だ?

第一章:マーケティングツールという名の玩具

システムの仕様はシンプルだ。

  1. 顧客にメールを送る
  2. メールには顧客を識別できるURLを埋め込む
  3. 顧客がリンクをクリックしてLPにアクセス
  4. アクセス件数とアクセスした顧客を表示

どこにでもあるマーケティングツールだ。俺なら30分で設計が終わる。

当然、アクセスログを記録する。タイムスタンプ、顧客ID、リファラ、IPアドレス。基本中の基本だ。表示時はログを集計すれば、いくらでも分析できる。

  • 顧客ごとのアクセス回数
  • 時間帯別アクセス数
  • リピート率
  • 滞在時間

マーケティングの基本データが全て取れる。

第二章:ログという概念の不在

コードを見て、俺は言葉を失った。

彼らの実装は、LPにアクセスがあると:

  1. メール詳細データの顧客IDリストに追加
  2. アクセス回数をカウントアップ

それだけだった。

ログを取っていない。

つまり、こういうことだ。

  • 顧客Aが2回、顧客Bが1回アクセス → 顧客2人、アクセス3回
  • 顧客C、D、Eが1回ずつアクセス → 顧客3人、アクセス3回

全く違う状況なのに、見た目の数字は似ている。だが、このシステムでは「誰が何回」という最も重要な情報が失われる。

さらに調査を進めて、俺は怒りで手が震えた。データベース設計を見たのだ。

   メール配信テーブル
- mail_id
- subject
- body
- send_date
- count_lp
- contact_ids[]

配列フィールド。可変長の顧客IDリスト。これを見た瞬間、俺は確信した。

こいつらはデータベースを知らない。

第一正規形。1970年代にE.F.Coddが提唱した、リレーショナルデータベースの基本中の基本。一つのフィールドには一つの値。これすら守られていない。

なぜこれが最悪なのか:

  • 検索不可能:特定の顧客がアクセスしたメールを探せない
  • 集計不可能:SQLでGROUP BYができない
  • 整合性なし:同じ顧客IDが重複しても気づかない
  • スケーラビリティゼロ:配列が大きくなれば死ぬ

さらにcount_lpという冗長なフィールド。配列の要素数と一致する保証はどこにもない。データの整合性という概念が存在しない世界だった。

第三章:「要件は満たしています」

管理者SEに問い詰めた。返ってきた答えがこれだ。

「要件は満たしています。画面にはLPごとのアクセス件数とアクセスしたユーザーが表示されています」

俺は深呼吸した。怒りで手が震える。タバコをやめて20年、また吸いたくなった。

これは要件を満たしているのか?

否だ。

画面に数字が出ることと、システムとして機能することは違う。これは明らかに契約不適合だ。

第四章:失われた可能性

ログがないということは、以下が永遠に不可能ということだ:

  • 顧客分析:誰が何回アクセスしたか不明
  • 時系列分析:いつアクセスが集中するか不明
  • 効果測定:キャンペーンの成果が測定不能
  • 問題調査:トラブル時の原因究明が不可能

マーケティングツールとして致命的だ。これは車輪のない自動車、翼のない飛行機と同じだ。

第五章:学生の実習以下

大学の情報系学部、いや、専門学校でも教える。

「ログは必ず取れ」

なぜか?データは後から作れないからだ。集計は後からでもできる。だが、記録していないデータは永遠に失われる。

これは学生の実習以下だ。学生なら「なぜログが必要か」を学ぶ機会がある。だが、彼らにはその機会すらなかったのか、それとも学ぶ気がなかったのか。