Мягкие связи. Чему может поучиться КПО у CMMN и DCR
Как Карта процесса-опыта может описать то, что разворачивается не по порядку
Вопрос пришёл от практика, который работает с КПО в реальных сессиях. Звучал он примерно так: как отмечать на карте регулярную активность, у которой нет жёсткого триггера — например, когда актор без явного внешнего сигнала обращается с вопросом к ИИ-помощнику? Такое обращение может случиться в разных местах процесса, его трудно зафиксировать в одной точке, а втискивать в линейную цепочку — значит исказить картину.
На первый взгляд это технический вопрос о нотации. Но он потянул за собой более широкое исследование: что вообще умеют разные нотации, когда сталкиваются с процессами, у которых нет жёсткого порядка шагов?
Что КПО даёт уже сейчас
Мой первый ответ опирался на то, что в нотации уже есть. Если активность может возникнуть в разных местах процесса, её лучше показать как отдельную ключевую точку с предваряющим событием слева: ромб-инициатор, от которого тянется поводок к точке. Нет жёсткой цепочки — нет и попытки её нарисовать.
Это честный подход. Если система устроена как набор ходов, каждый из которых запускается своим сигналом, так и стоит показывать — разрозненными точками с событиями-слушателями. Пытаться выстроить из этого последовательность значит добавлять порядок, которого в самой деятельности нет.
Там же я обозначил наблюдение, которое работает как аналитический инструмент: если событие-инициатор у точки размытое — «актор как-нибудь вспомнит и сделает» — это маркер хрупкости. Место, где система рассчитывает не на сигнал из среды, а на человеческое спохватывание. Чем больше таких мест, тем более хрупким выглядит процесс в целом.
Но вопрос заставил меня углубиться в исследование.
Что умеют другие нотации
Большинство инструментов описания процессов исходят из того, что процесс — это последовательность. BPMN строится на потоках управления, IDEF3 использует Junction-узлы, но модель остаётся императивной. Это не недостаток — каждый из них решает свои задачи хорошо. Но для ситуации, где порядок активностей принципиально не предопределён, они неудобны.
BPMN предлагает Ad-hoc Sub-process — подпроцесс с тильдой, внутри которого активности не связаны потоком управления, исполнитель решает сам. Технически это ответ. Но Ad-hoc выглядит в BPMN как конструкция, добавленная нехотя: тяжёлая коробка с «мягкой» начинкой контрастирует с остальной строгостью нотации. И главное — она ничего не говорит о том, когда из этой зоны выходить.
В 2014 году OMG выпустил CMMN — Case Management Model and Notation. Создавался именно для knowledge work: юридические дела, медицинские протоколы, клиентские ситуации, где порядок шагов определяется обстоятельствами, а не регламентом. Понятийный аппарат у CMMN хорошо устроен: дискреционные задачи (те, что исполнитель может выполнить по своему суждению), sentries (условия входа и выхода для каждого элемента), milestone (не точка в последовательности, а состояние, которого достиг кейс). Концептуально точнее, чем всё предыдущее.
Дальше история знакомая. Версия CMMN 1.1 вышла в 2016 году и стала последней. Camunda 8 убрала поддержку CMMN, сославшись на отсутствие спроса. Flowable ещё поддерживает — скорее в режиме сохранения наследия. Стандарт оказался трудно автоматизируемым и плохо читаемым: аналитики его не освоили, тулинг не вырос, рынок не сложился.
Жаль, потому что идеи CMMN — дискреционность (право выбора варианта решения агентом), sentry, milestone — формулируют именно то, чего обычно не хватает в описании гибких процессов.
DCR Graphs: другая парадигма
Самой интересной находкой в этом исследовании оказались DCR Graphs (Dynamic Condition Response) — декларативная нотация, разработанная в Дании и применяемая в скандинавских системах здравоохранения.
DCR работает иначе. Вместо того чтобы задавать порядок выполнения шагов, он описывает отношения между событиями. Четыре базовых типа:
Обозначение
Тип
Смысл
A →• B
Condition
B заблокировано, пока не случилось A
A •→ B
Response
Если A случилось, B обязано случиться (pending)
A + B
Include
После A событие B динамически появляется в доступных
A % B
Exclude
После A событие B исключается из доступных
DCR строит сеть ограничений, из которой вытекает, что можно делать в каждый момент. Порядок не задан — он проявляется из условий.
Чтобы почувствовать, как это работает, возьмём пример далёкий от рабочих процессов: утренняя процедура умывания. В ней есть обязательные шаги, есть условия, есть действия, которые имеют смысл только после других. При этом строгой линейной последовательности нет — можно сначала умыть лицо, потом взять щётку, или наоборот. DCR описывает именно это устройство:
Бизнес-логика ИЛИ жизненное правило
Тип связи в DCR
Как это работает на практике
Нельзя чистить зубы без щётки и пасты
Взять щётку →• Чистить зубы (Condition)
«Чистить зубы» заблокировано, пока не взята щётка
Взяв щётку и пасту, зубы нужно почистить
Взять щётку •→ Чистить зубы (Response)
«Чистить зубы» получает статус Pending; процесс нельзя считать завершённым, пока зубы не почищены
Нельзя полоскать рот, не почистив зубы
Чистить зубы →• Прополоскать рот (Condition)
Полоскание недоступно до завершения чистки
Крем наносят только на умытое лицо
Умыть лицо + Нанести крем (Include)
Изначально «Нанести крем» нет в списке доступных; умывшись, действие динамически появляется
Зубы чистят один раз за утро
Чистить зубы % Чистить зубы (Exclude)
Почистив зубы, событие исключает само себя, чтобы не повторяться
❦
Жесткой последовательности нет, есть набор ограничений — и этого выходит достаточно, чтобы точно описать поведение. Никто не запрещает умыть лицо до или после чистки зубов; но полоскать рот до чистки нельзя, а крем до умывания недоступен. DCR схватывает именно эту структуру, без принудительной стрелки от шага к шагу.
Математически DCR строже CMMN, а читается понятнее. Инструментарий есть, хотя широкого индустриального распространения подход пока не получил.
Что это означает для развития КПО
Исследование помогло сформулировать несколько вещей, которых в текущей нотации КПО нет или они выражены неявно.
Дискреционные точки. Ключевая точка без жёсткого триггера — это особый класс элементов. Сейчас она визуально не отличается от точки с надёжным событием-инициатором, хотя с аналитической точки зрения это принципиально разные ситуации. Рабочая идея — показывать такие точки облачком: облако интуитивно читается как нечто нечёткое, зависящее от суждения актора. Это и визуальное различение, и сигнал аналитику: здесь — место для вопроса, нет ли точки отказа?
Граница мягкого этапа. Если в каком-то участке процесса несколько точек могут выполняться в произвольном порядке, у этого участка нужна рамка. Не ради оформления, а ради ответа на вопрос «когда отсюда выходим?». В CMMN это completion rule, в BPMN Ad-hoc Sub-process это тоже предусмотрено. Без явного условия выхода читатель додумывает его сам — это ошибка чтения, заложенная в нотацию.
Мягкие связи внутри этапа. Даже внутри гибкой зоны могут быть зависимости без принуждения к порядку. Аналог DCR Condition: «точка B обычно не имеет смысла без точки A» — но это рекомендуемый порядок, не жёсткий. Для этого нужна визуально другая связь — другой тип линии, чтобы не смешивать с потоком управления.
Все три идеи пока в работе. Какая окажется жизнеспособной покажет практика.