В одном романе для того, чтобы подчеркнуть бесспорную красоту и поразительную сексуальность одной из героинь, автор использовал фразу: "She was a such kind of woman, that every man look at twice". Что в литературном переводе можно понять: "Она была такой женщиной, что каждый мужчина оборачивался ей в след".

И точно такую же фразу я могу применить к бесподобной книге "Предметно-ориентированное проектирование (DDD)" Эванса Эрика. К ней хочется возвращаться каждый раз, когда ты садишься за проектирование системы в незнакомой тебе области. Словно маяк во время шторма, она помогает вести вашу галеру через сложности, чтобы все гребцы увидели землю, а проект увидел успешный старт.

И в этом обзоре, я расскажу, почему, по моему мнению, это MUST HAVE книга для каждого middle+ разработчика.

Как обычно выглядят книги по проектированию 

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

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

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

И это на самом деле крутые книги! Каждый программист должен их знать и применять паттерны в своей работе.

Но, что если у вас нет начального состояния

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

Что вам поможет? Понимание, с чего начать и куда двигаться, если кругом неизвестность. И именно про это на самом деле книга DDD Эванса.

  • Как понять, c чего нужно начать проектировать систему;

  • Как выделить в будущей системе ключевые понятия;

  • Как найти общий язык с заказчиком проекта, наладить диалог и трансфер знаний от специалистов области к программистам;

  • Как построить упрощенные модели, чтобы новые разработчики могли работать без понимания всего контекста бизнеса заказчика;

  • Как ограничить контекст работы, чтобы над проектом могли работать несколько команд разработчиков, не мешая друг другу;

  • Как выстраивать отношения с соседними командами, если у них либо низкая мотивация, либо слишком много воздействия на вашу команду;

И хотя может показаться, что это какие-то темы больше про менеджмент, нежели про написание кода. Это не так.

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

Взаимоотношения не описываются схемами

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

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

Это именно та проблема, когда разработчики героически преодолевают несуществующие проблемы, а заказчику нужно совсем другое.

Успех проекта не зависит от кода

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

Одним словом мировой мужик, честно признает ограничения методологии.

Эта книга не нужна новичкам

Чтобы прочувствовать всю боль от ситуаций, которые описываются в книге, нужно иметь адекватный коммерческий опыт, желательно опыт при работе с большими заказчиками в неизвестной вам области. Прямо зайдет! Новички же книгу просто не поймут, и вряд ли смогут хоть как-то продуктивно использовать её опыт. Как говорится всему свое время.

Вперед к знаниям!

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

