
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.

Building Maintainable EF Core Repositories Without Generic Hell
Most EF Core projects start with a generic repository that soon turns into a mess of type parameters and leaky abstractions. In this post, learn how to design maintainable, aggregate-specific repositories that are clean, testable, and production-ready.