The blog

Latest deep dives

Deep dives on .NET, system design, architecture and databases. 16 practical articles.

AI5 min

AI writes the code. You still need to be the engineer.

What is left of your job when AI writes half the code, and how to keep getting better at it.

CROSS-PLATFORM8 min

.NET MAUI vs Flutter vs React Native: An honest comparison

No winners: how MAUI, Flutter and React Native render UI, what is known about their performance, and how to pick the one that fits your team.

.NET8 min

3 ways to create middleware in .NET: inline, convention-based, and IMiddleware

Inline delegates, convention-based classes, and IMiddleware: how each one works, the scoped-service pitfall, and when to use which.

.NET14 min

Resource expansion in ASP.NET Core: the expand query parameter

One request instead of many: how to build an ?expand= parameter in ASP.NET Core, and whether it's faster.

DATABASES10 min

JSONB in PostgreSQL: querying, indexing, and EF Core mapping

How PostgreSQL stores jsonb, what it costs, how EF Core 10 maps to it, and which index actually helps: GIN, jsonb_path_ops, or an expression index.

ARCHITECTURE6 min

Vertical slice architecture: shallow vs deep folder organization

There is no universal folder structure for vertical slice architecture. Start shallow, add depth when a slice earns it, and organize around use cases.

.NET7 min

Inside dotnet/extensions: resilience, telemetry, and AI for .NET services

A tour of dotnet/extensions' nine libraries: resilience pipelines, IChatClient, LogProperties, redaction, contextual options, and testing fakes.

.NET10 min

Configuration in .NET: Options pattern, validation, reloading, and secrets

How the options pattern builds on IConfiguration: DI registration, three lifetimes, validation, and secrets

.NET6 min

Configuration in .NET: sources, providers & precedence

How .NET layers appsettings.json, environment variables, command-line args, and custom sources into one IConfiguration, then binds it to typed options.

.NET6 min

.NET 10 and C# 14: The features I'd actually use in production

The C# 14 and .NET 10 features that earn their place in production: field, null-conditional assignment, extension members, Minimal API validation, and SSE.

.NET6 min

ProblemDetails in .NET: A practical guide to standardized API errors

Return consistent API errors in .NET with ProblemDetails: the RFC 9457 fields, Results.Problem, ValidationProblemDetails, and IExceptionHandler.

.NET7 min

Filters in .NET: Complete guide to authorization, resource, action, exception, and result filters

How .NET filters intercept requests and responses to handle authorization, validation, error handling, and logging without bloating your controllers.

DATABASES8 min

Dapper Plus or SqlBulkCopy? Pros, cons, and hidden limitations for high-performance .NET data ingestion

Raw TDS streaming vs orchestrated MERGE: an architectural and performance comparison, plus the limitations that are easy to miss.

DATABASES7 min

Where vs. WhereBulkContains: What's the real difference in EF Core?

Compare EF Core's version-dependent Contains translations with a temporary-table JOIN strategy, including tradeoffs for large and composite key sets.

.NET7 min

Introduction to Entity Framework Extensions library

SaveChanges() generates one SQL statement per entity, a bottleneck at scale. EF Extensions adds true bulk operations to your existing DbContext.

.NET6 min

Why every .NET developer should know about Dapper Plus

Dapper is famous for fast reads, but bulk writes are its weak spot. Dapper Plus fills that gap with one-line bulk insert, update, delete, merge and synchronize.