Создайте стык (seam) в первый же день

Создание платформы для обработки больших объемов данных заставляет сделать выбор.

Вам нужна быстрая база данных для долгосрочного хранения. Но развертывание сложной системы в первый же день — задача непростая. Вы можете даже не знать паттернов ваших данных. Безопасный выбор — стандартная реляционная база данных, которую вы уже используете.

Ошибка заключается в том, чтобы привязывать код напрямую к этой первой базе данных. Если каждая часть вашего приложения обращается к базе напрямую, вы создаете ловушку. Переход на более подходящую базу данных позже потребует масштабного рефакторинга.

Правильное решение — создать стык (seam).

Стык — это контракт. Он определяет, что делает система, не уточняя, как именно она это делает.

  • Создайте интерфейс для задачи.
  • Напишите базовый драйвер, использующий вашу текущую базу данных.
  • Привяжите этот драйвер к интерфейсу.

Все остальные части вашего приложения взаимодействуют только с интерфейсом. Никто не знает, какая база данных работает в фоновом режиме.

Когда объем данных вырастет и вам понадобится более быстрая система, работа будет простой. Вы напишете новый драйвер, измените одну строку кода и выпустите обновление. Дашборды не сломаются. Пайплайны не остановятся.

Некоторые называют это преждевременной абстракцией. Они говорят, что она вам пока не нужна.

Я не согласен. Интерфейс стоит вам всего одного дополнительного файла. Отказ от него лишь переносит расходы на более поздний срок. Когда вам наконец потребуется внести изменения, вам придется исправлять сотни файлов в условиях цейтнота. Интерфейс — это дешевая страховка.

Используйте эти три привычки, чтобы сделать ваши стыки надежнее:

  • Используйте двойную идентификацию. Используйте быстрые целые числа для внутренних соединений (joins) в базе данных. Используйте UUID для всего, что покидает вашу систему. Это обеспечит безопасность данных и высокую скорость соединений.

  • Используйте Enums для общего словаря. Не используйте произвольные строки для статусов или уровней важности. Используйте единый Enum, чтобы каждая часть вашего приложения говорила на одном языке.

  • Используйте версионированные оболочки (envelopes) для данных. Если ваша система получает данные из множества источников, используйте строгую схему. Только добавляйте новые поля. Никогда не удаляйте и не переименовывайте их без выпуска новой версии. Это позволит старым клиентам продолжать работу, пока вы совершенствуете систему.

Найдите границу. Опишите её контрактом. Наполните её простой реализацией.

Контракт — это ваше обещание. Драйвер — это лишь то, как вы выполняете это обещание сегодня.

Источник: https://dev.to/nasrulhazim/build-the-seam-on-day-one-the-second-driver-on-day-ninety-26b