PlantUML, личные примеры.
Примитивное, чисто для иллюстрации:
Это я делал дерево технологий для "X-COM: Terror from the Deep":
Посмотреть код plantuml-диаграммы
@startuml
'!theme plain
'left to right direction
'scale max 4000 width
skinparam BackgroundColor #eee
skinparam titleFontSize 26
skinparam titleFontName Verdana
skinparam titleBorderThickness 0
skinparam titleBorderRoundCorner 12
skinparam titleBackgroundColor Aqua-CadetBlue
skinparam groupInheritance 2
skinparam object {
BorderColor grey
BackgroundColor #ddd
FontSize 13
FontName Verdana
BorderColor<<blueprint>> transparent
handwritten<<blueprint>> true
}
skinparam package {
BorderThickness 1
BorderColor grey
RoundCorner 20
Style default
}
<style>
legend {
FontSize 16
Padding 14
Margin 16
}
</style>
title "X-COM: Terror from the Deep" research tree
package "The research projects available by default" {
object "**Gauss Technology**" as GaussTechnology
object "**Particle Disturbance Sensor**" as ParticleDisturbanceSensor {
Blueprint: **Particle Disturbance Sensor**
}
object "**Medi-Kit**" as Medikit {
Blueprint: **Medi-Kit**
}
object "**Gauss Pistol**" as GaussPistol #fbb {
Blueprint: **Gauss Pistol**
}
object "**Gauss Pistol Clip**" as GaussPistolClip #fbb {
Blueprint: **Gauss Pistol Clip**
}
object "**Gauss Rifle**" as GaussRifle #fbb {
Blueprint: **Gauss Rifle**
}
object "**Gauss Rifle Clip**" as GaussRifleClip #fbb {
Blueprint: **Gauss Rifle Clip**
}
object "**Heavy Gauss**" as HeavyGauss #fbb {
Blueprint: **Heavy Gauss**
}
object "**Heavy Gauss Clip**" as HeavyGaussClip #fbb {
Blueprint: **Heavy Gauss Clip**
}
object "**Gauss Cannon**" as GaussCannon #f9d {
Blueprint: **Gauss Cannon**
Blueprint: **Gauss Cannon Ammo**
}
object "**Gauss Defence**" as GaussDefence #ccf {
Blueprint: **Gauss Defence**
}
diamond jointCoelacanth
object "Blueprint: **Coelacanth/Gauss**" as CoelacanthGauss<<blueprint>> #f99
}
package "Sonic research tree" {
object "**Sonic Pistol**" as SonicPistol #fbb {
Blueprint: **Sonic Pistol**
}
object "**Pistol Power Clip**" as PistolPowerClip #fbb {
Blueprint: **Pistol Power Clip**
}
object "**Sonic-Blasta Rifle**" as SonicBlastaRifle #fbb {
Blueprint: **Sonic-Blasta Rifle**
}
object "**Blasta Power Clip**" as BlastaPowerClip #fbb {
Blueprint: **Blasta Power Clip**
}
object "**Sonic Cannon**" as SonicCannon #fbb {
Blueprint: **Sonic Cannon**
}
object "**Cannon Power Clip**" as CannonPowerClip #fbb {
Blueprint: **Cannon Power Clip**
}
object "**Sonic Oscillator**" as SonicOscillator #f9d {
Blueprint: **Sonic Oscillator**
}
diamond jointSonicOscillator
object "**Sonic Defence**" as SonicDefence #ccf {
Blueprint: **Sonic Defence**
}
diamond jointDisplacerSonic
object "Blueprint: **Displacer/Sonic**" as DisplacerSonic<<blueprint>> #f99
}
object "**Zrbite**" as Zrbite #ef7
object "**Disruptor Pulse Launcher**" as DisruptorPulseLauncher #fbb {
Blueprint: **Disruptor Pulse Launcher**
}
object "**Disruptor Pulse Ammo**" as DisruptorPulseAmmo #fbb {
Blueprint: **Disruptor Pulse Ammo**
}
diamond jointPWTCannon
object "**P.W.T. Cannon**" as PWTCannon #f9d {
Blueprint: **P.W.T. Cannon**
..
Blueprint: **P.W.T. Ammo**
}
object "**P.W.T. Defence**" as PWTDefence #ccf {
Blueprint: **P.W.T. Defence**
}
diamond jointDisplacerPWT
object "Blueprint: **Displacer/P.W.T.**" as DisplacerPWT<<blueprint>> #f99 {
Blueprint: **P.W. Torpedo**
}
object "**Magnetic Navigation**" as MagneticNavigation {
Blueprint: **Magnetic Navigation**
}
object "**Transmission Resolver**" as TransmissionResolver #ccf {
Blueprint: **Transmission Resolver**
}
diamond jointAlienSubConstruction
object "**Alien Sub Construction**" as AlienSubConstruction
package "New subs" {
diamond jointNewFighterFlyingSub
object "**New Fighter Flying Sub**" as NewFighterFlyingSub #f9d {
Blueprint: **New Fighter Flying Sub (Manta)**
}
object "**New Fighter Transporter**" as NewFighterTransporter #f9d {
Blueprint: **New Fighter Transporter (Hammerhead)**
}
diamond jointTheLatestFlyingSub
object "**The Latest Flying Sub**" as TheLatestFlyingSub #f9d {
Blueprint: **The Latest Flying Sub (Leviathan)**
}
}
object "**Bombardment Shield**" as BombardmentShield #ccf {
Blueprint: **Bombardment Shield**
}
package "Armour" {
object "**Ion-Beam Accelerators**" as IonBeamAccelerators {
Blueprint: **Ion-Beam Accelerators**
}
object "**Deep One Corpse**" as DeepOneCorpse #6b6
object "**Aqua Plastics**" as AquaPlastics {
Blueprint: **Aqua Plastics**
}
object "**Plastic Aqua-Armour**" as PlasticAquaArmour #fbb/ccc {
Blueprint: **Plastic Aqua-Armour**
}
object "**Deep One Terrorist**" as DeepOneTerrorist #lightgreen
diamond jointIonArmour
object "**Ion Armour**" as IonArmour #fbb/ccc {
Blueprint: **Ion Armour**
}
diamond jointMagneticIonArmour
object "**Magnetic Ion Armour**" as MagneticIonArmour #fbb/ccc {
Blueprint: **Magnetic Ion Armour**
}
}
package "Main Storyline" {
object "**Lobster Man Commander**" as LobsterManCommander #lightgreen
object "<one of alive alien>" as AliveAlien #lightgreen {
**Aquatoid** | **Gil Man**
| **Lobster Man**
}
object "**Alien Origins**" as AlienOrigins
object "<one of high rank alive alien>" as HighRankAliveAline #lightgreen {
**Lobster Man Navigator**
| **Lobster Man Commander**
| **Gil Man Commander**
}
diamond jointUltimateThreat
object "**Ultimate Threat**" as UltimateThreat
diamond jointTleth
object "**T'leth, The Aliens' City**" as Tleth
}
package "Mind-control technologies" {
object "<one of alive alien> **Terrorist**" as AliveAlienTerrorist #lightgreen {
**Calcinite** | **Bio-Drone**
| **Tentaculat** | **Triscene**
| **Xarquid** | **Hallucinoid**
}
object "**any alive Tasoth**" as AliveTasoth #lightgreen
object "**M.C.-Lab**" as MCLab #ccf {
Blueprint: **M.C.-Lab**
}
object "**M.C. Reader**" as MCReader {
Blueprint: **M.C. Reader**
}
diamond jointMCDisruptor
object "**M.C. Disruptor**" as MCDisruptor {
Blueprint: **M.C. Disruptor**
}
object "**M.C. Generator**" as MCGenerator #ccf {
Blueprint: **M.C. Generator**
}
}
package "Melee weapons research" {
object "**Calcinite corpse**" as CalciniteCorpse #6b6
object "**Vibro Blade**" as VibroBlade #fbb {
Blueprint: **Vibro Blade**
}
object "**Gill Man corpse**" as GillManCorpse #6b6
diamond jointThermicLance
object "**Thermic Lance**" as ThermicLance #fbb {
Blueprint: **Thermic Lance**
}
object "**Heavy Thermic Lance**" as HeavyThermicLance #fbb {
Blueprint: **Heavy Thermic Lance**
}
}
package "Miscellaneous standalones" {
object "<alien> **corpse**" as AlienCorpse #6b6 {
<i>Gives just an autopsy info.</i>
**Aquatoid** | **Lobster Man** | **Tasoth**
| **Bio-drone** | **Tentaculat** | **Triscene**
| **Hallucinoid** | **Xarquid**
}
object "**Sonic Pulser**" as SonicPulser #fbb {
Blueprint: **Sonic Pulser**
}
object "**Thermal Shok Launcher**" as ThermalShokLauncher #fbb {
Blueprint: **Thermal Shok Launcher**
}
object "**Thermal Shok Bomb**" as ThermalShokBomb #fbb {
Blueprint: **Thermal Shok Bomb**
}
object "**Alien Cryogenics**" as AlienCryogenics
object "**Alien Cloning**" as AlienCloning
object "**Alien Learning Arrays**" as AlienLearningArrays
object "**Examination Room**" as ExaminationRoom
object "**Alien Implanter**" as AlienImplanter
}
GaussTechnology --> GaussPistol
GaussPistol -l> GaussPistolClip
GaussPistol --> GaussRifle
GaussRifle -l> GaussRifleClip
GaussRifle --> HeavyGauss
HeavyGauss --> HeavyGaussClip
HeavyGaussClip --> GaussCannon
GaussCannon --> GaussDefence
GaussCannon --> jointCoelacanth
jointCoelacanth --> CoelacanthGauss
SonicPistol --> jointSonicOscillator
PistolPowerClip --> jointSonicOscillator
SonicBlastaRifle --> jointSonicOscillator
BlastaPowerClip --> jointSonicOscillator
SonicCannon --> jointSonicOscillator
CannonPowerClip --> jointSonicOscillator
jointSonicOscillator --> SonicOscillator
SonicOscillator --> SonicDefence
SonicOscillator --> jointDisplacerSonic
jointDisplacerSonic --> DisplacerSonic
Zrbite --> DisruptorPulseLauncher
Zrbite --> DisruptorPulseAmmo
DisruptorPulseLauncher --> jointPWTCannon
DisruptorPulseAmmo --> jointPWTCannon
jointPWTCannon --> PWTCannon
PWTCannon --> PWTDefence
PWTCannon --> jointDisplacerPWT
jointDisplacerPWT --> DisplacerPWT
MagneticNavigation --> TransmissionResolver
TransmissionResolver --> jointAlienSubConstruction
Zrbite --> jointAlienSubConstruction
jointAlienSubConstruction --> AlienSubConstruction
MagneticIonArmour ---> jointNewFighterFlyingSub
AlienSubConstruction --> jointNewFighterFlyingSub
jointNewFighterFlyingSub --> NewFighterFlyingSub
NewFighterFlyingSub --> jointDisplacerPWT
NewFighterFlyingSub --> jointDisplacerSonic
NewFighterFlyingSub --> jointCoelacanth
NewFighterFlyingSub --> NewFighterTransporter
NewFighterTransporter --> jointTheLatestFlyingSub
LobsterManCommander ---> jointTheLatestFlyingSub
jointTheLatestFlyingSub --> TheLatestFlyingSub
TheLatestFlyingSub --> BombardmentShield
DeepOneCorpse --> AquaPlastics
AquaPlastics --> PlasticAquaArmour
IonBeamAccelerators --> jointIonArmour
PlasticAquaArmour --> jointIonArmour
DeepOneTerrorist --> jointIonArmour
jointIonArmour --> IonArmour
IonArmour --> jointMagneticIonArmour
MagneticNavigation --> jointMagneticIonArmour
jointMagneticIonArmour --> MagneticIonArmour
CalciniteCorpse --> VibroBlade
VibroBlade --> jointThermicLance
GillManCorpse --> jointThermicLance
jointThermicLance --> ThermicLance
ThermicLance --> HeavyThermicLance
AliveAlienTerrorist --> MCLab
MCLab --> MCReader
MCReader --> jointMCDisruptor
AliveTasoth --> jointMCDisruptor
jointMCDisruptor --> MCDisruptor
MCDisruptor --> MCGenerator
AliveAlien --> AlienOrigins
AlienOrigins --> jointUltimateThreat
HighRankAliveAline --> jointUltimateThreat
jointUltimateThreat --> UltimateThreat
UltimateThreat --> jointTleth
LobsterManCommander ---> jointTleth
jointTleth --> Tleth
hide empty members
hide stereotypes
'show AlienCorpse fields
'show GaussCannon fields
'show PWTCannon fields
'center footer My super footer
legend left
<back:#fbb>#fbb colored boxes</back> = firing/throwin/melee HAND WEAPONS
<back:#fbb/ccc>#fbb/ccc gradient colored boxes</back> = ARMOUR
<back:#f99>#f99 colored boxes</back> = Submersible Weapon Systems (aka SWS)
<back:#f9d>#f9d colored boxes</back> = X-COM SUBS and their ARMAMENTS
<back:#ccf>#ccf colored boxes</back> = base FACILITIES
<back:lightgrey>lightgrey colored boxes</back> = miscellaneous
<back:lightgreen>lightgreen colored boxes</back> = ALIVE aliens
<back:#6b6>#6b6 colored boxes</back> = DEAD aliens
Mellarius, 2023
endlegend
@enduml
Это дерево технологий для "UFO: Aftermath", здесь особенность в работе с внешним JSON и с использованием возможностей preprocessing:
Посмотреть код plantuml-диаграммы
@startuml
skinparam groupInheritance 5
!$myjson = %load_json("somefolder/listof_tech_eng_obj_with_realnames.json")
left to right direction
skinparam BackgroundColor #eee
skinparam titleFontSize 26
skinparam titleFontName Verdana
skinparam titleBorderThickness 0
skinparam titleBorderRoundCorner 12
skinparam titleBackgroundColor Aqua-CadetBlue
skinparam class {
BorderColor grey
BackgroundColor #ddd
FontSize 12
FontName Verdana
'BorderColor<<blueprint>> transparent
'handwritten<<blueprint>> true
}
skinparam package {
BorderThickness 1
BorderColor grey
RoundCorner 20
Style default
}
<style>
legend {
FontSize 16
Padding 14
Margin 16
}
</style>
hide empty members
hide stereotypes
hide circle
scale max 4000 height
title "UFO: Aftermath" research tree
!$colour = "white"
!foreach $i in $myjson.research
!if ($i.kind == "SCI")
!$colour="white"
!else
!$colour="yellow"
!endif
class "$i.realname" as $i.name #$colour {
time: $i.time h
}
!endfor
!foreach $i in $myjson.objects
!if ($i.type == "EVENT")
!$colour="cyan"
!else
!$colour="lightgrey"
!endif
class "$i.realname" as $i.name #$colour
!endfor
!foreach $i in $myjson.research
!foreach $j in $i.subtechnos
!if ($j.required == true)
$j.elements --> $i.name
!else
$j.elements -[dotted]-> $i.name
!endif
!endfor
!endfor
legend left
<back:lightgrey>lightgrey colored boxes</back> = looted OBJECTS or captured live ALIENS
<back:cyan>cyan colored boxes</back> = EVENTS
<back:white>white colored boxes</back> = SCIENTIFIC research
<back:yellow>yellow colored boxes</back> = ENGINEERING technology
Mellarius, 2023. Visually generated by PlantUML.
endlegend
@enduml
JSON-данные для диаграммы
Методы анализа и нотации
В зависимости от того,
какую проблему мы решаем и что конкретно анализируем, определяемся с
точкой зрения на систему (
Point of View):
Для каждой из выбранной точки зрения существуют свои методы анализа и графические нотации для визуализации его результатов. Например:
|
Нотации моделирования бизнес-процессов:
|
|
Язык описания моделей предметной области:
|
|
|
|
|
TBD
BPMN
BPMN (Business Process Model and Notation, нотация и модель бизнес-процессов) = система условных обозначений для моделирования бизнес-процессов.
В BPMN рассматривается функциональная последовательность работ.
Пример BPMN:
Нюансы
- BPMN понимают и Бизнес и IT, при этом ни те ни другие не добавляет в схему того, что не нужно вторым
- Избегайте "визуального программирования" — на схеме не должно быть блоков чисто технических.
- Создание Бизнес-Процесса — от общего к частному
- Изменение Бизнес-Процесса — от частного к общему
- Когда кто-то кому-то что-то передаёт (н-р, документы), нет смысла обозначать саму передачу отдельной задачей, ибо сама стрелка между задачами как раз и обозначает передачу.
-
Если в текстовом описании БП (н-р, регламенте), которое вы переводите в BPMN, вы видите какие-то сроки
И при этом с т.зр. БП эти сроки никак не влияют на последовательность действий (за несоблюдение сроков нет никаких санкций)
, ТО мы сроки на схеме никак не рисуем.
Т.е. если, например, в регламенте никак не указано, что конкретно должно происходить если мы не успеваем сделать какой-то документ к 20 мая (аннулируем? не аннулируем? исправляем и т.п.), то и отражать это на BPMN никак не нужно.
- Если в текстовом описании БП, которое вы переводите в BPMN, в одном пункте указано 2+ действий, то очень внимательно отнеситесь к этому, возможно, что на схеме это имеем смысл отразить как отдельные последовательные задачи
-
После того как вы перевели какой-то текстовый регламент в BPMN, вы сделали только первый шаг. Для дальнейшей детализации диаграммы и превращения её в аналитическую, необходимо проводить опрос представителей ролей-участников БП.
Типичные вопросы это уточняющие и проясняющие исключительные случаи:
- как именно вы выполняете задачу?
- что вы делаете, если не можете выполнить эту задачу?
Потому что в процессе опроса может выяснится, что в выполнении задачи участвуют какие-то другие стороны, дополнительные информационные артефакты и прочее.
И только после такого уточнения у вас появится возможность понимать где и как можно скорректировать БП.
- TBD
ПО для автоматизация бизнес-процессов в ИТ-системах на основе BPMN:
-
Camunda — BPMS-платформа. (Camunda Modeler, Community Platform — бесплатно. Enterprise Platform — платно).
Полезные статьи, связанные с этим ПО:
UML
UML (Unified Modeling Language, унифицированный язык моделирования) = язык графического описания для объектного моделирования в области разработки ПО.
Часто встречаемыми (и наиболее полезными, IMHO) видами диаграмм являются:
IDEF0
Эта нотация на практике толком не применима и бесполезна, ибо схема даже всего из 4-х блоков становится нечитабельной.
Даже с археологической точки зрения носит сомнительную ценность. Достаточно научиться их читать, бывают случаи когда других схем по системе просто нет.
Посмотреть и охренеть
IDEF0 (Icam DEFinition for Function Modeling) = методология функционального моделирования и графическая нотация, предназначенная для формализации и описания бизнес-процессов.
Традиционно применяется для описания процессов в укрупнённых блоках, с указанием связей между ними.
В IDEF0 рассматриваются логические отношения между работами, а не их временная последовательность.
Начальная страница диаграммы содержит только один блок. Это "чёрный ящик", описывающий предметную область или систему в целом.
Все остальные страницы называются "декомпозицией" и могут содержать произвольное количество функциональных блоков.
Например, простая ежедневная операция — приготовление борща.
Большой прямоугольник посередине — функциональный блок, его название отображает описываемое действие (функцию).
Слева в функциональный блок входят стрелки входящих данных. Входящими данными для борща являются овощи и мясо.
Сверху в функциональный блок входят стрелки ограничений, или управляющих воздействий. В нашем случае рецепт — это ограничение (нельзя варить борщ не по рецепту), а мудрые советы веснушчатой Агриппины Саввичны это управляющие воздействия.
Снизу в функциональный блок входят стрелки указания исполнителей.
Справа из функционального блока выходят стрелки исходящий данных (результата). А ожидаем мы получить борщ.
Но указанная выше схема не даёт никакого понятия о том, как же будет происходить процесс варки борща.
Для этого мы должны спуститься вглубь функционального блока и сделать его декомпозицию:
На этой схеме уже видно, что для того чтобы из мяса и овощей получить готовый борщ нужно выполнить определённую последовательность операций. Приготовить бульон, подготовить овощи, собрать всё в одном месте, а потом подать на стол.
Данная диаграмма состоит из тех же элементов, что и главная. Всё так же в каждый функциональный блок входят стрелки входящих данных, выходят стрелки исходящих данных. Снизу — исполнители, сверху — ограничения и управляющее воздействие.