Комментарии (23)


  1. pukinlou
    30.09.2021 18:24
    +4

    Идеи в книге правильные, но как это все там описано - полнейший буллшит. Никому не могу порекомендовать ее читать, что бы разобраться c DDD есть более достойные книги/источники без лишней воды и двусмыслицы.


    1. vku
      30.09.2021 18:51
      +8

      Посоветуете конкретные?


      1. aleksandy
        01.10.2021 09:57

        Вот. Более понятно написана. Некоторые даже советуют начинать DDD с неё, а уже потом к синей книжке Еванса переходить.


        1. playermet
          01.10.2021 10:44
          +1

          А какие различия между Implementing Domain-Driven Design и более новой Domain-Driven Design Distilled того же автора (Vaughn Vernon)?


          1. dest2r4
            04.10.2021 08:27

            Одновременно изучал обе книги. Они скорее дополняют друг друга


    1. BasicWolf
      30.09.2021 19:37
      +1

      А вы сделайте скидку на то, что эта книга была издана ещё в 2004м году! Эта книга и её идеи лежат в основе современного ДДД.


    1. merrygod
      30.09.2021 21:53
      +5

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


      1. marshinov
        30.09.2021 22:31
        +1

        Нескромно конечно, но советую: https://habr.com/ru/company/jugru/blog/503868/


        1. hatman Автор
          01.10.2021 10:08
          +1

          Крутая статья! Можно рекомендовать!


      1. nick1612
        01.10.2021 00:27
        +4

        Вам не кажется, оно так и есть на самом деле :)


      1. laatoo
        01.10.2021 07:32
        +2

        Вы не один в этом ощущении, поверьте :)
        Это и есть религия с апостолоами и трактовками. Я бы даже сказал "ересь от ООП", которая сильно усложняет жизнь сегодня ради сомнительного профита в загробной жизни (которой, как известно, нет).


        Мне наиболее вразумительной показалась "красная" книжка, Vaughn Vernon — Implementing Domain Driven Design.


        Если пробьётесь через ужасный перевод (читал оглядываясь на оригинал, иначе никак) и критически посмострите на примеры кода — вы лишний раз убедитесь в своём ощущении


        1. marshinov
          01.10.2021 10:44

          Сомнительность профита зависит от ваших задач. Фактически делать по DDD или не делать по DDD - это компромисс между читаемостью кода и устойчивостью к нарушениям инвариантов VS сложностью написания кода и производительностью. @vkhorikovлучше всех сформулировал: https://enterprisecraftsmanship.com/posts/domain-model-purity-completeness/, https://khorikov.org/posts/2020-08-14-domain-modeling-trillema-examples/.


          1. nick1612
            01.10.2021 11:52
            +2

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

            Как мне кажется, главная проблема все этих Driven-Development практик в том, что их создают и пропагандируют всякие консультанты, которые живут в мире стрелочек, диаграмок и детских примеров в стиле "как добавить метод для смены email к классу User". И к реальному программированию каких-либо крупных проектов имеют очень мало отношения.


            1. marshinov
              01.10.2021 12:10
              +1

              Вы можете указать на кого-то конкретного? Я больше видел консультантов по agile очень плохо представляющих о чем они говорят, а не по driven-development. Допускаю, что необразованных хватает везде:)


              1. nick1612
                01.10.2021 12:30
                +1

                Странный вопрос, так как человек на которого вы привели ссылку, как раз и занимается пропагандой TDD и DDD, написанием книг, созданием курсов и докладов по данной тематике с примерами соответствующего уровня (как добавить метод в класс не нарушая заповеди).


                1. marshinov
                  01.10.2021 12:41

                  :) Я знаком с Владимиром и вы абсолютно неверного мнения о его квалификации (стрелочки и все такое).


                  1. nick1612
                    01.10.2021 12:52
                    +1

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


      1. atrevido
        01.10.2021 08:27
        +1

        Вон Вернон, Реализация методов предметно-ориентированного проектирования. Лучше в оригинале "Implementing Domain Driven Design". Он как раз писал эту книгу во многом с целью раскрыть то что написал Эванс


        1. atrevido
          01.10.2021 09:29

          Написал вчера, пока пост ждал модерацию - опередили меня :)


      1. Ekstrem
        03.10.2021 08:47

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


      1. maxkain
        21.10.2021 20:16

        Сначала я читал Эванса. Читаю, что-то воды много, думаю, ну может это такое введение долгое. Читаю дальше, то же самое. Перелистываю на другие главы, и там все в таком же духе. Ну ладно, думаю, почитаю Вернона, там же все-таки о реализации книга. Читаю, и там такая же история. В итоге, прочитал сокращенный вариант - "Domain Driven Design Quickly". Там на ста страницах все рассказано, и даже довольно развернуто, как мне показалось.

        В общем, по моим впечатлениям, это книги для разработчиков с низкой квалификацией или малоопытных, чтобы они хоть как-то могли писать код. "Чистый код" и "Чистая архитектура" Роберта Мартина, видимо, им сложно понять.


    1. marshinov
      30.09.2021 22:33

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


      1. pOmelchenko
        01.10.2021 10:38
        +2

        Никому не интересно думать, всем нужны серебреные пули.