Как приручить дракона

Объектно-ориентированное проектирование эпохи Средневековья

Пока все обсуждали седьмой сезон «Игры престолов», и пребывали в шоке от того, как Дейенерис научилась управлять своими драконами, мы продолжали коллективно учиться обуздывать наших собственных «IT-драконов» – разработка, управление проектами, маркетинг.

На одном из семинаров мы обсудили интригующую тему – проблемно-ориентированное проектирование (DDD: Domain Driven Design). Так как она обширная и многогранная, то по итогам семинара мы решили не ограничиваться обычными тезисами, а перенеслись в средние века и сочинили легенду о драконах и викингах, которая бы все это проиллюстрировала.

Итак, дети мои, внимаем, запоминаем…

Легенда

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

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

Это была ужасная кровавая вражда. Драконы сжигали дома викингов, уносили девушек, продукты и скот. Викинги тоже в долгу не оставались – отлавливали драконов и жестоко расправлялись с ними, а из их шкур изготавливали свое обмундирование.

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

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

Domain Driven Design держится на трех столпах – предметная область (Domain), единый язык (Ubiquitous Language) и ограниченный контекст (Bounded Context).

Предметная область в DDD

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

***

Семь поколений викингов жили в состоянии непрекращающейся борьбы, но ход вещей переломила история, случившаяся с сыном вождя племени, которое именовали как «Мудрое».

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

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

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

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

***

День инициации неминуемо приближался, и курсы укрощения драконов становились все интенсивнее. Но все было безуспешно – Эйнар по-прежнему одерживал поражение за поражением.

Когда он проиграл очередной поединок, вождь вызвал его на серьезный разговор.

– Сын мой…
– Да, отец.
– Ты же понимаешь важность предстоящего события?
– Да, конечно, отец.
– Тогда почему ты совсем не стараешься?
– Стараюсь, отец. Но я не понимаю, зачем мне убивать дракона. Мне их жалко. Ведь они тоже живые существа.
– Ты не понимаешь! Ты не представляешь, что испытываю я! Думаешь, я хочу изгонять из племени родного сына?! А если я сам нарушу многовековые традиции – то какой я тогда вождь? Тогда меня самого надо изгонять!

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

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

  1. Есть дракон.
  2. Дракон обитает в Драконьей пустоши.
  3. Берешь копье.
  4. Точишь копье.
  5. Надеваешь доспехи.
  6. Идешь в Драконью пустошь.
  7. Находишь дракона (можно некрупного).
  8. Целишься в него копьем.
  9. Убиваешь дракона.
  10. Приносишь тушу в племя.

И все! – заключил вождь.

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

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

Это про стратегические модели. Что касается тактических, то дракон здесь выступает Сущностью (Entity), Драконья пустошь – Агрегатом (Aggregate), то есть группой связанных сущностей объектов, а стая драконов, живущих в ней, – Хранилищем (Repository).

Entity, Aggregate, and Repository

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

Разбиваем задачу на несколько этапов

***
Наконец, наступил день X.

С самого утра лил дождь, предвещая беду.

Громко прозвучали трубы, что означало – обряду инициации дан старт.

Обряд предстояло пройти пяти мальчикам племени Мудрое.

Вождь произнес торжественную речь.

«Дорогие мои юные воины! Поздравляю вас с этим важным днем! Именно сегодня вы докажете, что достойны быть частью нашего клана! Вперед, в бой!».

Время решать задачу

После удара гонга группа «инициируемых» направилась через лес в Драконью пустошь.

***

По дороге Эйнар размышлял:

  • Что я знаю о драконах? Живут в Драконьей пустоши, питаются овцами, коровами и другим скотом. Перед тем, как приступить к еде, они поджаривают ее своим огненным дыханием.
  • Покрыты толстой чешуей, которую трудно пробить.
  • Примерные размеры – 10 метров в длину, размах крыльев – 10,2 метра, площадь крыльев – 17,5 квадратного метра.
  • Согласно древней истории, которую я прочитал в книге Предков, драконы и люди раньше не воевали друг с другом, а жили в мире. Почему же мы так не можем?
  • Нас пять человек. Значит, пять драконов будет убито. Нет, своего я убивать не буду. Пусть хоть одной жертвой будет меньше.

Любое действие по DDD начинается с переработки знаний. Что и сделал Эйнар по дороге в Драконью пустошь – он проанализировал свои собственные знания, входные данные о летающих рептилиях, информацию из книги Предков и выявил сущность «Дракон», определив для себя другую модель поведения, которая на его взгляд казалось более понятной и эффективной.

