I’m confused.
For many years I’ve been a .NET / Microsoft stack developer (from now on I might call it .NET for simplicity, but what I mean is the Windows / ASP / .NET / IIS / SQL Server etc. family of products) not because of any “religious” reasons, nor because I’ve had a corporate mind or any business constraints like others might have had – but merely because random coincidence led me to start developing with Visual Basic 2, then continue with later versions and the rest is history.
Praise for .NET
Throughout the years I always read that the “cool” guys use Unix / Linux / Ruby / Python / YouNameIt; that they use VIM to hack things quickly; that the open source software community is so large and full of contributing people; that its tools & frameworks are so robust and fast.
Somehow I never got it. I mean, I didn’t question these facts but I always saw, and to some degree still am, the .NET stack as strong, rich, robust, with superb tooling (primarily: Visual Studio) and well documented.
Especially in the recent few years, a blast of both Microsoft and 3rd party libraries, tools & frameworks emerged and have made .NET even greater. Many of these tools were “inspired” by Linux – although their creators would hardly admit it. To name a few – completely random in order and importance: ASP.NET MVC, Chocolatey, NuGet, Entity Framework, Nancy, Web API, PowerShell, Windows Server Core… and of course many other “smaller” tools that enriched the ecosystem like: NUnit, Resharper, Web Essentials, GitHub for Windows, Dapper, Lucene.Net, Autofac, Cmder and hundreds of other projects. Not to mention other tools that originated in .NET or that are just superior on their own: Octopus Deploy, Hangfire, Xamarin, SignalR. I’ve always had the feeling that I don’t miss anything in the .NET stack – the tools are there, the robustness is there; that the cool kids bash .NET just because they’re cool, or at least think they are. The only issue I agreed to throughout this whole time was that using the Windows/.NET ecosystem incurs licensing costs, while *nix is free. But this argument is not even clear-cut, since with the free stuff you don’t get enterprise support etc. (I know that this argument originates from MS’s marketing, is very subjective, but I won’t enter too much into this point right now.)
Disenchantment (sort of)
Despite all that, what I saw more and more was a disturbing picture. Microsoft’s code is not open source, and when they finally began to open source some of their projects a few years ago, they didn’t accept pull requests. The amount of good libraries & frameworks in *nix is way larger than in Windows. Internet Explorer? don’t even get me started to rant on this. I’ve already written my part. Most benchmarks claim that IIS performs way worse than nginx. Shell? truth must be told: PowerShell is a huge step forward but it still lags behind sh/Bash in terms of console robustness, ease & speed of use. Windows users have still not changed their state of mind towards working with the shell, using a keyboard. All guides/tutorials/Q&A out there will explain you how to carry out a given IT task as UI screenshot steps – open this program, click there, choose from a list etc. – whereas the command line version would usually be a one-liner, and something you can actually copy-paste & reuse and it will just work, no missing steps, windows that changed their location between versions etc.
We started to see a movement of .NET/Windows veterans to *nix and they blogged about it. It’s not a new thing at all. It has mainly gained acceleration in the last 5 years, at least according to my impression. People have said many things against .NET/Microsoft and in favor of *nix. At the beginning I thought it’s just a nerd-ish thing: Microsoft’s not cool, Linux lets me hack things faster, Windows is insecure by nature, Microsoft doesn’t get the idea of free software and still charge a fortune. I heard people saying they moved to the LAMP stack and feel they’ve been set free. But I still didn’t quite get it because as I said before, the .NET ecosystem was robust, constantly improving and fully supported.
Slowly I began to realize there’s some subtle truth in that. It’s like when you argue with someone where each one of you doesn’t quite listen to their party but then you get to a point where you mentally zoom yourself out of the argument, try to be objective and judge who’s right regardless of your personal view and ego. And then you start seeing the other party’s view and you find that they’re not that wrong.
I follow dozens of podcasts & blogs. Natively many of them speak about .NET, as this is where I come from. But when you filter those who speak about software design in general, entrepreneurship, lean startups, hackathons – everything that is not the corporate world – they hardly speak about .NET. They don’t hate .NET, they don’t laugh at it all day. They just don’t care. They hack their things in Python/Node/Go/Meteor (I’m not mentioning RoR as it has recently become uncool), they fast boot thin Linux VMs or Docker containers, they deploy to Heroku or Google AppEngine or just to a lean Linux VM in DigitalOcean or one of these, and that’s it. And that doesn’t mean their architecture is not robust, because they do have all the databases, frameworks and tooling they need, and they’re free, and they’re robust, and they use them in production environments.
If you look at both early and mature start-ups out there – their code is 90% on the Linux stack (OK I’ve just made up this exact number but it’s about there). It’s very hard to find good .NET engineers in Silicon Valley. Nowadays, NodeJS (running on Linux due to costs, although it perfectly runs on Windows as well) is the cool kid – part of what’s known as the MEAN stack. More and more I hear that .NET development belongs to the old, traditional corporate world, whereas the really lean, agile & MVP stuff is done on MEAN (previously: LAMP).
The .NET revolution
On the other hand, winds of change emerge from the Redmond giant, and they increase every week or so. This change that began when Microsoft started to open source some of the .NET stack, continued by the introduction of Microsoft-initiated open source organizations like Outercurve and MS Open Tech. We started to see significant contributions to some famous open source projects by these organizations, and then Microsoft finally began to accept pull requests – for the collateral stuff at the beginning, and now for .NET core libraries themselves, with the introduction of .NET vNext. Microsoft does not deny Linux’s existence any more. Not only they acknowledge its existence (I’m pretty sure their marketing department has been forced to change its paradigm with the help of some significant inside political force), they even officially offer Linux VMs in Microsoft Azure and as for the time of this writing, 20% of VMs running on Microsft Azure are Linux. Docker is going to be supported on Windows.
The announcement of .NET vNext skyrocketed everything. Microsoft iteratively builds the .NET code against Linux and Mac OS – no more the orphan hello-world-capable-but-not-really-for-production Mono project. Finally .NET projects are not bound to the proprietary .csproj files – projects are now parsed according to their physical folder’s contents and are fully portable, including the .NET framework version they run on itself. All of these close the gap between the stacks & frameworks I mentioned earlier really fast.
So as a .NET guy, today looks much brighter than yesterday. If a few years ago I felt ashamed of being that corporate-world .NET guy, I recently don’t feel it so much any more. I elaborated about this bit a few months ago, in the Reversim podcast (Hebrew).
I’m confused. Again.
I still don’t know though, whether the steps Microsoft takes are too few and too late. Microsoft is trying to catch up with the market, after realizing that by sticking to its traditions and unique way of thinking and building products it has missed the market. Microsoft is not the default any more. It probably is the default among desktop users (personal & business) but not in browsers – for a long time, not in servers (1, 2) and not in development stacks. The big question here is whether Microsoft will succeed catching up, stop the flow of developers moving to Linux and even reverse the trend.
Another obscure fact is whether .NET on Linux and Mac OS will indeed work 100% like their Windows counterpart. Despite genuine intents from Microsoft to really provide fully compatible versions, I don’t know if that will actually happen.
I’m really not religious in choosing my development stacks although naturally I happen to be a .NET guy with a rich career to back it up. I’m open to whatever best suits the task at hand. But for my next web gig, unless I see a clear advantage to the other frameworks, namely NodeJS+Express, Meteor, Go, Python+Django (I’m aware that some of these have different strengths and roles in the client and/or the server) – I don’t see any reason not to do it on the .NET stack. That is, server-side – web and application. Client side is a completely different story.
So, what do think? does the future look bright for .NET or has the horse left the barn already? will *nix guys consider the .NET option, now that the monetary & IP obstacles are almost gone?
“Tux” image courtesy of Larry Ewing.