A minimal diagram showing features grouped by vertical slices, with entire folders being removed cleanly to illustrate delete-ability and localized change.

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.

January 12, 2026 · 8 min
A minimal architectural diagram showing controllers, services, and domain entities, with business logic drifting upward into services and increasing complexity.

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.

January 5, 2026 · 11 min
A minimal diagram showing tools and frameworks fading into the background while judgment, domain understanding, and maintainability remain central.

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.

December 31, 2025 · 9 min
A minimal architectural diagram showing layers becoming more complex over time, with arrows highlighting trade-offs between abstraction, simplicity, and maintainability.

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.

December 25, 2025 · 9 min
Illustration showing hands controlling a marionette, labeled "ANEMIC MODEL: CONTROLLED BY SERVICES".

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.

December 3, 2025 · 7 min
Illustration of developers collaborating during a code review to share knowledge and improve quality

Code Reviews That Grow Developers

TL;DR Code reviews should teach, not just catch bugs. Stop nitpicking syntax and start building autonomous developers. Focus on architectural patterns, ask guiding questions instead of giving orders, and eliminate multi-team approval bottlenecks that delay delivery. Good reviews create learning opportunities that scale your team’s expertise. Code reviews shouldn’t be about catching syntax errors or enforcing personal preferences. They’re your best tool for spreading architectural knowledge and building stronger development teams. But most teams get this wrong, creating bureaucratic bottlenecks instead of learning opportunities. ...

September 16, 2025 · Last modified: November 12, 2025 · 8 min

From Code Contributor to System Thinker: The Senior Developer’s Shift

A senior developer’s perspective on writing less code, focusing on architecture, mentorship, and team productivity.

August 30, 2025 · 7 min

Why Middleware Beats DI for SaaS Extension Points

In multi-tenant SaaS applications, custom middleware gives you the earliest hook in the request pipeline, even before dependency injection kicks in. Middleware runs at the very beginning of your pipeline, providing access to raw request data before any transformations occur.

August 24, 2025 · Last modified: August 28, 2025 · 9 min

Why Async Can Be Slower in Real Projects?

Async/await is powerful but overused. This guide breaks down async misconceptions, shows real enterprise use cases, and gives you a practical decision framework for async in C#.

August 1, 2025 · Last modified: August 11, 2025 · 14 min
×