Переработка знаний

Вдруг раздался рев, что означало, что отряд пришел в Драконью пустошь.

***
Собратья Эйнара разбрелись по пустоши в поисках драконов.

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

Вдруг он наткнулся на что-то большое и с шипами. Это был хвост дракона.

Хвост шелохнулся, а вместе с ним и дракон.

Приглядевшись, Эйнар обнаружил, что он ранен.

– Как тебя зовут?
– Сидра, а тебя?
– Эйнар. Не бойся, я помогу тебе.

Викинг нарвал охапку листьев лечебного растения и сделал из них средство для заживления ран. Рецепт он вычитал в одной из книжек.

Дракону сразу полегчало.

– Так ты не будешь меня убивать?
– Нет, я не такой. А ты?
– Вам, викингам, нельзя доверять. Но ты мне помог, поэтому нет. Но тебе же нельзя будет вернуться в племя?
– Да, я знаю.
– И куда пойдешь?
– Еще не решил.
– Оставайся в пустоши – я тебя всему научу и со всем помогу.

Так Эйнар и остался жить в Драконьей пустоши.

С задачами стоит подружиться

***

Вскоре дракон и викинг стали лучшими друзьями.

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

Днем они вместе охотились, а по вечерам – жарили мясо и весело болтали, пели песни и развлекались.

***

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

Эйнар на цыпочках проследовал за ними и подслушал их разговоры.

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

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

***
– Дракон Ужасный – причина вражды между драконами и викингами? Как вы могли от меня скрыть такое?
– Эйнар, у нас не было выбора – иначе он бы тебя съел, а мы этого не хотели.
– Но, получается, драконы и викинги могут жить в мире! Главное – одолеть Ужасного!
– Но это невозможно…
– Возможно! Я пойду в свою деревню и приведу подкрепление. Уверен, вместе мы победим!

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

Ошибка в проектировании, или неучтенная сущность

***
Эйнар пришел в родное племя. Ему никто не был рад.

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

«Зачем вернулся, трус! Тебе здесь не место!», – то и дело раздавалось с разных сторон.

Наконец, он дошел до хижины вождя.

– Зачем ты здесь, сын мой? Тебя не должно здесь быть, ты не прошел испытание, уходи.
– Но отец, выслушай меня! Драконы и люди не должны враждовать! Мы не должны убивать их!
– С чего ты взял?
– Главная причина – гигантский черный дракон Ужасный, который живет в пещере, недалеко от пустоши за лесом. Он ненавидит викингов и хочет всех нас уничтожить! А другие драконы хорошие и миролюбивые, они не желают нам зла, а делают его против воли. Я со всеми ними подружился.
– Гигантский черный дракон – причина наших бед? Что ж, тогда мы его уничтожим. Но обряд инициации не будем отменять – таковы священные традиции.
– Но отец…
– Молчи. А тебя закуем в кандалы и посадим в темницу, чтоб не мешал операции.
– Но так нельзя…
– Молчи. Атакуем завтра!

***
Наступил день битвы. Сгустились темные тучи.

Викинги, вооружившись копьями и вилами, отправились в логово черного дракона.

Начался бой. Но силы были слишком неравны: викинги не могли справиться с гигантским драконом и готовились принять верную смерть в последнем бою.

«Вам меня не победить», – взревел Ужасный, выдохнув столп пламени.

Казалось, исход был предрешен.

Но вдруг неожиданно в небесах появился Эйнар со стаей драконов, верхом на одном из них. Его друг, дракон Сидра, спалил темницу и освободил его от кандалов.

Так драконы и люди объединились в битве века и вместе повергли общего врага –гигантского дракона.

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

Этими событиями стали: обряд инициации, встреча Эйнара с драконом, раскрытие тайны о гигантском драконе и финальная битва.

Domain Events

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

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

Мораль

Финальная битва завершила процесс. А может, только начала – со сменой бизнес-модели взаимодействия с драконами, и викингам, и драконам нужно будет многое изменить в своем укладе. Грядет крупная оптимизация, так сказать. Племя (компания) на пороге важных перемен. Но это уже совсем другая история.

Мораль истории про DDD

Если вам мало этой истории для понимания DDD, то вот вам презентация:

Comments

comments


© 2001-2018 Энтерра Софт - Разработка программного обеспечения на заказ.

Entries (RSS).