<?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: Rich McIntyre</title>
    <description>The latest articles on DEV Community by Rich McIntyre (@rich-mac).</description>
    <link>https://dev.to/rich-mac</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%2F1461118%2F045bb7d4-a838-4a74-821e-f588ad1da955.jpg</url>
      <title>DEV Community: Rich McIntyre</title>
      <link>https://dev.to/rich-mac</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rich-mac"/>
    <language>en</language>
    <item>
      <title>Exploring Modern Architectures: A Shallow Dive into Modular Monoliths, Event-Driven Architecture, and Edge Computing</title>
      <dc:creator>Rich McIntyre</dc:creator>
      <pubDate>Tue, 11 Mar 2025 12:06:02 +0000</pubDate>
      <link>https://dev.to/rich-mac/exploring-modern-architectures-a-shallow-dive-into-modular-monoliths-event-driven-architecture-1037</link>
      <guid>https://dev.to/rich-mac/exploring-modern-architectures-a-shallow-dive-into-modular-monoliths-event-driven-architecture-1037</guid>
      <description>&lt;p&gt;In an ever changing technical landscape, modern architectures are becoming increasingly important for businesses to stay competitive and efficient. Getting your architecture right is the difference between scaling and delivering fast with longevity and not. So, you need to make good choices. &lt;br&gt;
I often help organisations look at the architecture patterns they employ, and together think about technical strategic opportunities. In one of these recent sessions, there were 3 brilliant architectural approaches that I thought it would be worth sharing. &lt;/p&gt;

&lt;h2&gt;
  
  
  Modular Monoliths: The Best of Both Worlds
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Ever had challenges with micro-service network complexity and deployment orchestration? Ever found a large evolving monolith turn into spaghetti with slow cumbersome test cycles and functionality bloat that becomes hard to understand?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Ficsjyozhiuyzhp22pfqu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Ficsjyozhiuyzhp22pfqu.png" alt="Modular Monoliths" width="686" height="530"&gt;&lt;/a&gt;&lt;br&gt;
I first came across the modular monoliths through the excellent Elixir programming language, they have a concept of '&lt;em&gt;umbrella projects&lt;/em&gt;', that you can set up through its default build tool '&lt;em&gt;Mix&lt;/em&gt;'. &lt;br&gt;
As a developer I would often introduce modules immediately as I set up an app. This would allow me and the team I was working with to very clearly work within the domain boundaries, and to easily separate the logic into a brand-new service should I need to. Recognising shared logic and domain specific logic and creating a logical separation early, helps you to create elegant, maintainable apps.&lt;br&gt;
Each module will have clear entry points through its router, you do not access other modules apart from via it's routing mechanism, this is to ensure that you do not re-create a spaghetti monolith by accident. &lt;br&gt;
You can then either deploy the application as a monolith, if you need to future separation, you can have some routing logic that will allow subdomains to map to paths, so externally they appear like individual services. You can also deploy to multiple compute instances and despite services all having the save code deployed to them, similar domain to path mapping can ensure each service only invokes the module that is dedicated to a given domain.&lt;/p&gt;

&lt;p&gt;We have found the benefits of a Modular Monolith include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Single or multiple deployment units&lt;/li&gt;
&lt;li&gt;Less Operational Overhead&lt;/li&gt;
&lt;li&gt;Separation of Concerns&lt;/li&gt;
&lt;li&gt;Focused Ownership&lt;/li&gt;
&lt;li&gt;No Network Latency&lt;/li&gt;
&lt;li&gt;Optimized Resource Usage&lt;/li&gt;
&lt;li&gt;Selective &amp;amp; Efficient Scaling&lt;/li&gt;
&lt;li&gt;Reduced Infrastructure Costs&lt;/li&gt;
&lt;li&gt;Potential Lower Development Costs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Modular Monoliths offer a balanced approach, combining the simplicity of monolithic architecture with the flexibility of micro-services. This pattern allows developers to build applications as a single, cohesive unit while maintaining clear boundaries between different modules. This approach not only simplifies deployment but also enhances maintainability and scalability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Event-Driven Architecture: Events as a first-class citizen
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;We often have events within our architectures, however are they truly event-driven? What is the difference between utilising events being event-driven?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F9txgsjil4az77vr2vg1g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F9txgsjil4az77vr2vg1g.png" alt="Event Driven Architecture" width="800" height="571"&gt;&lt;/a&gt;&lt;br&gt;
One way that you might think about this problem, is to take out all other communication methods such as REST from the internal communication of your system, would it still work? One reason micro-service architecture has been seen as brittle and not fault tolerant, is its high reliance on HTTP. HTTP is great, it scales the entire internet. However, failure patterns are not very elegant and are often not implemented consistently.&lt;br&gt;
Event-driven architecture (EDA) is a powerful pattern where components communicate to each other primarily through events, EDA enables loose coupling and asynchronous communication providing fault tolerance and greater control of failure scenarios.&lt;br&gt;
This is especially useful when you have many inconsistent dependencies, your messaging service can handle much of the abstraction for you, where the common language of communication of the service is the event message itself. Event streaming technologies such as Kafka or Azure's Service Bus, allow you to register message schemas, that be used for validation.&lt;/p&gt;

