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

26.09.2017
42

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

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

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

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

Легенда

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

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

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

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

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

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

 

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

***

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

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

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

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

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

***

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

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

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

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

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

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

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

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

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

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

 

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

 

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

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

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

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

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

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

 

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

***

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

 

***

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

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

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

***

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

Мораль

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