After I made my opinionated post last week on the pointlessness of debating what the “best” is in regards to programming languages, frameworks, etc., I got a rather substantial amount of feedback/whiplash from it. I really appreciated someone submitting the post to Hacker News because it ended up generating a lot of great commentary that made me rethink my thoughts on the matter. Have I changed my story? Not really. But, I need to clarify a couple of things.
One of the better responses that I saw came from Ryan McGreal who I thought made an excellent observation:
“It seems to me that the author is ignoring the relationship between experience and expertise in a language. Programmers call themselves [language/framework] developers because they’ve invested a lot of time becoming proficient in that language/framework. Of course there’s some skills transference when you pick up another language, but they’re not commodities and they’re certainly not entirely fungible.”
Ryan is totally right, and I admit that I carelessly made some rather abstract comments without mapping them back to reality. As professionals, we all need jobs, and those jobs come with a label attached to them (e.g. ASP.NET developer). In order to be valuable for those jobs we need to do our best to excel in a specific language and/or framework (most likely both). I was never trying to call out that truth or somehow sound disillusioned to the way you can become successful.
What I need to clarify though is how I view developers, their multiple personalities, and their immensely powerful ability to change between those personalities as needed. When I think about software development as a whole, I think of it as a series of different personalities that people can choose to adopt over time. For instance, if somehow along your career path, you do a stint as a DBA, you’ve acquired that personality. Done embedded development? You got another. Written ColdFusion? Eek, sorry about that (I know how you feel). Worked with functional languages? Guess what? You’re now changed forever.
As your career progresses, your “value” can be calculated in one of two ways: how many personalities you’ve acquired, and how strong some of your individual personalities are. The former is what I focused on in my previous post, the later is what I believe Ryan was referring to, and in most cases is what lands you a job in the real world. But, is that what makes you the most flexible? Or the most well-rounded? It’s hard to say.
I’ve interviewed many developers who applied to a position that was attached to a specific programming language, and didn’t even know that language, but I still gave my recommendation to hire them. The reason was that I felt comfortable enough with their current skill set that I knew I could not only mentor them to transition in another language, but they could become really strong. Truthfully speaking, I never once saw a negative recourse from one of those decisions (thank goodness!).
To me, these types of incidents have always spoken to the fact that a good developer, who has strong fundamental knowledge, paired with the right team, can easily move between languages and frameworks. Everything out there is made up of the same ideas, they’re just worded differently. Give someone the right translator and they’ll be happy to speak the language. Anyone who is running a development team, and doesn’t try to see that potential in people, is doing themselves and their team a disservice.
This anecdote doesn’t exactly hold up for contractor positions where a company is looking to hire someone with a specific skill for a specific amount of time. But, I only think my point degrades from the perspective of the company, not the developer. The next subheading will explain why.
Human Duck Typing
Besides the case of a developer who can flexibly move between languages/frameworks due to his core knowledge, what about the developers who have strong knowledge in multiple areas? I personally know some guys who are ridiculously versed in both PHP and Java, or .NET and Ruby, or both C# and Scala, etc. What do you label those people as? I don’t think that you do, but that’s just me.
If our expertise were like a base class, we could only ever have one (in most languages), but I think many of us can agree that inheritance is overused. If expertise were like attributes that a person could have, then we wouldn’t really care what they labeled themselves as, because we’d only be concerned with the fact that they can speak the language we want them to. That is exactly why “duck typing” in programming languages can be so useful, because from a programmatic perspective it allows us to not be considered with what something is, but what it can do.
When a company puts out an ad for a “Ruby developer”, the guy who has multiple different technical personalities, one of which is Ruby, could then apply for that job, and everybody wins. The company had to choose a specific attribute to ask for up front, but if they were really smart, they’d be interested in a lot more in the long run. In some ways this can also be paralleled to claims-based identity. The identity provider could have a whole ton of information on a user, but the relying party only requests the bits it needs. Likewise, a developer can contain a whole slew of technical prowess, but an employer is only “demanding” a few primary ones.
Wrap This Up For God’s Sake
If you strip out all of the ridiculous analogies and ramblings, all I was trying to say is that as a developer I love sharing ideas with other people and gleaning from them parts of their technical personalities (read my other post here). I feel like this is what makes me a better professional, and keeps my interest in the industry fresh. I appreciate other developers who have a similar interest in learning, and take the approach with their career to try to be as well-rounded as possible without sacrificing the expertise in the areas that make them valuable. At any given time we’re obviously going to have a stronger slant towards the technologies we’re using, but that doesn’t mean we have to settle ourselves in that bucket in terms of conversation. Be what you need to be for your day job, but be all that you can be for your community.
FYI, I realize that was disgustingly cheesy, but it was just too awesome an opportunity for me not to close it like that
This morning, 