Fixing Perverse Incentives in Software Development

I read with interest an article about picking the right metric to incentivize desired behavior and thought I would add a little of my own personal insight. One problem with many (maybe most) software development organizations is that they inadvertently create perverse incentives, rewarding undesireable behavior and creating confusing and chaotic environments that, despite best efforts of all involved, seem to only on a hit or miss basis produce the desired result. Just as important, often the rewards are implicit and it isn't obvious that developers are actually being rewarded for the errant behavior.

Some short examples of widely used, but poor metrics I've observed as well as some simple and arguably better alternatives follow. For example:

  • Rewarding developers for "count of bugs fixed". Without accountability for who created the bug, this simply incents developers to release buggy half finished software that they will then subsequently be rewarded for "fixing". It's probably better to reward developers for "bug-free features delivered" or "lowest bug count".
  • Rewarding developers for "hours worked". Do we really want to incent someone to take 20 hours to do something they could actually accomplish in 20 minutes? It would be better to measure features delivered per unit time than simply the raw number of hours in chair.
  • Rewarding folks for being the "expert" in something. Inevitably this leads to situations where folks WANT to be the sole expert in something... hiding or obfuscating things or creating proprietary boondoggles that no outsider ever has a hope to figure out. Better to reward someone for creating something that is transparent and usable by all ... or better yet reward someone for teaching others how to do something than be the "expert".

Some examples of inadvertent rewards that crop up over and over again and reinforce the negative behavior:

  • We're going to pay you to your own mess. Yep, consultants love this one.. pay to build a mess AND fix it, you'll be gainfully employed for life! Maybe it would be better if we let you fix your bugs for free! on your own time! I wonder what would happen to the bug count in this case?
  • Look at the superhero. Wow! load balancer crashed and we had to call you on vacation because you're the only one who knows the root password/knows where the server is. What an ego boost! Perhaps instead we should celebrate the sysadmin who has NEVER had a server outage instead of the one who can't take a vacation because they're the only one who knows how to reboot the load balancer.
  • You're fired! This is a tricky one, and actually not a reward, but if there is a absolutely no reward in pointing out problems and ONLY risk, who's going to stand up and risk the axe for pointing out an honest error? It's much better to reward honest and constructive criticism of problems with appreciation for the effort and concern than creating a hide and go seek culture of "it's not my fault". I realize this is actually a risk, but I've put myself on a tight timeline so you'll have to live with it :)

While not comprehensive, hopefully we can use this list as a lens to view our software delivery teams and look beyond the superficial problems. In doing this, I believe, we can start getting better at constructing better metrics and rewards. This should lead to build better software, of a higher quality, delivered more reliably and quickly.

Comments

Popular posts from this blog

Push versus pull deployment models

the myth of asynchronous JDBC

MACH TEN Addendum: for companies wanting to use MACH platforms