One of my previous managers used to tell us "You either pay now or pay later. If you pay later, you pay more". Years have passed and I have seen how true it is for an engineering team.
The dilemma is: the one who chooses not to pay now may not be the same one who pays later. Why would I pay now, so that someone else wouldn't pay more later? It's natural thing that we make selfish choices, unless there is something to counter balance it.
Here is an example, a real live site incident that happened recently. Our customer couldn't start the virtual machine from the management portal. The cause was in the following code, it threw
foreach (RoleInstance roleInstance in this.RoleInstances)
int currentUpdateDomain = (int)roleInstance.Current
When the developer pressed "." after
roleInstance.Current, he probably didn't pause and ask himself: would the
Currentalways be not
null? He probably didn't spend time to read the related code a bit to find out and put extra code there for safety (e.g. "
if(roleInstance.Current!=null)"). If he did all these (the pause, the code reading and the additional code), he would be slower. But that would have saved so much more associated with the live site incident: people's time spent on investigate the incident, the time to rollout the hotfix, and the time to handle the (unhappy) customer. But those time is not the developer's time. By cutting some corners, he probably got a few more work items done. Thus, he probably got a somewhat better performance review and promoted a bit sooner. Then he moved on and leave the team behind to "pay later but pay more".
Our performance review model doesn't help, either. In the annual review cycle, we barely can hold people accountable for something they did more than a year ago. Once bonus are paid and promotions are done, unless it's something really bad (like causing the subprime crisis), we are not going to take the bonus back or revert the promotion.
Among the things that we can do, one thing I did was to keep my team members' ownership unchanged for long time (e.g. two years, if not more) and told them so upfront. The benefits are:
- By fixing people on the same thing for longer time, the one who chooses not to pay now would be more likely the same person who will pay later (and pay more).
- By telling them so upfront, it does not only counter-balances the shortsighted cutting-corners, but also encourages the right behavior and investments in their areas that will lead to long-term successes. It's like if I know I am going to live in this house for at least five years, I will spend the first year cleaning up the weeds and fixing the irrigation system in the backyard, then plant the plum trees in the second year and keep fertilizing and take good care of it in the third and fourth year, so that from the fifth year onward, I get to eat the sweat plums while enjoying the sun and breeze in my backyard.
That's why re-org has a downside. In some companies where a re-org happens every 18-24 months, although the organizations get to more frequently optimize their structure and alignment, it also sets a norm that discourage long-term investments and successes: why bother planting the plum trees if I know I am going to move to another house every 18-24 months?
As Reid Hoffman said: "Good managers know that it’s difficult to achieve long-term success without obtaining long-term commitments from employees."
 I usually did it in a mixed way: some fixed ownership + some flexibility of changing projects once a while.