Продолжая использовать этот сайт, вы соглашаетесь на использование файлов cookie 🍪
Блог CosySoft
Разработка Технологии

Полезно, сомнительно или ненужно: Draw.io и PlantUML глазами бэкенд-разработчика

Нужен ли навык создания схем бэкенд-разработчику? Если вы активно взаимодействуете с аналитиками, лидерами команд или руководите джунами, то схемы станут удобным способом презентовать, объяснять или согласовывать архитектурные решения. Наш разработчик Костя Н. использовал инструменты Draw.io и PlantUML в повседневной работе и решил получше разобраться в их возможностях. В этой статье Костя расскажет о практическом аспекте использования схем — какие действительно полезны, а какие бэкендеру не пригодятся.

Draw.io

В Confluence существует два основных способа создания и редактирования схем: Draw.io и PlantUML.
Draw.io, также известный как diagrams.net, является популярным инструментом для создания схем и диаграмм. Это мощный инструмент, однако его использование связано с определенными ограничениями, такими как низкая производительность в Confluence и сложность интеграции с системами контроля версий. Несмотря на это, низкий порог входа делает Draw.io хорошим выбором для быстрой визуализации идей.

Преимущества Draw.io

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

Недостатки Draw.io

  • Схемы хранятся в формате XML, что затрудняет отслеживание изменений и интеграцию с Git.
  • При работе с большими проектами и сложными диаграммами инструмент может ощутимо тормозить.
  • Автоматическое размещение элементов может приводить к непредсказуемым сдвигам и последующей ручной корректировке.
Моя рекомендация: используйте плагины для улучшения производительности. Когда Draw.io запущен через Confluence то при большом количестве схем будут задержки. Используйте плагин для IDE, например, IntelliJ, который позволяет создавать и редактировать диаграммы локально, и затем копируйте их в Confluence. Это снижает зависимость от качества интернет-соединения, что особенно актуально при подключении через VPN.

Костя, бэкенд-разработчик

PlantUML

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

Преимущества PlantUML

  • Благодаря текстовому описанию создание и изменение диаграмм происходит значительно быстрее по сравнению с Draw.io.
  • Поскольку диаграммы описываются кодом, они легко интегрируются с системами контроля версий.
  • Позволяет сосредоточиться на сути диаграммы, описывая, что должно быть представлено, а не как именно это должно выглядеть.

Минусы и ограничения PlantUML

  • Если требуется точное расположение элементов диаграммы, это может потребовать значительных усилий и экспериментов с синтаксисом PlantUML.
  • Новичкам может потребоваться время для освоения синтаксиса.

Создаем простую диаграмму в PlantUML

Предположим, вам необходимо быстро создать диаграмму сущностей для одной из функций вашего проекта. Этот простой код генерирует диаграмму, описывающую связь между пользователями и заказами. В отличие от графических инструментов, где вам пришлось бы вручную размещать блоки и соединять их стрелками, в PlantUML можно быстро настроить структуру диаграммы, корректируя текстовое описание.
@startuml
title Диаграмма настроек

skinparam linetype ortho

entity dispensers_settings_pack {
*id : bigint
--
group_id : bigint
total_production : numeric
}

entity dispensers_settings {
* dispensers_settings_pack_id : bigint
* dispenser_id : bigint
--
production : numeric
}

entity dispersers_settings_status_history {
*id : bigint
--
*dispensers_settings_pack_id : bigint
status : text
user_name : text
email : text
created_at : timestamp
}

dispensers_settings_pack }|-- dispensers_settings
dispensers_settings_pack }|-- dispersers_settings_status_history

@enduml

Типы диаграмм в PlantUML

При выборе инструментов для визуализации архитектуры и процессов в бэкенд-разработке важно понимать, какие типы диаграмм действительно полезны, а от каких можно отказаться. Я разбил диаграммы на 3 класса: полезные, сомнительные и ненужные.

Ненужные диаграммы

Эти типы диаграмм редко находят применение в задачах бэкенд-разработчика.
  • EBNF (Extended Backus–Naur Form). Используется для описания синтаксиса языков программирования.
  • ASCII Math. Предназначен для рисования математических формул в текстовом формате.
  • MindMap. Полезны для мозговых штурмов, но в контексте бэкенд-разработки часто оказываются избыточными.
  • Gantt диаграммы. Обычно используются проектными менеджерами для планирования сроков и ресурсов.
  • Use Case диаграммы. Хотя могут быть полезны для понимания требований системы, их создание — задача системных или бизнес-аналитиков.

Сомнительные диаграммы

Эти диаграммы могут быть полезны в определенных ситуациях.
  • Диаграмма классов (Class Diagram). Полезна для визуализации объектов и их взаимодействий. В крупных проектах может быть избыточной.
  • Диаграмма развертывания (Deployment Diagram). Описывает физическое развертывание программного обеспечения. Обычно настраивается DevOps-специалистами.
  • Диаграмма состояний системы (State Diagram). Полезна для отображения состояний объектов или системы. Требует глубокого понимания синтаксиса PlantUML.
  • Сетевая диаграмма (Network Diagram). Описывает сетевую инфраструктуру и подключения. Чаще используется DevOps-инженерами.
  • Archimate диаграммы. Высокоуровневые архитектурные диаграммы, предназначенные для архитекторов.

Полезные диаграммы в PlantUML

JSON диаграммы

