<?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: Ahmed Abdelgawad</title>
    <description>The latest articles on DEV Community by Ahmed Abdelgawad (@ahmed_abdelgawad).</description>
    <link>https://dev.to/ahmed_abdelgawad</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4006495%2Fabc973e3-f1a7-4be8-beb5-86364442d213.jpg</url>
      <title>DEV Community: Ahmed Abdelgawad</title>
      <link>https://dev.to/ahmed_abdelgawad</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ahmed_abdelgawad"/>
    <language>en</language>
    <item>
      <title>Complexity Should Be Earned</title>
      <dc:creator>Ahmed Abdelgawad</dc:creator>
      <pubDate>Thu, 02 Jul 2026 06:00:00 +0000</pubDate>
      <link>https://dev.to/ahmed_abdelgawad/complexity-should-be-earned-nnf</link>
      <guid>https://dev.to/ahmed_abdelgawad/complexity-should-be-earned-nnf</guid>
      <description>&lt;p&gt;Every engineer eventually reaches a point where they stop asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How do I implement this?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and start asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What's the right architecture?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's a sign of growth.&lt;/p&gt;

&lt;p&gt;It's usually when you discover concepts like Domain-Driven Design, CQRS, Event Sourcing, Hexagonal Architecture, and countless other patterns that promise cleaner, more maintainable systems.&lt;/p&gt;

&lt;p&gt;The mistake isn't learning those patterns.&lt;/p&gt;

&lt;p&gt;The mistake is looking for reasons to use them.&lt;/p&gt;

&lt;p&gt;Over the years, I've noticed something interesting: the more experienced engineers become, the more comfortable they are introducing complexity. Sometimes that's exactly what a system needs. But sometimes we're solving tomorrow's problems while today's business is still asking for a simple application.&lt;/p&gt;

&lt;p&gt;One of the most valuable engineering skills isn't knowing every architecture pattern.&lt;/p&gt;

&lt;p&gt;It's knowing &lt;strong&gt;when not to use one.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Every decision has a price
&lt;/h2&gt;

&lt;p&gt;Architecture discussions often focus on what patterns enable.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CQRS separates reads from writes.&lt;/li&gt;
&lt;li&gt;Event Sourcing preserves the history of every change.&lt;/li&gt;
&lt;li&gt;Microservices allow teams to deploy independently.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are all legitimate advantages.&lt;/p&gt;

&lt;p&gt;But every architectural decision also introduces long-term costs.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More concepts for new engineers to understand.&lt;/li&gt;
&lt;li&gt;More code paths to debug.&lt;/li&gt;
&lt;li&gt;More operational overhead.&lt;/li&gt;
&lt;li&gt;More infrastructure to maintain.&lt;/li&gt;
&lt;li&gt;More failure modes to think about.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those costs are worth paying &lt;strong&gt;only when they're solving a real problem.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the business isn't getting enough value in return, you've probably introduced complexity too early.&lt;/p&gt;

&lt;h2&gt;
  
  
  CRUD isn't something to "graduate" from
&lt;/h2&gt;

&lt;p&gt;CRUD isn't an architecture.&lt;/p&gt;

&lt;p&gt;It isn't a design pattern either.&lt;/p&gt;

&lt;p&gt;It's simply a way of describing applications whose primary behavior revolves around creating, reading, updating, and deleting data.&lt;/p&gt;

&lt;p&gt;Yet I often see teams treating CRUD as something temporary—as if every successful system eventually needs CQRS, Event Sourcing, or a fleet of microservices.&lt;/p&gt;

&lt;p&gt;I don't think that's the right mindset.&lt;/p&gt;

&lt;p&gt;A well-designed CRUD application can have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;clear boundaries&lt;/li&gt;
&lt;li&gt;rich domain logic&lt;/li&gt;
&lt;li&gt;comprehensive tests&lt;/li&gt;
&lt;li&gt;clean abstractions&lt;/li&gt;
&lt;li&gt;excellent maintainability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of those qualities require advanced architectural patterns.&lt;/p&gt;

&lt;p&gt;Sometimes CRUD isn't the beginner solution.&lt;/p&gt;

&lt;p&gt;Sometimes it's simply the right solution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let the business earn the complexity
&lt;/h2&gt;

&lt;p&gt;Imagine you're building an inventory system.&lt;/p&gt;

&lt;p&gt;At the beginning, inventory is just a quantity.&lt;/p&gt;

&lt;p&gt;Receive stock.&lt;/p&gt;

&lt;p&gt;Ship stock.&lt;/p&gt;

&lt;p&gt;Update the current value.&lt;/p&gt;

&lt;p&gt;A straightforward CRUD application is probably all you need.&lt;/p&gt;

&lt;p&gt;Now fast-forward two years.&lt;/p&gt;

&lt;p&gt;The business introduces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;multiple warehouses&lt;/li&gt;
&lt;li&gt;stock reservations&lt;/li&gt;
&lt;li&gt;returns&lt;/li&gt;
&lt;li&gt;warehouse transfers&lt;/li&gt;
&lt;li&gt;third-party fulfillment&lt;/li&gt;
&lt;li&gt;inventory audits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Suddenly, inventory is no longer just a number.&lt;/p&gt;

&lt;p&gt;Different parts of the system care about different views of the same data. Historical changes become valuable. Read and write workloads start evolving independently.&lt;/p&gt;

&lt;p&gt;At that point, introducing concepts like projections or CQRS might actually make the system &lt;strong&gt;simpler&lt;/strong&gt;, not more complicated.&lt;/p&gt;

&lt;p&gt;Notice what happened.&lt;/p&gt;

&lt;p&gt;The architecture changed because the business changed.&lt;/p&gt;

&lt;p&gt;Not because someone wanted to use a particular pattern.&lt;/p&gt;

&lt;p&gt;That's exactly how I believe software should evolve.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with the problem, not the pattern
&lt;/h2&gt;

&lt;p&gt;One of the most common architecture questions I hear is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Should we use this or that pattern?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I think there's usually a better question.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What problem are we trying to solve?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sometimes the answer genuinely leads to CQRS.&lt;/p&gt;

&lt;p&gt;Sometimes it leads to Event Sourcing.&lt;/p&gt;

&lt;p&gt;Sometimes it leads to a modular monolith.&lt;/p&gt;

&lt;p&gt;And sometimes it leads to a straightforward CRUD application.&lt;/p&gt;

&lt;p&gt;The pattern isn't the goal.&lt;/p&gt;

&lt;p&gt;It's the consequence of understanding the problem.&lt;/p&gt;

&lt;p&gt;Good architecture isn't about collecting patterns.&lt;/p&gt;

&lt;p&gt;It's about making thoughtful trade-offs.&lt;/p&gt;

&lt;p&gt;The hardest architectural decision isn't choosing the most sophisticated solution.&lt;/p&gt;

&lt;p&gt;It's recognizing when the simplest one is enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good engineers learn patterns.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Great engineers learn when not to use them.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>programming</category>
      <category>backend</category>
      <category>softwareengineering</category>
    </item>
  </channel>
</rss>
