One of the more common reactions I hear when engineers first encounter a message broker in a service-to-service communication context is that it feels like overengineering. Why introduce Kafka or RabbitMQ when a plain HTTP call does the same job with less infrastructure? It’s a fair question on the surface, and the people asking it aren’t wrong that a broker adds operational complexity. What…
Distributed systems earn their bad reputation for debugging mostly because of how they’re designed, not because distribution is inherently opaque. When services call each other synchronously through long chains of HTTP requests, a single failure anywhere produces symptoms everywhere — and tracing the origin means reconstructing a timeline across logs scattered across a dozen services, each with…
There’s a line of thinking in software engineering that treats bugs as interruptions — things that pull you away from the “real work” of shipping features. At Nubank I found the opposite to be true. When something lands in the dead letter queue, that is the real work. The DLQ is a centralized queue shared across services where messages end up when processing fails. At any given moment it…
A year into working at Nubank — where the backend runs almost entirely on Clojure — I’ve had enough time to form a real opinion rather than a first impression. The thing that keeps standing out to me is how much less code I write to accomplish the same things I used to do in C# or Java. Not fewer features, not less correctness — fewer words. When I was watching Rich Hickey talk about how standard…
We’ve all been in the situation where the LIKE operator in SQL isn’t good enough for the needs of the task at hand. The LIKE operator lacks the ability to find strings that are similar but not quite the same. This is when the Levenshtein distance algorithm comes in handy.
Throughout my career I’ve noticed many books and courses that promise to teach you everything you need to know about a programming language or software methodology in 24 hours, 7 days, or a month. This idea always struck me as curious, even back in college, and I confirmed it was largely a fallacy once I started programming professionally.
Implementing Aspect-Oriented Programming (AOP) in .NET Core 2 was an eye-opener. I love the idea of transferring my .NET programming skills across all platforms, and here’s how I applied the techniques I’m used to on Windows directly on a Mac.