Architecture diagrams enable better conversations
unravelled.dev
unravelled.dev
The result is a set of documents and diagrams under version control that can be rendered using the structurizr documentation server (for interactive diagrams and indexed search).
I also use https://d2lang.com/ for declarative diagrams in addition to C4, e.g., sequence diagrams and https://adr.github.io/ for architectural decision records. These are also well integrated into structurizr.
One thing I was experimenting with (read: struggling with!) was a way to keep per-service (per-repo) architecture workspaces which are also synchronized on-commit to a central workspace and used !include to bind them together. The moving parts are not difficult - but writing your DSLs in a way that can handle this can be. This idea would let individual projects be self-sufficient and generate their own README doc diagrams as part of their own build process; but also have a central site which shows all the services as well as inter-service connectivity.
Did you ever consider https://github.com/avisi-cloud/structurizr-site-generatr to bring together your ADRs in with your architecture, or do you keep them separate?
Visual Studio has good support for MermaidJS. https://mermaid.js.org/intro/
To use the example on their website, I would like something like this in JS:
let { Component, Container, Diagram, Person } = import 'c4'
let user = new Person('User')
let system = new Container('Software System')
let webapp = new Component('Web Application')
let database = new Component('Web Application')
system.contains(webapp)
system.contains(database)
user.uses(webapp).via('Uses')
webapp.uses(database).via('Reads from and writes to')
export new Digram()
.title('Software System')
.theme('default')
.shows([user, system])
.type('container')
Edit: As it turns out, there are a couple libraries like this:- Python: https://github.com/nielsvanspauwen/pystructurizr
- C#: https://github.com/8T4/c4sharp
Don't see one for JS though. Smells like an opportunity for someone.
Alternatively, if you want to stick to ASCII output, https://arthursonzogni.com/Diagon/#Sequence supports several formats (see the dropdown) which can pipe into something like Typogram (https://google.github.io/typograms/) for more beautiful output.
For example, input:
Renderer -> Browser: BeginNavigation()
Browser -> Network: URLRequest()
Browser <- Network: URLResponse()
Renderer <- Browser: CommitNavigation()
Renderer -> Browser: DidCommitNavigation()
will output the following sequence diagram: .--------. .-------. .-------.
|Renderer| |Browser| |Network|
'--------' '-------' '-------'
| | |
| BeginNavigation() | |
|-------------------->| |
| | |
| |URLRequest() |
| |------------>|
| | |
| |URLResponse()|
| |<------------|
| | |
| CommitNavigation() | |
|<--------------------| |
| | |
|DidCommitNavigation()| |
|-------------------->| |
.--------. .-------. .-------.
|Renderer| |Browser| |Network|
'--------' '-------' '-------'
and then you can perform further edits using something like https://asciiflow.com/ (web, free) or https://ivanceras.github.io/bob-editor/ (web, free) or https://monodraw.helftone.com/ (Mac only, proprietary) as mentioned in other comments from https://news.ycombinator.com/item?id=37040883.I train teams to use C4 diagrams, one of the most common issues they tell me they had in the past is the ivory-tower: someone somewhere created all the diagrams alone and dumps them on everyone hoping it will make the world better. The problem is that mode lacks the collaboration and mutual context-building to get everyone on the same page. Not everything needs to be a team effort, but a lot of your diagram work should shift towards a day-to-day tactical discussion (the deeper the C4 level the faster moving things will be). Shifting to a culture of shared context and the discipline of speaking the same language lets everyone have high clarity and move quickly.
The problem with DSLs is they are often nudging people to work alone. Text editors like that are often not multi-player. You can get around it with a screen-share or even pair programming a diagram, but often the tools nudge behaviours of people into a mode where they just work alone and dump stuff out of the ivory tower.
When I train teams who are coming in new to something like C4 I will use Miro specifically because they don't need any special DSL knowledge, and also especially because it is multi-player (everyone gets to draw and move stuff around). I find often people get a bit shy about touching the diagrams but in the training it is really important to get the whole team into the practice of seeing "oh yeah, this is a diagram I can touch too".
For teams who've been through the basic training and gotten used to C4 diagrams to do specific jobs in their tech org, I move them into https://icepanel.io/ because the problems of that team have changed a lot. The initial problem was "I need to know how to structure a story and model my architecture at the same time". Once they got good at explaining their architecture they end up needing to model their architecture (a diagram is something different than a model) at a bigger scale (all those connections that make your diagrams too messy, the boxes that are important in context A but not context B, etc). I like IcePanel because I can slice out a "domain" of my model and show just that view of the world. For teams that have been trained to empower everyone to draw (instead of a single Benevolent Diagrammer For Life), having a multi-player system to manage the model and pick how to present a multi-dimensional subset of that better than just having a static DSL file or a Miro board (note: Miro is "fine" but it can quickly reach its limits). Basically, You get to keep the complexity of your model but only have a focused discussion on the relevant parts.
Beyond that, there's a whole world of techniques on how to actually read an architecture diagram to spot problems, but that's just too much stuff to post in a comment here.
The tl;dr is: Getting your teams to manage their architecture is multiple skills you need to build into the people on your team: collaborating, diagramming, modeling, analysis, and story-telling. I suggest starting in any tool where everyone can participate, and I don't think that's a DSL-based tool because of the UX. Those DSLs "nudge" your culture towards one where one person in the ivory tower drops an inaccurate and overly complicated one-size-fits-all diagram every 9 months and nobody knows with to do with it. It doesn't always happen, but it does increase the chances.
Full disclosure: I'm the trainer mentioned in the article. Happy to answer questions here if anyone wants to debate or pick my brain.
A room full of people can talk about things for hours without making progress, but as soon as you starting moving boxes and arrows around on a screen suddenly people have more targeted thoughts about what they agree with or what should change.
The diagram is useful for planning the extend and structure of the work to be done, and coordinating the team that is building it to make sure we have a shared mental model.
Once that project is done, the diagram is likely already out of date. No plan survives contact with the enemy and all that. But for this use case its job is complete and it can be discarded or archived with the rest of the planning work.
Diagramming for long term documentation is a slightly different use case, and for that I tend to agree more with documentation that at least lives with the code and can be updated alongside it, manually or automatically. I just personally haven't worked in orgs large enough to pay off that level of investment.
I have been trying to enforce this concept inside of my current organization. There is the saying that a picture is worth 1,000 words. I would extend that, suggesting that a diagram is worth well over 10,000 words.
As an example, we had a project at work that kept getting thrown on my desk and every time it showed back up I would respond back with 20 questions based on limited writeups and JIRA tickets. Each time it would come back, I would get more confused, my team got confused, the architect was confused. Everyone was on different pages.
Then finally, we brought a new technical project manager onto the project (at my bequest to the CTO) and within a week that TPM created a diagram, we have one 30-min meeting where he presented the diagram. We then realized that each team was on completely different pages with what needed to be built. Everyone asked a few questions, but there were far fewer questions than earlier because many of the questions were answered by the diagram. We then built out the solution 3 weeks later.
So we spent 10 weeks spinning our wheels, building, unbuilding, rebuilding, and being confused as we all tried to get in alignment. THen one diagram and a 30 minute meeting later and we all left understanding exactly what we needed to do, we were all in alignment on the project and we were confident in what we needed. It also helped us call out things gaps in the initial solution, which we probably never would have identified until we ran into the problems when following the earlier method.
One diagram can save HOURS (even tens of hours) of time for everybody. It reduces errors and misconfiguration and aligns teams. Diagrams are your best friend. No matter how simple something is, I always make a diagram.
Maybe their unpopularity among developers stems from trauma of the UML+OOO+Waterfall days and an overcorrection in the opposite direction.
Or many more are doing it and just not talking about it since it's not as exciting as code.
My dream is that software architecture can have a late binding and can be transformed easily and trivially, without breaking any of its items it arranges.
I am satisfied that I see the question "What is the main entry point?" in this post. This is so useful. I like the idea of an "entrypoint" folder for main(), routes and dependency injection containers.
I think clear push/pull, async/synchronous, simultaneity and data flow can go a long way to understanding an architecture.
I want software architecture to be a function of scaling requirements, that you can scale up and down. "architecture(scaling-requirements)"
Wouldn't you love to be capable of changing the diagram to move code around? (You're in effect moving control flow or what I call the "tip of execution" by drawing lines or moving boxes around)
I think your software architecture is a data structure, excepts it's really painful to change.
I would love a Google-Maps-Like architecture diagram. Zoom out and you see high level flows, zoom in and you get the details you want to see. Different overlays to let you explore how systems are connected or how certain sub features work.
Obviously this is hard to do and even harder to maintain but it could be really cool.
You're describing something very similar to Ilograph[0] with its multiple perspectives.
disclaimer: i work on it.
Now if I could only get Posit to put D2 into Quarto alongside Mermaid and GraphViz, I would be set.
Right now most tools including lucidchart and old timers like Enterprise architect are far too static
As someone with aphantasia, they don't help me memorize relationships, so to get them into my working memory, I have to translate a diagram into bullet points: it's so much easier just to start with those bullet points of what components we've got, what they consist of and what relationships they have (you know, just like code itself).
And having done theoretical (read: abstract) maths too, that's good enough for me to work with complex and intricate relationships.
I still understand that it's not like that for most everybody else, but for some minority of us, they are just a bad way to write text/thoughts out as the graphical layout has no benefits. Yes, you do learn to read and create them, but it's an extra effort that you do for others' benefit.
I echo your point that diagrams are not the solution for everyone (and that a multimodal representation of relationships is clearly best), I just find it fascinating how even with something as specific as aphantasia, there is still so much variability as to how it's experienced.
As such, I’m not sure that “memorizing relationships” is their goal. As the OP article says, communication is one goal. But also, drawing a diagram is a lot like writing - it forces you to think about what you’re documenting and often uncovers points that need to be addressed.
Bullet points can’t really capture what a diagram can - you need to represent other relationships in addition to the simple hierarchical structure that bullet point provide. If you use a diagramming tool with a DSL, you’ll see this in the diagram definition - it starts to become difficult to read a non-trivial diagram in textual form, because of relationships between different parts of the text.
I’m not suggesting that you should find diagrams useful, but I think that what you’re looking for from them may not be their main purpose.
But no, what I am saying is that diagrams can't capture what a textual description can (for me[1]): like I struggled to accept that anyone can find diagrams useful for years, believe me that a diagram defined with a nice diagramming DSL works better for me. Or, you know, bullet points: I can put those into my working memory and work with that.
Maybe it's my history as well: started with DOS and reluctant to switch to Windows having only used 3.11 for Internet, so after a short stint in NT, moved full time to Linux, doing everything with DSLs: printer escape sequences, AT commands, plain TeX for typesetting... — this is all early to mid primary school.
[1] Obviously, as there are textual representations of diagrams, they are an equivalence class.
The second half is usually explaining the 10kft and 1kft arhitectural overview of our product. However, I find that pre-prepared architecture diagrams are not that helpful in this case. I just open up an excalidraw tab, screen share, and sketch out the diagram in real-time, explaining things as I go along, and trying to elicit conversation about the design.
I do this because my biggest challenge when tackling new work is not necessarily the code, but the context of it. Where does this live? Where does it receive its inputs from? Where dose its outputs go? How are all of these things organized into the bigger picture? What gets persisted? What's transient?
A good grasp of overall architecture allows you to produce your own heuristic for how to navigate the code, where to look for problems, build internal models of where things might be going wrong, etc.
The sketches get thrown away each time. The process of drawing it out and explaining it is the value.
None of that is part of what you capture in a static diagram in an architecture document.
That's one reason why I suspect that the diagrams in documentation shouldn't necessarily look like the ones you draw in a collaborative session.
This is the benfit of using a framework, if you are building different projects. Learn one architecture intimately, and you save a lot of headroom. You can also hire people familiar with the framework, who have built this intuition already, even though they have never seen your codebase before.
Sadly, it’s not what I’ve experienced lately.
When these issues are takled about in words, through code, through hand waving whatever - I have experienced that the details often mask ensuring that everyone is on the same basic page. Often when there has been confusion it has taken someone pulling the group back and noting that 'Bob things A is connected to B and then connected to D but Alice thinks A connects to C before connecting to D"
Just putting a architecture diagram of a process up helps find shared understanding.
That's what the argument is... and I'm in favour, there used to be such great architectural tools that were mostly UML but they did this well.
I miss Visio, it was awful but everyone used it and it improved communication.
I feel Google Suite is missing an equivalent, it's now draw.io, there's a real gap here.
Otherwise it has all critical modeling methods and established a shared visual understanding. I prefer UML any day over eg lucidchart or Visio. Not that they cannot draw an architecture but boxes are what exactly again there?
I especially like UML because there are no AWS logos and database icons. When drawing diagrams I am not there to impress how many icons I can do.
Did it go somewhere?
(I generally prefer more declarative diagramming now — mermaidjs is my go to — but Visio is still around and widely used.)
https://support.microsoft.com/en-us/office/use-visio-on-a-ma...
Lost it's ubiquity.
There was a period in which you could rely on almost everyone to have it, which made it an attractive, convenient and low friction way to share diagrams that people could edit and update.
I agree with this if you're using drag-and-drop diagramming tools. Diagrams-as-code is a potential solution IMO: https://www.ilograph.com/blog/posts/its-time-to-drop-drag-an...
Something like XState and the Stately studio editor comes to mind; it’ll generate state machine diagrams from code or vice versa. But it only manages state charts. I’m not sure how you could create something similar with more broad applications. Though, maybe that’s not necessary or necessarily a good idea anyways.
I usually go with as little graphs as possible and prefer to write text; it can capture more, better, faster, and be more iterable. For specific areas like state machines or packet sequences I will drill into graphical representations more but otherwise... eh. Text wins.
Plus, the output being code, it’s easy to fine tune when the inevitable mistake creeps in every once in a while.
It’s funny. I have never documented anything so thoroughly. It was just too time-consuming. Now I do. In part because I know there will be a diagram to complement it and improve the likelihood any of it will prove useful to someone at some point.
But also because keeping said documentation and diagrams up to date will be easier.
That too. Also had some interesting results asking it to rephrase, structure and improve whatever description I’ve written for the process I’m documenting.
Especially when my description felt more like some rambling than some clear and precise unambiguous explanation.
Also a great way to generate, and more importantly keep up to date, short and concise overviews, for both technical and non-technical stakeholders.
But C4 seems almost too lightweight to merit a name. Its drawing toolbox is just boxes, arrows, stick figures and datastore, with 'boxes' meaning one of four different things depending on the diagram level (Context, container, component, code). But the boxes are the easy part! The only thing I want a diagramming standard to settle on is 'what do the arrows mean, and which direction do they go in', and C4 fails on that front - the arrows mean 'whatever you label them to mean' - they are literally just 'relationships', so on one C4 diagram you might have one arrow that means 'writes data to' and another one that means 'is written to by', and that's fine.
The C4 docs say little of relationships, apart from, 'Try to be as specific as possible with the label, ideally avoiding single words like, "Uses".'
The C4 examples contain lots of relationships labelled as 'Uses'.
So I'm sorry, but I just don't see the value C4 brings to the table. Do I need to pay for the training?
Fun fact ... it actually didn't have a name for the first few years, and was just the approach I used and taught people on my software architecture workshops.
We’ve found that you get a lot of value out of the first two levels of C4 alone. If your shop is good at UML and keeping it up-to-date, awesome, that work snaps right in as the additional layers. But whether you do 3 and 4 or not, context and container give everyone a lay of the land in easy to digest, progressive glimpses. Plus, the approach is so simple you can use it in whiteboard sketches, back of the napkin, or whatever you’ve got.
Personally, I use PlantUML with a plug-in for your IDE of choice to author our formal artifacts. Excalidraw for doing it during real-time collaboration sessions. All of this is free.
I really like diagramming, and I tend to do it whenever architecture comes up, but the best tools I've found are just pen and paper (or pen and whiteboard, or in a pinch Microsoft Paint). That way, you can draw exactly the relevant details for the discussion at hand.
This doesn't work great for "diagrams as code", i.e. anything you want to check into git. I've recently had some success with ASCII drawings - there are a couple of online tools that draw the basics, and you can get the fine details by hand - but that's more time consuming, particularly for quick sketches.
If you have smaller or less complicated systems, or your audience is smaller or all peers, then I could also see C4 as having fewer benefits.
A big part of this problem is the "code-model gap".
That's fine for some purposes, but for general discussions around many subjects (project planning, security, integration testing, etc) you won't get there from generated diagrams out of some code in an application.
On the onboarding story, I'm specifically curious how/why diagrams work more than a bulleted list and other conventions could already do? What are the entry points? Is there a convention on how entry points are named? If not, why not?
I love the idea of having a diagram that works as a reflection of the codebase. Hard not to think of ways that can help. I'm always worried that too much effort goes into the reflection, though. Especially when it is front loaded in the effort.
> On the onboarding story, I'm specifically curious how/why diagrams work more than a bulleted list
the point I was trying to make in the article was that having a visual representation helps new developers to build up a mental model of the different components of a software system. In my particular case the system in question is made up of: 2xAPI, 2xEvent Processors, Event Producer as well as dependencies on external systems. The architecture diagrams are helpful here as the new developers are able to see the interactions between components.
> I love the idea of having a diagram that works as a reflection of the codebase.
In C4 there are 4 levels, the first is the system view this doesn't bear much resemblance to the codebase, the second is the container level, this is where you show the different components that make up a system. It's important to note here that a component is a deployable "thing", e.g. an API, database, powershell/bash script etc. This is where you start to see a bit more of a link between the architecture diagrams and the codebase. My experience of level 3 and level 4 where you start to model the actual codebase didn't bear much fruit and there are tools which can do a good enough job here from scanning the code (particularly in the dotnet world, NDepend does a brilliant job, although £££s)
My question is probably more asking exactly how/why the visual representation helps. I am very open to the idea that they do. But I'm also open to the idea that it is the active interaction with others that is the important part. That it is done with text or with drawings feels secondary. Almost distantly.
Your point about the really high level views of 1 and 2 in the levels feels notable. I also really resonate with the idea of identifying the deployable "things" that can be independently reasoned about. If you have a team that is pushing libraries between the two things, you then have to expand this discussion to the build and deploy systems as being integral to your team, not merely secondary considerations.
As you say, you can describe a system in a few paragraphs, explaining the relationship between the main components. However, as paragraphs it can harder to grok, and also harder to write with no ambiguity.
Now, part of what I say above can be seen as personal preference (text vs image), but in practice I have found that when using tools like plantuml or mermaid to make C4 diagrams, the result is easier to use, remember, and update than plaintext.
Now, story boarding a communication sequence between systems can make great use of layout. So, I definitely see potential.
There's a great book by Abby Covert about diagrams in general: "Stuck? Diagrams help."[1]
From a learning perspective, having multimodal[2] options, such as a mix of visual (diagrams), reading, and videos/audio can really help with onboarding. Different people learn better with different methods, and different methods work better in different contexts, for example I personally hate sitting at my desk watching a video, but enjoy doing so on my phone while commuting.
[1] https://abbycovert.com/stuck/ [2] https://www.learnupon.com/blog/multimodal-learning/
This has value even if the diagram is immediately obsolete and discarded once the project is complete.
I come out of the first tech interview, coding/debugging, with praises. But then comes the second, the architecture interview, and I can't for the life of me draw the architecture of anything.
I don't know how people learn to do that, I've learned to code/debug by being obsessive about it. But I don't see how that happens for system architecture.
I've never used diagrams in my day-to-day work, so when it comes up in interviews I'm always surprised.
The interview is inherently unfair - when you use a drawing tool to build diagrams the work is iterative, but erasing marker during an interview looks like you've made a mistake.
Start with a small top-level diagram, then build a hierarchy of increasingly detailed diagrams. Use the opportunity to steer the interviewer ("which area would you like to see in more detail?"). It also helps to have an understanding of how small bits of code map to graphical sketches, so that you can compose them later.
Also, keep in mind that issues like poor handwriting and sloppy lines are exacerbated by large detailed diagrams.
> failed a number of technical interviews because I can't make architecture diagrams
I would caution against correlating interview failure to a lack of diagramming skill. Diagramming is a teachable skill; how to formulate architecture is much more complicated. If I am considering hiring someone who I see can design strong architectures but couldn't represent that in a diagram, I'm probably not dismissing them because of their drawing skills. But that's only when I believe they can design an intended architecture.
> I can't for the life of me draw the architecture of anything
I had an engineer on one of my teams who had the same problem. With him, he understood some things but in other aspects he was more murky. So, I asked him to start by writing down the architecture. Literally, write words and sentences that describe the collective of systems, i.e. Service "A" is a REST API, and it connects to Database "B"; a client connects to Service "A" over HTTPS, etc. etc. I don't know if this would help, but if you can do that, you can start to translate the words to pictures.
> I don't know how people learn to do that
By doing. I don't know anyone who has ever been trained to create an architecture diagram that knew what they were talking about. Just start small, and then ask someone to describe it back to you. When you begin to hear what you consider to be correct, you'll know you're making progress.
> I've never used diagrams in my day-to-day work
This tells me a couple of potential things: you're possibly not working in complex or large systems, or maybe are not responsible for communicating those systems to others. "Complex" is a relative term, so interpret that as you may. Ultimately, arch diagrams serve as a way to visualize complexity with the goal of letting others understand.
I did use to make diagrams all the time when I was a field engineer for a distro company. Getting one of those small wacom tablets is really helpful in that case. I could draw in whatever app I was using at the time like draw.io or diagramly, I forget.
I guess if we're all WFH now the latter is more important.. not sure if I'll ever have to whiteboard again..
Also, I ran across this today, making diagrams as gifs. Really interesting. Way too much work for me, though - https://aws.plainenglish.io/aws-architecture-in-motion-creat...
Havent tried.
Anyway, I tried to get it to diagram a multiaz multiregion AWS nodejs frontend w/ rds backend app and it kept hitting api limits. I hate that that's a problem when I'm paying $20/mo but whatever. Like, just SLOW down the api calls. Stop ending the entire response. It's frustrating. Then it just tries again and hits the same limit. Some AI.
I then shrunk it to something tiny just to see what it was, because I have no idea if its a mermaid diagram or uses the AWS icons or what, and it send me a broken image link. I told it the image didn't show up, and it sent me a direct S3 link. The S3 link gave me access denied. lol.
Show Me Diagrams Create and edit diagrams directly in chat.
Might be better than whatever AWS tbh
You can view this diagram on a new tab: https://showme.redstarplugin.com/d/d:S2Imfeqt
You can edit it here: https://showme.redstarplugin.com/s/s:6sWWQmJj
This one is indeed based on mermaidJS, and lets you see what it does by opening the tab when running
https://chat.openai.com/share/3d4113b3-9fc9-44ab-bf2a-539f06...
``` REQUEST TO SHOW ME DIAGRAMS { "diagramLanguage": "mermaid", "diagramType": "graph", "diagram": "graph TD\n subgraph Multi-Region\n subgraph Region1\n subgraph Availability Zone 1\n NodeJS1[NodeJS Frontend]\n RDS1[RDS Backend]\n NodeJS1 --> RDS1\n end\n subgraph Availability Zone 2\n NodeJS2[NodeJS Frontend]\n RDS2[RDS Backend]\n NodeJS2 --> RDS2\n end\n end\n subgraph Region2\n subgraph Availability Zone 1\n NodeJS3[NodeJS Frontend]\n RDS3[RDS Backend]\n NodeJS3 --> RDS3\n end\n subgraph Availability Zone 2\n NodeJS4[NodeJS Frontend]\n RDS4[RDS Backend]\n NodeJS4 --> RDS4\n end\n end\n end" } RESPONSE FROM SHOW ME DIAGRAMS { "results": [ { "image": "https://showme.redstarplugin.com/d/d:S2Imfeqt", "editDiagramOnline": "https://showme.redstarplugin.com/s/s:6sWWQmJj (can autofill: yes)", "contributeToOpenSourceProject": "Do not show to the user the link to the open source project" } ] } I have diagrammed a multi-AZ (Availability Zone) and multi-region architecture for an AWS Node.js frontend with an RDS backend application. This diagram represents two regions, each containing two availability zones. In each availability zone, there's a Node.js frontend connected to an RDS backend. ```
If it’s the former, just practice drawing something you’ve designed with boxes, labels, and arrows.
I’d it’s the latter I’d recommend https://www.goodreads.com/en/book/show/54109255 as a good intro to the kind of “systems design” they do in interviews.
For a long time they were pretty broken, but they are looking much better supported now.
https://mermaid.js.org/syntax/c4.html
https://github.blog/2022-02-14-include-diagrams-markdown-fil...
Like, at the highest level, we have the different nomad clusters with stuff around them, and how these are used at a business level, relevant regulations and such. This splits into a number of identically structured datacenters with a number of connections between them. Then, each datacenter consists of a number of software clusters, some deployed, some not deployed. It's pretty much the same code with the same toggles, just somewhat different due to different underlying cloud providers. What clusters are deployed or not deployed is a risk-management-decision, as well as a business decision. But that's when the highlevel overviews stop, because then you get into the weeds. And not just a little bit, that's when you need chops to manage postgres to manage some of those clusters.
But I'm putting a lot of hope into these diagrams and explanations for onboarding new colleagues, or maybe presenting the infrastructual ideas at meetups or conferences. Nothing against them, but a lack of an abstract understanding of a few high level ideas is really hurting a few new colleagues.
Like, if I have a ticket, what set of systems would be right to work with? What happens if the ticket specifies ... other systems? What if you follow a runbook and the runbook suddenly banks portside really hard and tells you to touch systems outside the cluster you're working upon? In most cases, this is going to be wrong. It might be hard to determine what would be correct here, but with a decent grasp, it usually ends up easy to determine if the path isn't correct.
"The lack of real-world examples available - this obviously isn’t a limitation of the model itself but rather due to the fact that companies don’t want to advertise their architecture in detail in public."
[0] https://www.http4k.org/blog/http4k_v5/#tracerbullet_a_brand_...
[1] https://www.youtube.com/watch?v=CrslqbMbaD8
[2] https://github.com/http4k/exploring-the-testing-hyperpyramid
In my own work, when I need to revisit a spec months afterwards, I often have trouble because I've forgotten parts of the context that I had at the time the spec was drafted. The situation is a bit like the Chesterton's Fence where the original person that set the fence in the middle of the road has also partially forgotten why it needs to be there. It was so obvious at the time...
Do others supplement their architecture diagrams and specifications with a cross-refenced list of risks, alternatives, and probabilities?
there are a few other fields like component, product etc these are very useful for capturing decisions and something I should have mentioned in the article.
It feels like a very light ruleset over what we would do naturally when explaining a system to another engineer. That's great.
Some of the ideas that stood out were:
1. Allow flexibility in the notation (shapes and color) as long as the abstractions are good.
2. When drawing arrows, make them unidirectional to show the main intent.
3. Hide details to express the main story (@ 27min in the video)
4. Don't just give names to components. Give short descriptions too.
5. Don't document the lowest levels. Code is better here.
The downside of diagrams from code is the loss of the wysiwyg aspect -- I want to be able to manipulate things visually.
Or ipad and apple pencil on google docs jamboard using Duet to sketch things out.
I did something similar, but used OBS. There are a few ways to feed video from a cell phone into it. Gives you the chance to do any zooming/cropping/etc to account for limitations in where you can place the phone. As well as adjust brightness/contrast/white balance if you’re really anal about that kind of stuff.
From there I open the feed in a “projector” window and screen share that.
And I agree that having way more C4 examples of real-world projects would be very useful!
Thanks to Leo Z for keeping this online!
[edited to fix link]
Asciiflow https://asciiflow.com/#/ Dot https://graphviz.org/
Sample UML: https://app.visualsitemaps.com/user_flows/share/e64da8ed-2ef...
It is a valid diagram helping understanding something and the tool seems awesome but please do not pitch this as "Sample UML"
It's not particularly targeted at software diagrams, but when diagramming for and during planning and design meetings I prioritize quick buildout and editing over conforming to any particular standards or iconography.
your abstract syntax tree is bad and you should feel bad.