<?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: Irwansyah</title>
    <description>The latest articles on DEV Community by Irwansyah (@irwansyahwii).</description>
    <link>https://dev.to/irwansyahwii</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%2F215322%2F851254a0-9cf8-448c-9827-4de84469e3c2.jpeg</url>
      <title>DEV Community: Irwansyah</title>
      <link>https://dev.to/irwansyahwii</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/irwansyahwii"/>
    <language>en</language>
    <item>
      <title>TaroDomain: This is the way to build scalable and beautiful system</title>
      <dc:creator>Irwansyah</dc:creator>
      <pubDate>Sun, 11 Oct 2026 07:22:13 +0000</pubDate>
      <link>https://dev.to/irwansyahwii/tarodomain-this-is-the-way-to-build-scalable-and-beautiful-system-4ame</link>
      <guid>https://dev.to/irwansyahwii/tarodomain-this-is-the-way-to-build-scalable-and-beautiful-system-4ame</guid>
      <description>&lt;h2&gt;
  
  
  What Is an Aggregate?
&lt;/h2&gt;

&lt;p&gt;Hearing the word aggregate it is not very clear what that means. To really understand this concept we need to go back to history of software development.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fowler's Domain Model (PoEAA, 2002)
&lt;/h3&gt;

&lt;p&gt;In Patterns of Enterprise Application Architecture, Fowler cataloged the ways to organize domain logic — the logic that belongs to the business, not to databases or UIs:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0ymdft8so11yvgivrluj.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0ymdft8so11yvgivrluj.webp" alt="PoEAA" width="400" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pattern&lt;/th&gt;
&lt;th&gt;Shape&lt;/th&gt;
&lt;th&gt;When to use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Transaction Script&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One procedure per operation (procedural)&lt;/td&gt;
&lt;td&gt;Simple logic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Table Module&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One class wrapping a table/record set&lt;/td&gt;
&lt;td&gt;Dataset-centric stacks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Domain Model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;"An object model of the domain that incorporates both behavior and data"&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Complex, evolving logic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service Layer&lt;/td&gt;
&lt;td&gt;Thin API layer sitting above the above&lt;/td&gt;
&lt;td&gt;Application boundary&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Before the Domain Model pattern, business applications used Transaction Scripts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Transaction Script — all logic in procedural functions&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;placeOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;customerId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;customer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;customerGateway&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;customerId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;validateCustomer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;customer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;customerId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;customerId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;productGateway&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;productId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;orderLine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OrderLine&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nx"&gt;orderLine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;productId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;productId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;orderLine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;quantity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;orderLine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;unitPrice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;orderLine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lineTotal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;quantity&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;orderLine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lineTotal&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;orderGateway&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;saveLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;orderLine&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nx"&gt;orderGateway&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;inventoryGateway&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduceStock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;notificationGateway&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendConfirmation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;customer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Problems:&lt;/p&gt;

&lt;p&gt;Business logic scattered across scripts&lt;/p&gt;

&lt;p&gt;Duplication: same validation logic repeated in every script&lt;/p&gt;

&lt;p&gt;No single place to understand the business rules&lt;/p&gt;

&lt;p&gt;Hard to test — logic embedded in database access&lt;/p&gt;

&lt;p&gt;Objects are just data bags (DTOs)&lt;/p&gt;

&lt;p&gt;Fowler proposed building an object model of the domain where objects encapsulate both behavior and data. Instead of procedures manipulating data, you build an object graph where behavior lives with the data it owns. An Order has OrderLines; a Customer has Addresses; the logic for "what's my total?" lives inside Order, not in some script.&lt;/p&gt;

