Achieving Exactly-Once Processing in Distributed SystemsTo achieve exactly-once processing in a distributed system, we must address two fundamental challenges.Dec 3, 2024Dec 3, 2024
Convenient Testing Proxies with EventsThe proxy pattern is a powerful design technique. Especially, when you develop a well-defined interface, you can implement various…Aug 30, 2024Aug 30, 2024
Data vs. ConfigWhen pondering over what renders data construed as config, I found myself considering the interplay between data planes and their control…Jun 24, 2024Jun 24, 2024
Layering Implementations Around Well-Defined InterfacesRecently, while reviewing an implementation in a repository, I noticed that caching and buffering were directly integrated into the…Jun 6, 2024Jun 6, 2024
The Cost of AbstractionWe all often fall into the trap of being lured by shiny new technologies. Before adopting a so-called successor technology, we must…May 25, 2024May 25, 2024
Scenario Based TestingLet’s say we want to test an interface, this interface can be as simple as this:May 16, 2024May 16, 2024
When to use OOP, how does an object differ from data?To distinguish data from an object, data is to be persisted. To avoid data inconsistencies, we should persist it in normalized form. It…May 10, 2024May 10, 2024
Procedural Visitors in GoThe Visitor pattern allows you to separate data from behavior, modularly adding new functionality to existing data structures without…Apr 18, 2024Apr 18, 2024
How to model sum types in Go?Although Go doesn’t have built-in support for sum types, we can simulate them to some extent using interfaces and type assertions. Here’s…Apr 18, 2024Apr 18, 2024
Achieving Effective Abstraction and Layering: Why Core and Application Layers are InseparableTo achieve a well-designed abstraction, it should not expose any underlying details. An abstraction has the power to unite multiple…Apr 9, 2024Apr 9, 2024
Understanding K-Sortable Keys and Database LocalityK-sortable keys, derived from the concept of sortability, play a crucial role in optimizing database performance. In databases, data is…Mar 29, 2024Mar 29, 2024
Applying the Robustness Principle to Value Objects in GoValue objects help avoid primitive obsession and make code more expressive and maintainable. While working with value objects in Go, I…Mar 21, 2024Mar 21, 2024
Encapsulating Dependencies within Adapters: A Pragmatic Approach for Boundary IntegrationsWhen designing software systems, we often strive for loose coupling and the separation of concerns. Dependency injection (DI) is a popular…Mar 19, 2024Mar 19, 2024
Unraveling Go’s Hidden Complexities: Navigating Type Definitions, Simulated ADTs, and the Mutable…In the realm of programming languages, Go stands out for its simplicity and efficiency, especially when dealing with concurrency and…Mar 16, 2024Mar 16, 2024
Let the Data Structure Do the Heavy LiftingUnveiling the Foundation: Introduction to Data StructuresNov 25, 2023Nov 25, 2023
Embracing Proactivity in Code: The Symbiosis of EAFP and “Tell, Don’t Ask”The adage “It’s easier to ask forgiveness than permission” encapsulates a programming philosophy that stands in stark contrast to the…Nov 3, 2023Nov 3, 2023
IoC Unveiled: Why Inversion of Control Isn’t Just Dependency Injection or Dependency InversionInversion of Control (IoC) is a powerful concept in software design that transcends traditional notions of dependency injection and…Oct 25, 2023Oct 25, 2023
How to Persist Objects Without Jeopardizing Encapsulation?In OOP, encapsulation is paramount. We should strive to hide and not leak the data encapsulated by objects highlighting behavior. If we had…Oct 6, 2023Oct 6, 2023