Sachin Tendulkar is the greatest batsman ever. He has almost every batting record to his name. I used to play cricket at college and corporate levels. Sachin is a better batsman than me. Better than me by a factor of, say, 1000 times. In short, Sachin is 10^N times better than me. Sachin achieved this greatness by improving his batting skills. If we were to assess the performance of a batsman (on an annual basis), we can have the following aspects to consider:
  1. Number of runs scored
  2. Batting average
  3. Strike rate
  4. Man of the match awards
  5. Number of 100s
The output is highly visible and very measurable.
Is it possible to have a Sachin Tendulkar among programmers? Is it possible that we have a programmer who is 10^N times better than an amateur programmer. If such programmers exist, how do we find them?
Unfortunately, the performance of programmers cannot be measured that easily. To me, a good programmer is someone who understands the requirements well, provides solutions, designs and architects systems really well, communicate effectively with other team members, and writes maintainable and high quality code. These things are not easy to measure. But, some folks try to measure all of this:
  1. Number of hours logged (Utilization)
  2. Escalations or Feedbacks received (Bugs, Other personal attributes pissing the manager)
  3. Communication skills (Ability to talk politely, or fluently, Ability to write good English emails)
To go back to the analogy of cricket, Sachin is part of a team that competes with other teams. Today, businesses are more like a sports team. To survive, businesses need great products, which in turn, requires great talent. For software companies, great talent means excellent programmers (and managers). We have to measure the impact that programmers create for the organization (to compete). A few attributes that can make excellent programmers are:
  1. Excellent skills in a programming language, and coding algorithms
  2. Excellent skills in enterprise architecture and design patterns
  3. Excellent analytical and problem solving skills (requirements, providing solutions)
But, these attributes are not enough to make great programmers. For the modern world, a few more attributes are required.
  1. Quickly learn new methodologies
  2. Quickly learn new tools
  3. Proactively, suggest product features
  4. Quickly prototype features
A thing to remember is that Sachin makes lots of money. Excellent programmers (Sachin's of programming) should also make lot of money. This is possible only if programmers are part of a team that directly impacts the marketplace. Excellent programmers are excellent, only if, they work for revolutionary companies - Google, Facebook, Microsoft, or any Startups (where the impact of programmer is more).
In cricketing terms, Team India makes an impact in the cricketing world. But, my corporate cricket team does not. It is upto the individual to ensure that he is part of an impact-making team. Apart from cricketing skills, Sachin has the talent to sell his cricketing skills. This is an essential part of excellence. But, BCCI (Board of cricket control, India) also has a part in identifying and grooming talent.
My informal topic of research for several years is: How do great companies set up their performance assessment system to hone talent within the company? Most companies fall into the trap of having a system that works within their culture, or having a system that maximizes benefit to the organization (mostly in the short term). My objective here is to articulate a performance assessment system that hones excellent programmers and rewards them.
Greatness and Excellence comes out of passion to do. If we have a system, where everyone is evaluated on what they are passionate about, it will bring about the best in people. How do we setup a system where measurement is encouraging, beneficial, and evolves talent? Here is my attempt:
  1. Number of product features implemented
  2. Number of product features suggested (and found its way into the product)
  3. Number of prototypes developed
  4. Number of new things learned - products, tools, frameworks
Some people will say that this works for a product company but not a service company. Programmers in service companies can have similar measures:
  1. Number of projects implemented
  2. Number of new things learned - products, tools, frameworks, industry knowledge
  3. Number of features implemented / suggested within the project 
There are some numbers which cannot be captured. The impact to the project or the product cannot be captured in numbers. A verbal feedback is ok (especially for the average performers). But, the verbal or written feedback should be measuring impact in the above measures only.
Example of some ineffective feedback is:
  1. Productivity is low in the project. But, productivity may be good, if the programmer was involved in making unsuccessful prototypes or learning new technologies.
  2. There are too many defects. This is a bad metric because the complexity and dependencies in the project cannot be measured. Too many defects can also happen because of a good testing team. Defect detection and removal is an operational detail.
  3. Team work or Attitude skills are bad. This is a good indication of talent. Usually, people who specialize in honing a specific talent may be oblivious to a few. Mentoring or awareness can induce behavioural changes.
In my opinion, the above feedbacks are not really useful in getting the best out of employees. I like HCL's slogan: Employees first, Customers second. If this were to be put in practice, programmers should be evaulated by measuring their passion to work and not on the immediate benefits to the organization.