Я написал эту статью для себя, но подумал, что она будет полезна и начинающим айтишникам, и тем, кому необходимо освежить знания или быстро вспомнить основные вещи, не открывая полное руководство.
Ещё раз подчеркну, статья задумывалась как базовая памятка и помощь для начинающих, а никак не исчерпывающая документация. Многое я опускаю ввиду избыточности или неактульности, по крайней мере в моей работе.
Что это?
BPMN — это нотация (или метод, хотя почти везде пишут «система») моделирования или описания бизнес-процессов. Бизнес-процесс представляет из себя логику (алгоритм) работы системы для достижения поставленной задачи. Соответственно, BPMN-диаграмма — это диаграмма, которая описывает бизнес-процесс. Такие диаграммы довольно просто и интуитивно читаются, особенно если разработчик бизнес-процесса (тот, кто моделировал диаграмму) проектировал его по всем правилам и стандартам, а также старался не нагружать его лишней информацией.
В отдельных случаях с помощью BPMN прорабатывают сложные процессы: разработчик проектирует процесс, описывает все условия, пробрасывает потоки и т. д. Для этого есть специальные среды разработки, например, Tibco BPM и Camunda BPM.
Но всё же я буду рассказывать в первую очередь о диаграммах, так как это отличный инструмент для того, чтобы все участники команды, от менеджера до тестировщика, могли понять, что именно они делают в рамках конкретной задачи.
Из чего состоит?
Основные элементы, из которых состоит BPMN-диаграмма: события (синий), действия (зелёный), шлюзы (красный) и потоки (желтый).
![Основные элементы Основные элементы](https://habrastorage.org/getpro/habr/upload_files/ec9/0b4/fe0/ec90b4fe01dd46d0eefe88981878f482.png)
На самом деле элементов больше — есть также комментарии, «дорожки» и артефакты, — но они не так важны и можно обойтись без них. А вот обойтись без основных элементов никак не получится.
События (триггеры) используются для того, чтобы отобразить какое-то происшествие, например, приход сообщения в топик. События могут быть стартовыми, завершающими или промежуточными. Стартовые обозначают начало процесса, завершающие — его окончание, а промежуточные события могут приостанавливать выполнение процесса.
Обычно стартовые события имеют тонкую рамку, промежуточные — двойную, а завершающие жирную рамку:
![Основные типы событий Основные типы событий](https://habrastorage.org/getpro/habr/upload_files/410/cd5/df5/410cd5df52d05bf42d1254149f268d03.png)
В нотации BPMN 2.0 есть ещё и другие события. Точнее, стартовые и промежуточные разделены на подтипы. В моей практике всегда было достаточно событий базового типа, чтобы описать бизнес-процесс, поэтому на подтипах я останавливаться не буду, они больше нужны для разработки в специальных средах вроде Camunda BPM.
Помимо разделения на три основных типа, ещё есть разделение на типы по характеру работы события. Самые востребованные:
![Основные типы событий по характеру работы Основные типы событий по характеру работы](https://habrastorage.org/getpro/habr/upload_files/870/62b/02d/87062b02d9be4e0d149765f5eb046e33.png)
Пустое. Используется чаще всего в описании «подпроцесса» или когда проектировщик диаграммы просто поленился :) Иногда я сам так делаю, не судите строго ❤️
Сообщение. Используется в тех случаях, когда, например, инициатором запуска процесса выступает новое сообщение в топике, либо запрос.
Таймер. Почти все сценарии, которые связаны со временем. Например, запуск процесса в 12:00 каждый день.
Ошибка. Событие, которое чаще все используют как завершающее. Зачастую, описывая процесс, затрагиваются и негативные сценарии, именно для них используют событие с ошибкой (исключение).
Действия (или задачи) используются для отображения функций, которые будут выполняться программой. Также как и события, бывают нескольких типов и разные по характеру. Но в своей практике я пришёл к тому, что для описания бизнес-процесса с точки зрения аналитики для айтишной команды бессмысленно использовать все варианты действий, так как зачастую не все знают и понимают различие. А ещё это вызывает небольшой перегруз, но это мое субъективное мнение. Поэтому из всех действий я постоянно использую только два: обычное и «подпроцесс».
![Основные типы действий Основные типы действий](https://habrastorage.org/getpro/habr/upload_files/bc7/f4e/b5c/bc7f4eb5c4f563900fc2786ae762461a.png)
Обычное действие используется для описания активности, которую нельзя никак разбить (по крайней мере, я его так использую).
Подпроцесс. Это действие используется, когда необходимо в описываемый процесс внедрить ещё один (который, например, уже описан) как его часть, либо для дальнейшей декомпозиции действия. Ознакомиться с использованием такого действия можно дальше в главе с примерами «Лента новостей своими руками».
Шлюзы — это элементы, которые используются для введения в процесс развилок, различных условий или дополнительной логики. Чаще всего используются три типа шлюзов: «исключающее ИЛИ», «И» и «включающее ИЛИ». По сути, они работают как и их одноимённые операторы. Опять же, типов куда больше, особенно в BPMN2.0, но практически всегда используются эти три (по крайней мере мной, и лишних вопросов от коллег не получаю).
![Основные типы шлюзов Основные типы шлюзов](https://habrastorage.org/getpro/habr/upload_files/1c8/6d1/15a/1c86d115adabe0f7db68c1be8878eefa.png)
«Исключающее ИЛИ». Такой шлюз требуется для разделения выполнения процесса на один из вариантов. То есть это работает как выбор, и в процессе выполняется либо одна ветка, либо другая. Примеры:
![Пример 1 Пример 1](https://habrastorage.org/getpro/habr/upload_files/55d/aef/f0b/55daeff0b999ff1219e7c6b3dd69cd89.gif)
![Пример 2 Пример 2](https://habrastorage.org/getpro/habr/upload_files/59a/b72/4f3/59ab724f3724dd977e7c7133c8db53ba.gif)
«И». Шлюз используется для распараллеливания процесса на две ветки, которые исполняются одновременно. Примеры:
![Пример 1 Пример 1](https://habrastorage.org/getpro/habr/upload_files/498/656/676/4986566767cebd8759bdc781b97962c7.gif)
![Пример 2 Пример 2](https://habrastorage.org/getpro/habr/upload_files/e31/22f/a98/e3122fa982e0652f88bfa87308b5e1fe.gif)
«Включающее ИЛИ». Этот шлюз сочетает в себе функции двух вышеописанных: выполнение процесса может как распараллелиться на все ветви, так и разбиться на определённые, удовлетворяющие условию.
![Пример с шлюзом “включающее ИЛИ” Пример с шлюзом “включающее ИЛИ”](https://habrastorage.org/getpro/habr/upload_files/273/560/550/273560550953e5c71c617f112aa71aff.png)
Примеры разделения потоков:
![Пример Пример](https://habrastorage.org/getpro/habr/upload_files/548/86f/c89/54886fc89b3312170868892a74b47072.gif)
Очень важно отметить, как двигается «токен» выполнения процесса по потоку и какие бывают нюансы. Это НЕ поможет на собеседовании (а может, и поможет), но позволит чётко и осознанно понимать работу шлюзов, как делать НАДО, как можно, но НЕ СТОИТ, а как точно НЕЛЬЗЯ.
Как делать НАДО (показано в примерах под каждым шлюзом). Корректнее использовать открывающие шлюзы и закрывающие одного типа, а также не использовать закрывающий шлюз сразу под раскрытие новых веток. Это необходимо для повышения читаемости и исключения различных ошибок (о них далее).
-
Как делать НЕ СТОИТ. Я бы не рекомендовал сочетать разные шлюзы при раскрытии веток и их объединении, так как это может запутать человека, который будет смотреть ваш процесс. Ещё такое сочетание разных шлюзов может привести к некорректной работе. В примере ниже действие под номером 4 выполнится дважды, хотя процесс был запущен один раз. Так произойдёт из-за того, что в процессе используется шлюз «И» как открывающий, он распараллеливает потоки, а закрывающий — шлюз «ИЛИ», который не собирает потоки воедино.
Так делать НЕ СТОИТ Работать этот процесс будет. Возможно, в отдельных случаях такой алгоритм работы может даже пригодиться. Поэтому это не ошибка, так делать можно, но я бы не рекомендовал, как минимум из-за снижения читаемости логики выполнения процесса. Если нужно в алгоритме сделать так, чтобы какое-то действие выполнялось дважды, то лучше это действие разбить и вынести в каждую ветку. В таком виде процесс будет понятнее и вопросов к нему будет меньше.
-
Как делать НЕЛЬЗЯ. Здесь также речь про сочетание разных шлюзов. В примере ниже действие под номером 4 не выполнится никогда, да и сам процесс тоже никогда не завершится. Произойдёт это из-за того, что в качестве закрывающего шлюза выбран «И», который ожидает токены из обеих веток для продолжения процесса, а их никогда не будет. Сочетание шлюзов в таком формате — грубая ошибка.
Так делать НЕЛЬЗЯ
Потоки — тут всё очень просто: это стрелка, которая отображает последовательность действий в процессе.
Дорожки — эти элементы являются необязательными, но я лично в своей практике использую их довольно часто для отображения разделения на микросервисы, а также взаимодействий со смежными системами. Дорожка представляет из себя подписанный прямоугольник, внутри которого укладываются те элементы, которые выполняются внутри или причастны к микросервису или системе. В этом примере с помощью дорожек процесс декомпозируется на отдельные микросервисы системы, в которой он (процесс) выполняется.
![Пример с дорожками Пример с дорожками](https://habrastorage.org/getpro/habr/upload_files/fff/805/2ae/fff8052ae577630660aea1fef5c22c60.png)
Где и как пользоваться?
Есть довольно много вариантов, где и как можно пользоваться нотацией. Это могут быть упомянутые выше Tibco BPM, Camunda BPM, или же такие инструменты как ARIS, draw.io и т. д. Писать об этом подробно не буду, так как по большей части всё зависит от компании, в которой вы работаете. Либо вам предоставляют специальное ПО для проектирования бизнес-процессов, либо нет. Я предпочитаю в своей практике draw.io, так как он универсален и пользоваться им можно практически везде. Причём это может быть плагин, встроенный во всеми любимый (или нет) Confluence или в вашу любимую IDE. Кстати, при использовании IDE перед нами открывается могучий «docs-as-code».
При использовании плагина draw.io в Confluence работа выглядит так же, как и при использовании конструктора на сайте. Небольшой пример работы вы можете посмотреть в моей статье про диаграмму последовательности.
Для установки плагина в IDE — в моём случае это WebStorm от JetBrains — можете следовать этому руководству. Зайдите в настройках в меню Plugins, далее найдите во вкладке MarketPlace плагин «Diagrams.net Integration» и установите его:
![Установка плагина Установка плагина](https://habrastorage.org/getpro/habr/upload_files/ea7/0bb/a2b/ea70bba2ba42b9236b6ace4cc92b4446.png)
После этого вам станет доступно создание файла в формате, понятном для draw.io:
![](https://habrastorage.org/getpro/habr/upload_files/bca/b46/6e9/bcab466e9a6aac1efa00772a94f8cf8b.png)
![](https://habrastorage.org/getpro/habr/upload_files/12f/9ba/9fe/12f9ba9fe388845ffaaffb46ae7d2772.png)
![](https://habrastorage.org/getpro/habr/upload_files/8dc/561/93d/8dc56193dc3bdb945fd65aca5cdcae85.png)
Лента новостей своими руками
Попробуем вместе спроектировать бизнес-процесс, приближенный к рабочим задачам. Предположим, что перед нами стоит цель спроектировать алгоритм взаимодействия браузера с бэкендом приложения. Необходимо описать процесс с предоставлением пользователю ленты новостей на основе записей друзей и рекомендаций.
![Обращаю внимание, что все новые элементы выделены зелёным цветом для наглядности Обращаю внимание, что все новые элементы выделены зелёным цветом для наглядности](https://habrastorage.org/getpro/habr/upload_files/106/ca6/6a7/106ca66a763978a46cc5acadd1203aaa.png)
У нас получился простой процесс из стартового, завершающего событий и четырёх действий:
поиск друзей и интересов;
отбор новых записей друзей и рекомендаций;
отсечение лишних записей;
сортировка записей по релевантности.
Теперь предлагаю улучшить наш процесс с помощью добавления типов «Сообщение», которые отображают полученный запрос и отправленный ответ. Также добавляем ещё одно действие для наглядности, что мы формируем ответ и возвращаем его. Результат улучшения:
![](https://habrastorage.org/getpro/habr/upload_files/194/ef7/abc/194ef7abcf53450e1f6bdb74a613de48.png)
Добавим обработку запроса:
![](https://habrastorage.org/getpro/habr/upload_files/561/013/283/561013283b775cedf8df5da9700b9ba2.png)
Помимо нового действия с обработкой запроса, в который может быть включена проверка тела запроса, проверка корректности данных и т. д., добавилась новая ветка, которая раскрывается с помощью исключающего шлюза. В ней у нас появилось действие с фиксацией ошибки и новое событие с ошибкой.
Предлагаю теперь немного ещё улучшить:
![](https://habrastorage.org/getpro/habr/upload_files/bfa/eb7/322/bfaeb7322aa091da887cc7e6f7942e78.png)
В новой версии процесса мы декомпозировали действия на отдельные ветки и добавили дополнительные условия.
И последнее улучшение: предположим, что архитектура нашего бэкенда состоит из микросервисов, и тогда будет удобнее раскидать все события и действия по отдельным «дорожкам». Каждая из них будет представлять из себя блок с определённым микросервисом:
![](https://habrastorage.org/getpro/habr/upload_files/851/b8b/1dc/851b8b1dccb700ca067065be5f2f78bf.png)
Теперь стало понятнее, где и что у нас происходит при разделении на отдельные сервисы. Но пришёл владелец продукта и попросил внести новый кусок логики — добавление в ленту рекламных записей, и описал, как это должно работать. Чтобы аккуратно внедрить этот кусок в наш процесс, мы можем его выделить в виде отдельного подпроцесса, а сам алгоритм описать в отдельной диаграмме:
![](https://habrastorage.org/getpro/habr/upload_files/a32/3d7/657/a323d76577c72c07997432e0478565f2.png)
Заключение
BPMN это мощный инструмент, который лично я, как системный аналитик, использую в своей работе практически каждый день. Если сам не проектирую бизнес-процесс, то, как минимум, изучаю документацию смежников. Очень рекомендую каждому аналитику, а также всем причастным к разработке освоить это дело.
Надеюсь, что в виде шуточной практики мне удалось донести смысл и принцип создания бизнес-процессов; а если нет, то жду ваши вопросы в комментариях.
Кстати, у меня есть Telegram-канал «Айтишник обыкновенный», где я делюсь опытом и знаниями из IT-индустрии. Лучшая поддержка — подписка на мой канал ❤️
А ещё рекомендую глянуть мою статью по диаграммам последовательности. Я уверен, что каждый найдёт для себя в ней что-то новое.
P.S. Возможно, про какие-то особенности я забыл написать или даже не знал. Поделитесь в комментариях, если пользуетесь чем-то ещё, что я не осветил в статье. Если будет что-то дельное, я обязательно добавлю, а также укажу вас как соавтора.
Всем добра!
Комментарии (27)
nlinker
14.08.2024 19:16+1Как же классно выглядят именно анимированные диаграммы, понятно буквально с одного взгляда.
orchanin
14.08.2024 19:16Спасибо, а уточните какой софт использовали для запуска диаграмм? В dwawio такой фичи не видел.
AATs
14.08.2024 19:16Хм... Автор очевидно изучал BPMN по Википедии :-) BPMN содержит ещё модели, которые логически связаны между собой. Описана только модель типа "оркестровка". В отрыве от других типов моделей - это только красивая картинка. Коллеги, почитайте нотацию на первоисточнике на сайте OMG.
default_itshnik Автор
14.08.2024 19:16Автор рассказал на собственном примере как использует BPMN в своей работе, а также подсветил это несколько раз)
Естественно, если ты хочешь разобраться от корки до корки в этой теме, то тебе надо идти и изучать мануал, я написал свое видение, а не исчерпывающую документацию другими словами)
Dolby
14.08.2024 19:16Хорошо все описано, но думаю было бы неплохо добавить что-то про call activity элементы. Очень полезная штука, особенно для однотипных подзадач - один раз описал потом переиспользуешь в любом месте схемы
default_itshnik Автор
14.08.2024 19:16В моем понимании это важно, когда ты ведешь разработку, используя bpmn, то есть, например, разрабатываешь процесс в Camunda Modeler'е каком-нибудь. А я описывал с упором на создание аналитики. Надеюсь, я тебя правильно понял, спасибо за совет!
itGuevara
14.08.2024 19:16+1При использовании плагина draw.io в Confluence работа выглядит так же, как и при использовании конструктора на сайте.
1 Как составить дерево процессов из схем в drawio, но желательно не в платном Confluence, а в Open source? Дерево процессов, как в aris publisher, см. пример
в левом верхнем углу раскрываем treeview и пробегая по дереву процессов справа видим соответствующую схему процесса. treeview + интерактивное отображение выбранного в нем элемента.
2 Как отображать добавленные в схему drawio атрибуты как к смехе (автор), так и к элементу схемы? Также как в п. 1, но значения из "Object", см. тот же пример
Речь про метаданные - пользовательские свойства — дополнительная информация к фигурам, см. shape-metadata, но отображение их не в схеме, а в publisher (в идеале еще импорт \ экспорт данных фигур = метаданных в excel, как это штатно умеет visio).
В целом 1 + 2 - как сделать publisher для схем drawio?
3 Один из мифов BPMN показал тут
default_itshnik Автор
14.08.2024 19:16Согласен, это все очень здОрово и вполне справедливо звучит, но зачем? Чтобы что?
Например, передо мной стоит задача расписать алгоритм какого-то нового процесса для фичи вместе со всеми интеграциями внутри.
Я делаю BPMN-диаграмму для наглядности, чтобы любой человек из команды мог открыть страницу на confluence и быстро понять что, как и где происходит на каждом этапе. Подробное описание со всеми нюансами алгоритма оставляется ниже под диаграммой.
1)Для чего мне дерево процессов в рамках фичи? Я могу ссылаться на отдельные страницы с аналитикой, если нужно.
2)Зачем мне вообще работать со схемой drawio? Чтобы что?
3)Это аналитика, а не разработка. В аналитике наличие бизнес процесса для наглядности довольно хорошо позволяет погружаться в задачу, тратя меньше времени.
Возможно я, конечно, где-то не так тебя понял и ты имел в виду что-то другое, если так, то сори) Но в любом случае спасибо за развернутый коммент ❤️
itGuevara
14.08.2024 19:16+13)Это аналитика, а не разработка. В аналитике наличие бизнес процесса для наглядности довольно хорошо позволяет погружаться в задачу, тратя меньше времени.
Возможно я, конечно, где-то не так тебя понял и ты имел в виду что-то другое, если так, то сори) Но в любом случае спасибо за развернутый коммент
Мир BPM зародился давно (ARIS и ранее, включая bpwin) и в нем те вещи, про которые я указал выше, считаются базовыми. В ARIS все это хорошо сделано - это был и остается инструмент №1 для аналитика процессов. Много по нему информации и хорошо показана идеология BPM, см. "BPM-библия" из Подборка ссылок.
Все объекты схемы (операции, события \ шлюзы), их дублирование в других схемах (заимствование подпроцессов), атрибуты, взаимосвязи и т.п. Единое дерево всех процессов компании и т.п. Поиск и сортировка по миллионам объектов, размазанным по тысячам схем (в масштабах сбера - еще больше) и т.п.
Даже выделение трех подпроцессов нагляднее смотрится в виде дерева из трех веток (в дополнение к интерактивному раскрытию их на схеме BPMN).
system analyst - sberdata - bpmn\ aris:
default_itshnik Автор
14.08.2024 19:16Я не спорю, aris крутой, даже удалось в нем немного поработать в своё время, но еще раз повторюсь, я проецирую в первую очередь свой опыт. Эта вещь все-таки субъективная. В текущей ситуации, когда везде есть конфлюенс и далеко не везде есть арис, я вижу использование bpmn в таком виде, как описал в статье.
К сожалению, мы не в идеальном мире живем(
Iana_Bakh
14.08.2024 19:16Спасибо за статью!
Для отрисовки использую https://demo.bpmn.io/ (даже draw.io не нужно).
По содержательной части. У меня возникли сложности с пониманием шлюзов "И" и "ИЛИ".
Реально хорошо поняло только "Исключающее ИЛИ". Придется gpt-тить примеры кейсов на шлюзы "И" и "ИЛИ" с оговоркой "простым языков", "элементарные примеры".
Ну и поскольку не до конца врубилась в шлюзы, на практике в "Лента новостей своими руками" понимала содержимое схемы до картинки 4 (добавление новой ветки для восприятие уже стало сложным).
ИМХО: хороший материал для "самых маленьких". На работе не использую инструмент, но мечтаю освоить хотя бы на базовом уровне
Zelebublik
14.08.2024 19:16Дорожки - зло.
Семантика кривовата.
Для показать бизнесу - сойдет.default_itshnik Автор
14.08.2024 19:16Почему дорожки зло? Разрабам очень нравится на основе дорожек быстро и четко осознавать о каком сервисе речь и что он выполняет в рамках общего процесса.
RMV1983
14.08.2024 19:16+1Пишу тут для себя в свободное время программку, как оказалось, с похожим функционалом. Изначально, цели были немного иные, но визуально похоже. Думаю, если немного доработать, может напоминать то, что описано в статье. Именно как упрощённый режим. Вот только, раздумываю: оно кому-то надо, кроме меня?
vesh95
14.08.2024 19:16Да где же, черт побери, делают эти ваши BPMN диаграммы? Сколько работаю разработчиком ещё ни разу не встречался с ними, обычно в /issue все текстом прописано что нужно сделать, с разговоров про что-то новое всё начинается и текстом все заканчивается. Хотя всё это я изучал в технаре, но никогда не пригодилось даже знание этих диаграмм, даже не по себе от этого, как будто мне всё обучение мимо темы прошло.(
Если где-то в компаниях это используют отзовитесь, посмотрю хоть на вас.default_itshnik Автор
14.08.2024 19:16Мы активно в команде используем. Почти во всех задачах, если, конечно, задача не про добавление 2 новых полей и смену кнопки в интерфейсе))
Делаем конкретно мы в конфлюенсе, так как встроен плагин с draw.io, и диаграммы красиво выстраиваются в аналитику.
vesh95
14.08.2024 19:16Это круто. Как мне кажется некоторые компании зря не используют это. Как правило в таких компаниях ещё и перестройки крупные для проектов требуются, а без диаграмм опорной точкой становится именно кодовая база, это тоже самое что пытаться узнать как выглядит динозавр, глядя на его кости.
default_itshnik Автор
14.08.2024 19:16Ну да, реверсинжениринг – почти всегда самое сложное в работе, раньше даже в консалтингах за такую работу больше денег просили и им платили))
itGuevara
14.08.2024 19:16Год назад им первое место дали:
https://youtu.be/V2eaihzQCl8?si=vFw2Fa1JMxeFers3
Полагаю, что bpmn сейчас используют в каждом крупном банке.
Batorskylab
Спасибо, было интересно и познавательно.