Writing on software engineering, product design, and machine learning.

Just enough abstraction

Abstractions are often associated with unnecessary complexity, but targeted domain-specific abstractions can significantly simplify code. Finding the right balance is key. This post walks through an example, demonstrating how introducing "just enough abstraction" can incrementally improve code quality and resilience without adding complexity.

Implementing the saga design pattern with Pub/Sub

In this blog post, I will explore the saga pattern as a solution to the problem of implementing distributed transactions. I will discuss the context and problems that arise when working with distributed systems and how the saga pattern can help address these challenges.

A zero-dependency Pub/Sub implementation on top of PostgreSQL

Implementing a Pub/Sub solution purely on top of PostgreSQL can provide benefits over using an off-the-shelf service, such as RabbitMQ or Cloud Pub/Sub. You don't need to introduce an extra dependency for your application and you can use transactions to ensure the atomicity of publishing the Pub/Sub messages.

Understanding Gradient Descent for Neural Networks

In this blog post, I try to explain the intuition behind gradient descent, what gradient descent is, what it is used for and how we might go around implementing it from scratch.