&lt;p&gt;Fowler acknowledged the pattern comes in two flavors: a simple domain model that mirrors the database schema (works with Active Record), and a rich domain model with real behavior (needs Data Mapper). Either way, the core idea is: an interconnected graph of domain objects — and that word "graph" is where the trouble starts.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Fowler Got Right
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Principle&lt;/th&gt;
&lt;th&gt;How&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Objects encapsulate behavior&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Order.addItem()&lt;/code&gt; not &lt;code&gt;orderService.addItem(order, product, qty)&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Objects collaborate&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Order&lt;/code&gt; references &lt;code&gt;Customer&lt;/code&gt; and &lt;code&gt;OrderLine&lt;/code&gt; directly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business rules live in the model&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Customer.canPlaceOrder()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reduces duplication&lt;/td&gt;
&lt;td&gt;Validation logic in one place&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testable&lt;/td&gt;
&lt;td&gt;Objects can be tested without database&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;What Fowler's Domain Model Got Wrong (or Left Unsolved)&lt;/p&gt;

&lt;p&gt;Continue to: &lt;a href="https://techbro.iamtaro.com/en/minibooks/the-design-and-implementation-of-tarodomain-framework/domain-layer" rel="noopener noreferrer"&gt;https://techbro.iamtaro.com/en/minibooks/the-design-and-implementation-of-tarodomain-framework/domain-layer&lt;/a&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>microservices</category>
      <category>softwaredevelopment</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>From ERD to DDD: 40 Years of Software Architecture (And Why I am Building TaroDomain)</title>
      <dc:creator>Irwansyah</dc:creator>
      <pubDate>Thu, 08 Oct 2026 07:41:38 +0000</pubDate>
      <link>https://dev.to/irwansyahwii/from-erd-to-ddd-40-years-of-software-architecture-and-why-i-am-building-tarodomain-5f44</link>
      <guid>https://dev.to/irwansyahwii/from-erd-to-ddd-40-years-of-software-architecture-and-why-i-am-building-tarodomain-5f44</guid>
      <description>&lt;p&gt;This morning Bude Ti asked me a question while I was sipping Tubruk coffee at Pak Slamet’s warkop. "Taro, you've been in IT for 20 years. Why do kids these days argue so much about React vs Angular, or Monolith vs Microservices? Isn't there one right answer?"&lt;/p&gt;

&lt;p&gt;I sipped my coffee. "Bude, those are just tools. Software architecture is like a pendulum. You swing left, right, back to the left. Searching for the perfect balance between business agility and technical scalability."&lt;/p&gt;

&lt;p&gt;Bude Ti stirred her rice. "Pendulum? That pendulum on the wall clock is just there to cover up a nail hole."&lt;/p&gt;

&lt;p&gt;Literal. Bude Ti is indeed the most literal interpreter of instructions on earth. But she's not wrong. For 40 years, the software industry has been treated like a pendulum. Swinging back and forth.&lt;/p&gt;

&lt;p&gt;Here is the unvarnished history of how we got here, the trade-offs of each era, and why I finally decided to build a new framework: TaroDomain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 80s: ERD is King, OOP is an Afterthought
&lt;/h2&gt;

&lt;p&gt;In the 80s and early 90s, designing software was viewed entirely from the database's perspective. We used DFDs (Data Flow Diagrams) to track how data moved, and ERDs (Entity-Relationship Diagrams) to design the database schema. Because databases were the most expensive and critical part of the system, the ERD became the de facto blueprint for the entire application.&lt;/p&gt;

&lt;p&gt;Then Object-Oriented Programming (OOP) arrived. IT folks back then struggled to translate these data-centric diagrams into objects. This birthed Object-Oriented Analysis and Design (OOAD). Pioneers like Grady Booch created rigorous modeling techniques, notably the Use Case Document. By 1997, they unified their methods into UML (Unified Modeling Language). We meticulously drew Class Diagrams before writing any code. Around the same time, the Gang of Four (GoF) published their book on Design Patterns.&lt;/p&gt;

&lt;p&gt;OOAD and UML gave us a rigorous, standardized way to bridge business requirements and code. Use Cases structured our requirements. Design Patterns gave us a shared vocabulary.&lt;/p&gt;

