
Designing Idempotent APIs in ASP.NET Core
Network failures and retries are inevitable in distributed systems. Without idempotency, duplicate requests create double charges and data corruption. This guide shows how to implement idempotent APIs in ASP.NET Core using action filters, Redis, and idempotency keys to handle retries safely.

Delete-Driven Design: How to Write Code You Can Remove
Most design principles focus on extensibility and reuse. Delete-Driven Design flips the question: how easy is it to remove code safely? This post explains why delete-ability is the ultimate test of boundaries, abstractions, and tests—and how to design systems that accept change without fear.

Why Most Service Layers Make Code Worse
Service layers were meant to coordinate use cases, but in many systems they become dumping grounds for business logic. This post explains why that happens, how it leads to anemic domain models and brittle tests, and what to do instead.

What Senior Developers Should Care About in 2026
Frameworks change, but the hardest problems in production software don’t. This post explores what senior developers should actually care about in 2026 - judgment, boundaries, domain modeling, performance, testing, and communication - long after the hype fades.

The Engineering Trade-offs I Got Wrong
Most engineering mistakes don’t come from ignorance—they come from good intentions applied too early. This post reflects on real-world trade-offs around abstractions, service layers, Clean Architecture, testing, and what I’d do differently today.

C# 14 Extension Members: Cleaner Code
The era of the ‘Helper Class’ is over. C# 14 introduces Extension Members, allowing you to add properties, operators, and static methods to external types. Here is how to modernize your codebase.

Avoid Anemic Domain Models
Stop writing C# classes that are just data bags. An anemic domain model scatters your business logic, leading to bugs and maintenance nightmares. Here’s how to fix it.
The Real Difference Between Domain and Application Layer in Clean Architecture
I’ve lost count of how many times I’ve seen developers struggle with this question: “Should this logic go in the Domain layer or the Application layer?” Clean Architecture diagrams make it look simple, but when you’re staring at your actual codebase, the lines blur fast. You know the situation. You’ve got a business rule to implement. You open your project, see both folders, and pause. Put it in the wrong place, and six months later you’re wrestling with a mess of tangled dependencies and logic that’s impossible to test. ...

Stop Asking Your Objects Questions. Just Tell Them What to Do
The ‘Tell, Don’t Ask’ principle helps reduce behavioral dependencies in C# applications by keeping decision-making logic inside the objects that own the data. This leads to cleaner, more maintainable code with better encapsulation and reduced coupling.
Integration Testing ASP.NET Core APIs The Right Way with WebApplicationFactory
A comprehensive guide to integration testing ASP.NET Core APIs with WebApplicationFactory. Learn to replace real databases, mock services, test authenticated endpoints, and build production-ready test suites.