Это понедельник.
Вы сидите с каким-то бизнес-аналитиком.
Он описывает вам следующую функцию, которую он хотел бы продать/иметь.
Он часто использует слово «рабочий процесс».
Архитектор, хорошо знакомый с этими обменами, небрежно предлагает, что «мы должны реализовать очень простой механизм процессов».
Аналитик полностью согласен.
В этот момент ты пиздец.
Песня сирены-метафоры
Видите ли, проблема в том, что люди так сильно любят обещания, данные «рабочими процессами». Они ничего не могут с этим поделать.
Они видят работу, которую нужно сделать, работу, которую можно легко разделить на более мелкие части, части, которые вы можете легко нарисовать на доске с помощью простых прямоугольников и стрелок. Они повсюду видят объектно-ориентированные метафоры. Вот класс «Шаг». Вот это "Триггер"! условие" ! Это так наглядно! Приложение, кажется, проектирует себя!
Но все имеет свою цену; и большинство людей действительно не понимают, что они должны платить.
Разработка начинается. Достаточно скоро приходит осознание того, что данные должны быть разделены между шагами. Так начинается неизбежное и трагическое введение класса «Контекст». Он должен быть универсальным, верно? Таким образом, даже если вы используете статически типизированный «предпринимательский» язык, в него добавляется карта нетипизированных метаданных. Не беспокойтесь, это должно покрыть все потребности.
Затем неизменно приходит идея собрать рабочий поток во время выполнения в каком-то внешнем формализме, возможно, XML, JSON или YAML, в зависимости от вкусов.
Через несколько дней полный набор суффиксов шаблонов проектирования был исчерпан. Архитектор показывает очень плотную диаграмму классов в своей презентации удовлетворенному, но блаженно невежественному руководству.
Что вы наделали?
Поздравляем!
Вы только что построили вычислительную модель поверх вычислительной модели.
Очень дерьмовая, неформальная, неполная, недокументированная и плохо протестированная модель вычислений.
О, но еще слишком рано, чтобы признать это. Сначала вам нужно вытерпеть бесконечный цикл агонии.
Шаги искупления
Продукт, наконец, попадает в производство, и достаточно скоро начинают появляться первые билеты.
Вы запускаете отладчик. Вы попадаете в функцию, пытающуюся разобраться в невообразимой мешанине нетипизированных данных и неверных предположениях о текущем состоянии выполнения.
Ваш разум блуждает. Эту функциональность было бы так просто реализовать… с помощью всего лишь кода. Вы знаете, просто вызывая функции API, бросая свои «если» и «возврат» туда и сюда.
«Недостаточно перспективно», — вы могли бы услышать, если бы осмелились это предположить.
Итак, вы предлагаете внести некоторые изменения в рабочий процесс, перетасовывая некоторые этапы. Это просто вопрос изменения XML, верно? Неправильный ! Шаги имеют неявно жестко закодированные предварительные условия, и вам также нужно изменить то, что они делают. Ваш менеджер слышит, что вам нужно выпустить новую версию, и кричит на вас.
Проходят месяцы.
То, что было набором изолированных шагов с ограниченным, сфокусированным объемом, теперь стало безбожными башнями кода, потому что так было как-то легче управлять.
Лучшие кодеры давно ушли. Архитектор тоже.
По крайней мере, можно сказать, что «урок усвоен». Простите, у этой истории нет счастливого конца. Скорее всего, вы испытали этот ужас несколько раз в своей жизни.
Потому что ты знаешь. Это просто рабочий процесс. Но в следующий раз мы просто воспользуемся подходящим коммерческим BPM-движком. Я слышал, что крупные компании используют их.