Friday, March 05, 2010

Developer Skill Sets: There is no such thing as an Intermediate Software Developer ...

At every company I've worked, the performance reviews have been structured nearly the same way. Software developers are graded on perhaps five different traits:

  1. Technical skills - How well do you code?
  2. Debugging skills - How well can you do maintenance work?
  3. Communication skills - Can you write effective email, documentation and talk to your team?
  4. Business/Marketing awareness - How well do you know the market this company plays in and the competitors?
  5. Time management - Can you focus on the task at hand?

The weight applied to each category varied depending on the developers position of Junior, Intermediate or Senior, Team Lead, etc.

While these are not bad, in the general sense, there are two very large buckets in the above list where a multitude of sins can occur: technical skills and debugging. Fine granularity is important to software developers when it comes to performance reviews. If you want a developer to exhibit great code craftsmanship, then you need to be explicit on what you value and reward.

What Can We Do To Revitalize The Old Developers Performance Review?

Let's look at the table stakes; skills every developer you hire should be able to exhibit before you hire them! These are not skills you want to teach on the job:

  1. Solid core CS skills - algorithms, complexity, architecture, underpinnings, etc.
  2. Operating system essentials - scripting, backup/restore, boot process, device management, remote access
  3. Programming as a passion - They program recreationally and perhaps have a few side projects on the go. They never got into CS just because they thought it was a sound career choice.

I assume I'm getting these skills from a good programmer right out of school. More is nice, but I don't assume much more. Code craftsmanship is rarely taught in school. It comes from the school of hard knocks. Once you've been beaten into submission by a chunk of code you can start to think about how to do things better.

If we break Technical Skills and Debugging Skills down, what could this list look like? Here are the things I like to see in every developer that I work with:

  1. Adheres to coding style
  2. Correctly applies our core development idioms
  3. Follows language best practices (knows "Effective [Foo]")
  4. Maintains useful documentation 
  5. Writes effective tests
  6. Writes tests that act as teaching aids
  7. Is able to focus
  8. Contributes constructively in development discussions
  9. Experience with dynamically typed, static typed and functional languages
  10. Can grok new topics quickly
  11. Understands scalability concerns
  12. Understands usability concerns
  13. Effectively uses Patterns
  14. Refactors in a timely fashion

(What would your list look like?)

You give me a team of developers that have those skills and we will conquer the world! Obviously not everyone, especially anyone straight out of school, is going to have that skill set. The above list is really a road map to great code craft.

Personally, if over the years, I was given this list in my performance reviews it would have given me a lot more career direction than just "better technical and debugging skills". I would have loved to learn that I need to focus more on "writing tests that act as teaching aids" and that I'm considered great at "groking new topics quickly".

Given a suitable list, any company should be able to delineate what they think it means to be a Junior, Intermediate or Senior developer.

Perhaps:

  • Junior: < top grade in 5 topics, 
  • Intermediate: top grade in 5 to 9 areas and 
  • Senior: top grade in > 9 topics? 

(What would work for you?)

I have a theory about this: There is no such thing as an Intermediate developer! You are either Junior or quickly on your way to becoming Senior. If a developer stays in the Intermediate designation for too long the company should re-evaluate their role in the company. Sounds a little harsh but, assuming they are being given every opportunity to advance, why are they not? Not everyone can be an astronaut.

More so, these skills are applicable to nearly any company. Most programmer job ads have stuff like this:

  • Knows Struts, Hibernate and JSP
  • 3yrs experience with Powerbuilder 6.x and Oracle Form Blaster 
  • Has Cake PHP experience
While I understand the motivation of getting a developer that can hit the ground running when you hire them, I would argue that a developer with the craftsmanship skill set listed above would be handle any of those specific domains with little problem. I would also argue they could probably do it better than developers that only focus on those specific tools. There needs to be a balance. Yes, confirm that the developer has the specific skills needed by your company, but more importantly, make sure they have the Code Craft skills to not do more harm than good!

Would you hire a developer to work on your desktop graphical C# application if they only have Ruby on Rails experience? Would you change your mind if they could demonstrate great code craft and general language diversity?

This is a hard problem. How can a developer prove they have good code craft? Sadly, I don't have a good answer for that right now. I don't think certification is the answer. The closest thing I can think is their demonstrable participation in an open source project. I'm open to suggestions here and will continue to post my thoughts on the topic as they come.

Is Code Craftsmanship The Only Thing?

If code craftsmanship was the only thing that mattered to a company we would all be contractors … disposable drones brought in to do a task as needed. But we know this is not the case. The longer you work at a company, the more you should learn about how the company makes money. Who are their competitors? How do their products differentiate? Who are the key customers? How do customers use the products you create?

A developers value in a company is multiplied greatly by their awareness of these factors. The other part the performance evaluation and hiring criteria needs to take these factors into account. A very valuable software developer is one that:

  1. Designs with product vision in mind
  2. Identifies pending delivery roadblocks in a timely fashion
  3. Researches new technologies, languages and tools applicable to our product mix
  4. Helps improve our operational efficiency
  5. Contributes to our competitive advantage
Software developers that write solid code and understand the business are your greatest assets. Guard them accordingly!

Your thoughts?

4 comments:

Adam Burry said...

To your list of tecnical and debugging skills I would add:

10a. Has read Heinlein.

gboruk said...

This is great! I think we have a lot of parallels in thinking. A developer is not just a code monkey. There needs to be method, and thinking. I think some people think that a developer is just a "do-er". They miss the fact that he/she is a knowledge worker and therefore don't expect a developer to think about providing business value, only code. This is sad in my opinion. Great post! :)

-Gennady (@gboruk, http://www.gboruk.com)

TonyZeigler said...

In my experience the most important trait is the willingness to ask questions to fully flesh out what is being requested.

For example - one time a co-worker who had moved on to another team in the same company asked me for my opinion. "Can you make a scheduled crystal report save to a directory on another machine?" If I hadn't asked questions I wouldn't have been able to offer a better solution to their real problem. "Sounds like a better solution would be to just write a unix script that queries the db, saves the result as a comma delimited file, and ftp's it out to the client. You can schedule it via cron".

And yes, they had somehow intended to use that report to fullfill a requirement the client had for an ftp of a flatfile. :)

If the person isn't willing to question you for the details of a task - skip em.

MyDarkSecret said...

@Tony, that's a very good insight. In interviews I often ask "What do you do for fun?", and hopefully the answer contains some form of "there's this coding project I'm working on". Great developers always seem to be coding and that questioning nature you speak of is the fun part of programming. Thx for that.