Tuesday, November 18, 2008

Specialize in Something Relevant

generalist: a person competent in several different fields or activities
If you read my blog entry on Language Specialization you might have concluded that I prefer generalists. If, in our industry, generalists were what the definition describes, then I would prefer generalists. Unfortunately, business software developers seem to have created their own definition of generalist.
business software developing generalist: I know how to do the simplest tasks with many different languages/tools, but I can not be considered competent with any of them.
I blame Scott Ambler. To me anyway, it seems like the daft generalist movement started when Scott wrote Generalizing Specialists.

Our industry has always been saturated by bad programmers. I'm on record stating that at least 50% of the people writing business software should find a new profession. The problem with bad developers is that they take good ideas and turn them in to monstrosities.

I remember reading Generalizing Specialists and being inspired. I thought Scott gave fantastic and relevant advice. Unfortunately, many bad or junior developers heard: Don't bother to deeply understand anything, instead, you're agile if you know a little about everything. Suddenly, when I started interviewing developers I ran into situations like this.
  • me: So, I see you have Erlang on your resume, how do you like the language?
  • candidate: I like it's concurrency handling, but I'm a bit weary of it's syntax.
  • me: (thinking - okay, do you have any original thoughts on Erlang?) I can understand those points of view, what problem were you trying to solve with Erlang and why did you think it was the right tool?
  • candidate: Oh, I really only got through the 2 minute tutorial, you know, hello world basically. But if you guys have Erlang projects you want me to work on I'm happy to, I'm a generalist, I like all languages.
  • me: Okay, so what language would you say you know the most about?
  • candidate: I don't bother to specialize, I do a little bit with each language, you know, hello world or whatever, so I can use the right tool for the job. That's the best part of being a generalist.
  • me: (thinking - this interview is already over) Okay, so tell me about the languages/tools you've had to use at your different jobs?
Inevitably, the candidate doesn't even have a deep understanding of the tools they've used at work, because they are too busy doing hello world in every language invented. They also love to say that they take the Pragmatic Programmers advice to extreme and 'learn' several languages a year.

The truth is, these generalists have little in the way of valuable knowledge. They provide their projects with little more knowledge than a Google search can bestow in 30 minutes. In short, they're worthless, if not destructive.

I don't actually blame Scott Ambler. In my opinion he was right then, and he's right now. Become a Generalizing Specialist is still the advice that I currently give developers.

Specializing in something makes you an asset to the team. If I'm building a Web 2.0 website, I want everyone to have an understanding of HTML, CSS, Javascript, Ruby, & SQL. However, I also want each team member to specialize in one of those areas. Knowing IE quirks is just as important as knowing how to optimize MySQL. And, I want to make sure I have team members that can get into the deep, dark corners of delivering highly effective software. That doesn't mean everyone needs to know what a straight join in MySQL does, but at least 1 person should. The rest of the team isn't entirely off the hook though, they better understand how to write basic SQL statements that are maintainable and at least semi-performant.

Becoming a Generalizing Specialist takes time, but the first step is becoming a Specialist. Once you deeply understand one language/tool, you can move on to the next relevant language/tool. How do you know when it's time to move on? When you start having answers to questions that people aren't asking. If you're constantly looking up answers to common questions, you aren't a specialist. However, if you start providing more (relevant) detail in your answers than people are looking for, you're on your way to possessing the deep understanding that a Specialist should have. At that point, it's probably time to start looking deeply into something else.

One painful mistake to look out for is specializing in something less relevant. If you work for a trading firm that writes only thick client applications, understanding why Chrome's Javascript VM is better than Firefox's Javascript VM is probably not the best use of your time. It's true that you may move on to a web application at some point, but by then your information will probably have become stale anyway. Stick to specializing in things that you work with day to day. Your language, your IDE, the Domain Specific Languages you use in your applications (regular expressions, SQL, LINQ, etc), or the frameworks you use (Spring, ASP.net, etc) are things you should specialize in to increase the value you provide to your team.