PlantUML позволяет быстро визуализировать большие JSON-структуры. Например, вы можете загрузить большой JSON-файл, и за считанные секунды он сгенерирует диаграмму, отображающую взаимосвязи между полями. Это особенно полезно при работе с API или конфигурационными файлами, где необходимо понять структуру данных.

YAML диаграммы

YAML-диаграммы помогают визуализировать конфигурационные файлы или структуры данных. При развертывании микросервисов с использованием YAML-конфигураций, диаграмма позволяет быстро увидеть, как различные компоненты взаимодействуют друг с другом.

Regex диаграммы

Regex-диаграммы облегчают понимание структуры и работы регулярных выражений, особенно когда регулярка становится сложной и трудноразбираемой.
@startregex
^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$
@endregex

Information Engineering Diagram

IE-диаграммы отображают сущности, их атрибуты и связи между ними. Они полезны при проектировании баз данных, когда требуется согласовать структуру между командами или документировать ключевые сущности системы. PlantUML поддерживает указание типов данных, модификаторов видимости и внешних ключей (FK), что делает диаграммы детализированными и информативными.

Sequence Diagram

Диаграмма последовательностей, один из самых популярных типов диаграмм в UML. Эта диаграмма используется для объяснения того, как различные компоненты системы взаимодействуют друг с другом во времени. С помощью PlantUML можно быстро изменять диаграмму, просто редактируя текстовое описание. По сравнению с Draw.io создание диаграмм последовательностей в PlantUML существенно быстрее и проще.
@startuml
title Проведение платежа
participant UI as ui
participant Scheduler as scheduler
participant Rabbit as rabbit
participant PaymentService as payServ
participant YandexClient as ya
participant Database as db

== Создание платежа ==
ui -> payServ ++
payServ -> db ++
return paymentId
return paymentId

'это дополнительный промежуток между блоками
|||

== Создание задач на обработку платежей ==
scheduler -> payServ ++
payServ -> db ++
return unprocessed paymentIds
loop batch по 100 платежей на задачу
payServ -> rabbit : создание задач
end
deactivate payServ

== Проведение платежей ==
rabbit -> payServ ++
payServ -> db ++
db -> payServ : необработанные платежи
loop для каждого paymentId в задаче
payServ -> ya
ya -> payServ : yandexPaymentId
payServ -> db : сохранение проведенного платежа
end
deactivate db
deactivate payServ
|||

@enduml
  • Определение участников (actors). В PlantUML вместо использования стандартного участника participant можно указать специфичные типы, например, database, что позволит более точно отобразить роль каждого компонента.
  • Использование плейсхолдеров. Для упрощения процесса можно использовать плейсхолдеры и переменные, что позволяет избежать повторного указания одних и тех же элементов.
  • Добавление заметок (notes). При необходимости добавить пояснения или уточнения, можно использовать команды note right или note left, что позволяет разместить дополнительную информацию рядом с основными элементами диаграммы.
Sequence-диаграммы имеют два ключевых ограничения: сложности с отображением ветвлений и перегруженность элементов. Ветвления, которые возникают при выполнении нескольких альтернативных действий, трудно визуализировать в рамках одной диаграммы, поэтому их лучше дополнять диаграммами Activity для наглядности. Перегруженность диаграмм, вызванная большим количеством участников и сообщений, можно уменьшить, разделив процесс на несколько диаграмм или добавив заметки и placeholder’ы для упрощения восприятия.

Activity Diagram

Диаграмма активности позволяет визуализировать алгоритмы и процессы, что особенно полезно при согласовании базовых алгоритмов с лидом или другими членами команды. Она помогает объяснить, как планируется писать код, и согласовать основные этапы разработки.
Инструмент поддерживает визуализацию сложных процессов, таких как параллельные ветви, циклы и блоки с заметками.
  • Использование стандартных блоков: для создания диаграммы активности необходимо использовать стандартные блоки программирования, такие как условия, циклы и различные типы циклов.
  • Добавление ветвлений и циклов: для отображения ветвлений и циклов можно комбинировать диаграммы активности с диаграммами последовательностей, что позволяет более гибко управлять логикой алгоритмов.
  • Использование заметок: для пояснения отдельных блоков можно добавлять заметки с помощью команды note right или note left, что помогает лучше объяснить происходящие процессы.
  • Активирование и деактивирование блоков: команды activate и deactivate позволяют управлять состоянием блоков, что особенно полезно для отображения начала и конца активности.

Итоги

В целом, я планирую создавать диаграммы преимущественно с помощью PlantUML, поскольку этот инструмент быстрее и проще в использовании. Но если мне будет необходимо быстро что-то согласовать, то я скорее выберу Draw.io, чтобы точно быть уверенным в том, что все поймут мою схему.
Если мне нужно объяснить что-то джуну, я, скорее всего, предоставлю ему исходный код напрямую и отправлю делать диаграмму в PlantUML. Кстати, стоит отметить, что исходный код легко передать ChatGPT для генерации диаграмм. Можно попросить ChatGPT создать диаграммы на основе миграций, сущностей или репозиториев, что значительно упрощает процесс документирования и визуализации базовых сервисов и классов. Но об этом я расскажу в следующий раз.
Резюмируя: PlantUML предпочтительнее и для быстрой и эффективной визуализации, а Draw.io может быть использован для более детализированных и согласованных диаграмм с более опытными коллегами. Используйте оба инструментов в зависимости от контекста и повышайте качество коммуникации и документирования в команде.