Бизнес-архитектура вашего успеха. Разбираемся с Domain-Driven Design

Предметно-ориентированное программирование (англ. — Domain-Driven Design или DDD) — это методология разработки программного обеспечения, которая формирует единый язык для разработчиков и других участников процесса и использует для построения архитектуры концепцию реального мира. Главная цель DDD — упрощение процесса разработки.

Бизнес-архитектура вашего успеха. Разбираемся с Domain-Driven Design
© It-world

Основные принципы, на которых строится подход предметно-ориентированного программирования:

● Единый язык — разработчики, менеджеры, аналитики и другие участники процесса вырабатывают на встречах список ключевых терминов и придерживаются их во всех процессах. Например, у нас в «Авито» мы договорились, что запись в базе данных будет называться объявлением, пользователь — продавцом или покупателем, вместо CRUD-операций используем конкретные бизнес-сценарии. В бизнесе часто бывает такое, что менеджер и разработчик, упоминая разные термины, говорят об одних и тех же вещах и не понимают друг друга. Единый язык помогает этого избежать.

● Ограниченные контексты — это небольшая область внутри бизнеса вокруг бизнес-процесса, где используется отдельный единый язык, свой для каждого ограниченного контекста. Например, ограниченный контекст «Доставка» содержит сущности «Товар» и «Пользователь», при этом последняя подразделяется на «Продавца» и «Покупателя». Переводя на бизнес-язык, можно сказать, что бизнес-процесс «Доставка» заключается в том, что Продавец отправляет Товар Покупателю. При этом, в рамках этого ограниченного контекста могут происходить различные дополнительные процессы — например, Покупатель может отказаться от Товара, получить его или отправить обратно Продавцу.

Ограниченные контексты формируют карту контекстов — то есть, сами контексты + взаимосвязи между ними.

Чтобы лучше понять DDD, давайте также разберемся в основных терминах:

Домен (domain) — это наша основная бизнес-область. В моем случае это «Авито» — доска-агрегатор объявлений. Чтобы работать в подходе DDD, мы проводим собрание, где определяем ключевые бизнес-процессы и разбиваем домен на поддомены.

Поддомены (subdomains) — это области, которые отражают основной функционал домена. В идеальном случае поддомены соответствуют ограниченным контекстам. При этом основная область называется смысловым ядром (core domain). То есть, именно над этой функциональностью работают лучшие специалисты компании, именно сюда в первую очередь вливается бюджет, и именно это определяет бизнес-ценность продукта. Также выделяются:

● служебные поддомены (supporting subdomain) — области, которые помогают ядру функционировать;

● неспециализированные поддомены (generic subdomain) — вспомогательные, но не критичные для функционирования ядра области, их можно заменить другими или отказаться от них.

Пространство задач — это смысловое ядро (core domain) + те поддомены, которые оно использует. Это пространство показывает стратегические задачи, которые решаются для выполнения главных бизнес-целей. Определение пространства задач влияет на выделения пространства решений.

Пространство решений — это конкретные ограниченные контексты, которые способствуют решению этих стратегических задач. То есть, это те IT-решения, которые помогают достичь бизнес-цели.

Как DDD используется на практике

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

Финансовая отрасль | Банковская система

● Доменная область: онлайн банкинг

● Ограниченные контексты: интернет-банкинг, обработка платежей и управление счетами, клиенты (физические и юридические лица)

● Ядро — обработка платежей, самая важная часть, где сосредоточена основная прибыль и риски бизнеса.

Здравоохранение | Информационная система для управления медицинскими записями

● Доменная область: медицинская система в поликлинике или больнице

● Ограниченные контексты: пользователи (пациенты, врачи), медицинские карты, процессы обслуживания, ОМС, ДМС

● Ядро — правила управления записями и взаимодействия между пациентами и врачами, то есть процессы обслуживания

Телекоммуникации | Система управления абонентскими данными

● Доменная область: управление абонентскими данными у провайдера телефонии

● Ограниченные контексты: биллинг, управление услугами и техническая поддержка

● Ядро — управление жизненным циклом абонентских данных и обработка событий (например, изменение тарифного плана)

