.NET & C#

Twenty-plus years of C#, starting inside Microsoft.

My first stack job was at Microsoft in 1995, writing tools for Visual C++ and Visual Basic years before .NET was a word. I picked up C# in its earliest versions and never put it down — today I write it daily on .NET 8. This page is the shop-floor version of that career: the upgrades I sequence, the services I containerize, the ML and AI I wire into C#, and the Blazor apps I run in production — including the one you’re reading.

Pre-.NET Roots, Post-.NET 8 Fluency

I shipped Microsoft developer tooling before the word “.NET” existed.

At Microsoft in 1995 I built ActiveX runtime controls — in plain C — for Visual C++ and Visual Basic on Windows CE. So when C# showed up, it didn’t feel new; it felt like the language the platform had been waiting for. I adopted it early and have carried real production systems through every framework generation since, up to .NET 8. The practical payoff: when an upgrade breaks, I usually remember the API before it broke, which turns a mystery into a diff. And I still eat my own cooking — this site is a Blazor app I statically render in C# so search engines get plain HTML.

The .NET Work I Actually Do

Six kinds of work I keep getting hired for, from aging Framework estates to greenfield .NET 8.

Modernization & Framework Upgrades

.NET Framework → .NET Core → .NET 8. My rule after years of these: the retarget is the easy part; the job is triaging breaking changes service by service. I scope with the Upgrade Assistant, then port the shared libraries first — if auth or messaging lands broken, every downstream team inherits the pain. I write the upgrade playbook, then walk services through it myself instead of tossing it over the wall.

Cloud-Native .NET

I write ASP.NET Core REST services that run as Linux containers on Kubernetes, autoscaled with KEDA — and I do the Dockerfile, the pipeline, and the security scans in the same pass as the code, because I’ve learned that anything “bolted on later” never gets bolted on. Deployment is part of the service, not an afterthought. See my cloud work

ML & AI in .NET

I don’t reach for Python when C# already does the job. I run ML.NET time-series forecasting (SSA and SDCA) inside ordinary C# services and call Claude / LLM APIs from .NET back ends. In my own product, ML.NET computes the investment grades and Claude turns them into plain-English explanations — one C# codebase orchestrating both.

Blazor Web Apps

I’ve shipped Blazor WebAssembly, Blazor Server, and static SSR, and I’ve learned which one to pick when: WASM for rich client work, SSR when crawlers and first paint matter. That last lesson is why this very page is prerendered Blazor — same C# from the database to the markup you’re reading. My own site runs on the advice I give.

.NET MAUI & Cross-Platform

When the back end is already C#, I build the clients in .NET MAUI so the models, validation, and API contracts are literally shared code — iOS, Android, Windows, and macOS from one codebase. Fewer languages in the estate means fewer places for the same bug to hide, and one test discipline instead of four.

Testing & Engineering Discipline

I write xUnit and moq suites that run to hundreds of tests — my own product ships with 695 — because I refactor aggressively and I want the suite to catch me. Add TPL and async done without the classic deadlocks, trunk-based development, and the C# coding standards I’ve written for client teams. Untested speed is just deferred debugging.

Where I’ve Put This to Work

Four stories — healthcare, banking, telecom, and my own product — told the way I’d tell them to another engineer.

Healthcare · .NET 8 Upgrade

Centene — Writing the .NET 8 Playbook, Then Living By It

Nine months inside the utilization-management platform of the Fortune-25 managed-care enterprise. I wrote the org-wide .NET Core 3.1 → .NET 8 upgrade playbook, but the part I’m proud of is the sequencing: auth, messaging, and caching libraries ported before any service moved, so no team upgraded onto broken foundations. Then I proved the playbook worked by carrying 15+ services through upgrade, Dockerfile, pipeline, and security scans with my own hands.

Banking · C#/.NET on Azure

Fiserv — C# at Banking Scale

I was the top technologist on a 60+ person program building a C#/.NET cloud stand-in digital banking platform on Azure. The numbers that kept me honest: 2,000+ banks and 10 million banking customers on the other end of every design call. Cosmos DB for data, KEDA for scale, and real transaction load to tell us whether the architecture was right.

Fintech · ML.NET + Claude

Grade My Investments — What One Architect Ships in Six Months

The product I built alone, with nobody to blame but me: 695 tests, 11 background services, and 4 client apps, ML.NET (SSA/SDCA) doing the investment grading and a Claude language layer explaining the results, all on 50+ Azure resources. Six months from empty repo to production. When someone asks how I engineer .NET, this is the exhibit.

Read the full case study
Telecom · Windows → Linux

Getting Windows-Only .NET onto Linux for a National Telecom

A major national telecom had .NET OSS services welded to Windows, and I got them running as Linux containers. The real work was hunting down every Windows-only DLL dependency and isolating it, rewriting data access on EF Core, and — the part nobody warns you about — making IBM DB2 and Informix native drivers behave on Linux. Docker/Podman images through Portainer finished the job. Cross-platform .NET is real, but somebody has to do this part.

Building Products · EDI Integration

A C# System That Outlived Two Eras of .NET

I wrote an EDI 832 price catalog distribution system as a WPF desktop app over MariaDB, and years later rebuilt the same business capability as a containerized ASP.NET Core API with an Angular front end, a NetSuite SuiteTalk integration library, and cron-driven sync and transmission workers. Then I ran it for eight years. Watching one C# codebase cross that gap taught me more about .NET longevity than any migration guide.

Read the write-up

If your problem is .NET-shaped, odds are I’ve already shipped it.

Framework upgrades, cloud-native C#, ML.NET and Claude integration, Blazor, MAUI — I do the work myself and leave the tests behind to prove it. Kafka producer/consumer demos at Koch, .NET orchestration architecture at FM Global: same hands, same standards.