<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Simon Brown</title>
    <description>The latest articles on DEV Community by Simon Brown (@simonbrown).</description>
    <link>https://dev.to/simonbrown</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F45519%2F35de7496-eb6f-4108-bc5d-549f059f7e8c.jpeg</url>
      <title>DEV Community: Simon Brown</title>
      <link>https://dev.to/simonbrown</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/simonbrown"/>
    <language>en</language>
    <item>
      <title>Scripting support added to the Structurizr DSL</title>
      <dc:creator>Simon Brown</dc:creator>
      <pubDate>Fri, 10 Sep 2021 16:10:41 +0000</pubDate>
      <link>https://dev.to/simonbrown/scripting-support-added-to-the-structurizr-dsl-2ehm</link>
      <guid>https://dev.to/simonbrown/scripting-support-added-to-the-structurizr-dsl-2ehm</guid>
      <description>&lt;p&gt;The &lt;a href="https://github.com/structurizr/dsl"&gt;Structurizr DSL&lt;/a&gt; now provides a way to run scripts written in Groovy, Kotlin, Ruby, and JavaScript, via the new &lt;code&gt;!script&lt;/code&gt; keyword. This gives you access to the underlying &lt;a href="https://github.com/structurizr/java"&gt;Structurizr for Java&lt;/a&gt; workspace, for when you need to do something not supported by the DSL.&lt;/p&gt;