Производство | Система управления производственными процессами

● Доменная область: мебельная фабрика

● Ограниченные контексты: управление запасами, логистика и производство

● Ядро — правила управления запасами и оптимизации производственных процессов

Туризм | Онлайн-система бронирования отелей

● Доменная область:транзакция между туристом и отелем

● Ограниченные контексты: функциональность для бронирования, учета клиентов и управления номерным фондом

● Ядро — бронирование номера клиентом

Образование | Информационная система для управления учебными курсами

● Доменная область: онлайн обучение

● Ограниченные контексты: создание курсов, функциональность для регистрации учащихся, проведения занятий и выставление оценок

● Ядро — проведение занятий и оценка полученных знаний

Примеры крупных российских компаний, уже использующих DDD: «Спортмастер», сеть медицинских клиник Медси, Тинькофф (онлайн-экосистема финансовых и лайфстайл-услуг), 1С (система 1С: Предприятие), «Додо-пицца» (собственная информационная система).

Личная история

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

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

Я, как разработчик, часто выдвигаю идеи по повышению эффективности процессов без потери в качестве и функциональности продуктов. Например, во время работы над проектом перепродажи смартфонов в «Авито» я руководил внедрением CRM для подключения новых партнеров. Моей задачей было создать сложнейший пользовательский интерфейс для партнеров, чтобы они могли управлять сотнями настроек. У руководства уже было предполагаемое решение, но изучив вводные данные, я нашел другой путь, который в разы сократил сроки реализации с сохранением необходимой функциональности. В этом мне помогло понимание наших общих бизнес-целей.

Еще пример. В ходе разработки этой же платформы мы подключили для партнеров возможность выкупа устройств при подаче объявления, что дало нам преимущество перед перекупами. Для наглядности мы решили внедрить функцию сравнения временных затрат между прямой продажей и опцией выкупа для каждой модели. Такой функционал требовал долгой кропотливой работы аналитиков. Я предложил посчитать среднее значение перепродажи для iPhone и Android-телефонов, прописать в код эти значения и запустить продукт, а уже после внедрения (в течение пары недель) сделать более точный подсчет каждого значения. В итоге нам удалось запуститься раньше, не дожидаясь полной готовности системы, и донести ценность этой функции до пользователей. Опять же, мне помог в этом DDD, так как я был глубоко погружен в бизнес-процессы и знал, чего хотят пользователи.

Ценность DDD для бизнеса

Главная ценность подхода — это упрощение коммуникации внутри проектов и снижение риска недопонимания, что очень важно для предотвращения ошибок на ранних этапах разработки.

DDD способствует построению гибкой IT-архитектуры, которая легко адаптируется к изменениям в бизнес-правилах, что особенно важно в постоянно развивающихся, масштабируемых бизнесах.

Предметно-ориентированное программирование предполагает итеративное уточнение доменной модели, на основе которой мы строим цифровой продукт. Домен совершенствуется и обновляется на основе новых данных и обратной связи от экспертов и пользователей. Это позволяет создать наиболее эффективное решение, которое будет удовлетворять пользователей и приносить прибыль бизнесу.

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

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

DDD и другие области программирования

DDD активно использует концепции объектно-ориентированного программирования (ООП), строя модели вокруг объектов и их взаимодействия. Это обеспечивает более наглядное представление бизнес-сущностей.

Архитектурные паттерны (микросервисная архитектура или CQRS) успешно интегрируются с DDD. Подход позволяет структурировать службы и их взаимодействие, что соответствует современным архитектурным требованиям.

Принципы также согласуются с идеями реактивного программирования при моделировании асинхронных и распределенных систем. Это особенно важно при обработке потоков событий.

В сфере тестирования DDD способствует взаимопониманию между разработчиками и тестировщиками. Единая терминология, понятная бизнес-экспертам, облегчает проверку соответствия доменной модели требованиям бизнеса.

Таким образом, эта методология успешно используется совместно с другими методами и подходами к программированию для создания комплексных и адаптивных решений.

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

DDD станет вашим верным помощником в создании программных решений, способных гибко адаптироваться к вызовам современного бизнеса.