My current gig at Pure Charity is my first developer
role where the technical environment is not .NET.
After 6 years of .NET development work, I've decided to leave .NET and work in Ruby. My reasons for making this change were largely technical but also reflected a change in attitude about building software.
This post will be an in depth explanation of my reasons for leaving .NET.
Back to Unix
Working with Ruby on a day to day basis has rekindled my love for Unix.
The philosophy of Unix is usually summarized as:
Write programs that do one thing and do it well.
This concept really identifies with how I think about software that I write and what makes my favorite software tools so great.
In college, most of my programming work was done on on Unix based systems. While much has stayed the same on the Unix side in the last decade, my toolset has changed slightly. Where I used to use Solaris/Linux, Emacs, and Bash, these days I use OSX, Vim, and Zsh, respectively.
Coming back to Unix was a big change from the Visual Studio focused Windows development environment that I had used for the past 6 years. But after a few months, I feel more productive than ever.
Git has become one of my favorite software tools. While some may think of it as just source control, for me it represents a different approach to distributed work, experimentation, and simplicity around source code.
Combined with the use of GitHub as a collaborative tool, Git has simplified my entire workflow around writing code, reviewing other people's code, and utilizing Open Source.
Most of the Enterprise tools that the vast majority of .NET shops use to accomplish these things come with far too much friction for my tastes. This friction leads to lots of wasted time, more bugs, and lots of general frustration among the Agile teams that I've worked with in the past.
Switching to the Mac
I purchased my first Mac in 2009 and I have found the hardware and the software on the Mac to be simple, elegant, and easy to use.
The single biggest benefit to the Mac is that beneath the flashy hood, it's a powerful Unix-based OS and can utilize all the tooling and libraries that Unix developers have used for decades. Coupled with the power of Unix and the ability to run familar software with the GUI or through virtualization, there's little reason for any developer to not consider moving to the Mac.
Another benefit that I have found with the Mac is that it requires far less baby-sitting of the Operating System in the way of driver updates, OS updates, and general system administration. By simplifying all of these tasks, the Mac has allowed me to focus more on consuming and creating content rather than constantly tweaking my OS or worrying about the latest update.
While some enjoy the tweaking, as I did in the past, I no longer enjoy spending my time that way. I now prefer my OS to stay out of my way so I can focus on perfecting my craft and building things.
Deploying to the Linux based Cloud
Many companies today are starting to move away from self hosted infrastructure and are instead deploying to Amazon EC2 or to other cloud based hosting providers. Such public clouds are built on top of the virtualization layers and foundations provided by Linux.
Unix based Operating Systems provide far more system level configuration, setup, and automation via the shell. These types of administrative tasks most often are done via GUIs in Windows, making things more inefficient by requiring more dedicated personnel to manage environments.
With Azure and other efforts, Microsoft is making efforts to address these short comings with Windows Server. But to me it makes little sense to pay exorbitant license fees for immature and less elegant solutions to manage cloud-based server infrastructure.
Joining the Ruby Community
I've always admired the Ruby community and the hacker focused culture around it. Open Source is at the heart of this community and reputations are built upon significant open source contributions. You'd be hard pressed to find a Rubyist speaker who doesn't put their code out there for the world to see and critique. This makes the whole community feel more genuine.
The Ruby conference talks are more often in a show and tell format. Rarely do I feel that the speaker is attempting to sell me on something or further their personal branding. The .NET community tends to have a strong vendor focus along with lots of self promotion at the speaker level. It's been refreshing to see less of this in the Ruby community.
The Ruby community also feels more self sufficient than the .NET community, since Rubyists don't look to a vendor to direct their technology stack. Many .NET developers will not approach a technology unless there is a Microsoft flavor of said technology, even if it is the poorer choice compared to mature open source offerings. There are countless examples of this over the last decade, and I expect to see countless more.
Working at Startups
After a few years of working with Enterprise Software companies, I realized that I'm better suited to work with startups. I prefer new product development over legacy software maintenance, and it's very difficult to find such opportunities inside traditional Enterprises without political maneuvering and a lot of luck.
In a startup, there is usually a lot more room for an individual to experiment and take ownership of an idea without getting too deep into internal politics and bureaucracy.
Unfortunately, startups are less likely to use .NET technologies due to its higher costs. To be fair, Microsoft has made efforts to reduce costs for startups through the Bizspark program. But after 3 years, a startup is still subject to very high licensing costs and has to strategically plan to pay for them or migrate off .NET. Given the choice, I don't know many startup founders that would choose .NET for new ventures today.
Additionally, there is a perception that .NET developers are too specialized to be effective generalists. Since I specialized in .NET for the past 6 years, this severely limited my options when seeking to work with startups.
Specialization is for Insects
My journey away from Windows and .NET has been around 2 years in the making, beginning with my purchasing a Mac and making a concerted effort to build a product using Ruby on Rails.
It's been a long and hard road to get here, but I received a lot of support from my friends and former coworkers who similarly left .NET recently. For their help, I am eternally grateful.
I've definitely had to make sacrifices to get here, including a loss of seniority, but I'm confident that I made the right choice and that these sacrifices will be well worth it in the long run.
In the future, rather than specialize solely in Ruby, I've chosen to grow more as a generalist developer. In the coming years, I'm looking to tackle other technologies like Node.js, Scala, Clojure, iOS, and Android.
I don't regret my time in .NET, as I made lots of wonderful friends and got the chance to work with some very smart folks. But it's time to move on to other things. I look forward to sharing more of my journey with you.