- Technical skills - How well do you code?
- Debugging skills - How well can you do maintenance work?
- Communication skills - Can you write effective email, documentation and talk to your team?
- Business/Marketing awareness - How well do you know the market this company plays in and the competitors?
- 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:
- Solid core CS skills - algorithms, complexity, architecture, underpinnings, etc.
- Operating system essentials - scripting, backup/restore, boot process, device management, remote access
- 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:
- Adheres to coding style
- Correctly applies our core development idioms
- Follows language best practices (knows "Effective [Foo]
- Maintains useful documentation
- Writes effective tests
- Writes tests that act as teaching aids
- Is able to focus
- Contributes constructively in development discussions
- Experience with dynamically typed, static typed and functional languages
- Can grok new topics quickly
- Understands scalability concerns
- Understands usability concerns
- Effectively uses Patterns
- Refactors in a timely fashion
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.
- Junior: < top grade in 5 topics,
- Intermediate: top grade in 5 to 9 areas and
- Senior: top grade in > 9 topics?
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
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:
- Designs with product vision in mind
- Identifies pending delivery roadblocks in a timely fashion
- Researches new technologies, languages and tools applicable to our product mix
- Helps improve our operational efficiency
- Contributes to our competitive advantage