初日からSeam(継ぎ目)を構築せよ

大規模データを扱うプラットフォームの構築には、選択を迫られる局面があります。

長期保存には高速なデータベースが必要ですが、初日から複雑なシステムを構築するのは困難です。まだデータのパターンさえ把握できていないかもしれません。安全な選択肢は、すでに使い慣れている標準的なリレーショナルデータベースです。

間違いは、コードをその最初のデータベースに直接結びつけてしまうことです。アプリのあらゆる部分がデータベースを直接呼び出すようになると、それは罠となります。後でより優れたデータベースに切り替えようとしたとき、大規模なリファクタリングが必要になってしまいます。

正しい策は、「Seam(継ぎ目)」を作っておくことです。

Seamとは「契約」です。それは「どのように行うか」ではなく、「何を行うか」を定義します。

  • タスクのためのインターフェースを作成する。
  • 現在のデータベースを使用した基本的なドライバーを作成する。
  • そのドライバーをインターフェースにバインドする。

アプリの他のすべての部分は、インターフェースに対してのみ通信します。バックグラウンドでどのデータベースが動いているかは、誰も知りません。

データが増大し、より高速なシステムが必要になったとき、作業は簡単です。新しいドライバーを書き、コードを1行変更して、リリースするだけです。ダッシュボードが壊れることも、パイプラインが止まることもありません。

これを「早すぎる抽象化」と呼ぶ人もいます。まだ必要ないと言う人もいます。

私はそうは思いません。インターフェースを作るコストは、ファイルが1つ増える程度です。それを避けても、コストを後回しにしているだけです。いざ変更が必要になったとき、プレッシャーの中で何百ものファイルを修正することになります。インターフェースは、安価な保険なのです。

Seamをより強固にするために、次の3つの習慣を取り入れましょう。

  • 二重の識別子を使用する。内部的なデータベースの結合には高速な整数を使用し、システム外に出るものにはUUIDを使用します。これにより、データのセキュリティを保ちつつ、結合を高速化できます。

  • 共通言語としてEnum(列挙型)を使用する。ステータスや重要度(severity)にランダムな文字列を使用しないでください。単一のEnumを使用することで、アプリのあらゆる部分が同じ言語で話せるようになります。

  • データにはバージョン管理されたエンベロープ(包み)を使用する。システムが多くのソースからデータを受け取る場合は、厳格なスキーマを使用してください。新しいフィールドを追加するのみにとどめ、新しいバージョンなしにフィールドを削除したり名前を変更したりしないでください。これにより、システムを改善している間も古いクライアントを動作させ続けることができます。

境界を見つけ、それを契約(contract)として定義し、シンプルな実装で満たしてください。

契約はあなたの「約束」です。ドライバーは、今日その約束を守るための手段に過ぎません。

Source: https://dev.to/nasrulhazim/build-the-seam-on-day-one-the-second-driver-on-day-ninety-26b