Полезные диаграммы из UML (Рубрика #Architecture)
Сегодня утром я вспоминал книгу "Самоучитель UML", а также применимость языка для коммуникации и размышления об архитектурных решениях (
1 и
2). Там я пообщел отдельно рассказать о диаграммах, которые я считаю полезными и вот время пришло. Ниже представлен список, который мне кажется полезным и в нынешних условиях, когда UML проиграл другим средствам моделирования, навроде C4 Model, про который хорошо рассказывает Саймон Браун, создатель концепта (смотрите мой
разбор его доклада "The C4 Model - Misconceptions, Misuses & Mistakes" из 2024 года)
1) Use case diagram (диаграмма вариантов использования) - это стандартная диаграмма со сценариями, из которой обычно все помнят человечков и эллипсы, но забывают, что это только иллюстрации, а основа в тексте с happy path и exceptional flow. Также тут есть магия про декомпозицию и композицию сценариев. Сам тип диаграммы иногда используется до сих пор, но когда-то стало модно это описывать через user stories, потом customer journey map, потом jobs to be done сценарии и так далее
2) Class diagram (диаграмма классов) - по-факту, это наследие ER диаграммы (entity-relationship), но в объектно-ориентированном исполнении. Почти любая IDE может генерировать такие диаграммы по коду. Они понятные для инженеров и тоже иногда используются
3) Sequence diagram (диаграмма последовательности) - это популярная диаграмма для описания взаимодействия между разными частями системы. Она достаточно интуитивно читается, а также позволяет описать и проанализировать сложное взаимодействие. Хороший пример такого описания и анализа есть в недавные статье от Google "A Model-based, Quality Attribute-guided Architecture Re-Design Process at Google", про которую я
рассказывал раньше. Кстати, есть похожая диаграмма, которая тоже про взаимодействия, но отображение чуток другое - это
Activity diagram (диаграмма деятельности). Эти диаграммы отображают динамическое поведение системы
4) Component diagram (диаграмма компонентов) - это диаграмма позволяет отобразить компоненты с их интерфейсами, а также как они зависят друг от друга. Эта диаграмма отображает статическое состояние системы.
5) Deployment diagram (диаграмма развертывания) - этот вид диаграмм позволял связать логическое описание системы с его физическим воплощением. То есть мы понимали тут как наши компоненты будут физически воплощены в процессах, внутри серверов, связаны сетью и так далее.
6) State chart diagram (диаграмма конечного автомата) - этот тип диаграмм позволяет описывать конечные автоматы. У него есть состояния и переходы между ними, доступные действия и так далее. В этой диаграмме мы можем описать, например, логику работы чайника. Его состояния могут быть такими: «выключен», «нагревается» и «кипит». Когда мы нажимаем кнопку, он выполняет действие — переходит из состояния «выключен» в состояние «нагревается». А когда вода в чайнике закипает, он автоматически меняется на состояние «кипит». Каждое из этих действий, например, нажатие кнопки или закипание воды, заставляет чайник переходить из одного состояния в другое, по заранее заданным нами правилам.
В общем, эти виды диаграмм отлично помогли мне структурировать понимание того, как можно декомпозировать систему на части и размышлять о них отдельно - это аналитическая часть проектирования. И только потомя научился не просто разбирать системы на произвольные части, но и собирать что-то осмысленное обратно. А постепенно мне стало ясно, как размышлять про эмерджентные свойства системы, которые удовлетворяют как функциональным, так и нефункциональным требованиям к системе. Но это уже история для другого поста.
#Software #Architect #SystemDesign #SoftwareArchitecture #Processes