&lt;p&gt;Some of the benefits include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Loose Coupling&lt;/li&gt;
&lt;li&gt;Independent Development&lt;/li&gt;
&lt;li&gt;Asynchronous Communication&lt;/li&gt;
&lt;li&gt;Focused Ownership&lt;/li&gt;
&lt;li&gt;Fault Tolerance&lt;/li&gt;
&lt;li&gt;Retry Mechanisms are easier to implement&lt;/li&gt;
&lt;li&gt;Easier Interfacing&lt;/li&gt;
&lt;li&gt;Parallel Processing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One of the key advantages of EDA is its ability to handle high availability services at a national scale. For example, in government projects, event-driven systems ensure that critical events, such as passport applications, are processed reliably and efficiently. This architecture also supports parallel processing making it ideal for systems that evolve frequently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Edge Computing: Bringing Processing Closer to the User
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Edge computing turns upside down the way we think about compute, deployment and cloud platforms.&lt;/strong&gt; &lt;br&gt;
&lt;a href="https://media2.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%2F8tr8he443hzg7xy4rz2v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F8tr8he443hzg7xy4rz2v.png" alt="Edge Computing" width="800" height="593"&gt;&lt;/a&gt;&lt;br&gt;
By moving computation closer to data sources and user, edge computing reduces latency, makes systems feel more responsive and enhance the user experience. This is particularly useful for applications that require close to real-time processing and low latency.&lt;br&gt;
In practice, edge computing has been used to create super-fast and efficient micro apps that can be deployed to the edge network. This not only improves performance but also simplifies deployment and management. However, there are still challenges, for example data centralisation (&lt;a href="https://dev.to/shamsup/psa-lambdaedge-isnt-a-quick-win-3252"&gt;see this excellent blog post from Alex Mitchell&lt;/a&gt;), which need to be addressed to fully run with this&lt;/p&gt;

&lt;p&gt;Some other benefits we have found:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Extremely cost effective&lt;/li&gt;
&lt;li&gt;Intelligent Web Application Firewall (WAF) built in (Cloudflare)&lt;/li&gt;
&lt;li&gt;Performant (we have seen sub 10 millisecond responses from workers)&lt;/li&gt;
&lt;li&gt;Fast to deploy&lt;/li&gt;
&lt;li&gt;All the good sides of Serverless (Scalability, cost, no maintenance)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We have found Cloudflare workers particularly effective, deployment times are extremely fast and the supporting features around it, including KV stores, databases and queues make them very powerful. In some cases, it might be possible to use Cloudflare as a cloud platform in itself. &lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Modern architectures like modular monoliths, event-driven architecture, and edge computing are evolving the way we build and deploy software. By understanding and implementing these patterns, businesses can achieve greater scalability, fault tolerance, and efficiency. As we explore these exciting approaches further, it's clear there will be some powerful solutions available to us in software development.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>eventdriven</category>
      <category>microservices</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Using GitHub Copilot in a whole bunch of teams and projects, this is what we discovered</title>
      <dc:creator>Rich McIntyre</dc:creator>
      <pubDate>Fri, 03 May 2024 14:56:29 +0000</pubDate>
      <link>https://dev.to/bjss/using-github-copilot-in-a-whole-bunch-of-teams-and-projects-this-is-what-we-discovered-1hd3</link>
      <guid>https://dev.to/bjss/using-github-copilot-in-a-whole-bunch-of-teams-and-projects-this-is-what-we-discovered-1hd3</guid>
      <description>&lt;p&gt;At BJSS we are super excited about new AI tooling coming out. We have been trying out various tools, however, the GitHub Copilot is a tool that we felt could give engineers instant benefits, we were also excited to see if the improved velocity improvements that GitHub has been advertising were true.&lt;/p&gt;

&lt;p&gt;At the time of writing GitHub claims Copilot can help you achieve &lt;a href="https://github.com/features/copilot"&gt;55% faster coding&lt;/a&gt;. We of course know that being a software engineer is not just about coding, so we were not expecting a 55% efficiency, but we were expecting some exciting pace.&lt;/p&gt;

&lt;p&gt;We gave Copilot to approximately 40-50 developers over 4 different clients. Before each team got going we gave them a feature overview and demo so that they could get up and running as fast as possible.&lt;/p&gt;

&lt;p&gt;We then had biweekly check-ins and retrospectives to find out how developers felt that their work had been impacted by using AI-based tooling.&lt;/p&gt;

&lt;h2&gt;
  
  
  So what did we learn?
&lt;/h2&gt;

