Как описать процесс с помощью BPMN? Разбор на примере
Всем привет! В прошлой статье посмотрели, что такое BPMN, из каких элементов состоит, так как элементов достаточно много, то я решила разбор на практике в виде написания какого-то конкретного бизнес-процесса оставить на вторую статью.
Поэтому сегодня мы посмотрим метод моделирования бизнес-процесса BPMN и разберем порядок, основные шаги, проведем ревью.
Поехали!
Какой процесс будем описывать?
Мы опишем процесс найма, начиная от запроса нанимающего менеджера и заканчивая выходом нового сотрудника на работу, что, в свою очередь, запускает процесс онбординга.
Нам примерно всем знакомо, как работает найм в компании:
нанимающий менеджер осознает потребность в работнике, формулирует требования к кандидату, по навыкам и характеристикам будущего сотрудника, такую анкету создает, приходит в HR-отдел к рекрутеру, там они эту анкету превращают в вакансию, вакансия размещается на доске объявлений (сайт компании или job board), рекрутер ведет кандидатов и организовывает собеседования, предположим, будет два этапа — скрининг и собеседование с нанимающим менеджером, — кому-то отказывают, кто-то успешно проходит и потом получает оффер, и, получается, процесс завершается выходом на работу нового сотрудника
Но мы-то с вами знаем, что выход нового сотрудника — это не только конец процесса найма, но и начало связанного с ним — онбординга.
Как мы будем это все отражать с помощью BPMN?
Я пойду в этой статье по шагам, шаги эти я узнала в книге BPMN Method and Style, автор Брюса Сильвера (Bruce Silver). Мне понравился представленный в книге метод моделирования, да, у BPMN есть гайд и рекомендации: вот этот элемент делает так, этот так, вот этот можно исполнить так, но из руководства сложно вычленить именно стилистику и правила.
На практике же большинство людей стараются просто изложить логику описываемого ими процесса (не всегда исполняемого) с целью описания как есть / приведения в порядок / будущей автоматизации, и примерно одинаково делают. Поэтому понятное изложение стилистики написания схем меня порадовало, ну и там много примеров.
Что еще нужно знать о том как научиться: специальные курсы и международные сертификации по BPMN, но а) не у всех есть на это ресурс (время и деньги) и б) не всем нужен такой уровень погружения в нотацию.
Поэтому предлагаю пойти путем для новичка: подсмотреть приемлемый пошаговый план и на практике понять, что нам надо, а потом уже принять решение, надо ли лезть глубже. Я буду писать эту статью так, как если бы вот я только знакомилась с нотацией и разбиралась, а что мне надо использовать и как. В конце проведу ревью отрисованного процесса и мы посмотрим, что мы упустили.
Шаг 1. Определить границы процесса
Границы у нас, как мы помним, от входа до выхода. Когда мы один раз упорядоченно прогоняем процесс от начала до конца — это один экземпляр процесса. В нашем случае, найм одного сотрудника — один экземпляр процесса. Один найм может быть успешным, другой найм (экземпляр одного и того же процесса) неудачным. Если нужно нанять двух разработчиков, это будет два экземпляра процесса.
На этом шаге нам нужно ответить на вопросы:
Как начинается процесс: по запросу (по факту возникновения какой-то потребности) от внешнего или внутреннего участника / исполнителя или запланированно (регулярно повторяющийся базовый вопрос)? В нашем случае по запросу от внутреннего исполнителя (возникает потребность у нанимающего менеджера в новом сотруднике).
Как завершается процесс: имеет он одно или несколько завершений? В нашем случае несколько вариантов: наймом нового сотрудника (успех) или отсутствием найма нового сотрудника (по разным причинам, не успех), но этот конкретный экземпляр процесса мы уже завершим. Почему так? Потому что если начальное состояние — запрос, то завершение — выполнение запроса. Наш запрос — найм сотрудника, завершение — найм / не найм сотрудника.
Варианты завершения: надо описать все конечные состояния процесса (мы уже определили, что у нас есть успешное завершение, и что есть несколько причин, когда оно неуспешное, надо причины четко сформулировать):
- Успешное завершение — сотрудник нанят, то есть кандидат принял оффер и вышел на работу, давайте назовем это завершение «Сотрудник нанят»
- Неуспешное завершение — сотрудник не нанят, то есть а) в самом начале нам не дали согласия на найм сотрудника, не согласовали заявку б) мы вообще не нашли подходящих кандидатов, или в) выбранный кандидат отказался от оффера, или г) кандидат принял оффер, но не вышел на работу, давайте назовем это завершение «Вакансия закрыта без найма»
Как видите, на этом шаге мы ничего не моделируем, мы только отвечаем на ключевые наши вопросы и согласовываем ответы при необходимости.
Шаг 2. Определить верхнеуровневую карту процесса
На этом шаге надо определить ключевые этапы процесса, с учетом наших конечных состояний в нашем случае это:
- Сформировать заявку на подбор, здесь у нас может быть так, что заявку могут согласовать / не согласовать (два конечных состояния)
- Провести отбор кандидатов, здесь мы можем найти / не найти подходящих кандидатов
- Сделать оффер, кандидат может принять / не принять оффер
- Подготовиться к выходу нового сотрудника (документы и рабочее место), но сотрудник может выйти / не выйти на работу
После этого шага в книге BPMN Method and Style идет шаг с созданием именно модели верхнеуровневой, чтобы потом ее детализировать, обычно я пропускаю промежуточный этот шаг (мне достаточно понимать, какие ключевые этапы) и сразу детализированный процесс описываю, но тут сделаем все подробно и постепенно.
Шаг 3. Моделирование верхнеуровневого потока операций
Я начинаю с определения участников. В BPMN для этого используются Пулы (Pools) и Дорожки (Lanes).
Давайте внимательно посмотрим на процесс, кто у нас есть:
- нанимающий менеджер внутри компании
- HR-отдел внутри компании
- кандидат (много разных)
Разумно выделить два Пула: компания и кандидат, это два верхнеуровневых наших независимых участника. Почему кандидат — Пул? Мы не можем контролировать его действия, то как быстро он ответит, он внешний участник.
ВАЖНО: Кандидат — black-box Пул, потому что мы описываем бизнес-процесс компании, поэтому у нас к Кандидату будут идти только Поток сообщений (Message Flow).
Внутри компании у нас есть роли менеджера и HR-отдела, это будут наши дорожки внутри Пула «Компания».
Смотрим, как это будет выглядеть:
Почему я расположила Пули и Дорожки в таком порядке? Потому что это соответствует очередности появления в процессе этих участников. Вначале (первым) мы видим Нанимающего менеджера, потом появляется HR-отдел, и только потом Кандидат. Так мне будет проще переходить с исполнителя на исполнителя, и от участника к участнику.
Что важно: так как для нас пул Кандидата — black-box Пул, то он должен отображаться в свернутом виде.
Теперь отражаем последовательно наши ключевые этапы в виде подпроцессов, потому что внутри этих этапов есть какой-то набор действий со своими завершениями.
С чего мы начинаем? С начала. Возникает потребность в сотруднике, то есть это наше стартовое событие. У кого потребность? У нанимающего менеджера внутри компании. Как нам отразить это на диаграмме?
Мы ставим Начальное событие (Start Event) в виде простого круга с названием «Возникла потребность в сотруднике» на Дорожке «Нанимающий менеджер» Пула «Компания». От начального события у нас идет Поток операций (Sequence Flow) (сплошная стрелка) к Подпроцессу (Sub-Process) (прямоугольник с + внизу) «Сформировать заявку на подбор», заявку могут согласовать / не согласовать, поэтому нам нужно уточнить, согласовали ли заявку, прежде чем двигаться дальше: ставим Исключающий шлюз (XOR Gateway) (ромб) с вопросом «Заявка согласована?».
Если заявка согласована, то ветка «Да» ведет к подпроцессу (наш следующий ключевой этап) «Провести отбор кандидатов», а если не согласована, то ветка «Нет» ведет к Конечному событию (End Event) «Вакансия закрыта без найма» (то вот наше неуспешное завершение в Шаге 1).
Смотрим:
Что дальше?
Мы можем провести отбор кандидатов, нам надо определить его успешность, поэтому ставим Исключающий шлюз (XOR Gateway) (ромб) с вопросом «Найден финальный кандидат?», по той же логике что и выше ветка «Да» ведет к подпроцессу «Сделать оффер», а ветка «Нет» ведет к Конечному событию «Вакансия закрыта без найма».
После подпроцесса «Сделать оффер» ставим Исключающий шлюз (XOR Gateway) (ромб) с вопросом «Оффер принят?», и ветка «Да» ведет к подпроцессу «Подготовиться к выходу сотрудника», а ветка «Нет» (кандидат отказался) ведет сплошной стрелкой к Конечному событию «Вакансия закрыта без найма».
После подпроцесса «Подготовиться к выходу сотрудника» ставим шлюз «Сотрудник вышел на работу?». Ветка «Да» ведет к успешному Конечному событию типа Сигнал (Signal) (круг с треугольником внутри) «Сотрудник нанят», почему сигнал? Потому что успешное завершение процесса найма является стартом (сигналом для старта) процесса онбординга. Ветка «Нет» (кандидат не вышел) ведет, как и все неуспешные завершения, к Конечному событию «Вакансия закрыта без найма».
На верхнеуровневом моделировании мы не показываем никаких потоков сообщений с нашим black-box Пулом Кандидат, мы внутри Компании смотрим ключевые наши этапы в виде подпроцессов и условий выхода из этих подпроцессов.
Шаг 4. Моделирование детализированного потока операций
Теперь давайте последовательно опишем каждый подпроцесс детальнее.
Подпроцесс «Сформировать заявку на подбор»
Из каких действий состоит первый подпроцесс «Сформировать заявку на подбор»:
- нанимающий менеджер должен заполнить анкету и обозначить, кого же он все-таки хочет найти, это Задача (Task) «Составить анкету кандидата»
- рекрутеру HR-отдела нужно согласовать анкету, это Задача (Task) «Согласовать анкету»
При этом согласование — это своего рода цикл (начать согласовывать, получить правки, внести правки, согласовать после правок, получить правки и т. д., пока не будет достигнуто согласование). Поэтому Задача (Task) «Согласовать анкету» имеет маркер Loop (значок закругленной стрелки внутри задачи). Цикл Loop похож на цикл Do-While в программировании. То есть задача согласования будет выполняться до тех пор пока не будет достигнуто согласование анкеты между HR и нанимающим менеджером. Если это не очевидно, то можно порешать проверку согласованности анкеты, например, через шлюз с вопросом о необходимости правок, но маркер цикла предпочтительнее.
Как оформляется раскрытый подпроцесс в нотации? Это прямоугольник с закругленными углами, который начинается со своего Начального события типа None (это обязательное правило для подпроцессов). У нас не может подпроцесс ничем не закончиться. И вообще на схеме не может быть действия без завершения, «пути вникуда» быть не может.
В подпроцессе у нас два конечных состояния: успешное согласование заявки и отклонение заявки.
У меня был подпроцесс в свернутом виде «Сформировать заявку на подбор», в развернутом он подписан так же, начинается с события типа None, содержит 2 задачи, у одной задачи признак цикличности, отражены оба конечных состояния подпроцесса, выход из подпроцесса у меня тот же, что был на верхнеуровневой схеме — Исключающий шлюз (XOR Gateway) (ромб) с вопросом «Заявка согласована?».
Ветка «Да» ведет к нашему следующему подпроцессу «Провести отбор кандидатов», ветка «Нет» к закрытию вакансии без найма, конечному состоянию. При этом, внутри подпроцесса моя ветка «Нет» — по сути, детализация, почему я закрываю вакансию без найма (не согласовали заявку).
Важно: путь, который отмечен штрихом называется путь «по умолчанию» (на картинке выше — ветка «Нет»). Этот путь будет выбран в том случае, если никакое из условий на потоках не сработало. То есть если у меня не сработало согласование (нет четкого согласовано / не согласовано, я веду себя так, как будто не согласовано и, получается, закрываю найм).
Продолжаем!
Подпроцесс «Провести отбор кандидатов»
Подпроцесс «Провести отбор кандидатов» содержит такие действия и выборы, которые должны быть выполнены:
- рекрутеру HR-отдела нужно создать вакансию, это Задача (Task) «Сделать текст вакансии»
- рекрутеру HR-отдела нужно разместить вакансию на джобборде, это Задача (Task) «Разместить задачу на job-board»
- рекрутеру HR-отдела нужно получить отклики от кандидатов, каждый отклик это, по сути своей, промежуточное событие «Получен отклик», так как мы получаем отклики в виде сообщений от кандидатов, то будем использовать Промежуточное принимающее событие-сообщение (Intermediate Catching Message Event) (двойной кружок с пустым конвертом), на всякий случай: промежуточное оно, потому что не в начале и не в конце процесса
- рекрутеру HR-отдела нужно организовать и провести этапы отбора до момента как не будет найдет финальный кандидат: то есть он будет повторять задачи скрининга, собеседования с нанимающим менеджером до тех пора пока не будет найден тот финальный кандидат, которому дадут оффер, в противном случае поиск продолжится с начала (скрининг и собеседования)
- рекрутеру HR-отдела нужно будет отказывать каждому неподходящему кандидату, значит, у нас есть Задача (Task) «Отправить отказ кандидату» и завершающее событие «Кандидату отказано»
О чем нам надо помнить: один отклик = один кандидат. Все действия (скрининг, собседование и утверждение кандидата) выполняются в отношении каждого кандидата, либо пока я не найду финалиста, либо пока мой перебор не закончится ничем, ведь может быть так, что ни один кандидат не станет финалистом отбора.
Я могу использовать здесь после получения отклика многоэкземплярный подпроцесс (Multi-Instance Subprocess) (значок трех вертикальных полос), который позволяет обрабатывать каждый элемент в списке полученных откликов, но эксперты по BPMN говорят, что это возможно когда я знаю количество позиций в списке до начала обработки списка, а это не совсем наш случай, ведь я не знаю, сколько будет откликов. С другой стороны, я могу поставить пометку, мол, обрабатывать этим многоэкземплярным подпроцессом отклики как только набирается 5 новых, набралось 5 штук — разобрала, набралось еще 5 — разобрала. На мой взгляд это лишнее усложнение для нас сейчас.
Я решаю для себя не использовать многоэкземплярный подпроцесс и сделать цикл через шлюзы с условием и возврат к откликам, если кандидат меня не устраивает (прошел скрининг и собес, но не устроил, значит, ищу еще, устроил — назначаю его финальным кандидатом и завершаю отбор).
Обратите внимание, что я здесь учла и обмен сообщениями с Пулом Кандидата, в тех моментах, когда у нас есть взаимодействие. То есть нам надо раскидать в нужных местах Поток сообщений (Message Flow) (пунктирная линия) и оформить правильно сообщения:
- когда размещаем вакансию, а кандидат с ней знакомится
- когда кандидат откликается, то есть мы получаем от него отклик и резюме
- когда мы отказываем кандидату
- когда мы приглашаем его дальше
Правильно оформить означает, что даже если обмен сообщениями содержит в себе объекты данных, я никоим образом эти объекты к пунктирам не приписываю и не пристраиваю. Подробнее про стилистические правила оформления диаграмм смотрите в книге, на которую я ссылалась уже и на руководство BPMN.
Обратите внимание так же на то, что я сначала думала, что у меня просто Задача (Task) «Провести скрининг» и просто Задача (Task) «Провести собеседование», но по факту это подпроцессы:
- чтобы провести скрининг, нужно просмотреть резюме, проверить соответствие опыта заявленным требованиям в анкете
- чтобы провести собеседование, нужно получить временные слоты для встречи у нанимающего менеджера, согласовать с кандидатом, в согласованное время провести встречу, подготовить вопросы и собрать обратную связь по кандидату
То есть это не разовое какое-то действие, которое можно определить как задачу, но я не стала запихивать в наш пример слишком многое, поэтому обозначила как подпроцесс.
Подпроцесс «Сделать оффер»
Мы переходим к детализации следующего этапа, созданию оффера для финалиста отбора.
Пподпроцесс «Сделать оффер» состоит из следующих действий и событий:
- рекрутеру HR-отдела нужно создать оффер (сам текст и оформить его), потом отправить кандидату
- рекрутеру HR-отдела нужно дождаться ответа от кандидата: принимает он оффер или отказывается от него? Это промежуточное событие-сообщение, от которого у нас есть развилка пути процесса: да, принял, нет, отказался.
- если кандидат оффер не примет, то это будет для нас конечное событие — наш вариант «в» в возможных завершениях процесса
- если кандидат оффер примет, то это будет конечное событие: кандидат принял оффер
Здесь довольно просто для нас уже должно быть:
Идем дальше.
Подпроцесс «Подготовиться к выходу сотрудника»
Что нам известно:
- рекрутеру HR-отдела нужно будет подготовить документы на выход сотрудника в нужную дату, указанную в оффере (это документы типа приказа, трудового договора, должностной инструкции и т. д.)
- сотруднику HR-отдела нужно будет проследить за подготовкой рабочего места или подготовить рабочее место сотрудника в соответствии с условиями в оффере (от банальных стол и стул до наличия компьютера и т. д.)
- рекрутеру HR-отдела нужно дождаться даты выхода кандидата, это событие-таймер, когда наступит дата уже можно будет ответить на вопрос: вышел ли сотрудник на работу или не вышел? Это шлюз, и у нас будут конечные события «Сотрудник вышел на работу» или «Сотрудник не вышел на работу»
И, соответственно, на выходе из подпроцесса мы в целом можем прийти к завершению процесса найма: если сотрудник вышел, то это успешное завершение, закрываем процесс успешным Конечным событием типа Сигнал (Signal) «Сотрудник нанят» (заканчивает текущий процесс и подает сигнал для старта процесса Онбординг). Если не вышел и / или не принял оффер, то мы закрываем вакансию без найма.
Так, тут мы закончили. Что дальше?
Ревью процесса
Давайте посмотрим на процесс целиком и поймем, все ли в порядке, вдруг мы что-то потеряли?
По ссылке можно посмотреть на pdf-файл с диаграммой, чтобы спокойно увеличивать и видеть разные участки.
С точки зрения процессности, то есть именно описания и качества, состояния самого процесса Найма, у нас не отражено (то есть нет этой информации на момент отрисовки диаграммы, но мы можем ее подсветить владельцу процесса и внести правки, то есть смоделировать процесс TO BE):
- как и с помощью чего принимают решение о согласовании заявки на сотрудника, то есть нет никаких у нас запросов к финансовому отделу, например, а есть ли вообще бюджет на найм, или к отделу снабжения, а есть ли техника для обустройства рабочего места,
- согласовывается ли текст вакансии, и если да, то как это происходит и кем,
- храним ли мы каким-то образом в каких-то базах данных отклики и историю откликов разных кандидатов, и если да, то как? Как обновляем информацию?
- из каких конкретно шагов состоят подпроцессы скрининга и собеседования, есть ли обязательные критерии для скрининга (правила найма внутри компании)?
- есть ли какие-то ограничения по времени на размещение вакансии и прием откликов?
- есть ли какая-то принятая и согласованная форма отказа кандидату, кто согласовывает текст отказа, если согласовывает?
- есть ли утвержденная форма оффера?
- есть ли временные ограничения на принятие оффера кандидатом (например, он должен дать ответ в течение 3 дней)?
- пакет документов, которые нужно подготовить для выхода сотрудника едины для всех должностей и грейдов или отличаются? Кто и как влияет на полноту пакета документов? В какие сроки они должны быть подготовлены и с кем согласованы?
- что будет делать сотрудник HR-отдела если не выйдет кандидат на работу, будет ли он писать письма, вызванивать, как долго он будет добиваться ответа?
Видите, как много вопросов у нас есть, а ведь на первый взгляд все замечательно: вот процесс найма, вот диаграмма процесса, всем все понятно. Но на данный момент это просто неполная версия, именно за счет отсутствия информации об ограничениях, исполнителях, участниках, потребителях и т. д. Если бы мы собрали тщательно информацию о процессе, то и отразить в диаграмме это смогли. Поставили бы таймеры, делали бы параллельные задачи, или еще что.
А что с точки зрения нотации?
С точки зрения правил работы с нотацией BPM надо проверить:
- все ли пути имеют конечные события (то есть нет ли у нас подвисших без завершения задач / событий), у нас все хорошо: все пути закрыты конечным событием
- все ли названия задач имеют вид «глагол + существительное», у нас да, все
- есть ли у нас все начальные события? Да, есть
И так далее, вот здесь можно посмотреть самые частые ошибки в оформлении.
А в главе 11 книги BPMN Method and Style Брюса Сильвера (Bruce Silver) есть прям список правил, по которым можно проверить оформление диаграммы.
Чего у нас не не хватает: типов задач (выполняется пользователем, системная или еще как) и объектов данных.
Например, сделать оффер — задача пользователя, а задача отправить оффер — задача отправки сообщения, а сам по себе оффер — Выходной объект данных (Data Output) (то есть документ появляется в результате выполнения задачи):
То есть мы можем пошагово еще раз пройтись по всей нашей диаграмме и расставить все эти маркеры и элементы (можем, но я не буду, могу себе позволить).
Сама по себе текущая схема процесса не может быть исполняемой, потому что у нас нет достаточно данных для 100% полноты шагов, участников, ограничений, объектов данных и у нас нет 100% однозначности при интерпретации схемы (то есть когда кто-то, кто не мы, посмотрит на схему и скажет, что все понял, понять он может не все или не так).
Заключение
Я очень долго делала эту статью и этот пример, старалась показать максимально простой и мягкий вход в нотацию (я во многом ориентируюсь на рекомендации школ / книг, так как мой опыт работы с BPMN ограничен теми проектами и кейсами, на которых она была нужна, а нужна она была мне не каждый проект, прямо скажем).
Повторюсь, все пробелы / неточности в готовой схеме связаны с необходимостью продемонстрировать пробелы в сборе информации о процессе и исходных данных: когда у нас есть вся информация, мы ее всю отображаем теми же шагами и в том порядке, в котором она идет по потоку.
Повторюсь, вся статья есть пример и знакомство с нотацией для тех, кто думает, надо ли им погружаться и изучать нотацию на профессиональном уровне, потому как большинству чаще всего достаточно навыков чтения диаграммы.
Пожалуйста, если у вас есть аргументированные правки к данному кейсу, схеме и вы желаете их мне дать, то пишите в комментариях, я все учту и разберу. Возможно, я к вам пристану с вопросами, почему вы так думаете и на основании чего, но это не точно.
Чет у меня какой-то дисклеймер получился, а не заключение, но все же! Была рада написать для вас этот разбор. Встретимся в канале (хоть не в канаве, бадум-тсс!):