Как и зачем переходить от статусов к процессам

В корпоративных системах есть понятие статуса. В CRM это “холодный”, “горячий”, “новый”, “закрыт”. В документообороте — “Зарегистрирован”, “На согласовании” и “Исполнен”. Через статусы можно эмулировать бизнес-процессы, но до определенной степени. О том, как (и зачем) переходить от “статусов-стадий” к процессам читайте в этой статье. Она сложная, приготовьтесь.

6 проблем статусов

Статусы — это способ контролировать состояния заявок, договоров, сделок. Они отлично работают пока статусов немного, статусы не влияют друг на друга. Статусы работают, пока могут перепрыгивать туда-сюда по воле пользователя или строго в одном направлении. Но при усложнении логики у статусов появляются проблемы. Статусы можно воспринимать как FSM, конечный автомат (см. вики).

1. Нужно помнить прошлое

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

Однажды окажется, что в предыдущее состояние переходить нельзя.

У разработчика будет 2 пути:

  • Выразить факт прохождения статуса “Новый” через атрибут сущности. Например:  есть “Документ” ,  добавляем атрибут “Был в статусе “Новый”. При попытке перевести “Документ” в статус “Новый” проверяем атрибут.
  • Добавить дополнительную таблицу пройденных статусов и проверять в ней.

Если развивать эту мысль, то при любой смене статуса нужно перепроверить все атрибуты.

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

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

2. Нужно N-состояний одновременно

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

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

3. Рекурсия

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

4. Комплексный рост сложности и скорости разработки

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

  • 2 атрибута и 2 статуса дают 4 перестановки.
  • 3 атрибута и 3 статуса дают 27 перестановок.
  • 5 атрибутов и 5 статусов дают 3125 перестановок.

5. Доказательство проходимости и сложность тестирования

Тестировать статусы сложно — на каждую перестановку нужно писать тест. А если поменялись статусы или атрибуты, то нужно всё перепроверять и\или переписывать.

6. Несколько сущностей меняют статусы друг другу

Представьте:

  • Из одного документа нужно родить 4 новых,
  • Прогнать их независимо
  • Переопределить статус основного, в зависимости от результатов обработки указанных 4 документов

Это много кода и тестов, которые не имеют ценности.


Проблемы находятся на уровне разработки и не решаются на этом уровне. Я не могу придумать действия, которые в долгосрочной перспективе избавили систему статусов от перечисленных недостатков. Значит надо выходить за её границы.

Переходим к процессам

Как меняется сложность добавления функционала

Нужно вводить отдельную сущность — экземпляр процесса и процесс.

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

В этом смысле это классическое сравнение FSM и сетей Петри. На эту тему написано несколько научных статей, например эта. 

Для сложной структуры нужна правильная модель предметной области. BPM-движки или BPMS-системы (например Camunda) все предлагают такую структуру:

Разница между статусами и процессами в структуре хранения

  • Deal — бизнесовая сущность. Она может участвовать в большом количестве Process Instances. Во всех процессах бизнес-сущности свои.
  • Process Instance — конкретный запуск процесса по сущности.
  • Process Definition — описание процесса, которое содержит все возможные варианты его развития.
  • Activity Definition — описание конкретной задачи(статуса), которое может быть достигнуто в процессе.
  • Activity — конкретная задача, которая выполняется сейчас, с возможными переходами.

В случае со статусами понятия логически существуют, но они размазаны по сущности как атрибуты или хранятся в коде:

Как хранятся данные, если нет соответствующей структуры

Алгоритм перехода

Для описания процессов будем использовать BPMN — это простая и понятная нотация, которая к тому же исполнима. Это значит, что существует софт, который возьмёт за вас заботу о Process Definition, Activity Definition, Process Instance и всем вокруг. Останется позаботиться об конкретных Activity и описании процессов.

1. Стадии как промежуточные события

Представим, что у нас есть сущность, которая проходит статусную модель:

Нарисуем её в формате BPMN:

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

В BPMN процессы должны иметь стартовое и завершающее событие. Стартовое — это значит что в рамках инстанса оно выполняется только раз, а до его выполнения инстанса нет. Завершающее — это значит процесс (или токен) завершаются на этом событии и дальше нет никаких работ( или статусов), которые необходимо выполнять.

Судя по схеме, кандидатами на стартовое событие это A, а завершающее — это F.

В BPMN стартовое событие не может иметь входящих потоков управления. Статус A выполнял 2 функции — старт процесса и показывал выполнение какой-то работы. Нарисуем это:

2. Разбираемся с развилками

Статусы — это отражение того, что-то то было выполнено или должно быть выполнено, но в неявном виде. А при создании процесса мы должны вытащить это явно на диаграмму.
Почему после статуса E можем перейти в статус C или статус F? Кто-то или что-то принимает решение, что нужно перейти куда-то. Если это решение принимает человек, то изобразим это так:

Если решение принимает скрипт, то можно изобразить так:

Сделаем тоже самое со статусами C->D  или C-A1:

3. Выясняем, почему меняются статусы

Между А1 и B  что-то происходит, из-за чего сущность меняет свой статус. Нарисуем:

4. Уточняем бизнес-смысл происходящего

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

Мы перестаём перещелкивать статусы, а начинаем делать работу в рамках процесса.

5. Проверяем квадратики: достаточность информации

Берём 2 квадратика и задаём вопрос — действительно ли после выполнения первого квадратика возможно выполнить второй:

Добавляет задачи, которые пропустили:

6. Проверяем квадратики: а что если?

У каждого квадратика подразумеваем успешное выполнение. А что если задача будет выполнена не успешно — например при проверке контрагента он оказался плохой? Нарисуйте такие развилки и реакции на них:

Поздравляю, теперь у вас есть первая версия процесса.

Что мы получаем и чем платим

Процесс избавляет вас от проблем:

  • Прошлое не нужно помнить — за счёт наличия маркера текущих Activity вы знаете состояние процесса. Не нужно сохранять это состояние на сущность. Это разделяет сущность от её процессов, что дает возможность развиваться независимо.
  • N-состояний — за счёт process definition и activity definition, а так же независимости сущности от процесса, возможно иметь сколько угодно одновременно состояний в процессе.
  • Рекурсия — не страшна, т.к. мы знаем все возможные переходы и нам не больно их учитывать. Всегда знаем путь, по которому сущность дошла до текущего состояния.
  • Рост сложности — избавлены от него, т.к. данные разделены и от процесса, есть понятие Activity, являющееся кирпичиком процесса. Activity может добавляться\редактироваться независимо от остальных элементов процесса.
  • Доказательство проходимости — подпроцессы на BPMN это подмножество сетей Петри. Существует возможность математически доказать,что сеть Петри проходима.
  • Несколько сущностей — process definition могут включать в себя другие process definition, в которых обрабатываются другие сущности.

За это мы платим:

  • Дорого в реализации — нужно врубиться в технологии BPMS, понять как работает BPMN. У меня на онлайн-курсе 1204 можно сократить стоимость и срок осмысления.
  • Нужно врубаться в процессы — подход с процессами требует от айтишников понимания процессов и бизнеса.

Где хороши статусы

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

В итоге

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

Как вам статья? Приходилось ли работать со статусами и страдать? Напишите в комментарии и поделитесь статей в соц.сетях.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Комментарии

Вам так же понравится

Спасибо! Подписывайтесь на меня в соц.сетях, чтобы быстро получать новые материалы по BPMN, BPM, BPMS

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: