<?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: Jasseem Allybokus</title>
    <description>The latest articles on DEV Community by Jasseem Allybokus (@jasseem).</description>
    <link>https://dev.to/jasseem</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%2F2751180%2Fa407c10f-c8e4-4a55-b13b-35b265b77d3c.png</url>
      <title>DEV Community: Jasseem Allybokus</title>
      <link>https://dev.to/jasseem</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jasseem"/>
    <language>en</language>
    <item>
      <title>Simplifying Event Sourcing in Golang</title>
      <dc:creator>Jasseem Allybokus</dc:creator>
      <pubDate>Fri, 24 Jan 2025 09:47:03 +0000</pubDate>
      <link>https://dev.to/jasseem/simplifying-event-sourcing-in-golang-5944</link>
      <guid>https://dev.to/jasseem/simplifying-event-sourcing-in-golang-5944</guid>
      <description>&lt;p&gt;Event sourcing and CQRS (Command Query Responsibility Segregation) are powerful architectural patterns for building scalable and maintainable systems. However, implementing them can be complex, especially when you’re striving to follow best practices like Domain-Driven Design (DDD). That’s where &lt;a href="https://github.com/thefabric-io/eventsourcing" rel="noopener noreferrer"&gt;thefabric-io/eventsourcing&lt;/a&gt; comes in.&lt;/p&gt;

&lt;p&gt;In this post, I’ll walk you through how this open-source library simplifies event sourcing in Go, its core features, and how you can get started.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Event Sourcing?
&lt;/h2&gt;

&lt;p&gt;Event sourcing is more than just a storage pattern. Instead of persisting the current state of an object, it captures all state changes as a sequence of events. This approach provides several advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scalability:&lt;/strong&gt; Events are immutable, making them easier to scale.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auditability:&lt;/strong&gt; The full history of changes is stored.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexibility:&lt;/strong&gt; Replay events to reconstruct the state or debug issues.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Combined with CQRS, you can separate the responsibility of writing (commands) and reading (queries), leading to clean and focused code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing &lt;a href="https://github.com/thefabric-io/eventsourcing" rel="noopener noreferrer"&gt;thefabric-io/eventsourcing&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;This library is designed to make event sourcing easier to implement in Go while staying true to DDD principles. It provides the building blocks for defining aggregates, managing events, and maintaining projections.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Aggregate Management:&lt;/strong&gt; Simplifies handling aggregate lifecycles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event Storage:&lt;/strong&gt; Built-in logic for persisting and replaying events.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CQRS Integration:&lt;/strong&gt; Supports separating reads and writes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extensibility:&lt;/strong&gt; Adaptable to various domains and storage backends.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;To see the library in action, you can explore the example repository:&lt;br&gt;
&lt;a href="https://github.com/thefabric-io/eventsourcing.example" rel="noopener noreferrer"&gt;thefabric-io/eventsourcing.example&lt;/a&gt;. It includes a detailed implementation showcasing the library's capabilities.&lt;/p&gt;
&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;First, install the library using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go get github.com/thefabric-io/eventsourcing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Example Overview
&lt;/h3&gt;

&lt;p&gt;The example repository provides a comprehensive guide to using the library. You’ll find a setup for managing aggregates, emitting events, and processing them. It demonstrates practices for structuring your project, handling events, and building projections.&lt;/p&gt;

&lt;p&gt;You can clone and run the example with the following commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/thefabric-io/eventsourcing.example.git
&lt;span class="nb"&gt;cd &lt;/span&gt;eventsourcing.example
go run main.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This example illustrates how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Define aggregates and their behaviors.&lt;/li&gt;
&lt;li&gt;Persist and replay events.&lt;/li&gt;
&lt;li&gt;Query projections for read-side operations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Refer to the &lt;a href="https://github.com/thefabric-io/eventsourcing.example" rel="noopener noreferrer"&gt;thefabric-io/eventsourcing.example&lt;/a&gt; repository for detailed explanations and context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Use Cases
&lt;/h2&gt;

&lt;p&gt;Imagine a CRM system where users can create and update customer inquiries. Each change is captured as an event, allowing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reconstruction of the inquiry's history for debugging.&lt;/li&gt;
&lt;li&gt;Seamless integration of projections for analytics dashboards.&lt;/li&gt;
&lt;li&gt;Event-driven triggers for sending notifications.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With &lt;a href="https://github.com/thefabric-io/eventsourcing" rel="noopener noreferrer"&gt;thefabric-io/eventsourcing&lt;/a&gt;, these workflows become intuitive and maintainable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get Involved
&lt;/h2&gt;

&lt;p&gt;Check out the GitHub repositories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Library:&lt;/strong&gt; &lt;a href="https://github.com/thefabric-io/eventsourcing" rel="noopener noreferrer"&gt;thefabric-io/eventsourcing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example:&lt;/strong&gt; &lt;a href="https://github.com/thefabric-io/eventsourcing.example" rel="noopener noreferrer"&gt;thefabric-io/eventsourcing.example&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feel free to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Star&lt;/strong&gt; the repos if you find them useful.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Report issues&lt;/strong&gt; or request features.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contribute&lt;/strong&gt; by submitting pull requests.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Event sourcing doesn’t have to be complicated. With &lt;a href="https://github.com/thefabric-io/eventsourcing" rel="noopener noreferrer"&gt;thefabric-io/eventsourcing&lt;/a&gt;, you can focus on building robust, scalable applications without getting bogged down in boilerplate.&lt;/p&gt;

&lt;p&gt;I hope this library helps you on your journey to mastering event sourcing in Go. If you have any questions or feedback, feel free to reach out or open an issue on GitHub. Let’s build better software together!&lt;/p&gt;

</description>
      <category>go</category>
      <category>eventsourcing</category>
      <category>pattern</category>
      <category>postgres</category>
    </item>
    <item>
      <title>AI is the New Order</title>
      <dc:creator>Jasseem Allybokus</dc:creator>
      <pubDate>Thu, 23 Jan 2025 05:18:31 +0000</pubDate>
      <link>https://dev.to/jasseem/ai-is-the-new-order-2imj</link>
      <guid>https://dev.to/jasseem/ai-is-the-new-order-2imj</guid>
      <description>&lt;p&gt;&lt;a href="https://www.thefabric.io/blog/ai-is-the-new-order" rel="noopener noreferrer"&gt;Original post&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;AI has transformed system design by bringing order to chaos, enabling us to shift from rigid structures to dynamic, human-like understanding.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For decades, developers have built software systems rooted in a paradigm of structure. Data was clean, predictable, and organized into tables, schemas, and hierarchies that machines could easily interpret. This was not a matter of preference but a necessity—machines were only capable of processing data that adhered to rigid formats. Any nuance, ambiguity, or semantic richness that humans took for granted had to be stripped away and translated into strict logic, rows, and columns. The result? A world of applications that thrived on order but were blind to the messiness of reality.&lt;/p&gt;

&lt;p&gt;Then came Large Language Models (LLMs), and with them, a seismic shift in how we think about data, systems, and intelligence. AI didn’t just change the tools we use; it redefined the rules of the game. Welcome to the new paradigm: &lt;strong&gt;AI is the new order.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Old Paradigm: Structure Above All
&lt;/h3&gt;

&lt;p&gt;In the pre-AI era, application development revolved around structured data. Databases were the cornerstone of every system, meticulously designed to capture information in fixed formats. Whether you were building an e-commerce site, a social network, or a logistics platform, success hinged on predictability and precision. Data flowed neatly through pipelines, and any ambiguity was resolved before it reached the machine.&lt;/p&gt;

&lt;p&gt;But this approach had limitations. Real-world data is inherently messy. Language, images, and human interactions are full of nuance, context, and variability. The structured paradigm forced developers to ignore or oversimplify this complexity. Machines could not understand context or semantics, so developers had to design around this gap, creating systems that were powerful but ultimately brittle in the face of real-world ambiguity.&lt;/p&gt;

&lt;p&gt;This rigidity extended beyond just databases. It shaped the very way we thought about building applications. Developers spent enormous effort defining schemas, designing data validation pipelines, and writing strict rules to ensure consistency. While this was effective for certain types of problems, it left little room for innovation in domains where the human experience, language, and perception mattered most. The gap between machine logic and human understanding was vast and unbridgeable with the tools of the time.&lt;/p&gt;

&lt;h3&gt;
  
  
  The New Paradigm: Semantic Understanding
&lt;/h3&gt;

&lt;p&gt;The rise of LLMs, like OpenAI’s GPT models, marked the end of this constraint. For the first time, machines could understand and generate human-like language, unlocking the ability to process unstructured, chaotic, and context-rich data. These models don’t require every piece of data to be pre-labeled or categorized. Instead, they thrive on ambiguity, extracting meaning and insights from even the most disorganized inputs.&lt;/p&gt;

