<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Architecture on Software Engineering Thoughts</title><link>https://software.skipoles.co.uk/tags/architecture/</link><description>Recent content in Architecture on Software Engineering Thoughts</description><generator>Hugo</generator><language>en</language><lastBuildDate>Fri, 21 Jul 2023 21:22:11 +0100</lastBuildDate><atom:link href="https://software.skipoles.co.uk/tags/architecture/index.xml" rel="self" type="application/rss+xml"/><item><title>CQRS (and Event-Driven) Anti-Patterns</title><link>https://software.skipoles.co.uk/posts/cqrs-anti-patterns/</link><pubDate>Fri, 21 Jul 2023 21:22:11 +0100</pubDate><guid>https://software.skipoles.co.uk/posts/cqrs-anti-patterns/</guid><description>&lt;p&gt;Over the years I have worked on a number of systems that would be classed as event-driven, and some
of these have also implemented various parts of the CQRS pattern. More recently I&amp;rsquo;ve been working
on systems and services that utilise the full gambit of CQRS and Event Sourcing. These have primarily been
built using Axon Framework to provide the technical infrastructure.&lt;/p&gt;
&lt;p&gt;While these approaches generally lead to really well structured systems, as with all software development,
there are always some anti-patterns that tend to emerge. These make the solutions more difficult to
understand, maintain and enhance.&lt;/p&gt;</description></item><item><title>The Essence of Axon Framework</title><link>https://software.skipoles.co.uk/posts/the-essence-of-axon-framework/</link><pubDate>Thu, 06 Jul 2023 17:39:58 +0100</pubDate><guid>https://software.skipoles.co.uk/posts/the-essence-of-axon-framework/</guid><description>&lt;p&gt;Axon Framework provides an underlying technology platform to allow building of solutions that utilise the
&lt;a href="https://software.skipoles.co.uk/posts/the-essence-of-cqrs/"&gt;CQRS&lt;/a&gt; and &lt;a href="https://software.skipoles.co.uk/posts/the-essence-of-event-sourcing/"&gt;Event Sourcing&lt;/a&gt; architectural patterns. It combines these with a message bus approach that allows for distribution, location
transparency and service redundancy.&lt;/p&gt;
&lt;p&gt;In this post, rather than describe Axon Framework in great detail, I just want to focus on the main essence of
this framework. More details can be found in the resources section at the end of the post.&lt;/p&gt;</description></item><item><title>The Essence of Event Sourcing</title><link>https://software.skipoles.co.uk/posts/the-essence-of-event-sourcing/</link><pubDate>Thu, 06 Jul 2023 15:29:25 +0100</pubDate><guid>https://software.skipoles.co.uk/posts/the-essence-of-event-sourcing/</guid><description>&lt;p&gt;Event Sourcing is a really interesting pattern in software engineering. It is an alternative
approach to maintaining the state of a domain model and managing its persistence.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a wealth of great material around this pattern and how to use it for building software. If
you&amp;rsquo;d like more information then I&amp;rsquo;ve included a section at the end of this post with a list of useful
resources.&lt;/p&gt;
&lt;p&gt;In this post, rather than explain all the details of Event Sourcing, I want to just focus on what I think is
the essence of this pattern. Armed with this information you can then go off and explore the subject
in more detail.&lt;/p&gt;</description></item><item><title>The Essence of CQRS</title><link>https://software.skipoles.co.uk/posts/the-essence-of-cqrs/</link><pubDate>Wed, 05 Jul 2023 17:07:43 +0100</pubDate><guid>https://software.skipoles.co.uk/posts/the-essence-of-cqrs/</guid><description>&lt;p&gt;I think one of the most interesting patterns in software engineering is Command Query Responsibility Segregation (CQRS). It is a super powerful way of thinking about certain problems and a way of building systems that solve these problems.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a wealth of great material around this pattern and how to use it for building software. If
you&amp;rsquo;d like more information then I&amp;rsquo;ve included a section at the end of this post with a list of useful
resources.&lt;/p&gt;</description></item><item><title>API Best Practices</title><link>https://software.skipoles.co.uk/posts/api-best-practices/</link><pubDate>Fri, 14 Apr 2023 21:32:35 +0000</pubDate><guid>https://software.skipoles.co.uk/posts/api-best-practices/</guid><description>&lt;p&gt;Creating great APIs is hard. Getting the right level of abstraction and building something
that is pleasant for clients to integrate with is a huge challenge. This post delves
into this topic in more detail.&lt;/p&gt;
&lt;blockquote&gt;
&lt;h4 id="but-first-an-anecdote"&gt;But first an anecdote&amp;hellip;&lt;a class="anchorjs-link" href="#but-first-an-anecdote"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Product Owner&lt;/strong&gt;: &amp;ldquo;I need you to integrate with this third-party API as part of the current feature. It provides most of the functionality that we require in this area, and will avoid us having to write loads of it ourselves. Here&amp;rsquo;s the link to their documentation.&amp;rdquo;&lt;/p&gt;</description></item><item><title>The Problem With APIs</title><link>https://software.skipoles.co.uk/posts/the-problem-with-apis/</link><pubDate>Fri, 14 Apr 2023 20:32:35 +0000</pubDate><guid>https://software.skipoles.co.uk/posts/the-problem-with-apis/</guid><description>&lt;p&gt;Creating great APIs is hard. Getting the right level of abstraction and building something
that is pleasant for clients to integrate with is a huge challenge. This two part post delves
into this topic in more detail.&lt;/p&gt;
&lt;blockquote&gt;
&lt;h4 id="but-first-an-anecdote-courtesy-of-russ-miles"&gt;But first an anecdote&amp;hellip; (courtesy of Russ Miles)&lt;a class="anchorjs-link" href="#but-first-an-anecdote-courtesy-of-russ-miles"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Provider&lt;/strong&gt;: “Ah, you’re missing the special field, BABEL-256. Without that field this behaves subtly differently…”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Consumer&lt;/strong&gt;: “Wait, what??”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Provider&lt;/strong&gt;: “Yeah, you can think of this service as a single front door where, past the door, there are a lot of different rooms, hallways, and functions available. ‘Service DoSummat’ is just the front door. The concoction of fields you pass are where all the magic happens. It’s Postel’s Law, we accept almost anything and that’s a good thing…”&lt;/p&gt;</description></item><item><title>Incremental Architecture</title><link>https://software.skipoles.co.uk/posts/incremental-architecture/</link><pubDate>Sun, 29 Jan 2023 19:47:54 +0000</pubDate><guid>https://software.skipoles.co.uk/posts/incremental-architecture/</guid><description>&lt;p&gt;I have been having some interesting discussions with colleagues around evolving architecture and adding new
requirements in an agile environment. The discussion raised some interesting points that I felt worthy
of a blog post exploration.&lt;/p&gt;
&lt;h2 id="background"&gt;Background&lt;a class="anchorjs-link" href="#background"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Imagine a simple system comprised of two main components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Component A&lt;/strong&gt; is the main component containing the key business logic. In order for it to
do its job it needs to interact with component X. Mostly it needs to retrieve activity status
from X, but it can also initiate a new activity from time to time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Component X&lt;/strong&gt; is a legacy system outside of our control. It has a number of peculiarities
that make it challenging to integrate with. These include:
&lt;ul&gt;
&lt;li&gt;Legacy format API payloads that aren&amp;rsquo;t mapped to a domain model&lt;/li&gt;
&lt;li&gt;Payloads that might not always be backwards compatible&lt;/li&gt;
&lt;li&gt;Release cadences that aren&amp;rsquo;t related to those of component A&lt;/li&gt;
&lt;li&gt;Periods of scheduled non-availability where some requests cannot be accepted and must be retried later&lt;/li&gt;
&lt;li&gt;Performance constraints requiring some throttling of requests&lt;/li&gt;
&lt;li&gt;High latency on some operations&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Given the challenges of interfacing with component X, the team building the integration made a
sensible decision and decided
to keep all the complexity outside of the main component. Instead they added a new microservice,
&lt;strong&gt;Component B&lt;/strong&gt;. This component implements an adapter and anti-corruption layer that
deals with, and abstracts away, all the eccentricities of X.&lt;/p&gt;</description></item></channel></rss>