Helping .NET developers build software that lasts.

Practical insights on software architecture, engineering judgment, AI, and modern .NET development.

Build Production APIs in .NET (Beginner → Advanced)

A practical guide to building maintainable ASP.NET Core Web APIs, from project setup to architecture, testing, and production concerns.

Explore focused articles covering the essential building blocks of a Web API.

AI & Modern Software Engineering

Exploring how AI is changing software development, engineering practices, and developer productivity.

Clean Architecture in Real Systems

Practical approaches in C# to designing maintainable systems and writing software that can evolve over time.

  • Unit Testing and Test Driven Development in C#: The Real Use Case

    Writing code without unit tests can be risky because you might not realize issues until it’s too late. Unit testing helps to ensure that your code actually does what it’s supposed to do. And it also provides reassurance that you won’t break existing functionality when adding new features or fixing something in the future. →

  • Database Migrations in .NET: System Design & Tools

    Keeping the database state in sync with the code evolution is a natural process in software development and should be straightforward most of the time. But, during my career, I have encountered that some teams are having real struggles putting this into the right workflow without creating additional overhead. Except for doing manual migrations by executing SQL scripts directly on the database every time before deploying a new version of code, there are also tools that provide automated way of syncing code with the database. →

  • Who Is Responsible for AI-Generated Code? The Vibe Coding Ownership Problem

    What happens when a bug appears in the code which was written, reviewed and shipped by AI? Who is taking the responsibility in such a case? Is it the developer who wrote the prompts? Or the one who approved the pull request? Or the team in general? Why these questions are necessary to be answered at all or we already know the answers? →