&lt;p&gt;This capability has profound implications:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;From Data Rules to Data Chaos&lt;/strong&gt;: In the past, systems failed when data broke the rules. Today, AI finds patterns and meaning in chaotic, unstructured environments, allowing developers to work with data as it exists, not as it’s forced to be.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;From Query to Conversation&lt;/strong&gt;: Traditional systems relied on rigid queries and predefined inputs. With AI, interactions become dynamic and conversational, bridging the gap between machine logic and human communication.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;From Builders to Orchestrators&lt;/strong&gt;: Developers are no longer constrained to rigid workflows. Instead, they orchestrate systems that let AI navigate complexity, interpreting inputs and outputs in ways that mimic human understanding.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This transition has also redefined the relationship between developers and the systems they create. Instead of micromanaging every rule and edge case, developers can now focus on higher-order design principles—crafting systems that leverage AI’s ability to handle complexity, adapt to new contexts, and continuously learn from data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implications for System Design
&lt;/h3&gt;

&lt;p&gt;With this new paradigm, the very act of conceiving systems must evolve. Here’s how:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. &lt;strong&gt;Data as a Living Entity&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;In the AI-driven world, data is no longer static or pre-processed. It is dynamic, context-rich, and continuously changing. Systems must be designed to embrace this fluidity, allowing AI to interpret meaning on the fly. This means abandoning the idea of data as a finite resource and instead treating it as a living, breathing component of the system.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. &lt;strong&gt;Emergence Over Rules&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;The old paradigm relied on deterministic logic: If X, then Y. The new order embraces emergent behavior, where AI discovers connections and solutions that are not explicitly programmed. Developers must learn to design for exploration, not just execution. This approach encourages innovation and adaptability, allowing systems to evolve in ways that were previously impossible.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. &lt;strong&gt;Human-Inspired Interfaces&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;The semantic power of AI allows systems to interact in human-like ways. Applications can now understand intent, adapt to context, and provide insights with nuance. This shifts the focus from building rigid UI flows to creating adaptive, intelligent experiences. By designing systems that prioritize understanding and empathy, developers can create tools that resonate more deeply with users.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. &lt;strong&gt;Integration of Multimodal Data&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;AI’s ability to process diverse forms of data—text, images, audio, and video—opens up entirely new possibilities for system design. Developers must think beyond single-modality systems and consider how different types of data can work together to provide richer, more meaningful insights.&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenges in the New Order
&lt;/h3&gt;

&lt;p&gt;While this shift is transformative, it is not without its challenges:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Trust in AI Decisions&lt;/strong&gt;: With emergent behavior comes unpredictability. Developers and users must trust systems that don’t always explain their logic in traditional terms. Building this trust requires transparency and robust evaluation mechanisms to ensure AI behaves reliably and ethically.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ethics and Bias&lt;/strong&gt;: The chaotic nature of unstructured data means that biases within the data can be amplified. Ensuring fairness and transparency becomes a critical part of system design. Developers must proactively address these issues by designing systems that prioritize inclusivity and mitigate bias.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Developer Mindset Shift&lt;/strong&gt;: Embracing the new order requires a fundamental change in how developers think about problems. The focus moves from defining every rule to designing frameworks where AI can discover the rules on its own. This shift can be challenging but is essential for leveraging AI’s full potential.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scalability and Resource Management&lt;/strong&gt;: AI systems often require significant computational resources. Designing systems that balance performance, cost, and scalability will be a key challenge as AI becomes more integral to application development.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The New Order in Action
&lt;/h3&gt;

&lt;p&gt;The impact of this shift is already visible across industries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Customer Support&lt;/strong&gt;: Chatbots powered by LLMs can understand and resolve issues using natural language, replacing scripted flows with dynamic conversations. These systems not only enhance efficiency but also provide more personalized and empathetic interactions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Content Creation&lt;/strong&gt;: Tools like Jasper and DALL-E allow creators to work with AI as a collaborative partner, generating ideas and assets from vague prompts. This democratizes creativity, enabling people with limited technical skills to produce high-quality content.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Healthcare&lt;/strong&gt;: AI systems analyze unstructured patient data, from doctor’s notes to imaging, identifying patterns and insights that structured systems would miss. This has the potential to revolutionize diagnostics and personalized medicine.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Education&lt;/strong&gt;: AI-driven platforms personalize learning experiences, adapting to individual students’ needs and pacing. This approach ensures that education is more inclusive and effective, catering to diverse learning styles and capabilities.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Embracing the New Order
&lt;/h3&gt;

&lt;p&gt;The transition to AI as the new order is not just a technological change; it’s a philosophical one. It challenges us to rethink how we build, interact with, and trust systems. It demands flexibility, creativity, and a willingness to let go of old certainties. But for those who embrace it, the rewards are immense: systems that are not only more powerful but also more human.&lt;/p&gt;

&lt;p&gt;This is a moment of transformation. As developers, innovators, and users, we stand at the threshold of a new era. The systems we build today will shape the future—a future where chaos is not the enemy of progress but its greatest ally. And AI, the architect of this new order, will guide us in turning complexity into opportunity and ambiguity into understanding.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
