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