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.

To .NET or not to .NET, That is the Question
  • luisrudge

    Awesome post!

  • Micha Kaufman

    I fully understand your conflict, and share the same thoughts! nI came from the same Microsoft stack as you came from; however, I couldnu2019t express my thoughts better than you did in this article!

    • Thank you. Yes, it’s quite confusing. You always want to take the right strategic decision going forward (except of when you quickly hack something in 3 days) and it’s a really hard one.

  • Thank you for writing this, great post. I will admit right away, I’m a Redmond based developer “marketing guy” on the Visual Studio team and at the same time I certainly appreciate where you are coming from. I spent 5+ years at Microsoft (recently) as a “field app/dev guy” working out of NYC in MCS and Premier and have a strong connection to customers. I am not blind to anything and I can assure you neither is my team. We are playing catch-up, but we know what we need to do. nAs for the future… I will say this, knowing the passion of the team, their dedication to deliver on the promises, the great amount of resources at hand, etc… well it all gives me a lot of hope. Nothing is certain but I think we are heading in a bright new direction thanks to folks like Satya and Guthrie guiding us from the top. So lets see what happens, but its exciting to be a .NET developer again that’s for sure!

    • Thanks for that Dmitry, that’s a great insider’s update. I guess that based on the assumption that the new generation of .NET stack (vNext) will be truly and fully open source, the expectation would be either that Windows will be licensed for free for production servers (not so probable but we could just hope) or at least the Linux .NET build will be 100% compatible with its Windows counterpart, so server cost would not be a consideration anymore. That’s for example Java’s primary adoption reason given the fact that C# is superior to Java in every other aspect.

    • A new Dev

      All we need is, Write once, Click Build, Run Everywhere, just like how Java worknnAnd we need a crossplatform IDE

  • Interesting blog post and discussion. n As .NET Product Manager at Microsoft Corp, I can tell you we are “all in” heading OSS and Cross-Platform, and it will continue growing. Just in case you don’t know about it, we released a lot of new info about .NET 2015 (ASP.NET 5, .NET Core 5, etc.) at Connect(); event, NYC Nov. 12th. nn Here you have a few links pointing to related .NET content where we’re talking about .NET going OSS and cross-platform and blog posts that I wrote.nn Connect(); event – Recorded keynotes and sessions nhttp://channel9.msdn.com/Events/Visual-Studio/Connect-event-2014nn What is .NET Core 5 and ASP.NET 5 within .NET 2015 Preview: http://blogs.msdn.com/b/cesardelatorre/archive/2014/11/18/what-is-net-core-5-and-asp-net-5-within-net-2015-preview.aspxnn MyShuttle.biz demo apps from Connect(); Visual Studio and Azure event: http://blogs.msdn.com/b/cesardelatorre/archive/2014/11/30/myshuttle-biz-demo-apps-from-connect-visual-studio-and-azure-event.aspx

    • You are right – that’s the premise of the last part of my post. Things are going in a positive direction at Microsoft, and as one guy commented somewhere, MS is doing it because of a necessity (to keep being relevant) rather than altruism. But that’s fine, I’m pragmatic. Let’s wait for more good news (like Microsoft acquiring Xamarin for example and offering it as part of MSDN or VS itself).

      • mbass

        So true. Right now Xamarin is arguably one of the most precious things in Microsoft arsenal to keep Microsoft relevant for the future. It’s what Microsoft itself should have done 10 years ago. Acquiring them would be a no brainer for me.

        • Prajay Basu

          Well, now what ? 馃檪

    • Frans Bouma

      “All in” would mean WPF and winforms will be open sourced as well and run on .NET Core. As no-one has said anything about that, I’m not really sure what your definition of ‘All in’ means.

  • Btw, here you have a good new post (Nov. 2014) about .NET OSS and pull requests being accepted, tested and merged. :)nnhttp://blogs.msdn.com/b/dotnet/archive/2014/11/20/one-week-of-open-source.aspx?amp&amp

  • Dmitry Novik

    Awesome… well, they just open sourced .NET, didn’t they? Although… I really really don’t understand how this “open sourced .NET” will work under auspices of such the corporate giant as Microsoft is. Will anyone contribute? Who will moderate commits? Will they honor pull requests in the matter of days, not years? Honestly, I am pretty pessimistic …

    • I remember seeing that they accepted at least one community pull request on the first day the repo was public. When I went to look at the repo on Github after the announcement, the latest commit was already from someone outside of Microsoft.nnSince then, lots of contributors from outside Microsoft seem to have joined in and had pull requests accepted: https://github.com/Microsoft/dotnet/graphs/contributors

  • Very good post which describes exactly the state I am in, too. nnI have been working on the Microsoft stack for more than 13 years now, have been an ASP.NET MVP since 2006 and I really loved (and do love) the power of these tools and what I have accomplished with my knowledge. I would call me a real full-stack developer with a ton of experience in web development and now even some deep knowledge in cross-platform mobile development, thanks to C# and Xamarin.nnBut as I got the chance to make a short break and to recapitulate in autumn of this year, my concerns got obvious to me. I mean, it’s not only that we are not playing with the cool kids for today, it is that we don’t even have the chance to work with “the next facebook”, as almost no one outside of the enterprise bubble is going with .NET. So if we don’t found our own startup and decide to use .NET (what I did in the last two years (yes, finding excellent developers is hard)), we’re bound to enterprises or some clients who don’t care about the stack we are developing customized solutions for them.nnI wrote down my own peace which has the same points as yours (in German, http://blog.thomasbandt.de/39/2438/de/blog/aspnet-quo-vadis.html). After that I decided to extend my break and to also extend my own horizon. I am working on my first real world MEAN project for a couple of weeks now, and despite the drawbacks of JavaScript it makes a lot of fun and I already got used to it to a level, I would certainly consider to use it in my next (professional) project.nnThough I still hope that ASP.NET 5 will be a huge success and that it will be someday widely accepted even by “the cool kids”. But to be realistic: if that will ever happen, it will take some time.nnIn the meantime I will broaden my knowledge and my personal toolset, and that will definetely not be solely in the Microsoft space.

  • Vincent Marquez

    C# is a cool language. I like Visual Studio (since 2012, before I considered it garbage). I’ve been doing C# development for the last four years professionally (many years of java before that). However new apps at our company are getting developed in Scala. Visual Studio is certainly one of the nicer IDEs, but it doesn’t make up for the difference in productivity I get from using a much more powerful language, having a thriving open source community and having everything from tooling to server side platforms being open source.

  • Great post! You captured my mindset exactly. I really worry that it’s too late, but at the same time I am really optimistic and excited about the future.

  • BuckRogers

    I’m much more interested in .Net now. It remains to see if .Net Core is too little too late, but I doubt it. I’ve always had problems finding lots of jobs doing my first love, Python. I never did which has been disheartening.nnFor me .Net is now an option for a personal project or small business idea. The last 7 years has been rough for .Net, I would have never advocated new product on it. Core changes that. I like having support (that I hope) is equal to Java’s on Linux and yet has 1st class support on Windows at the same time. If MS doesn’t sandbag anything, they’ll win bigtime with devs and IIS can finally compete on merit rather than lock-in.nI think it’s going to work out and I can enthusiastically embrace .Net for my side business and personal projects on Linux, while building the skills to open a -much- wider job market. In short, if enough people like me win, MS wins.nDevelopers in the OSS community do what pleases them, temporarily mutually-aligned interests are unreliable. MS has strong financial incentive to not toss their devs to the wind too often. They’ve shown lack of commitment to some things, but it’s clear .Net is here to stay. As an outsider, I’m eager to learn more.

  • Gustavo Freitas

    Well some how you made up my mind to stop dispersing trying to learn every single damn thing, and focus on my origins: .NET.nnnThere is really nothing wrong about it.nnnThanks so much for the enlightenment.

    • BuckRogers

      There isn’t, at least now with .Net Core on the way. But if you want to try something new, go for F#. That’s where the -real- cool kids are, not on Node/Javascript-new-joke-of-the-day.

      • What a ridiculous false dichotomy. Functional programming is hip and cool and F# is a nice language, but that has nothing to do with Node.js, Angular.js, Typescript, Dart, etc.

  • Fizzelen

    The biggest danger with Microsoft is not to be OSS or not to be OSS, making friends with the “cool kids”, it’s Microsoft’s on going internal wars and the bodies left on the side of the road (some deservedly so) DAO, RDO, ADO, (some MIA) XAML Win8 Apps, (some without reason or warning) , WFP, Silverlight, (and others) WinForms.nMicrosoft’s is in danger of scarring off the loyal .Net developers by killing their favourite tools

  • Travis

    Great article! My situation is the reverse of yours. I came from a Linux background, hacking RoR, PHP, and eventually Node. I moved to the .NET stack after accepting a job as a Java developer, then having our .NET guy quit. I had to serve both roles for a long time. Eventually my boss looked into hiring someone. I asked him to his a Java guy so that I could stay on the .NET side. I loved it.nnFor me, it was like going from a backyard-built racecar to a Rolls-Royce. While the racecar was fast and had tons of aftermarket support, the pieces always seemed to need modification to fit just right. And most of the parts tried to be a one-size-fits-all, so they were often bloated. With .NET, the Rolls, the ride was smooth, polished, and well defined. It maybe wasn’t as fast or as exciting, but it was consistent and very reliable. nnI’m currently building a web app (startup) which is much like Github, but for open-source hardware. I went back to my roots and first looked at RoR. Then PHP with the new technology that Facebook had released. I even entertained Java for a while. But ultimately, I landed back at .NET. And in more than happy and confident in that decision. nnSo don’t think you can’t work at the next Facebook of you’re a .NET guy. Some of us hipsters don’t follow the latest trends. We define them.

  • CodingChris

    The wind left my .Net sails a little with the release of Windows 8. With all of the development in that area being entirely HTML5, CSS3, and JavaScript; I felt my 9 years as a .Net developer weren’t going to count for much. Of course, that still left ASP.Net, but with Apache powering over 80% of the web servers on the internet; prospects were looking pretty grim in that direction too. Then, Microsoft started making the OSS offerings. Suddenly, things weren’t so bleak anymore. nIt is difficult to judge “too late”. One thing you can be happy about, however, is the persistence of .Net. It isn’t a ‘flavor of the week’ – it’s been crafted over many years and has some fantastic capabilities – and Microsoft’s choices with it of late, I think, will ensure that it continues to be a viable option developers like us can use for years to come. It’ll just depend on adoption, like anything else. If it isn’t used, it’ll get replaced; but I don’t see that happening too quickly now. In fact, as you’ve observed, things have kind of picked up for us .Net developers given recent events.nThank you for the article and thanks to those who’ve posted as well. It’s nice to see I wasn’t the only one freaking out a little on the future of being a .Net developer.

  • Steve Naidamast

    I have been working with .NET since it was commercially released in 2001. I have been in the field for over 40 years so I have also seen a boat-load of fads and new technologies come and go.nnThe one thing I see with .NET above all else with the exception of Java is its ability at longevity, which I don’t see with the OSS side of things with the exception of the more mature products.nnThe downside of working with OSS is that it has spawned many new technologies or what appear to be new ones. For the most part they are not. Practically everything that the younger professionals are using has been done before and for the most part is fairly redundant to what already exists. Without new topologies in distributed computing along with the languages that can take advantage of them, there is very little advantage to using one language over another or one methodology over another as for the most part they will all perform at around the same levels of performance.nnThe Internet especially, is all about hardware. In other words, there is only so much you can do with your development that will increase the performance of the application you may be working on. Whatever language you are using, assuming that its compiler andor interpreter are efficiently designed, it will only yield so many benefits. However, it is amazing to see how many people tout one technique over another for performance. With some exceptions it is all relative to the amount of people using the application concurrently and the quality of the hardware supporting it.nnGiven all this, .NET offers a great set of tools to build applications along with great support products such as SQL Server. The Java world also offers quite an array of mature products that perform as well, if not better, than the .NET environment under certain circumstances.nnOnce you leave the core development environments for the “purer” OSS side of things you are now entering a very fragile environment made up of many components that may not have very long shelf lives. “Node.js” may be popular now but its JavaScript and will most likely be supplanted by something else later on. “Ruby on Rails” is already in decline according to some reports along with PHP. nn”Python” is probably the only OSS language to have a strong future since like its .NET and Java cousins it can work within a host of environments and support a variety of interfaces such as the web and the desktop.nnThere are some very mature products in the OSS world such as the “NetBeans” development tools and MySQL as well as a host of others. However, all of these products reflect the traditional environments that enterprise developers and serious independent professionals and ISVs would work in.nnToday we have a host of new technologies for a host of new devices such as smart phones and tablets. However, again, for the most part these are fads when it comes to doing serious work. Anyone who claims they can work on a 7×13 tablet screen 8 hours a day has got something wrong with them or at the very least will develop vision problems in the ensuing years.nnThe immediate access you get with smart-phones anytime, anywhere will begin to wear thin as younger people get older. Life gets old with age…nnI don’t doubt that these new environments are the “things” of today with all of the new/redundant technologies that support them. However, the original environments have been around for a very long time and will continue to evolve as necessary to maintain competitive. I doubt many of these more recent technologies will be able to claim the same thing…

    • Very good insights. I agree with most of it, but not all :)nPerformance: there are negligent differences between C# and Java, Go – but they are way better than dynamic languages: Ruby, JavaScript (hence Node), PHP and even Python (although Python performs better than Ruby for example). It does present an issue. It’s not just hardware, because you need to buy double the hardware to get the same performance from a dynamic language for example. It doesn’t matter at all when you’re just bootstrapping and doing your proof of concept but when you grow big (read: Twitter) it’s going to bite you hard. The point is, these dynamic languages are not “wrong”. They are very good at letting you do things quickly and get an MVP out the door.nAnother issue is that you’re not supposed to use one “cool” technology throughout your all app architecture. Ideally one should build microservices that each is built using the technology that best suits its needs. If performance is critical, heck, even write in C…

    • PayMeNowOrLater

      Good post. I concur about what is really “new”. I have used most of the same techniques for achieving concurrency, throughput and scalability in the unix/linux world years back – its just that we built them from scratch. Now they come in pre-built tool kits and widgets and have buzzword names. A well designed system with a clean architecture and defined interfaces will pretty much last forever. You can rewrite parts of it or plug in new functionality without a lot of difficult and the performance is predictable.nnnMobile devices and tablet apps may seem like revolutionary technology but they still need great back end databases and services to run on. Whoever is building these back ends need to know what they are doing or you end up spending a lot of money and end up with something like healthcare.gov.

  • swampwiz0

    I am an early middle-aged, “obsolete”, “unemployable” American programmer. I think one of the reasons I became obsolete is because I hitched my wagon to the constantly changing Microsoft stack, and just couldn’t keep up.

  • Deployment is OK (have you looked at Octopus Deploy?) and with PowerShell things really get closer to Linux in terms of automation. I do agree though that SQL Server pricing is insane. I don’t get it at all. How does it help if I get BizSpark free licenses for 3 years, if I then need to pay a fortune after? and a fortune it is.

  • I liked your insight a lot.

  • minkyu

    Well balanced and even somewhat comforting article. I’d like to share this with my colleague developers. Can I translate it into my native language which is Korean and post it on SNS? It’ll be great pleasure.

  • Native languages: Go is compiled. Regarding performance, you can see the difference when you’re app gets to a large scale. Twitter had lots of problems for years. Their code was Ruby. I’m not saying that was their only problem but Ruby certainly had lots to contribute.nnDifferent technologies in the same project: Generally you are right but look at the biggest companies, they use different languages for different things. And not just the biggest. Of course, this should not be your MVP. It’s only when you grow.nnC/C++: it was just a radical example, the point was that you can resort to different languages if you have very specific performance needs for example.n

  • “Curious, what’s a ‘more powerful language’ than C#? “nHe said: Scala.

  • Vincent Marquez

    I do think it matters. Being able to either fix bugs/add features to a project you rely on (by the fact that it is OSS) is very useful. Often times just identifying the bug and finding out someone has a fix in the pipeline is enough. With commercial software we often have to file a ticket and wait for a long period before releases.

  • Pingback: 讛讗诐 讛拽讜讚 讛驻转讜讞 讛讜讗 讛诪讟讗讜专 砖讬讻讞讬讚 讗转 诪讬拽专讜住讜驻讟? | 讙讬拽讟讬讬诐()

  • VB6 Programming

    If Microsoft had any commitment to open source they would open source VB6 programming.nn http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/3440221-bring-back-classic-visual-basic-an-improved-versinnnnMicrosoft haven’t yet realized they are no longer relevant.

  • Ofer wrote: “Ideally one should build microservices that each is built using the technology that best suits its needs. If performance is critical, heck, even write in C…”nnnnI cannot agree more, spot on comment.

Enter my mailing list to get high quality full-stack updates directly to your inbox. Just pure content.

I will never spam you and never share your email address.