.NET Disappointment: Microsoft's Regressing Us Back to the Old Ways

I’ve had an off again/on again relationship with Microsoft over the years. I despised them through the 90s as they became the big brother corporation gobbling up all of the computer market while Mac, Unix, and other operating systems like BeOS went by the wayside both as a natural process and because of monopolistic practices MS imposed on system vendors. The same was true for how they successfully dominated the early web after stumbling out of the gates. But most of my professional development and engineering life was on Windows machines, using Visual Studio, apps that only ran on Windows, developing software that only ran on .NET. It was only in the 2012 period on when customer’s demanded Linux-based systems that I was able to practically break free from that and my having alternative OS’s like Mac, Linux, or a BSD being just a side thing. At the same time the tech stacks I was working with lacked some of the cleanness and modernness I was used to expecting with .NET. That’s why I was so excited when Microsoft bought Xamarin, .NET Core came out, and it looked like Microsoft was going to finally embrace open source cross platform development. While it was never all roses and there were stumbles it was still a process that was moving in the right direction. It was but doesn’t seem to be any longer.

I admit that my return to .NET came in an unusual way in recent years. I was not returning to Windows but instead was looking at embracing it on Linux predominantly. That meant using JetBrains Rider and the .NET command line tools not Visual Studio. I also wasn’t just looking to build server side software with .NET, which is honestly the real real Linux is a target at all with .NET core at all. I wanted to build desktop apps, hence my frequent posts here on Avalonia, at the time the only .NET cross platform UI framework with first class support for Linux as well as Mac and Windows. I wanted to develop mobile apps with it too. I look at technologies maximally first, “Can this realistically be used to develop the entire software stack if I so choose?” Whether it’s practical to do that in the end is another matter but if it is truly possible then I gravitate towards those technologies. The new era of .NET showed great promise in freeing me from the archaic Java server side, having to go back to C++ or again rely on Java for desktop, and being able to support multiple mobile platforms from one code base. I was in a bit of a honeymoon period with the new .NET world in 2018/2019 but it wasn’t to last.

First problem was that while .NET core was completely cross platform it was still pretty clear that Linux was a second class citizen for much of it. That’s better than its third class citizenship at best before, but still a bit of a bummer. Tools like Avalonia and Uno certainly filled in a lot of gaps but it was clear that Microsoft was only paying attention to .NET on Linux in so far as it enabled server side development for Linux deployments. As technologies like Kotlin Multiplatform and Flutter came out and continue to mature .NET’s differentiators started to fall away for me. But there was something else going on too which bothered me.

A second issue was that after years of working with Java, Node, Python, and other technologies I was used to a more diverse open source community around these platforms. It is a bit of an illusion, with huge tech companies really propping up much of the development on these platforms just as Microsoft does with .NET. However there was still a vibrancy around developer tools, libraries, etc. which .NET lacked. For example there are several legitimate competing platforms for building web services in these other platforms. On .NET there is Microsoft’s offering and that’s it. There are other vendors, I even used NancyFx for a while on a project, but they are not considered first class offerings and most end up dying under the crushing weight of a community that defaults to whatever Microsoft does is the way it is. The .NET Foundation was supposed to help fix that. Recent year’s community initiatives were going to make that better. There was even some positives signs that they were making progress in that direction through 2020 even. The reality of 2021 however has been the exact opposite, and it is not going unnoticed even outside of the .NET community.

First MAUI, the new UI development framework, was announced and Linux was nowhere to be found. When pressed on it the discussion was that it’d be community supported but since this is really just an evolution of Xamarin forms and Linux support has lagged in even maintaining that the idea that the community will address that is improbable, especially when the platform doesn’t even show up on the architecture (see below). Worse still while there could be convergences in runtimes we can still see that that isn’t happening. While WinRT is the smallest block you can be sure it is the one getting the most development support.

MAUI architecture diagram showing lack of Linux and Windows using its own runtime
MAUI Architecture Diagram Source: https://www.everycrsreport.com/reports/R45124.html


But is that just sour grapes from a Linux guy? Sadly, no. Earlier this year a .NET Foundation Executive Director started unilaterally making changes to the repos of projects which joined the foundation after they rejected those changes from the normal pull request process. While she apologized after the controversy the bulk of the messaging before and after was, “Tough shit, you should have read the fine print before you joined.” While people hoped it was a one off it turned out to be a larger part of the cultural problem, as this resigning .NET Foundation board member documents. To him and others it was clear that the Foundation was there to prop up Microsoft not to build a real community around .NET development. That became even clearer with this week’s news that a hot reload feature which was done to the point of being in the release candidates of the dotnet core tools was being ripped out and was going to reside solely in Visual Studio now. As Dustin Moris Gorski highlights in his post asking if we can trust Microsoft with open source .NET, this is actually a growing trend which started with Microsoft taking the open source MonoDevelop cross platform .NET platform into a closed source fork to create Visual Studio for Mac. So we have a .NET Foundation ever increasingly hostile to the community, Microsoft pushing harder on extracting useful technology that works out of the open source project and into their closed source solution that only runs on Windows, and returning us to an era where Windows is the first class .NET platform, MacOS is a second class one, and Linux is third class at best. Worse still all of the progress in making .NET a community driven open source project, the bit of progress there was anyway, is now evaporating rapidly.

Can there be a closed source, or just source available, .NET model that is attractive? Of course. There was before all of these Microsoft efforts to open source and build community around it. Even with other development stacks there is often one big vendor who exerts dominant control over it and if they wanted to take it in a different direction could. Android is more source available than a community open source project, but it does have some forks. Flutter is essentially a Google project which they could turn off at any minute if they so chose leaving developers holding the bag. Oracle could essentially do the same thing with Java and OpenJDK which would leave Kotlin as well in a lurch. Node has had its own tangles with forks, and re-merged forks et cetera. While this problem isn’t unique .NET it is still disheartening to see the reversals.

This won’t be the death of .NET or even cross platform .NET development applicable to most users. It is probably the beginning of the end of the era of Microsoft seeking to build community around .NET and fostering development tools, libraries, etc. that are non-Microsoft as having equal value to the .NET community. Instead we are probably entering into a .NET era like we had a decade or so ago but with a conslation prize of better support for Mac, Mobile, and server side Linux. I imagine Microsoft’s end goal will be to put the genie back in the bottle. They probably want to make Windows the development platform for .NET again with WSL being the tool that allows Linux development on Windows rather than having to support actual Linux platforms. They recently announced Android for WSL which further cements that belief in my mind. They probably wouldn’t even be bothering with Visual Studio Code for Mac except that Apple makes it impossible to do development for Mac or iOS on other platforms, at least the final build and packaging steps. In the end we are probably going to have the re-entrenching of the Microsoft library monoculture and what amounts to a source available open source .NET world, at least for the library side of things anyway.

I’ve already migrated my development stacks to Flutter for UIs and Dart or Kotlin for back ends before these recent kerfuffles. So this no longer directly affects me. Still, as someone who was so excited at the prospects of a viable open source cross platform .NET being my primary platform only one to two years ago, it is still heartbreaking.