&lt;p&gt;UML quickly devolved into a heavy, jarring waterfall artifact. Developers spent months drawing Class Diagrams that became obsolete the moment code was written. And because the ERD was still the foundation, developers simply created objects that mirrored database tables. OOP devolved into "classy procedural code" where objects were just dumb data bags and UML was just a pretty picture of a database schema.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Three-Tier Era and the ORM Trap
&lt;/h2&gt;

&lt;p&gt;In the late 90s and early 2000s, web apps grew massive. The tight coupling between UI, logic, and database made our heads nge-hang. The industry adopted the Three-Tier Architecture (Presentation, Application, Data) to enforce Separation of Concerns.&lt;/p&gt;

&lt;p&gt;To help developers, Martin Fowler published Patterns of Enterprise Application Architecture (PoEAA). The crown jewel was the Domain Model pattern. Objects shouldn't be dumb data bags. Objects should encapsulate both state and behavior. A User object shouldn't just have getters and setters; it needs a lockAccount() method that enforces business rules internally.&lt;/p&gt;

&lt;p&gt;To save and load these smart objects, developers turned to ORMs (Object-Relational Mapping). Hibernate or Entity Framework promised to seamlessly translate objects into relational database rows and back.&lt;/p&gt;

&lt;p&gt;ORMs ran headfirst into the Object-Relational Impedance Mismatch. OOP is about graphs and encapsulation; databases are about flat tables. Mapping a rich, behavioral object to a table was a mbulet (convoluted) nightmare of lazy-loading issues and N+1 queries.&lt;/p&gt;

&lt;p&gt;Developers took the easy way out: they stripped the behavior from objects to make the ORM's job easier. The Anemic Domain Model (ADM) anti-pattern was born. Objects became dumb again, and business logic was shoved back into "Use Case" services. The Three-Tier Architecture became hollow, serving as little more than a pass-through for the ORM and the ERD.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Rails Revolution and the Triumph of ActiveRecord
&lt;/h2&gt;

&lt;p&gt;Just as we were drowning in ORM configurations, Ruby on Rails arrived in 2004 and conquered the web. Rails popularized the ActiveRecord pattern.&lt;/p&gt;

&lt;p&gt;ActiveRecord threw architectural purity out the window for unprecedented developer velocity. It flattened the Three-Tier Architecture and embraced the Impedance Mismatch. Instead of fighting to map objects to tables, ActiveRecord fused them: your database table is your object.&lt;/p&gt;

&lt;p&gt;Rails proved that for 80% of web apps (simple CRUD), ActiveRecord was a superpower. Features were built in days, not weeks. The pattern was copied into every major language (Laravel in PHP, JPA in Java, GORM in Go).&lt;/p&gt;

&lt;p&gt;ActiveRecord was the ultimate enabler of the Anemic Domain Model. Because the object was tied to the table, putting complex business logic inside it created "Fat Models" (It also can create Fat Controllers or God Objects). Over years of rapid iteration, these monoliths inevitably devolved into a Big Ball of Mud—a tangled, tightly coupled mess where every controller talked to every table. &lt;/p&gt;

&lt;h2&gt;
  
  
  The Microservices Illusion and the Distributed Big Ball of Mud
&lt;/h2&gt;

&lt;p&gt;As monolithic "Big Balls of Mud" became impossible to scale, the industry looked for an escape hatch. Enter Microservices. The promise was seductive: break the monolith into small, independent services.&lt;/p&gt;

&lt;p&gt;Engineers eagerly carved up their monoliths without a principled guide. They didn't use DDD; they just grouped services by technical function or arbitrarily sliced the ERD.&lt;/p&gt;

&lt;p&gt;Without Bounded Contexts, the services were still tightly coupled. They shared databases, made synchronous HTTP calls, and introduced distributed transactions. We traded a local Big Ball of Mud for a Distributed Big Ball of Mud. A single user request now required five network hops, introducing latency, cascading failures, and debugging nightmares. Uncle Bob’s SOLID principles couldn't save us. We needed a way to define true, decoupled business boundaries.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Paradigm Shift: DDD, CQRS, and Event Sourcing
&lt;/h2&gt;