&lt;p&gt;Here is some of the feedback the engineers gave us. Here is a picture of what the engineers told us by category.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test Code
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Creating new unit tests quite quickly&lt;/li&gt;
&lt;li&gt;The few times I asked it to write some test code it gave me something that did cover the test but was very poor and difficult to understand&lt;/li&gt;
&lt;li&gt;Was good at ‘generating’ unit tests that were similar to other tests in the file (eg. an undefined case test)&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Productivity
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;It was Useful for quickly understanding blocks of code&lt;/li&gt;
&lt;li&gt;Useful in suggesting code snippets that speed up productivity&lt;/li&gt;
&lt;li&gt;It did not help much whilst working on bug tickets&lt;/li&gt;
&lt;li&gt;Extra time was needed to determine if the suggestion is helpful&lt;/li&gt;
&lt;li&gt;Useful for quickly changing simple patterns&lt;/li&gt;
&lt;li&gt;Suggestions were often poor and stopped me from using IDE suggestions &lt;/li&gt;
&lt;li&gt;Seemed to be a handy paste without having to find the thing to copy.&lt;/li&gt;
&lt;li&gt;Existing IDE tools provide alternative useful functionality (not always compatible&lt;/li&gt;
&lt;li&gt;Would occasionally be able to produce a function after writing a description for it, but would then have to analyse the function in detail to ensure it was what I expected&lt;/li&gt;
&lt;li&gt;I cannot go back to life without Copilot, the accuracy when it comes to refactoring code has helped tremendously&lt;/li&gt;
&lt;li&gt;I find it really useful for repetitive tasks which allows more time on the complex stuff&lt;/li&gt;
&lt;li&gt;The main benefit I’ve had is when it autocompletes simple code that takes little brain power but sinks time to write. 13. Sometimes it’s quicker to write what I want code to do in plain English than write the code itself, and then with the text prompt Copilot takes care of the rest.&lt;/li&gt;
&lt;li&gt;It’s a huge relief on cognitive load&lt;/li&gt;
&lt;li&gt;It's good for repetitive tasks when it works. I've found it's sometimes quite slow for me and sometimes doesn't give suggestions when you expect it to.&lt;/li&gt;
&lt;li&gt;I have found it super useful for updating pipeline files as well - if I add a bunch of vars, when i go to call those vars in the pipeline it remembers them and suggests them nicely&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Quality
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;No effect on quality because the only suggestions I accepted were patterns I was already using&lt;/li&gt;
&lt;li&gt;Code generated was of similar quality to existing code…&lt;/li&gt;
&lt;li&gt;Handy to test on different approaches/patterns&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Features and Integration
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Chat is more useful than code complete&lt;/li&gt;
&lt;li&gt;Chat was unable to help me with a specific issue&lt;/li&gt;
&lt;li&gt;The chat not being available for JetBrains meant I couldn’t use it to all of its abilities&lt;/li&gt;
&lt;li&gt;Useful feature: &lt;code&gt;explain this&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;I disabled it in WebStorm but try it occasionally in VSCode.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;From one snapshot we took, there was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;14 Positive sentiments&lt;/li&gt;
&lt;li&gt;8 Negative sentiments&lt;/li&gt;
&lt;li&gt;6 Neutral sentiments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Overall the sentiment was positive....&lt;/p&gt;

&lt;p&gt;Users felt that chat features, &lt;code&gt;explain&lt;/code&gt;, etc were of high benefit.&lt;br&gt;
However, users of JetBrains/IntelliJ IDEs had a worse experience due to lack of chat feature available at the time and native auto-complete being missed. &lt;/p&gt;

&lt;p&gt;GenAI tools were particularly useful for writing unit tests, however, were not as useful for bugs, migration of code, newer coding standards (eg. Vue 3), or emulating current repo coding styles. Code quality was unaffected but required verification and sometimes fixing to ensure it aligns with current standards and practices.&lt;/p&gt;

&lt;h3&gt;
  
  
  Closing thoughts
&lt;/h3&gt;

&lt;p&gt;I must admit I was a little disappointed that this was not quite the HUGE success that I was anticipating, however, engineers did feedback that they missed the tool when they no longer had access to it.&lt;/p&gt;

&lt;p&gt;The biggest gaps seemed to be a lack of understanding of the business context, project coding styles, and also an understanding of particular versions of language and frameworks.&lt;/p&gt;

&lt;p&gt;Saying this, GenAI dev tools are constantly improving. Today I learned Amazon Q developer is now available as a general release. I am also keen to use GitHub Copilot Enterprise which also promises to address some of these concerns.&lt;/p&gt;

&lt;p&gt;We also realised that it is not merely having a tool that speeds up AI-driven delivery, but changing and improving workflows whilst using GenAI tooling is also imperative.&lt;/p&gt;

&lt;p&gt;We are working on this right now which we will share with you more soon!&lt;/p&gt;

&lt;h3&gt;
  
  
  Going forward
&lt;/h3&gt;

&lt;p&gt;At BJSS we are confident that these tools are here to stay and are likely to radically change how we create software. We will continue to make assessments of new tools as they come out and will publish some of our findings. We are really excited about the productivity gains our teams will see in future!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>githubcopilot</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
