This is an update to the post I made a while ago titled “Why .Net Doesn’t need to be Expensive“. A lot has changed since I made that post. For example: Visual Studio Code wasn’t released, .NET Core was called vNext, and .NET hadn’t gone through it’s open-source transformation. These introductions to the .NET ecosystem have changed the way .NET developers are working day-to-day and the path to deploying .NET on Linux is quickly becoming a mandatory requirement for IT shops.
Microsoft has been on the Linux love train for quite some time now, and we are slowly starting to see the fruits of this transformation. Just recently the Linux Subsystem on Windows was added to Windows 10 without the need to turn on developer mode. Developers now have a native Linux bash that can be enabled through the Windows store. The new .NET core project templates in Visual Studio include Docker support with just the click of a checkbox. Azure allows you to host .NET Core projects in Linux, and has moved to allow container orchestration using technologies like Azure Container Storage, and soon to come Azure AKS (its managed Kubernetes). This change is also reaching out to the open source community. Most large projects have either ported their program to use .NET standard or are in the process of converting it.
Why so much Love?
Plain and simple: moving custom code to the cloud means moving to Linux. All cloud technologies that are coming out have Linux as a common player. AWS, GCP, OCP, Azure, and even smaller players like Digital Ocean all provide Linux as the OS. If an IT organization can’t migrate their .NET custom code to Linux they are dramatically limiting the choices they have to get to the cloud. If you aren’t going with Linux you only have two real choices:
1) Find a Windows Server VM in the cloud and deploy to IIS.
Technically yes, you are moving to the cloud, but are you really gaining any benefits? Your operations team still needs to monitor, maintain, and patch this VM just as if it was in your private data centre. You also are quickly locking yourself to the provider since making an export of the VM to move to another provider will be difficult and require down time as you make that transition.
2) Use Azure PaaS Offerings like Web App Services.
Azure is still your friend here. They will take your web application code that is slightly modified to be cloud ready and host it for you. The Web App Services offering is really good stuff. It comes with free auto-scaling, monitoring, and guaranteed availability. They even take care of patching and maintaining the infrastructure. The downside here is that until you have migrated that application to Linux you are tied to Azure. No other cloud provider is looking at a way to host non-core .NET web sites. So if Azure changes the pricing model, you will need to change with it.
What does Linux get you?
Linux buys you true portability of your applications. The most common way to get to true application portability is to write your applications as a 12 factor application, while using Docker to wrap your application and prepare it for deployment. If you follow this procedure, then pretty much any platform is open for you to deploy your applications. Microsoft is currently working to create Windows Server Docker containers like microsoft/nanoserver, but the licensing and deployment constraints are still unclear. It appears that you need to deploy these images only on a licensed Windows Server 2016 system. This restriction makes your application tightly coupled to Windows systems and reduces your deployment options significantly.
More investment for .NET Developers
A little while ago I was talking to a group about how the shift to Linux will be a big shift for .NET developers. Normally Microsoft would have a major release and developers could focus for a year or so to wrap their heads around it. When the TPL was released,
Async Await was the big player. Bloggers would write endless articles on how leverage this feature to introduce multi-threading into applications. This update was all that .NET developers needed to focus on. The next few years are changing a lot more than
Async Await. A new Operating System in Linux, arguably a new framework with .NET Core, Docker containers, container orchestrators like Kubernetes, all while building strong Dev Ops capabilities. The future is bright for .NET but the time required to learn all the advantages is long. I plan to keep our developers moving in this direction, since it is the brightest path forward for custom software development in general, including the .NET ecosystem.