В одном романе для того, чтобы подчеркнуть бесспорную красоту и поразительную сексуальность одной из героинь, автор использовал фразу: "She was a such kind of woman, that every man look at twice". Что в литературном переводе можно понять: "Она была такой женщиной, что каждый мужчина оборачивался ей в след".
И точно такую же фразу я могу применить к бесподобной книге "Предметно-ориентированное проектирование (DDD)" Эванса Эрика. К ней хочется возвращаться каждый раз, когда ты садишься за проектирование системы в незнакомой тебе области. Словно маяк во время шторма, она помогает вести вашу галеру через сложности, чтобы все гребцы увидели землю, а проект увидел успешный старт.
И в этом обзоре, я расскажу, почему, по моему мнению, это MUST HAVE книга для каждого middle+ разработчика.
Как обычно выглядят книги по проектированию
Большинство книг по проектированию систем скатываются к тому, чтобы обсуждать какие-то конкретные шаблоны проектирования в абстрактной ситуации. Нам сначала описывается какая-то система в первоначальной ситуации, потом добавляются дополнительные условия в виде изменчивости системы, а потом рассказывается паттерн, как правильно построить код, чтобы системы была поддерживаемой и расширяемой.
Если это чуть более приземленные книги, то там уже описываются какие-то реальные кейсы из опыта практикующих программистов и архитекторов, как они строили код, чтобы сделать систему поддерживаемой и расширяемой. Иногда даже добавляется юмор, чтобы сделать повествование более приятным.
И главная проблема этих книг заключается в том, что они описывают какое-то четкое начальное состояние системы. Описывают вызовы стоящие перед системой. А потом дается алгоритм перевода системы из начального состояния в нужное, героически преодолевая трудности.
И это на самом деле крутые книги! Каждый программист должен их знать и применять паттерны в своей работе.
Но, что если у вас нет начального состояния
Представьте, что вас ночью вывезли из дома в непонятном направлении, по приезду посадили в темной комнате с пачкой непонятных бумаг, рядом посадили несколько товарищей по несчастью и сказали, чтобы вы написали систему доставки топлива к нефтяным танкерам. Что-то мне подсказывает, что ни паттерны банды четырёх, ни шаблоны корпоративных приложений Фаулера вам не помогут.
Что вам поможет? Понимание, с чего начать и куда двигаться, если кругом неизвестность. И именно про это на самом деле книга DDD Эванса.
Как понять, c чего нужно начать проектировать систему;
Как выделить в будущей системе ключевые понятия;
Как найти общий язык с заказчиком проекта, наладить диалог и трансфер знаний от специалистов области к программистам;
Как построить упрощенные модели, чтобы новые разработчики могли работать без понимания всего контекста бизнеса заказчика;
Как ограничить контекст работы, чтобы над проектом могли работать несколько команд разработчиков, не мешая друг другу;
Как выстраивать отношения с соседними командами, если у них либо низкая мотивация, либо слишком много воздействия на вашу команду;
И хотя может показаться, что это какие-то темы больше про менеджмент, нежели про написание кода. Это не так.
Эванс дает примеры из своей жизни, как ответы на эти вопросы кардинально меняли понимание того, как должна работать система. А значит все абстракции, которые до этого были написаны крутыми программистами - выбрасывались в мусорное ведро. Ведь программисты главным образом решают проблемы бизнеса, а не строят коней в вакууме.
Взаимоотношения не описываются схемами
Типичное желание любого программиста при проектировании системы расписать, либо модель классов и их отношения между собой, либо какой-то псевдокод того, как элементы системы зависят друг от друга.
Однако, по мнению Эванса, это не работает, так как не каждое взаимодействие в реальной жизни можно описать схематично. Поэтому нужно описывать будущую систему не с позиции того, как элементы зависят друг от друга, а что система должна делать с этими элементами и давать на выходе.
Это именно та проблема, когда разработчики героически преодолевают несуществующие проблемы, а заказчику нужно совсем другое.
Успех проекта не зависит от кода
Отдельно хочется выделить заключительную главу, где Эванс честно признается, что методология проектирования систем в ряде случаев оказывается бесполезной. Ибо либо заказчик урезает бюджет, либо уходят ключевые сотрудники, либо это просто становится никому не нужно и так далее. Что опять же возвращает читателя к мысли, что программисты должны решать проблемы бизнеса, а не строить коней в вакууме.
Одним словом мировой мужик, честно признает ограничения методологии.
Эта книга не нужна новичкам
Чтобы прочувствовать всю боль от ситуаций, которые описываются в книге, нужно иметь адекватный коммерческий опыт, желательно опыт при работе с большими заказчиками в неизвестной вам области. Прямо зайдет! Новички же книгу просто не поймут, и вряд ли смогут хоть как-то продуктивно использовать её опыт. Как говорится всему свое время.
Вперед к знаниям!
Если вы еще не знакомы с DDD, и не читали эту книгу, то обязательно выделите в своем графике саморазвития время на эту книгу. Без всяких сомнений она пойдет на пользу и углубит ваше понимание в проектировании систем.
pukinlou
Идеи в книге правильные, но как это все там описано - полнейший буллшит. Никому не могу порекомендовать ее читать, что бы разобраться c DDD есть более достойные книги/источники без лишней воды и двусмыслицы.
vku
Посоветуете конкретные?
aleksandy
Вот. Более понятно написана. Некоторые даже советуют начинать DDD с неё, а уже потом к синей книжке Еванса переходить.
playermet
А какие различия между Implementing Domain-Driven Design и более новой Domain-Driven Design Distilled того же автора (Vaughn Vernon)?
dest2r4
Одновременно изучал обе книги. Они скорее дополняют друг друга
BasicWolf
А вы сделайте скидку на то, что эта книга была издана ещё в 2004м году! Эта книга и её идеи лежат в основе современного ДДД.
merrygod
Пожалуйста, посоветуйте без воды и двусмыслия. Без шуток, очень нужно, я за последний месяц перечитал уйму информации по DDD и мне все больше кажется, что это больше религия с своими апосталами и трактовками.
marshinov
Нескромно конечно, но советую: https://habr.com/ru/company/jugru/blog/503868/
hatman Автор
Крутая статья! Можно рекомендовать!
nick1612
Вам не кажется, оно так и есть на самом деле :)
laatoo
Вы не один в этом ощущении, поверьте :)
Это и есть религия с апостолоами и трактовками. Я бы даже сказал "ересь от ООП", которая сильно усложняет жизнь сегодня ради сомнительного профита в загробной жизни (которой, как известно, нет).
Мне наиболее вразумительной показалась "красная" книжка, Vaughn Vernon — Implementing Domain Driven Design.
Если пробьётесь через ужасный перевод (читал оглядываясь на оригинал, иначе никак) и критически посмострите на примеры кода — вы лишний раз убедитесь в своём ощущении
marshinov
Сомнительность профита зависит от ваших задач. Фактически делать по DDD или не делать по DDD - это компромисс между читаемостью кода и устойчивостью к нарушениям инвариантов VS сложностью написания кода и производительностью. @vkhorikovлучше всех сформулировал: https://enterprisecraftsmanship.com/posts/domain-model-purity-completeness/, https://khorikov.org/posts/2020-08-14-domain-modeling-trillema-examples/.
nick1612
Простите, но проблемы подобные DDD трилеме возникают только у тех, кто практикует DDD. То есть вначале создается произвольный набор правил, который якобы должен помогать, а потом оказывается, что у вас проблемы, так как код не соответствует вашим придуманным правилам.
Как мне кажется, главная проблема все этих Driven-Development практик в том, что их создают и пропагандируют всякие консультанты, которые живут в мире стрелочек, диаграмок и детских примеров в стиле "как добавить метод для смены email к классу User". И к реальному программированию каких-либо крупных проектов имеют очень мало отношения.
marshinov
Вы можете указать на кого-то конкретного? Я больше видел консультантов по agile очень плохо представляющих о чем они говорят, а не по driven-development. Допускаю, что необразованных хватает везде:)
nick1612
Странный вопрос, так как человек на которого вы привели ссылку, как раз и занимается пропагандой TDD и DDD, написанием книг, созданием курсов и докладов по данной тематике с примерами соответствующего уровня (как добавить метод в класс не нарушая заповеди).
marshinov
:) Я знаком с Владимиром и вы абсолютно неверного мнения о его квалификации (стрелочки и все такое).
nick1612
Ну тут я ничего не могу возразить :) Возможно все остальные на самом деле тоже очень высококлассные специалисты в разных областях, просто зарабатывают деньги таким путем.
atrevido
Вон Вернон, Реализация методов предметно-ориентированного проектирования. Лучше в оригинале "Implementing Domain Driven Design". Он как раз писал эту книгу во многом с целью раскрыть то что написал Эванс
atrevido
Написал вчера, пока пост ждал модерацию - опередили меня :)
Ekstrem
Выберите книгу, и с командой поэтапно пробуйте что-либо: спецификации, агрегаты, CQS, иммутабельные типы и т.д. Ошибкой будет пытаться сделать всё сразу, особенно в одиночку.
maxkain
Сначала я читал Эванса. Читаю, что-то воды много, думаю, ну может это такое введение долгое. Читаю дальше, то же самое. Перелистываю на другие главы, и там все в таком же духе. Ну ладно, думаю, почитаю Вернона, там же все-таки о реализации книга. Читаю, и там такая же история. В итоге, прочитал сокращенный вариант - "Domain Driven Design Quickly". Там на ста страницах все рассказано, и даже довольно развернуто, как мне показалось.
В общем, по моим впечатлениям, это книги для разработчиков с низкой квалификацией или малоопытных, чтобы они хоть как-то могли писать код. "Чистый код" и "Чистая архитектура" Роберта Мартина, видимо, им сложно понять.
marshinov
Ага, ну т.е. оригинал читать не будем. Почитаем изложение… основной косяк там с тем что тактические паттерны идут до стратегического дизайна. В остальном книга Эванса - это источник, на который опираются остальные.
pOmelchenko
Никому не интересно думать, всем нужны серебреные пули.