Warning, serious rant ahead, get yourself a cup of coffee and relax…
C# has been my bread and butter for quite some time, and before that it was Delphi. And you know what, I loved Delphi. It was a powerful language, one which was fast and relatively easy to develop in. I wrote Delphi code for years and enjoyed it. As the .NET platform was taking off I started to take a serious look at C# because it seemed like the most obvious jump from Delphi for what we were doing, which was writing Windows desktop applications. And I loved it!
Delphi was great, but C# was better. There was no denying it. Having a well thought out, managed language, great libraries, fast runtime, great IDE, familiar syntax was awesome. I was totally hooked. Sure, I loved Delphi, but C# was a brand new language designed from the ground up to be fast and easy to use. It was everything I wanted. After that point Delphi just seemed so clunky and old. Manual memory management seemed like such a pain. My love of Delphi started fading quickly after I had glimpsed into the promised land that was C#.
Fast forward eight years or so and I am starting to find myself in a similar predicament. I still think C# is a good language, and it has come so far. The .NET platform and ecosystem has matured and contains everything that almost any developer could want. I’ve developed an enormous number of applications with .NET, everything from tiny Windows forms applications to huge websites, and I like to think that I have been fairly successful doing it.
Over the past 6+ years my focus has been entirely on web applications, and I was specifically a web forms developer for several of those years. I learned all of the tricks and incantations necessary in order to create decent websites with web forms, but after a while I realized that I was fighting the web, and not working with it. Something just wasn’t jiving with me, I couldn’t easily use all of the cool new frameworks that I was hearing about like Prototype, Scriptaculous, and MooTools. I had to download and install some library in order to get any Ajax support at all, and what I mainly got was update panels which were easy to use, but pretty terrible in terms of trying to actually implement a light, interactive site. I was unable to do any client side page modifications or I would get screamed at, I was just all around fighting the way the web worked.
It was along this same time that I started to explore Ruby and Rails a bit more, picked up a copy of Agile Web Development with Rails, and quite frankly, I was absolutely blown away by Ruby’s power and Rails’ simplicity. I felt like I was getting left in the dark ages, but developing on the .NET platform was what paid the bills, so I started looking for better ways to develop .NET and C# applications. And I hate to sound repetitive, but I think overall things worked out pretty well. I started using the parts of C# and .NET that worked for me, and throwing the rest out.
I became an honorary member of the ALT.NET crowd, even though I actively distanced myself from them for a long period of time. But I started heavily promoting unit testing, dependency injection, mocking, ORMs, etc… I was using Subversion, NUnit, Rhino Mocks (then later Moq), NHibernate… all the tools that a good little ALT.NET person was supposed to use. But you know what, they allowed me to produce applications that were better than most of the tools that came out of Microsoft. And I got very into these tools and techniques and how they could make your life as a .NET developer easier.
Web Forms Hurt Justin
But at the same time, I was still heavily feeling the pain of web forms development, and I was still pining for greener pastures. I started looking into Monorail and loved it! What a great tool, and all in C# and .NET. Unfortunately at the time, I didn’t have a lot of luck using it at my day job, since we still had a ton of web forms lying around that wasn’t going to rewrite itself. Some time passed, and I started to hear about this new framework that Microsoft was developing called ASP.NET MVC. And I was, to say the least, excited. A framework for writing modern web applications, and it was coming out of Microsoft! That meant that it might actually gain some traction in the .NET world.
Around the same time I also started looking at another project that Microsoft was working on…IronRuby. I was really excited about IronRuby as well, I wrote a very large blog series about 2 years ago called Learning Ruby via IronRuby and C#. It was very well received, and I truly enjoyed writing it. I also got looped in to be the technical editor on Shay Friedman’s IronRuby Unleashed book, which was a ton of fun! I was excited about the future of Ruby on the .NET platform, and I was excited about what could be done when combining ASP.NET MVC and IronRuby.
What a great pair! Now, I know what you might be thinking, if you like Ruby and you want an MVC framework, why did you just switch to Rails? Well, the thought had crossed my mind, but overall I felt like I was still tossing out years of experience on a platform. I wasn’t looking for the easy road, but I was definitely considering job security and availability in my area. I haven’t always been the rockstar that I am now 🙂 Har har har! But realistically, I was heavily involved in the .NET community, and I was invested. I still am invested, I want to see the platform succeed and enable developers to do great great things.
So anyways, here is how I thought it was going to play out. ASP.NET MVC was going to be developed, and things would go swimmingly. At the same time IronRuby would be developed, would grow in maturity and be released. Once it was released as 1.0, we would get full support in a future version of ASP.NET MVC. I even heard some of the same things being intimated by Microsoft employees. It would have been pretty awesome, but unfortunately it seems like it is an idea that is not going to happen anytime soon.
Which brings me to where I am at now, and my recent rant on Twitter. You see, I recently founded my own company. I am doing a bit of consulting to pay the bills, but my main goal is to build a product. I want to create something and watch it grow. In fact, the project I want to create will be aimed at the .NET developer market, but it is going to be a hosted service. I’m going to need to build a fairly extensive website in order for my users to interact with. I’m standing in front of a giant blank slate, and I’m having second thoughts.
Sure, my product is aimed at .NET developers, but should I build the website part of it in .NET? To many it may sound like an obvious answer, but for me it hasn’t been so easy. If I write the site in C# and ASP.NET MVC I’m tied to that for the foreseeable future. And that isn’t the worst thing I could imagine, I actually really like ASP.NET MVC, but it truly upsets me that in order for me to work with ASP.NET MVC I don’t really have a choice but to use C#.
And you may be wondering, “what is so terrible about that? I thought you just said you liked C#?” Well, I do, but I feel like I am coming to the end of that road. You see, I’m tired of all of the ceremony that comes along with writing C# code. I’m tired of interfaces, non-virtual methods, dependency injection, mocking, stubbing, generics, static, sealed classes, internal classes, etc… I’m tired of having to write my code differently than I want to, just so I can cram a few tests in there. I’m tired of wrapping framework classes so I can test them. I can’t tell you the number of times that I have written wrappers around caching, http context, file IO, the database, cookies, etc… I’m just tired of it. I’m tired of all of the limitations.
And these aren’t design flaws in the platform or the language. They did things the best way they knew how at the time. And they did a great job. Many of those people given the same set of requirements would probably repeat it all again, and that is fine. I, however, would not. If I were given the chance I would prefer a language that gives me freedom and choice versus a language which locks me down. The programming world is becoming more dynamic, and I think that the dynamic keyword in C# is a sign that while the language is rooted in type safety and performance, these times they are a-changin’.
Choices, choices, choices
And so I’ve found myself with a choice. A choice that, quite frankly, I’m pretty pissed that I am forced to make. I’m forced to stick with a platform that I know and love, and keep using the same tools and techniques that I have been for the past several years. Or I can move on to Rails and get the language I want and a web framework that is designed for it. If I pick that road then I’m going to have to learn a whole new ecosystem and new environment and it will be a challenge. Undoubtedly a wonderful and exciting challenge, but one that would be more welcome when I wasn’t trying to build a company.
I still haven’t decided what I am going to do. On one hand, I love the .NET community and everyone I know in it. I know that everyone likes to play up the community that they are involved in, and everyone outside of the MS community thinks that we are all just a bunch of shills, but you couldn’t be further from the truth. Most everyone I know in the MS community is just hard working developers that want to write applications to the best of their abilities and in the best way they know how.
I know that this post isn’t the polarizing, rabble-rousing, flame-war that you were hoping for, it is just one developer who finds himself in an awkward position. One that I think many developers are finding themselves in. Unfortunately the .NET community has had a few too many “I’m leaving .NET” posts recently, and I think that people are starting to pull back and get defensive. There are a few posts that have quite the elitist bent as well, which doesn’t help things.
Overall though, I think it is a grave mistake for the .NET community to dismiss all of these people as elitists and troublemakers. Instead, I think we should think long and hard why this trend is occurring with such frequency. Just this evening on Twitter Rob Conery made these two tweets:
Know anyone who has made a massive change in their career? Moved from one tech to another, or perhaps changed something up? Lemme know.
Specifically I’m looking for someone outside .NET who needed a change and came TO .NET.
To which David Heinemeier Hansson replied:
Tell me when you find Lockness and Bigfoot too!
And it was humorous. I chuckled, but at the same time there is a dark truth to that sentiment. Do you know anyone out there developing web apps on Ruby, Python, or PHP who is voluntarily moving to .NET? I hear about lots of old school language programmers coming over, mainly because their enterprises are dragging them along, but web developers seem to be shying away. (and yes, this is the internet, as soon as I make this statement, you will inevitably show up by the truckload)
Does hearing that question piss you off a bit? I hope so, because it means you care. And it is a problem that needs to be addressed in the Microsoft community. Until the problem is addressed, the Microsoft community is going to have a constant leaking of its best and brightest to other platforms, while having a large number of incoming developers who are there because their employer told them to program in .NET. We need those top tier developers, we need them to provide guidance to the masses, and we need them to keep Microsoft in check and moving in the right direction. And right now, it seems that in many ways Microsoft is moving in a good direction, but unfortunately on the language front it seems to be a different direction than many in the community want.
I wanted IronRuby, I wanted support within ASP.NET MVC, and unfortunately now I’m not going to get it. I want a fully supported dynamic language on the Microsoft platform, but it doesn’t look like I’m going to get that anytime soon.
So, enough with this rant, it isn’t anything that others haven’t said before. Ultimately, I just want to build something. And I want to enjoy building it. I’m pretty sure that is the same thing every developer thinks right before they embark on a new journey. And I’m also sure that it is the same struggle that many other developers are experiencing right now.
Oh Wait, One More Thing…
I just wanted to say that, yes, I realize that part of the reluctance to full support a dynamic language is because the .NET framework is designed mostly around static languages, and the interaction can be awkward at times. This doesn’t mean that it isn’t possible to make the two play nicely, it just means that Microsoft has a bit more work on their plate than they would like to see. 🙂