<div class="paragraph">
<p>When designing software systems, architects and developers have plenty of architectural options to choose from. Microservice-based systems have become ubiquitous in the last couple of years. However, the idea of monolithic, modular systems has also regained popularity recently. Independent of the architectural style ultimately selected, the individual applications comprising the overall system need their structure to be evolvable and able to follow changes in business requirements.</p>
</div>
<div class="paragraph">
<p>Traditionally, application frameworks have provided structural guidance by providing abstractions aligned with technical concepts, such as Spring Framework’s stereotype annotations (<code>@Controller</code>, <code>@Service</code>, <code>@Repository</code>, and so on). However, shifting the focus to <a href="https://dannorth.net/2022/02/10/cupid-for-joyful-coding/#domain-based">align code structure with the domain</a> has proven to lead to better structured applications that are ultimately more understandable and maintainable. Until now, the Spring team has given verbal and written guidance on how we recommend structuring your Spring Boot applications. We decided that we can do more than that.</p>
</div>
Today many companies rely on web analytics data to make the right decisions and drive their business to a better place. When we took ownership of one of our client's systems, which provided such analytic data, we found a case full of architectural complexity. This was a consequence of good and not so good decisions, which required many hours of investigation, analysis and discussion and implementation to get things back onto the right path. Learn more about this in this blog.
Recommended read:
Building robust distributed systems | Kislay Verma
https://kislayverma.com/software-architecture/building-robust-distributed-systems/
Every time I think/write about hexagonal architecture, I feel like it's an actual silver bullet. It has so many valuable aspects, e.g. focusing on actor intentions, which allow for better test scenarios, decoupling from specific technologies, which leads to increased testability