Eventually, you become competent with several different tools and languages. You've become a Generalizing Specialist and as such you are significantly more valuable to your team.

10 comments:

  1. Great ideas---this is very helpful to me. I'm a relative newcomer to web application development and am spending a lot of time after work learning new things, but I definitely am going to follow your advice and concentrate on getting more in depth with things I'm actually going to be using at work. Thanks!

    ReplyDelete
  2. Anonymous4:01 AM

    Hahaha, almost as funny as all these guys that come looking for work sporting a "computer science" degree.

    me: "- ...but what can you DO?"
    graduate: "- But I have a COMPUTER SCIENCE degree, I went to UNIVERSITY!"
    me: "- Yes, but what do you know, what can you DO with your knowledge!?"
    graduate: "- As I said, I have a..."

    ...and so on...

    ReplyDelete
  3. I still believe that learning in general is a worthwhile thing even if your knowledge can become stale before you have a chance to use it. Other languages and frameworks can definitely teach you something and expose you to ideas which may be useful down the road or simply make you a better programmer today.

    So for me taking either advice to the extreme is probably not the best advice. Just focusing on immediate work related things is too narrow and learning hello world in every possible programming language too shallow. I guess a sensible balance is the best course and generally the course that I personally tend to pursue.

    Cheers

    ReplyDelete
  4. Anonymous8:31 AM

    Hi, start reading you blog entry reminded me a off a saying in The Great Gatsby. "I.. become again that most limited of all specialists, the 'well-rounded man'."

    ReplyDelete
  5. Anonymous12:30 PM

    This is just too stupid. How do these people even get to an interview?

    When I was done with my Comp.Sci. degree I had been programming straight for 3 years in C,Java and Python contributing to mostly two OSS projects.

    Now I've stared a company and are not even considering people who do no show me some kind of portfolio of previous works.

    ReplyDelete
  6. Then you're also on record as not being very good with economics.

    ReplyDelete
  7. Anonymous12:14 AM

    I agree with Anonymous. College degrees are overrated, and so on.

    ReplyDelete
  8. Anonymous5:15 AM

    To play devil's advocate-------

    While it's a little bit off topic, you haven't had anything original to say about Erlang either.

    http://blog.jayfields.com/2007/10/erlang-interest.html.

    This is the only real post on Erlang I could find of yours through Google; and while it's lengthy, it doesn't convey an original thought at all. (well, maybe the testing bit, but there's not much meat there). A "Hello world" in Erlang shows more thought to me than a short reiteration of a Gartner summary in a blog post.

    ReplyDelete
  9. Anonymous1:17 PM

    Anonymous: I love a devil's advocate.

    I'd say you're right, with the exception that I haven't seen anyone else talking about being able to run tests in parallel as a huge win for Erlang. But, other than that, I didn't say anything original.

    I think there's a big difference though. I wasn't claiming any level of competence with Erlang. Instead the post is about interest in Erlang.

    You probably wont find any other Erlang related posts, because I haven't found a problem that Erlang seems to be the best tool for. I don't tend to write about something unless I'm actually doing it.

    Though, if you skim my posts, I think it's pretty clear what technologies/tools I do specialize in.

    Thanks for the comment.

    ReplyDelete
  10. Anonymous9:29 PM

    I quite agree with the "first specialist, then generalist" point, and I would say : in all the fields of live.

    But I'm not sure on the limitation of the specificity. Everything (especially in computing) get stalled quickly.

    Shouldn't the recommendation for the first specialty go to something that force to face more problems, rather that something that will be more useful and durable?

    I mean : it's ok to study in depth the implementation of a js vm, as soon as it learns to solve problems and bring something like a general method of thinking and the strength to keep on fighting against problems.

    ReplyDelete

Note: Only a member of this blog may post a comment.