@AntonMartyniuk The interesting tradeoff is that many teams reach for a new database before exhausting partitioning, compression, indexing, aggregation, and storage optimizations in their existing one.
I keep seeing the same thing with beginner .NET developers. They spend months “learning”…
But never stay on one path long enough to actually build something real.
One week: Clean Architecture
Next week: microservices
Then:
• Kubernetes
• event sourcing
• AI agents
• whatever YouTube recommends next
…and after 6 months, they still haven’t deployed a real application.
That’s why I made this roadmap.
Not another: “Here are 97 technologies you should learn in 2026” PDF.
I wanted something practical.
A roadmap that answers:
1. What to build first
2. What to ignore
3. What actually matters for junior jobs
4. When to move to more advanced topics
So the roadmap walks through building progressively:
→ first API
→ databases
→ authentication
→ Docker
→ CI/CD
→ background jobs
→ scaling
→ testing
Step by step.
Not theory collecting.
Actual progression.
And honestly, the most important part is probably what I left OUT.
Because beginners lose insane amounts of time learning infrastructure and architecture patterns they simply do not need yet.
Meanwhile, someone with fewer technologies but better direction usually becomes job-ready much faster.
The roadmap has already crossed 1,200+ downloads, so I figured I should share it here again.
Download it for free: thecodeman.net/dotnet-roadmap…
Or comment: “roadmap” and I’ll send it over.
__
📌 Join the Newsletter and get "AI in .NET" Starter Kit projects for free: thecodeman.net
♻️ Repost to others.
📂 You can save this post for later, and you should do it.
➕ Follow me to learn .NET and Architecture every day.
The worst bug isn't the one that crashes. It's the one where your method returns "Success", and three systems disagree about what just happened.
Classic version: customer gets charged, the payment provider has the money, but your SaveChanges() threw right after. The order rolls back to draft. The user gets a "Payment failed, please retry" email. One click, and every subsystem now tells a different story.
The trap is that a use case *looks* like a transaction. It sits behind one method call. But the moment it touches more than one system, DB + payment + email, you're dealing with partial failure, and there's no single "handle errors properly" rule that saves you.
What actually helps is classifying every side effect first:
→ Transactional (DB inserts/updates, in-process domain events) - commit these LAST, after the external work has succeeded.
→ External but reversible (charge → refund, reserve → release) - make it idempotent (an idempotency key so a retry is a no-op) or compensate via an event.
→ External and irreversible (emails, webhooks, SMS) - get them OUT of the use case entirely. Raise a domain event, let the Outbox dispatch it after commit. If the transaction never commits, the email never escapes the DB.
The one thing you never do: swallow the failure to make the method "look successful." The symptom leaves your logs, the money stays gone, and the retry double-charges.
The mental model that fixed this for me: a use case is a unit of *intent*, not a unit of *atomicity*. Most event-driven production bugs I've debugged come down to a method that lied about whether it actually succeeded.
I break down production #dotnet patterns like this every Monday for 20,000+ engineers → thecodeman.net
How do you handle the charge-succeeds-but-commit-fails case in your services?
For years, we faked union types in C#.
Marker interfaces. Base classes. The OneOf library. Anything to model "this is either a Success or a Failure."
C# 15 finally bakes them into the language.
What changes in practice:
→ You declare the shape once - Success or Failure - and the compiler knows the full set of cases.
→ Your switch becomes exhaustive. Miss a case, and the compiler tells you, instead of a NullReferenceException at runtime.
→ No more third-party library just to express a closed set of outcomes.
This is one of those features that quietly removes a whole category of bugs. Modeling "one of N states" has always been clumsy in C#. Now it's first-class.
What do you think about it? How have you created it so far?
__
📌 Join the Newsletter and get "AI in .NET" Starter Kit projects for free: thecodeman.net
♻️ Repost to others.
📂 You can save this post for later, and you should do it.
➕ Follow me to learn .NET and Architecture every day.
@AntonMartyniuk Happy Birthday, bro! Everything I wish for myself, I wish for you too. Keep pushing harder and never stop chasing greatness. Have an amazing day! 🎉💪
800+ GitHub stars. 20,000+ developers. And the most common thing they tell me?
"I wish I had this before my last interview."
So here it is -> Pass Your .NET Interview. 250 questions with answers, code, and complexity analysis. Free.
What you get:
🔹 Arrays, Lists & Trees, 60 coding problems, each with 2–3 C# solutions and Big-O breakdown
🔹 General .NET / C# / SQL, 70 questions covering the full stack: async, SOLID, DI, EF, Blazor, CI/CD, SQL
🔹 Updated to #dotnet 10
🔹 2 bonus ebooks included
Whether you're prepping for your first job or going for a senior role, this kit gives you the structure you need most.
👇 Grab it here (no credit card, no catch):
thecodeman.net/pass-your-inte…
@AntonMartyniuk EF Core is often blamed for problems that are really query design problems. The database doesn't care whether the SQL came from EF Core or handwritten SQL if both generate the same execution plan.
@AntonMartyniuk Exactly. Exposing an MCP tool is basically exposing an API surface to an AI client. Without authorization, allow-lists, validation, and audit logs, “controlled access” quickly becomes uncontrolled execution.
After I published my article about building an MCP server in #dotnet, a lot of people asked me to record a video.
So I did.
In this one, I show how an AI agent can call real tools in a .NET app:
- run load tests
- compare API endpoints
- analyze results
- explain performance issues
The point is simple:
AI agents become much more useful when they stop guessing and start working with real data.
Watch it here: youtube.com/watch?v=RPz8f8…
A few days ago, I published an article about building an MCP server with .NET.
And the most common response I got was:
“Can you record a video version of this?”
So I did.
But I didn’t want to make another generic “AI chatbot talks to your app” demo.
I wanted to show something more practical:
How can an AI agent actually interact with a real .NET application and help us understand what is happening at runtime?
The demo is simple.
I have an ASP .NET Core API with two endpoints:
/slow-thread-sleep
/slow-task-delay
At first glance, they look almost identical.
Both wait.
Both return a response.
Both seem fine from the outside.
But under load, they behave very differently.
So I built an MCP server in #dotnet that exposes a few tools the AI agent can use:
→ run a load test
→ compare the endpoints
→ analyze the results
→ generate a performance report
And this is where MCP becomes much more interesting.
The AI is no longer just reading code and guessing.
It can call real tools, collect real runtime data, and explain the behavior based on actual measurements.
That’s the part I think many developers are missing when they look at MCP.
MCP is not only about giving AI more context.
It’s about giving AI controlled access to useful actions inside your system.
That could be:
→ performance testing
→ logs
→ metrics
→ database diagnostics
→ deployment checks
→ feature flags
→ internal workflows
Or anything else your team needs.
I recorded a short video where I explain the concept and show the full demo in action.
You can watch it here: lnkd.in/dPeXn2Ra
📌 Join the Newsletter and get "AI in .NET" Starter Kit projects for free: youtube.com/watch?v=RPz8f8…
♻️ Repost to others.
📂 You can save this post for later, and you should do it.
➕ Follow me to learn .NET and Architecture every day.
The most underrated question in API versioning is not "how do we version?".
It is "how do we know when it is safe to delete the old version?"
A lot of teams treat version removal as a calendar event.
The sunset date arrives, somebody opens a pull request to delete v1, and nobody really checks if the world is ready.
Sometimes it works.
Sometimes it takes down a key partner integration on a Friday afternoon.
The difference between those two outcomes is rarely the code.
It is the data you collected before pressing delete. A simple but effective practice is to track three things during the deprecation period.
First, what percentage of total requests still hit v1.
Second, which clients or API keys are responsible for that traffic.
Third, which specific endpoints on v1 are still being used.
With those three numbers, "should we remove v1?" stops being a debate and starts being a decision.
If 2% of traffic still uses v1 and it is all coming from one internal team, you know exactly who to talk to.
If 30% of traffic still uses v1 and it comes from twenty different consumers, you are not ready, no matter what the calendar says.
The teams that do this well usually define removal thresholds upfront. Something like: "we remove a major version only when its traffic stays under 5% for 30 consecutive days, and no top-10 consumer is still on it."
That kind of rule removes emotion and politics from the conversation. It also gives consumer teams a clear target. They know exactly what "done" looks like.
There is one more benefit that is easy to miss.
When you base removal on telemetry, your communication with customers improves. Instead of saying "we are removing v1 on this date, please migrate", you can say "you are currently using v1 on these specific endpoints, here is the migration guide for each of them."
That level of specificity dramatically increases the chance that the migration actually happens on time.
Version removal is a production event, not a cleanup task.
Treat it like a release, with data, monitoring, and a rollback plan, and it will stop being scary.
I cover the full decision framework and examples here: thecodeman.net/posts/why-do-y…
__
📌 Join the Newsletter and get "AI in .NET" Starter Kit projects for free: thecodeman.net
♻️ Repost to others.
📂 You can save this post for later, and you should do it.
➕ Follow me to learn .NET and Architecture every day.
@AntonMartyniuk I’ve seen header versioning work well internally, but public APIs become harder to reason about when the version is invisible. A simple curl request suddenly depends on hidden metadata instead of the URL telling the full story.
298 Followers 346 FollowingBuilding RaiseOS fundraising OS for solo founders.
The ones getting told "come back with a co-founder."
Talking to founders before writing code - https://t.co/uazxzZMOgb
3K Followers 2K FollowingFounding Partner @ Made With Future building the web & apps — Former Principal Architect @ YouVersion/Bible App https://t.co/iF7oUTWddq —
6K Followers 1K Following👩🏽💻 DevRel Lead @QodoAI. Codex Ambassador. top 1% @OpenAI. Engineer obsessed with software quality in AI. DevEx. Systems thinker. Fit nerd.
3K Followers 413 Following3x founder & dev. Building AI growth engine in the vibe coding era. https://t.co/tg9tNLjM6d - helping builders get their first 100 users.
68K Followers 2 FollowingUse hashtag #buildinpublic to share what you're working on. – Made by @marckohlbrugge. – Sponsored by https://t.co/vASwn0HF5o ⚡
5K Followers 700 FollowingI'm developing the Brainfire Radical Learning Engine and launching HealthSpan Foods and Purefoods Hydroponics. I serve Jesus Christ.
469 Followers 1K FollowingCTO, Soloprenuer, PE Operator with a passion for SaaS, Smalltalk, OO, Hockey, and rural life with my wife and growing family…
250 Followers 325 FollowingYour trusted resource for applied AI with Microsoft technologies. 🤖💻 Insights on C#, CoPilot, SharePoint, SQL Server, and more. Empowering businesses with AI!
514 Followers 954 Following.NET developer and Azure enthusiast. Managing Director of Expeed Technology. Building https://t.co/RXTi060K5D and https://t.co/5D4r4Jw0LL in my spare time
5K Followers 426 Following"Principal" developer, slightly rubbish content creator.
Views not those of employers past, present or future.
58K on YT: https://t.co/BVrwWaiqLh
2K Followers 772 FollowingExplaining the XRPL in simple terms.
Building a safety layer for the XRPL. On a mission to drive adoption.
Founder @rhyzlo_xrpl
96 Followers 834 Following🚀 Full-Stack Dev 👨🏻💻 .NET Engineer 👾 Geek & Friki 💡 Talks about #dotnet, #csharp, #azure, #visualstudio and a little bit of #nextjs.
394 Followers 41 Following🥑 Developer Advocate 🧑💻 Software Engineer 🧑🏫 Speaker
Follow me to learn more about AI, Data Engineering, and stream processing tools.
48K Followers 2K FollowingThe official Twitter account of the Microsoft Most Valued Professional (MVP) and Regional Director (RD) Programs. Follow for news, updates, and much more.
2K Followers 2K FollowingAI x Azure x Cyber Builder | @bostonazureai founder | Microsoft MVP (AI) | @oreillymedia author https://t.co/4f3ZorloPE | father of 4 | husband of 1 | ☁⛰🥾
979 Followers 2K Followingshe/her
20
painting is love
proud Sorb
Professional Hacker / Coder
Solopreneur | Entrepreneurship 📈📈
anime & memes 😁
big business (SEE YOU IN SILICON VALLEY)
159K Followers 808 FollowingI help dev teams be insanely productive with AI.
Courses: https://t.co/D5emROQHUh & https://t.co/6L1fD89GbP
Consulting: https://t.co/Qfp4TfpB8N ⚛️