&lt;p&gt;For example, you could use a script to create the default set of views, without automatic layout enabled:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;workspace {

    model {
        user = person "User"
        softwareSystem = softwareSystem "Software System"

        user -&amp;gt; softwareSystem "Uses"
    }

    !script groovy {
        workspace.views.createDefaultViews()
        workspace.views.views.each { it.disableAutomaticLayout() }
    }   

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You could also use a script to programmatically add elements to a view, using more complicated logic than is possible via the DSL alone.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;workspace {

    model {
        group "Group 1" {
            a = softwareSystem "A" {
                tags "Tag 1"
            }
            b = softwareSystem "B" {
                tags "Tag 2"
            }
        }
        group "Group 2" {
            c = softwareSystem "C" {
                tags "Tag 1"
            }
            d = softwareSystem "D" {
                tags "Tag 2"
            }
        }
    }

    views {
        systemLandscape "key" {
            !script groovy {
                view = workspace.views.getViewWithKey("key");
                workspace.model.softwareSystems.findAll { it.group == "Group 1" &amp;amp;&amp;amp; it.hasTag("Tag 1") }.each{ view.add(it); };
            }

            autolayout
        }
    }

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Scripting support is available now, via the open source &lt;a href="https://github.com/structurizr/cli"&gt;Structurizr CLI&lt;/a&gt; and the free &lt;a href="https://structurizr.com/help/lite"&gt;Structurizr Lite&lt;/a&gt;. See the &lt;a href="https://github.com/structurizr/dsl/blob/master/docs/language-reference.md#scripts"&gt;Structurizr DSL language reference - Scripts&lt;/a&gt; and the &lt;a href="https://github.com/structurizr/dsl/tree/master/docs/cookbook/scripts"&gt;Structurizr DSL cookbook - Scripts&lt;/a&gt; for more details.&lt;/p&gt;

</description>
      <category>architecture</category>
    </item>
    <item>
      <title>Visualising ADRs</title>
      <dc:creator>Simon Brown</dc:creator>
      <pubDate>Fri, 09 Jul 2021 12:14:52 +0000</pubDate>
      <link>https://dev.to/simonbrown/visualising-adrs-3klm</link>
      <guid>https://dev.to/simonbrown/visualising-adrs-3klm</guid>
      <description>&lt;p&gt;I'm a big fan of &lt;a href="https://www.cognitect.com/blog/2011/11/15/documenting-architecture-decisions" rel="noopener noreferrer"&gt;architecture decision records&lt;/a&gt; (ADRs) - a collection of short text files, stored in version control, that provides a way to document the significant decisions made before/during the development of a software product. I highly recommend that all teams adopt this lightweight practice, and they are a core part of my &lt;a href="https://dev.to/simonbrown/a-minimal-approach-to-software-architecture-documentation-4k6k"&gt;minimal approach to software architecture documentation&lt;/a&gt;. For tooling, I really like Nat Pryce's &lt;a href="https://github.com/npryce/adr-tools" rel="noopener noreferrer"&gt;adr-tools&lt;/a&gt; command line utility for managing ADRs. &lt;/p&gt;

&lt;p&gt;Do team members ever look at that folder of ADRs though? And how easy is it to search for information related to a single decision, or perhaps even a chain of decisions? Something we could really do a better job of is visualising those decisions, making them easy to find and read.&lt;/p&gt;

&lt;p&gt;Structurizr has supported publishing ADRs for a while now, and I've just added (an initial version of) a feature that visualises ADRs as a force-directed graph, showing the decisions and the connections between those decisions where they've been superseded. Here's a screenshot showing the decisions related to how the Structurizr cloud service has moved from Rackspace to Pivotal Web Services, and then onwards to Amazon Web Services.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faw2pdn44ct6l38iu7ih6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faw2pdn44ct6l38iu7ih6.png" alt="A force-directed graph of decisions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have a folder of ADRs created using Nat's tool, you can get this visualisation for free with &lt;a href="https://structurizr.com/help/lite" rel="noopener noreferrer"&gt;Structurizr Lite&lt;/a&gt; in under 5 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Create a workspace.dsl file
&lt;/h2&gt;

&lt;p&gt;Create a file named &lt;code&gt;workspace.dsl&lt;/code&gt; next to your folder of ADRs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvsgesop7solrhw1ssf53.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvsgesop7solrhw1ssf53.png" alt="File structure"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Add the following content to that file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;workspace {

  !adrs decisions

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This says, "create a workspace, and load the ADRs from the &lt;code&gt;decisions&lt;/code&gt; sub-directory".&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Start Structurizr Lite
&lt;/h2&gt;

&lt;p&gt;Assuming that you have Docker installed, you can now start Structurizr Lite with the following commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker pull structurizr/lite
docker run -it --rm -p 8080:8080 -v PATH:/usr/local/structurizr structurizr/lite
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Be sure to replace &lt;code&gt;PATH&lt;/code&gt; with the full path to the directory containing your &lt;code&gt;workspace.dsl&lt;/code&gt; file.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Open Structurizr Lite
&lt;/h3&gt;

&lt;p&gt;Open the workspace in a web browser by heading to &lt;a href="http://localhost:8080" rel="noopener noreferrer"&gt;http://localhost:8080&lt;/a&gt; and you should see your decisions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flupkwk8fl8dptkrg7wc8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flupkwk8fl8dptkrg7wc8.png" alt="A summary of decisions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can now click through the decisions, and press the &lt;code&gt;Space&lt;/code&gt; key to open the quick navigation feature. Click the little graph button underneath the heading, and the visualisation will open.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3fcdmmx21s5d4c3mgkea.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3fcdmmx21s5d4c3mgkea.png" alt="A force-directed graph of decisions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Over time, the graph will start to change to reflect how decisions have been superseded, deprecated, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;As I said at the start, I'm a big fan of ADRs. Whether you're using Structurizr or building your own tooling, we can do better than keeping them hidden away in a folder.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Getting started with Structurizr Lite</title>
      <dc:creator>Simon Brown</dc:creator>
      <pubDate>Wed, 23 Jun 2021 16:02:28 +0000</pubDate>
      <link>https://dev.to/simonbrown/getting-started-with-structurizr-lite-27d0</link>
      <guid>https://dev.to/simonbrown/getting-started-with-structurizr-lite-27d0</guid>
      <description>&lt;p&gt;&lt;a href="https://structurizr.com/help/lite" rel="noopener noreferrer"&gt;Structurizr Lite&lt;/a&gt; is a free version of Structurizr, packaged as a Docker container, and designed for developers who want to quickly author and/or view software architecture diagrams, documentation, and architecture decision records (ADRs). A software architecture model, views, and documentation (together called a "workspace") can be defined using the Structurizr DSL - what I referred to as &lt;a href="https://dev.to/simonbrown/diagrams-as-code-2-0-82k"&gt;Diagrams as code 2.0&lt;/a&gt; in a previous post; a textual language specifically designed to support software architecture and the &lt;a href="https://c4model.com" rel="noopener noreferrer"&gt;C4 model&lt;/a&gt;. Let's get started.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Create a new directory
&lt;/h2&gt;

&lt;p&gt;First we need to create a directory somewhere to store our workspace.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Create a workspace.dsl file
&lt;/h2&gt;

&lt;p&gt;Next we need to create a file called &lt;code&gt;workspace.dsl&lt;/code&gt; inside that directory, with the following content.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

workspace {

    model {
        user = person "User"
        softwareSystem = softwareSystem "Software System"

        user -&amp;gt; softwareSystem "Uses"
    }

    views {
        systemContext softwareSystem "Diagram1" {
            include *
            autoLayout
        }

        theme default
    }

}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;You can find more about the Structurizr DSL at &lt;a href="https://github.com/structurizr/dsl" rel="noopener noreferrer"&gt;https://github.com/structurizr/dsl&lt;/a&gt;, but essentially this DSL file says:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a model with a user and a software system, where the user uses the software system.&lt;/li&gt;
&lt;li&gt;Create a system context view for the software system, adding the default set of elements, using auto-layout.&lt;/li&gt;
&lt;li&gt;Use the &lt;code&gt;default&lt;/code&gt; theme for styling elements and relationships.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Start Structurizr Lite
&lt;/h2&gt;

&lt;p&gt;Assuming that you have Docker installed, you can now start Structurizr Lite with the following commands:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

docker pull structurizr/lite
docker run -it --rm -p 8080:8080 -v PATH:/usr/local/structurizr structurizr/lite


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Be sure to replace &lt;code&gt;PATH&lt;/code&gt; with the full path to the directory created in step 1. For example, if the directory is located at &lt;code&gt;/Users/alice/structurizr&lt;/code&gt;, the commands would be:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

docker pull structurizr/lite
docker run -it --rm -p 8080:8080 -v /Users/alice/structurizr:/usr/local/structurizr structurizr/lite


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  4. View the diagram
&lt;/h2&gt;

&lt;p&gt;Open the workspace in a web browser by heading to &lt;a href="http://localhost:8080" rel="noopener noreferrer"&gt;http://localhost:8080&lt;/a&gt; and you should see your diagram.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ykus0m4p7m01bghbptb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ykus0m4p7m01bghbptb.png" alt="Structurizr Lite - diagram"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you make a change to the DSL file and save it, you should see that change immediately reflected when you refresh your web browser.&lt;/p&gt;
&lt;h2&gt;
  
  
  5. Add some documentation
&lt;/h2&gt;

&lt;p&gt;Let's add some documentation to describe our software system. To do this, create a subdirectory named &lt;code&gt;docs&lt;/code&gt; and create a file named &lt;code&gt;01-context.md&lt;/code&gt; inside that subdirectory, with the following content:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

## Context

Here is a description of my software system...

![](embed:Diagram1)


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Now change the content of the &lt;code&gt;workspace.dsl&lt;/code&gt; file to be as follows (notice the addition of the &lt;code&gt;!docs&lt;/code&gt; line):&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

workspace {

    model {
        user = person "User"
        softwareSystem = softwareSystem "Software System" {
            !docs docs
        }

        user -&amp;gt; softwareSystem "Uses"
    }

    views {
        systemContext softwareSystem "Diagram1" {
            include *
            autoLayout
        }

        theme default
    }

}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Save all files, refresh your web browser, and click on the top-left button with the icon that looks like a book. You should now see the Markdown documentation page that we just created, which itself is embedding our existing system context diagram.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9s29xtb2nzrxwuy06ia6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9s29xtb2nzrxwuy06ia6.png" alt="Structurizr Lite - documentation"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Structurizr Lite provides a quick and free way to get started with the Structurizr tooling. It supports the full set of C4 model diagrams, along with the ability to publish Markdown/AsciiDoc documentation, and architecture decision records (ADRs). Enjoy!&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>productivity</category>
      <category>c4model</category>
    </item>
    <item>
      <title>Diagramming distributed architectures with the C4 model</title>
      <dc:creator>Simon Brown</dc:creator>
      <pubDate>Wed, 19 May 2021 11:38:25 +0000</pubDate>
      <link>https://dev.to/simonbrown/diagramming-distributed-architectures-with-the-c4-model-51cm</link>
      <guid>https://dev.to/simonbrown/diagramming-distributed-architectures-with-the-c4-model-51cm</guid>
      <description>&lt;p&gt;"I read that C4 is best suited for monolithic architectures and less suited to distributed architectures" ... this is a statement I see frequently, and it isn't true. The &lt;a href="https://c4model.com" rel="noopener noreferrer"&gt;C4 model&lt;/a&gt; is a hierarchical collection of diagrams based upon a small set of abstractions. There's nothing here that makes it more or less suitable for distributed architectures than UML, ArchiMate, or ad hoc whiteboard sketches. The problem is really one of tooling, and our inability to think past static PNG files.&lt;/p&gt;

&lt;p&gt;If you're following Conway's Law, and have different teams owning different parts of your distributed architecture, this post likely isn't for you. This post is really aimed at teams building a distributed monolith - one team, lots of separately deployable microservices and/or lambdas, lockstep deployment, etc. These architectures tend to have lots of elements and relationships at the C4 model &lt;em&gt;container&lt;/em&gt; level, making it difficult to create a comprehensive container diagram that's not cluttered, and easy to understand. &lt;a href="https://twitter.com/peibolsang/status/1393468838822481921" rel="noopener noreferrer"&gt;This tweet&lt;/a&gt; sums up the situation well.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"with serverless, you are deploying your UML collaboration diagram!"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Any diagram with 20+ elements (perhaps fewer) starts to get complicated quickly, making it harder to tell the story you want to tell. A complicated architecture will lead to a complicated diagram.&lt;/p&gt;

&lt;h2&gt;
  
  
  An example
&lt;/h2&gt;

&lt;p&gt;This is an oversimplified example, (and please don't create a distributed architecture that's really just a fragile chain of synchronous services communicating with each other!), but I want to use this example to illustrate some points about diagramming. Many teams would initially approach this by drawing a diagram showing the entirety of their architecture - perhaps showing all of the containers that make up the software system, plus their external dependencies.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foexr9e9din2zem9c4opy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foexr9e9din2zem9c4opy.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Granted this diagram isn't too bad, and this approach will work fine for smaller software systems. It falls apart very quickly once you start getting to 10 services, or 20 services, or 100 services. Although we'd ideally like to create a single diagram that shows everything, it's just not feasible in many cases. That approach to diagramming doesn't scale. You do have some options though.&lt;/p&gt;

&lt;h2&gt;
  
  
  Option 1: Create a number of smaller diagrams
&lt;/h2&gt;

&lt;p&gt;One of those options is to create multiple diagrams showing a subset of the overall story. You could create diagrams to show a single domain, a bounded context, a business capability, a feature, and so on. Alternatively, you could create diagrams to focus on a single service plus its direct afferent/efferent couplings. Here's an example that focusses on "Service 1" rather than showing all containers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh1eciygoq4342pnzb5c3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh1eciygoq4342pnzb5c3.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We do lose some of the "big picture" by doing this, but this diagram is much easier to understand because it has a much more confined scope. A problem with this approach is the same one I outlined in &lt;a href="https://dev.to/simonbrown/diagrams-as-code-2-0-82k"&gt;Diagrams as code 2.0&lt;/a&gt; ... we're going to need to repeat elements/relationships across multiple diagrams, and we need a strategy for keeping them all in sync when things change.&lt;/p&gt;

&lt;p&gt;And that leads to tooling, and diagramming vs modelling. I've said this before: we need to &lt;a href="https://dev.to/simonbrown/visio-draw-io-lucidchart-gliffy-etc-not-recommended-for-software-architecture-diagrams-4bmm"&gt;stop using general purpose diagramming tools for software architecture diagrams&lt;/a&gt; (Visio, etc), and we should think carefully before &lt;em&gt;handcrafting&lt;/em&gt; diagrams with PlantUML, C4-PlantUML, Mermaid, etc too.&lt;/p&gt;

&lt;p&gt;The above diagram that focusses on "Service 1" is trivial to create with any "model + views" tooling. For example, with the Structurizr DSL, once you've defined your overall model, you can create the above diagram like this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

views {
  container softwareSystem {
    include user -&amp;gt;service1-&amp;gt;
  }
}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This says, "create a container view showing the user, service 1, and anything directly connected to service 1". It's compatible with a number of diagramming formats too via the &lt;a href="https://github.com/structurizr/cli/blob/master/docs/export.md" rel="noopener noreferrer"&gt;Structurizr CLI export command&lt;/a&gt;. Here's a PlantUML version of the above diagram, created from the same Structurizr DSL code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2fmtid113hrrkjuqhi1s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2fmtid113hrrkjuqhi1s.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A "model + views" tool provides a quick and easy way to tell different stories from the model, while keeping all resulting diagrams in sync. The Structurizr DSL and CLI are free and open source, plus any good UML tool from the past 20+ years should offer this functionality too, albeit with a very different user experience. Modelling is not new, and we really shouldn't have thrown it away in our haste to become "agile".&lt;/p&gt;

&lt;h2&gt;
  
  
  Option 2: Use a different visualisation format
&lt;/h2&gt;

&lt;p&gt;With all the computing power available to us, it still amazes me that teams "just want a PNG image to embed in Confluence". Other documentation tools are available, of course.&lt;/p&gt;

&lt;p&gt;Traditional static diagrams are fabulous for communication, but they should not be the only tools in your toolbox. Once you relinquish your obsession with static PNG images and jump across the chasm, you might find there are other visualisation formats that are more suited to helping you tell a story.&lt;/p&gt;

&lt;p&gt;For example, an interactive force-directed graph is better suited to showing and exploring larger quantities of data. Something like &lt;a href="https://d3js.org" rel="noopener noreferrer"&gt;D3.js&lt;/a&gt; admittedly has a steep learning curve, but makes this relatively straightforward.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpuhc4q0i8fewgsa63wyu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpuhc4q0i8fewgsa63wyu.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(yes, the irony of posting a static screenshot of an interactive graph is not lost on me, so &lt;a href="https://structurizr.com/dsl?src=https://gist.githubusercontent.com/simonbrowndotje/25a2ee86acf57969c01196f6c41389a2/raw/2bfa5c9df4ff113416b9cf34c6cbc2cf00932676/gistfile1.txt&amp;amp;view=Containers_All&amp;amp;renderer=graph" rel="noopener noreferrer"&gt;here's a link to the interactive version&lt;/a&gt;) &lt;/p&gt;

&lt;p&gt;Alternatively, there are tools like &lt;a href="https://www.ilograph.com" rel="noopener noreferrer"&gt;Ilograph&lt;/a&gt;, which provides a way to navigate a model using an interactive UI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjp5ymivglkm31b6enhdy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjp5ymivglkm31b6enhdy.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsm02csvqvlben1pyuw3v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsm02csvqvlben1pyuw3v.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(&lt;a href="https://structurizr.com/dsl?src=https://gist.githubusercontent.com/simonbrowndotje/25a2ee86acf57969c01196f6c41389a2/raw/2bfa5c9df4ff113416b9cf34c6cbc2cf00932676/gistfile1.txt&amp;amp;renderer=ilograph" rel="noopener noreferrer"&gt;a Structurizr DSL to Ilograph export is available&lt;/a&gt; if you don't like writing Ilograph's YAML definition by hand)&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;In summary, the C4 model is not less suitable than any of the other alternatives for diagramming distributed architectures. And you have the same set of problems diagramming the components inside a larger monolithic application too. Those problems are related to the size and complexity of the diagram. If a diagram with a dozen boxes is hard to understand, don't draw a diagram with a dozen boxes!&lt;/p&gt;

&lt;p&gt;Instead, switch from diagramming to modelling, think about what the story is you're trying to tell, and look at how technology can help you achieve that goal. &lt;a href="https://dev.to/simonbrown/diagrams-as-code-2-0-82k"&gt;Diagrams as code 2.0&lt;/a&gt; is a very powerful approach if you're willing to jump across the chasm away from diagramming.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>productivity</category>
      <category>c4model</category>
      <category>microservices</category>
    </item>
    <item>
      <title>Diagrams as code 2.0</title>
      <dc:creator>Simon Brown</dc:creator>
      <pubDate>Thu, 13 May 2021 13:34:33 +0000</pubDate>
      <link>https://dev.to/simonbrown/diagrams-as-code-2-0-82k</link>
      <guid>https://dev.to/simonbrown/diagrams-as-code-2-0-82k</guid>
      <description>&lt;p&gt;&lt;a href="https://www.thoughtworks.com/radar/techniques/diagrams-as-code" rel="noopener noreferrer"&gt;Diagrams as code&lt;/a&gt; is becoming a popular way to diagram software architecture, particularly for long-lived high-level documentation. You write the diagram source in a text-based domain specific language (e.g. &lt;a href="https://plantuml.com" rel="noopener noreferrer"&gt;PlantUML&lt;/a&gt;, &lt;a href="https://github.com/plantuml-stdlib/C4-PlantUML" rel="noopener noreferrer"&gt;C4-PlantUML&lt;/a&gt;, &lt;a href="https://mermaid-js.github.io/mermaid/#" rel="noopener noreferrer"&gt;Mermaid&lt;/a&gt;, &lt;a href="https://www.websequencediagrams.com" rel="noopener noreferrer"&gt;WebSequenceDiagrams&lt;/a&gt;, &lt;a href="https://graphviz.org" rel="noopener noreferrer"&gt;Graphviz/DOT&lt;/a&gt;) or a programming language (e.g. &lt;a href="https://github.com/mingrammer/diagrams" rel="noopener noreferrer"&gt;Diagrams&lt;/a&gt;), and render diagrams using web-based or command line tooling. The benefits are well understood - writing the diagram source as text allows for easy integration into software development practices and toolchains, plus the automatic layout facilities allow authors to focus on content.&lt;/p&gt;

&lt;p&gt;But there's a problem with this approach, which I'm going to call "diagrams as code 1.0" - if you need to create multiple diagrams, you need to create multiple diagram source files, and ensure that you keep these files in sync.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1sdt0gwi7btwkyw3r33b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1sdt0gwi7btwkyw3r33b.png" alt="Diagrams as code 1.0"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Some tools do provide a way to "include" snippets, but most don't, forcing you to repeat information across those diagram definitions. Once you violate the "DRY principle", you need to ensure that any changes you make to one diagram are reflected elsewhere. Easy in theory ("we'll just use global search and replace", etc), but that doesn't necessarily happen in the real world.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx6twl8qdt00u1ef39uhm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx6twl8qdt00u1ef39uhm.png" alt="Keeping diagrams in sync is important"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One way to resolve this problem is to generate multiple diagrams from a single source file. To do that, we need to shift our thinking away from "diagrams", and towards "views of a model". That's the essence of "diagrams as code 2.0" - it's a way to define a model of our software architecture and the views that we'd like to see, ultimately resulting in a consistent set of diagrams that are generated for us.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7qrx3g2az3wsm1zkfq7m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7qrx3g2az3wsm1zkfq7m.png" alt="Diagrams as code 2.0"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the concept implemented by the Structurizr tooling, the majority of which is open source. Structurizr builds upon "diagrams as code", providing a way to create &lt;strong&gt;multiple diagrams&lt;/strong&gt; from a &lt;strong&gt;single model&lt;/strong&gt;, using a number of tools and programming languages. There are three key concepts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Workspace - this is the definition of the model and views, described using an open JSON format.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://structurizr.org/#authoring" rel="noopener noreferrer"&gt;Authoring tools&lt;/a&gt; - these provide a way to create a workspace. The most popular is the text-based &lt;a href="https://structurizr.com/dsl" rel="noopener noreferrer"&gt;Structurizr DSL&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://structurizr.org/#rendering" rel="noopener noreferrer"&gt;Rendering tools&lt;/a&gt; - these provide a way to render the views as diagrams. Supported diagram formats include PlantUML, C4-PlantUML, Mermaid, DOT, WebSequenceDiagrams, Ilograph, and the Structurizr cloud service/on-premises installation.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fev571sjhh4nphn3ox85t.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fev571sjhh4nphn3ox85t.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The separation of authoring and rendering reduces lock-in to any particular diagramming tool. And having a model of your software architecture provides a way to slice and dice it to create many different views, which can then be rendered using the best tool for the task ... a static PNG, an interactive and zoomable SVG, or perhaps an interactive force-directed graph.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;To summarise the key differences:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Diagrams as code 1.0: you write diagram definitions by hand&lt;/li&gt;
&lt;li&gt;Diagrams as code 2.0: diagram definitions are generated automatically, by tooling, based upon views of a model&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Although many teams define their models by hand, there's nothing preventing you from generating the model automatically, in part or in whole, by parsing infrastructure as code definitions, parsing distributed log files, performing static analysis of a code base, etc. Such techniques are especially useful for teams seeking ways to diagram their larger and more complicated distributed architectures.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>c4model</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Structurizr quick tip: moving relationship descriptions</title>
      <dc:creator>Simon Brown</dc:creator>
      <pubDate>Thu, 28 Jan 2021 17:36:19 +0000</pubDate>
      <link>https://dev.to/simonbrown/structurizr-quick-tip-moving-relationship-descriptions-4iim</link>
      <guid>https://dev.to/simonbrown/structurizr-quick-tip-moving-relationship-descriptions-4iim</guid>
      <description>&lt;p&gt;By default, Structurizr will render relationship descriptions half way along the line, like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OuHzBi3l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/ruytm53f0mlmddg8juk7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OuHzBi3l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/ruytm53f0mlmddg8juk7.png" alt="Alt Text" width="550" height="1100"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you need to move the relationship (perhaps because it's overlapping something else), when editing the diagram, you can hover the mouse pointer over the relationship so that it's highlighted, and press the &lt;code&gt;Up&lt;/code&gt;/&lt;code&gt;Down&lt;/code&gt; cursor keys to move it forwards/backwards along the line. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BH22p4hH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/nhcfyghs4f69mxtoneqq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BH22p4hH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/nhcfyghs4f69mxtoneqq.png" alt="Alt Text" width="550" height="1100"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Just note that this doesn't work when auto-layout mode is enabled.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>c4model</category>
      <category>structurizr</category>
    </item>
    <item>
      <title>Structurizr quick tip: hiding descriptions</title>
      <dc:creator>Simon Brown</dc:creator>
      <pubDate>Wed, 27 Jan 2021 07:57:49 +0000</pubDate>
      <link>https://dev.to/simonbrown/structurizr-quick-tip-hiding-descriptions-324b</link>
      <guid>https://dev.to/simonbrown/structurizr-quick-tip-hiding-descriptions-324b</guid>
      <description>&lt;p&gt;By default, Structurizr will include an element's descriptive text inside of that element when rendering a diagram:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjklq9jmh7ncpf4syrp7c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjklq9jmh7ncpf4syrp7c.png" alt="Diagram with element descriptions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While that level of information definitely enriches the diagram, there are situations where you might not want to show the descriptive text, for example if you're doing a presentation. For this reason, Structurizr allows you to hide the descriptive text in a couple of ways.&lt;/p&gt;

&lt;p&gt;When you're viewing a diagram, pressing the &lt;code&gt;d&lt;/code&gt; key will toggle the descriptions on and off:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0jhgdrvypcqxceyhptq9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0jhgdrvypcqxceyhptq9.png" alt="Diagram without element descriptions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you'd like to hide the descriptions a little more permanently, you can use a style for the &lt;code&gt;Element&lt;/code&gt; tag, setting the &lt;code&gt;description&lt;/code&gt; property to &lt;code&gt;false&lt;/code&gt;. For example, with the &lt;a href="https://structurizr.com/dsl" rel="noopener noreferrer"&gt;Structurizr DSL&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;styles {
  element "Element" {
    description false
  }
  ...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As a bonus tip, you can also increase the font size in a similar way, to enlarge the text for presentation purposes:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fw27bb7c7t0xgwecgpwbs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fw27bb7c7t0xgwecgpwbs.png" alt="Diagram without element descriptions, with a larger font size"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;The descriptive text can be useful, but sometimes you don't need to see it. Structurizr makes it easy to show/hide element descriptions, without needing to modify your diagram. &lt;/p&gt;

</description>
      <category>architecture</category>
      <category>productivity</category>
      <category>structurizr</category>
      <category>c4model</category>
    </item>
    <item>
      <title>software-architektur.tv</title>
      <dc:creator>Simon Brown</dc:creator>
      <pubDate>Fri, 22 Jan 2021 16:24:17 +0000</pubDate>
      <link>https://dev.to/simonbrown/software-architektur-tv-3f67</link>
      <guid>https://dev.to/simonbrown/software-architektur-tv-3f67</guid>
      <description>&lt;p&gt;Earlier today I had the pleasure of chatting to &lt;a href="https://twitter.com/ewolff"&gt;Eberhard Wolff&lt;/a&gt; about all things software architecture related ... architecture and agile, the role, whether architects should write code, UML, the C4 model, and Structurizr. If you missed it, here's a recording of the live stream.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/YS0ySnnlyto"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>agile</category>
      <category>c4model</category>
      <category>structurizr</category>
    </item>
    <item>
      <title>Modelling multiple relationships</title>
      <dc:creator>Simon Brown</dc:creator>
      <pubDate>Fri, 20 Nov 2020 08:15:05 +0000</pubDate>
      <link>https://dev.to/simonbrown/modelling-multiple-relationships-51bf</link>
      <guid>https://dev.to/simonbrown/modelling-multiple-relationships-51bf</guid>
      <description>&lt;p&gt;The topic of how to model multiple relationships between the same two elements has come up a number of times this week, so here's a quick tip.&lt;/p&gt;

&lt;p&gt;To explain the situation, imagine you have an online book store that has customers. Those customers can do a number of things; make purchases, make pre-orders, browse, search, view their previous orders, and so on. To describe this with a diagram, many people would simply draw two boxes, and have one arrow per major use case/feature/story/etc. That would look something like this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Frnwa12xq0u9tlghpe94i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Frnwa12xq0u9tlghpe94i.png" alt="Multiple relationships"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While correct and accurate, this approach tends to clutter the diagram, and each time you add a new major feature, you need to add another arrow.&lt;/p&gt;

&lt;p&gt;A better way to think about this is that there's a single relationship between the customer and the online book store. Perhaps the customer "uses" the online book store or, to be more descriptive, perhaps the customer "browses and makes purchases using" the online book store.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F77n6ao93eb0csa9cagoc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F77n6ao93eb0csa9cagoc.png" alt="A single relationship"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you do want to show each of the major use cases/features/stories/etc and how they work at runtime, you can do that with a unique &lt;a href="https://c4model.com/#DynamicDiagram" rel="noopener noreferrer"&gt;dynamic diagram&lt;/a&gt; for each of those use cases/features/stories. With this approach, essentially what you have is a single relationship in the static model, with each dynamic diagram showing an &lt;em&gt;instance&lt;/em&gt; of that relationship.&lt;/p&gt;

&lt;p&gt;I hope that helps!&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/9LnYV2g7S-w"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>c4model</category>
    </item>
    <item>
      <title>Diagrams as code</title>
      <dc:creator>Simon Brown</dc:creator>
      <pubDate>Wed, 28 Oct 2020 16:45:49 +0000</pubDate>
      <link>https://dev.to/simonbrown/diagrams-as-code-20eo</link>
      <guid>https://dev.to/simonbrown/diagrams-as-code-20eo</guid>
      <description>&lt;p&gt;The technique of "diagrams as code" just appeared on the &lt;a href="https://www.thoughtworks.com/radar/techniques?blipid=202010027" rel="noopener noreferrer"&gt;ThoughtWorks Tech Radar&lt;/a&gt; (as "Trial"), with the &lt;a href="https://structurizr.com/dsl" rel="noopener noreferrer"&gt;Structurizr DSL&lt;/a&gt; also getting a mention.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Funjzkl824xxkfiwj88m0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Funjzkl824xxkfiwj88m0.png" alt="ThoughtWorks Tech Radar - Techniques"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Diagrams as what?
&lt;/h2&gt;

&lt;p&gt;Like "infrastructure as code", "diagrams as code" is a bit misleading to be honest, as it seems to be used as an umbrella term for ways to create diagrams using a text-based approach. Some tools use real code, and others use a text-based DSL. Just bear that in mind when choosing your tooling. Whichever language you choose, everybody on your team will need to learn it in order to create diagrams.&lt;/p&gt;

&lt;h2&gt;
  
  
  The benefits of "diagrams as code"
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev.to/simonbrown/visio-draw-io-lucidchart-gliffy-etc-not-recommended-for-software-architecture-diagrams-4bmm"&gt;Visio, draw.io, LucidChart, Gliffy, etc - not recommended for software architecture diagrams&lt;/a&gt; covers my thoughts on why we can do better for software architecture diagrams, and "diagrams as code" is certainly a step in the right direction. The most obvious benefits are the ability to use the text-oriented tooling we already use as software developers, text is easily version controllable and diff'able, plus many of the "diagrams as code" tools can be scripted and integrated into a build pipeline for automatic documentation generation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Diagrams vs models
&lt;/h2&gt;

&lt;p&gt;And that's a good step forward from tools like Visio, but it really only scratches the surface of what's possible. Most "diagrams as code" tooling provides a way to create a single diagram from a single textual source file. So if you need to create two related diagrams, you'll need two separate source files. Some tools do provide a way to share common snippets via "includes", but generally you have to ensure that you keep both source files in sync when you make a change to either of them. &lt;a href="https://dev.to/simonbrown/modelling-software-architecture-with-plantuml-56fc"&gt;Modelling software architecture with PlantUML&lt;/a&gt; shows an example of this, and presents a solution in the form of the Structurizr DSL.&lt;/p&gt;

&lt;p&gt;The Structurizr DSL is an open source project that I built during the depths of the COVID-19 lockdown earlier this year. It's a textual domain specific language for defining a software architecture model (based upon the &lt;a href="https://c4model.com" rel="noopener noreferrer"&gt;C4 model&lt;/a&gt;), and essentially just a thin wrapper around the existing open source &lt;a href="https://github.com/structurizr/java" rel="noopener noreferrer"&gt;Structurizr for Java&lt;/a&gt; library. The first version of the DSL only took a week to build!&lt;/p&gt;

&lt;p&gt;The Structurizr DSL is actually much more powerful than the other tools it's compared to, because it allows you to define a collection of elements/relationships (a "model"), and multiple views of those elements/relationships. This model-based approach allows you to share elements/relationships across diagrams, keeping everything in sync when you make changes. This is a very powerful concept, especially when coupled with the next thing I want to mention.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multiple output formats
&lt;/h2&gt;

&lt;p&gt;Most of the "diagrams as code" tools you'll see today are focussed on creating diagrams in one output format, via one input format. If you define a diagram using the PlantUML diagram syntax, you'll need PlantUML to render that. The same is true for Mermaid, WebSequenceDiagrams, and the Python-based "Diagrams" tool. Use those input formats and you're locked into using those tools to render your diagrams.&lt;/p&gt;

&lt;p&gt;The Structurizr DSL is very different. The text-based DSL used to define a model and views is tooling agnostic, and the open source &lt;a href="https://github.com/structurizr/cli" rel="noopener noreferrer"&gt;Structurizr CLI&lt;/a&gt; provides a way to render those views as diagrams using a number of tools; including the Structurizr web renderer, PlantUML, Mermaid, WebSequenceDiagrams, and Ilograph. Each rendering tool provides something slightly different, so the Structurizr DSL is a fantastic way to try a number of diagramming tools without being locked in to any of them. &lt;a href="https://dev.to/simonbrown/getting-started-with-the-structurizr-cli-10c2"&gt;Getting started with the Structurizr CLI&lt;/a&gt; shows this in action.&lt;/p&gt;

&lt;h2&gt;
  
  
  Humans vs computers
&lt;/h2&gt;

&lt;p&gt;One of the assumptions most people make about "diagrams as code" is that these text-based diagram (or model) definitions are authored by humans. And that's how the majority of teams use these tools at the moment. But, again, we're only scratching the surface of what's possible here. Rather than writing the code/text yourself, what if a computer was to do this for you? Perhaps it could parse your AWS CloudFormation definitions, and automatically generate your cloud architecture diagrams via PlantUML, Mermaid, or the Structurizr DSL.&lt;/p&gt;

&lt;p&gt;There isn't much tooling available to support this type of use case yet, but as adoption of "diagrams as code" increases, I'm certain we'll be asking tools to do the hard work for us. It'll be interesting to see how this space evolves over the next few years.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;I've been advocating "diagrams as code" since the I released the initial &lt;a href="https://github.com/structurizr/java" rel="noopener noreferrer"&gt;Structurizr for Java library&lt;/a&gt; back in 2014, so it's great to see the general concept appear on the ThoughtWorks Tech Radar. I've certainly seen many of the organisations that I work with either adopt this already, or they're looking at better approaches to creating long-lived documentation. "Diagrams as code" is definitely worth trialling if you've not looked at it yet, and the &lt;a href="https://structurizr.com/dsl" rel="noopener noreferrer"&gt;Structurizr DSL demo&lt;/a&gt; is a great way to get started.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fh196yollqg0fzl4pqkft.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fh196yollqg0fzl4pqkft.png" alt="Structurizr DSL demo"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>productivity</category>
      <category>c4model</category>
    </item>
    <item>
      <title>Cloud architecture diagrams</title>
      <dc:creator>Simon Brown</dc:creator>
      <pubDate>Thu, 08 Oct 2020 21:04:47 +0000</pubDate>
      <link>https://dev.to/simonbrown/cloud-architecture-diagrams-3pbm</link>
      <guid>https://dev.to/simonbrown/cloud-architecture-diagrams-3pbm</guid>
      <description>&lt;p&gt;I've seen a lot of discussion about cloud architecture diagrams recently, with people specifically asking how to create them, which tools to use, and where to get the icon sets. Many of the example cloud architecture diagrams that I see online are relatively generic, and look something like this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F1y62yyztvf58eux48vjr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F1y62yyztvf58eux48vjr.png" alt="A typical cloud architecture diagram"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This diagram shows that a number of AWS services are being used; including Route 53, Elastic Load Balancer, EC2 (with auto-scaling), and MySQL on RDS. It looks good, it's colourful, and it uses the appropriate icons from the AWS icon set. It's a decent first attempt because it helps to highlight which AWS services are in use. But that's also the biggest problem - it's an "infrastructure diagram", and is only telling you half of the story. Understanding which AWS services are being used is great, but I'd really like to also know how &lt;em&gt;you&lt;/em&gt; are using them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deployment diagrams
&lt;/h2&gt;

&lt;p&gt;Most software development teams would be better creating a "deployment diagram", which shows the mapping of deployable things (e.g. your applications and data stores) to things that exist in the infrastructure environment. UML has a &lt;a href="https://en.wikipedia.org/wiki/Deployment_diagram" rel="noopener noreferrer"&gt;deployment diagram&lt;/a&gt;, which allows you to show the mapping of deployable artifacts onto device nodes and execution environments. The C4 model also has a &lt;a href="https://c4model.com/#DeploymentDiagram" rel="noopener noreferrer"&gt;deployment diagram&lt;/a&gt;, which shows the mapping of C4 model containers (again, applications and data stores) onto things that exist in the infrastructure environment (which I call "deployment nodes"). Here's an example.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fs51rwqhsnm4c4phdaic9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fs51rwqhsnm4c4phdaic9.png" alt="A deployment diagram"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This diagram again shows the AWS services in use, but it also shows what they are being used for, through the inclusion of the web application and database. You can, of course, add more detail as needed; including VPCs, VLANs, firewalls, IP addresses, instance counts, scaling limits, etc. It's worth noting that the same advice applies to diagramming Docker and Kubernetes environments too - remember to show your own applications and data stores.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Many of the example cloud architecture diagrams you'll see online are good starting points but they only tell half of the story. To tell more of the story, favour deployment diagrams over infrastructure diagrams.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/ALuL9uKqWU4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>c4model</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to review a software architecture diagram</title>
      <dc:creator>Simon Brown</dc:creator>
      <pubDate>Mon, 27 Jul 2020 11:02:44 +0000</pubDate>
      <link>https://dev.to/simonbrown/how-to-review-a-software-architecture-diagram-6p0</link>
      <guid>https://dev.to/simonbrown/how-to-review-a-software-architecture-diagram-6p0</guid>
      <description>&lt;p&gt;I see hundreds of software architecture diagrams every year, predominantly through my software architecture workshops. Some diagrams are better than others, but I've noticed that many people struggle to critique a diagram because they're not really sure what to look for. So that's the purpose of this blog post. Let's start with a fairly typical example of a whiteboard diagram from one of my workshops.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fylkr7tl2bmigeadvtc6d.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fylkr7tl2bmigeadvtc6d.jpg" alt="A typical whiteboard diagram"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the face of it, this diagram doesn't look too bad. It's high-level, clean, concise, colourful, and you might even be able to work out what's being described here. But we need to look a little closer.&lt;/p&gt;

&lt;h2&gt;
  
  
  General aspects
&lt;/h2&gt;

&lt;p&gt;Let's start by looking at the diagram as a whole. Here are a few initial things to think about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the diagram have a title?&lt;/li&gt;
&lt;li&gt;Do you understand what the diagram type is?&lt;/li&gt;
&lt;li&gt;Do you understand what the diagram scope is?&lt;/li&gt;
&lt;li&gt;Does the diagram have a key/legend?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'd estimate that upwards of 90% of the initial diagrams I see created during my workshops don't have a title! In this case, the diagram does have a title of "Context", but it's not explicit about what it's showing the context of, and what the diagram scope is. My assumption is that the large box labelled "Risk System" is the scope of the diagram, but a better title would clarify this.&lt;/p&gt;

&lt;p&gt;And regarding notation. Well, this looks like an ad hoc collection of "boxes and lines" rather than being UML or ArchiMate. And while that's not necessarily a bad thing, a diagram key/legend would help readers to understand the notation being used. I'd recommend adding a diagram key/legend for UML and ArchiMate diagrams too, since not everybody will know these visual languages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Elements (boxes)
&lt;/h2&gt;

&lt;p&gt;Let's move on to look at the elements in more detail. Again, here are some things to think about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does every element have a name?
&lt;/li&gt;
&lt;li&gt;Do you understand the type of every element? (i.e. the level of abstraction; e.g. software system, container, etc)
&lt;/li&gt;
&lt;li&gt;Do you understand what every element does?
&lt;/li&gt;
&lt;li&gt;Where applicable, do you understand the technology choices associated with every element? &lt;/li&gt;
&lt;li&gt;Do you understand the meaning of all acronyms and abbreviations used? &lt;/li&gt;
&lt;li&gt;Do you understand the meaning of all colours used?
&lt;/li&gt;
&lt;li&gt;Do you understand the meaning of all shapes used? &lt;/li&gt;
&lt;li&gt;Do you understand the meaning of all icons used?
&lt;/li&gt;
&lt;li&gt;Do you understand the meaning of all border styles used? (e.g. solid, dashed, etc)
&lt;/li&gt;
&lt;li&gt;Do you understand the meaning of all element sizes used? (e.g. small vs large boxes)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every element has a name here, so that's good, but some of those names are acronyms/abbreviations. I know what "RDS" means here, but you probably don't, so that should really be fixed. "IAM" is quite a generic term too, so perhaps it would be better to add more detail. We have a collection of shapes being used here, and I'm not sure what the difference between the rectangles and the ellipses is. It's the same story with colour. Why are some elements blue, while some are black?&lt;/p&gt;

&lt;p&gt;Moving away from the visual aspects, it's not actually clear what the elements represent, in terms of the level of abstraction. Are they all the same thing (e.g. "software systems"), or are some of them (e.g. the "Audit Log") really just an implementation detail of the "Risk System"?&lt;/p&gt;

&lt;h2&gt;
  
  
  Relationships (lines)
&lt;/h2&gt;

&lt;p&gt;Finally, let's look at the relationships:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does every line have a label describing the intent of that relationship?
&lt;/li&gt;
&lt;li&gt;Where applicable, do you understand the technology choices associated with every relationship? (e.g. protocols for inter-process communication)
&lt;/li&gt;
&lt;li&gt;Do you understand the meaning of all acronyms and abbreviations used? &lt;/li&gt;
&lt;li&gt;Do you understand the meaning of all colours used?
&lt;/li&gt;
&lt;li&gt;Do you understand the meaning of all arrow heads used?
&lt;/li&gt;
&lt;li&gt;Do you understand the meaning of all line styles used? (e.g. solid, dashed, etc)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only around half of the lines are labelled, and this is very common. I imagine that "audit logs" are being sent to the "Audit Log" box, but it would be nice to know what sort of things this might include. And "input" (from "RDS" to "Risk System") is quite generic and ambiguous, especially if you don't know what "RDS" means.&lt;/p&gt;

&lt;p&gt;While most of the arrows are unidirectional (one-way), there's a bidirectional (two-way) arrow between the "Risk System" and "IAM" boxes. I'm not a fan of bidirectional arrows, because they tend to be harder to label correctly.&lt;/p&gt;

&lt;h2&gt;
  
  
  A better diagram
&lt;/h2&gt;

&lt;p&gt;I've seen a number of "diagramming anti-patterns" blog posts in the past that will show you the problems associated with poor diagrams, but fail to show you the "good" example. So let's do that.&lt;/p&gt;

&lt;p&gt;Here's a better version of the diagram above. I've used a tool for this (&lt;a href="https://structurizr.com/dsl?src=https://gist.githubusercontent.com/simonbrowndotje/df206037424d3136e04ac3564cd0f1c9/raw/d230147718750b06d95ba0a2cc2222be4425c494/risk-system.dsl" rel="noopener noreferrer"&gt;diagram source&lt;/a&gt;), but you could use a whiteboard or sheet of paper.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev-to-uploads.s3.amazonaws.com/i/8vkmvy4zelvdf2390nfb.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8vkmvy4zelvdf2390nfb.png" alt="System Context diagram for Risk System"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fi2qbtypqed5j6uj77e03.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fi2qbtypqed5j6uj77e03.png" alt="Diagram key"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've made a few assumptions about the audit log, data retention, and logger elements being implementation details, so I've omitted them from this &lt;a href="https://c4model.com/#SystemContextDiagram" rel="noopener noreferrer"&gt;System Context diagram&lt;/a&gt;. Every element has a name and description, plus I've also included some text inside the element to explicitly state what type of thing the element represents (i.e. "Person" or "Software System"). All lines are labelled too. Finally, there's a diagram key that shows the different shapes and colours being used.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Learning how to review a software architecture diagram is a relatively easy skill to pick up, and I'd recommend using my &lt;a href="https://c4model.com/review/" rel="noopener noreferrer"&gt;diagram review checklist&lt;/a&gt; the next time you need to do a review.&lt;/p&gt;

&lt;p&gt;From a tooling perspective, sticky notes on a whiteboard work really well, but if you need something online, take a look at the &lt;a href="https://dev.to/simonbrown/announcing-the-structurizr-diagram-review-tool-c17"&gt;Structurizr diagram review tool&lt;/a&gt;, which you can use for free. Alternatives include collaboration tools like Miro and Mural.&lt;/p&gt;

&lt;p&gt;Creating good software architecture diagrams is a huge topic, but if you're interested in learning more, I'd recommend starting with the &lt;a href="https://dev.to/simonbrown/you-don-t-need-to-use-uml-4kaa"&gt;C4 model&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
