I've always found the conversation (mostly from the noSQL crowd) to be interesting. Many seem to hold this belief that for them to "win" someone must "lose". But why?
I've worked heavily in MySQL, SQL Server, Couchbase and MongoDB over the years. Direct comparisons between similar technologies to me makes sense. SQL Server is more powerful then MySQL. (Especially once Oracle took it over and wanted to put anything useful behind paywalls at the same time Microsoft is expanding what SQL Server Express can do.) They're an oranges to oranges comparison. In the same way you can compare Couchbase and MonogoDB. You can load all the same data in, build the same indexes and see which works better for you.
But how do you compare two things that, at least in my eyes as a developer, don't even compete? You don't.
At work we run production SQL Servers and MongoDB servers side by side. We write applications that use both at the same time. Their strengths are all we care about. How can we leverage XYZ to solve ABC? The use cases simply don't fit every design paradigm (I need a bell for when I type a buzz word I think) ding! Tools that work well for developers focus on getting what they do well up front and easily worked with. Don't focus on what you aren't. noSQL and SQL don't even compete as far as I'm concerned.
The Dangers of Picking Sides
As a person I will often play devil’s advocate for a lot of things even when I truly believe that the other point of view is better. I do this because it prevents "yes people" meetings. It makes me (and I hope the others with me) think about it from new angles. (Pro tip: Don't do this with your significant other, it makes for some very long, unnecessary discussions/arguments in which they think you're a complete tool.) It prevents making business decisions just because everyone happens to agree at that moment in time.
Sides can be dangerous to pick. If you pick a side it means you think one side must win. If your side isn't "winning" you will be emotionally affected by it. I think as humans we are designed to pick sides. But I think we pick far too many sides, we pick sides for things that don't even have a logical side vs side conflict. Case in point: noSQL vs SQL, technology that doesn't directly compete on most fronts. We pick sides for things that don't require a side to lose.
Steve Jobs once said for Apple to win doesn't require Microsoft to lose. As the underdog this was a brilliant point of view. It let them decide for themselves what winning meant. It wasn't defined by anyone else which means that winning could just be improving your own scores. Profits up year over year? Winning.
Picking a Side Makes Your Future Decisions Fate, Not a Choice
Every time developers start a new project they get the awe inspiring choice of what tools they should use out of the mountain of tools available to complete the job. Usually this decision isn't made alone, it's a group effort from the team to throw together the best tool belt to solve these problems. Of course by "best" I really just mean the sides that they've already picked to be on.
I have been guilty of this often enough myself too. I would like to think I'm less guilty now, but I doubt it. Previously I worked exclusively in PHP, at the time any new project came along PHP & MySQL were the answers! In retrospect I could have saved a lot of time and headaches learning another language that would have been far better suited to the problem. I eventually saw what Microsoft was doing with Azure and set out to learn C#. I recently went back for a client from five years ago and ported the old PHP code that I wrote to C#. It took literally 1/10th of the code. 1/10th. Not because I was bad at PHP (I mean, I was, but even looking over it I couldn't see how it could have been improved that much). But in their case PHP was simply a bad answer. Yes it worked, and given the circumstances when I wrote it doing it in another language wasn't feasible. But it was still, ultimately, the wrong answer.
Pick From What You Know
By no means am I advocating that every time a new project comes up should we all pick something new that we've never worked with. Understanding the nuances of a tool takes years of nothing but trial and error a lot of times. Understanding its strengths and limitations takes as long as well. But we should always keep in mind that not only will there be better ways to write some code, there is most likely a tool we've never worked with that could solve the same problem faster and better. If you pick sides you tend to disregard anything but your side. Let it go, let the tools speak for themselves on their own merits and follies.
Always Know More
But what you know should always be expending. I learned C# initially by just making side projects in it. Once I was comfortable I started writing tiny bits of production code and over time just got better. This is also how I started with Mongo and Couchbase. The only language I've learned in production was Classic ASP (my current job has alot of old code) and Objective-C.
It takes time but it’s an investment in yourself. Unless you've tried to write a database into MongoDB you won't really know the horror that happens once you can't look something up by its key (you can... but the query does not lend itself to maintainability).
On any given weekend I usually have a few side projects going. Currently I'm learning SignlR because there's a better way than just re-hashing JQuery AJAX calls and I want to know it. I don't work every weekend, pretty sure my wife would not support that too much. But I view continuing to learn as part of my job. Many disciplines have continuing education as a mandate. Programmers should to, especially given the pace of change in this field.
I experiment in my job as well. We don't have a lot of programmers where I'm at now so many times I do projects completely on my own which gives a lot of freedom when picking how you want to solve a problem. Every time something new comes along to work on I pick something small to learn along with it. This project needs CSS, time to learn LESS!
I use my blog to learn new things too. It's now inGhost running on Azure Websites.
Learning Pays Off
I probably wouldn't be so gung ho about always learning and bettering myself if it hasn't paid off ever. After I got a RaspberryPi I was trying to think of something to use it for. After a while I came up with server controlled digital signage and set out to write it. I posted it on Facebook where my manager saw it and thought it was cool (our core business is selling point of sale systems). A couple months later I met with some people from BP (yes, the oil company) and demoed a working version using production data from their systems. They were impressed and now Pis are being installed to power about 40 TVs in a refinery. (Yes, I was compensated for this work and idea.)
Learning C# and Windows development on my own paid off big time too since it's what got me my current job.
For me my next major language to really learn is Java. I want to write a Java web application as well as an Android application. If I wait long enough on Android I have a work project coming up that will throw me into it. Though I prefer not to learn on a hard deadline. If anyone has suggestions on other things I should take a look at tell me in the comments, I need to learn more!