&lt;p&gt;We finally realized the database is just an implementation detail, and network boundaries must align with business boundaries. Enter Domain-Driven Design (DDD). DDD emerged to rescue the rich Domain Model and provide the boundaries microservices desperately needed. It discarded the ERD-first approach, enforcing a Ubiquitous Language and Bounded Contexts.&lt;/p&gt;

&lt;p&gt;But DDD had a fundamental tension: we used the exact same data model to enforce complex business rules (writes) and render complex UI dashboards (reads). This mismatch caused the "Fat Models." Enter CQRS (Command Query Responsibility Segregation), introduced by Greg Young. A radical split:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Write Model (Commands)&lt;/strong&gt;: Handles complex DDD Aggregates, enforcing business invariants and transactions. Optimized for consistency, completely ignoring how the UI wants to see the data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read Model (Queries)&lt;/strong&gt;: Stripped of all business logic. Optimized purely for fetching data fast, using flat tables or NoSQL documents that perfectly match the UI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Alongside CQRS came Event Sourcing.&lt;/p&gt;

&lt;p&gt;DDD aligned code with business boundaries. CQRS solved the read/write tension permanently. Event Sourcing made the event the source of truth, providing 100% auditability—a lifesaver for Fintech. By focusing on events rather than state, we bypassed the ORM Impedance Mismatch entirely.&lt;/p&gt;

&lt;p&gt;The cognitive load of DDD, CQRS, and Event Sourcing is massive. You don't need CQRS for a simple admin panel; CRUD and ActiveRecord are still 10x faster to build. Event Sourcing introduces eventual consistency, complex schema versioning, and hard-to-debug projections. It is a heavy weapon that will make a team mbledos (explode) if misused.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Missing Link: Event Storming and the Rise of AI
&lt;/h2&gt;

&lt;p&gt;To bridge the gap between domain experts and developers, Alberto Brandolini created Event Storming. Instead of writing static Use Case documents or staring at ERDs, we look at domain events ("Order Placed", "Payment Verified"). Business and engineers finally speak the same language to discover Bounded Contexts in real-time.&lt;/p&gt;

&lt;p&gt;And what I've felt strongly lately: the rise of AI. Wooo, imagine this... Building DDD used to take a lot of works, writing boilerplate Aggregates and Event Sourcing until you went bald. Now? AI makes implementing domain models and DDD quick. What used to take months of thinking about the base framework, AI now helps scaffold quickly. We can focus on business logic without typing repetitive base code. DDD, which used to be heavy, is now much easier to execute.&lt;/p&gt;

&lt;h2&gt;
  
  
  TaroDomain Framework
&lt;/h2&gt;

&lt;p&gt;TaroDomain is a DDD + Event Sourcing framework designed to be polyglot and cloud-agnostic. It provides a clean domain model architecture that allows you to persist aggregates using either State-Based or Event Sourcing mechanisms, depending on the bounded context's needs.&lt;/p&gt;

&lt;p&gt;The Design Principles of TaroDomain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Persistence Agnostic&lt;/strong&gt;: Define your Aggregates and Domain Events once. You can change which storage to use easily via interfaces.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Polyglots&lt;/strong&gt;: The core architecture is designed to be implemented in any language. We are starting with TypeScript, but the design patterns allow for easy porting to Elixir, C#, or Go.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platform Agnostic&lt;/strong&gt;: The initial implementation is heavily optimized for Cloudflare services and using TypeScript because CloudFlare is the cheapest platform compare to other cloud platforms. Later on any one can implement the adapters for other cloud platforms.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the next part 2 I will wrote about the framework design and implementation.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>softwareengineering</category>
      <category>systemdesign</category>
    </item>
  </channel>
</rss>
