Note (12/6/2018): I originally wrote this blog post when Microsoft was under very different leadership with very different business strategy. Since this article reached #1 on Hacker News (which was completely unexpected), Microsoft morphed into a different organization. Microsoft is now focused on a cloud ecosystem (running Linux!). While the closed .NET Framework still exists, Microsoft completely re-wrote ASP.NET Core as an open-source, multi-platform software development ecosystem. I’m impressed with the changes, and I view the .NET Core platform as a viable option for many organizations moving forward.


Back in the late 90s, I was a hardcore Microsoft devotee and web developer that enjoyed JavaScript but wanted to get away from coding in Perl. Seeing a large amount of demand for Microsoft development skills, I started developing on the Microsoft platform using Visual Basic 5 and “classic” ASP in 1997. I moved to .NET after the release of .NET 1.0 Beta and kept on truckin’.

Fast forward about 11 years later, and I started making the move away from Microsoft. I bought a Mac, worked on a Django project or two, and eventually left Microsoft’s ASP.NET platform and Django for the world of Node.js and full-time JavaScript. After a (very very) brief stint working at Microsoft, I abandoned Microsoft technologies altogether. I no longer actively work on pure .NET projects and turn down projects based on ASP.NET Web Forms as a general rule.

A lot of the reason for this move came from my time in corporate management, serving as a technology director during a down IT market. Many others came from exploring emerging platforms in the realm of web software development.

TL;DR: Microsoft’s ASP.NET is too restrictive and costs too much. Microsoft’s target audience builds products that are generally poorly written and lag 4-8 years behind the current platform version. Other open platforms are available at little to no cost and lower overall cost of ownership.

Microsoft licensing costs are insane

Microsoft’s licensing structure and costs and are absolutely insane. I can build, deploy, and market test a product or feature using platforms such as Java, Rails, Django, or Node.js for a small fraction of what Microsoft charges, without the licensing headache. I’m not tied to only one operating system.

(Quick aside: yes, Mono is cool and cross-platform. It also lags behind the current version of the .NET Framework and represents the smallest of fractions of actual production .NET use.)

The vast majority of .NET projects involve working with giant, monolithic, boring, poorly written, legacy “enterprise” products. These products always seem to be 4-8 years old and 2-3 major platform releases behind the current .NET framework, in part because of the sheer complexity of modernizing. Coupled with the insane licensing, capital, and labor costs to develop a product using Microsoft’s platform, these products remain outdated because the business has barely broken even on the initial project investment. Investing in new feature development always beats investing in the cost to upgrade to the latest .NET version in most “enterprise” organizations.

Yes, BizSpark is a great program for giving free Microsoft stuff to startups. It’s like a drug dealer giving free samples to get you hooked on their expensive and now compulsory wares.

No focus on the user experience

When Microsoft first released ASP.NET, they wanted it to feel as familiar as possible to Visual Basic 6 developers transitioning into the world of web development. They introduced “Web Forms,” a concept where developers dragged and dropped web controls on to WYSIWYG-ish documents and wrote “code-behind” logic to create features. Developers coming from ASP and CGI development had to completely relearn how to develop for the web, as Web Forms hid so much of the mechanics of the web behind a giant form tag and a humungous hidden __VIEWSTATE field and on each page.

Over time, the back end architecture of these applications became better, while the front end user interface suffered horribly. ASP.NET developers were seemed pleased with the poorly generated HTML sent to their Internet Explorer session. Microsoft gave half hearted fixes such as “skins” and the spewer of horribly generated JavaScript that was ASP.NET AJAX.

I would estimate that 85-90% of the senior ASP.NET candidates I interviewed could tell me what nondeterministic finalization was, but couldn’t tell me how to dynamically position a DOM element using only JavaScript and CSS.

ASP.NET platform features are always behind other platforms

Sure, Microsoft introduced ASP.NET MVC in an attempt to move away from the Web Forms problem. Of course, ASP.NET MVC borrowed heavily from Rails, Django and Java frameworks like Spring, which were around for years before.

Adoption of ASP.NET MVC was terrible, in part because of the expense involved in undertaking any Microsoft upgrade. ASP.NET Web Forms developers had a difficult time understanding why MVC was a good thing, learning when to use MVC instead of Web Forms, or finding time to learn a new method for web application development.

Microsoft has tried to make MVC more attractive by replacing the original and confusing “Web Forms View Engine” with the “Razor” view engine, as well as a host of other moves. ASP.NET Web Forms, however, still rules the ecosystem.


I moved away from .NET primarily so I could use free and open platforms to rapidly develop, deploy, and market test products for myself and my clients. Modern open web platforms are easy to acquire, easy to configure, and easy to learn. They are on the leading edge of the web development industry and provide everything needed to create engaging user experiences on top of scalable and performant architectures. The largest web applications on the planet – Google, Facebook, Twitter – use free, open, non-Microsoft technology. And I do too.