Using Agile in less-than-perfect situations since Y2K
Great post from Bill Mill. Go on, read it. When you’re done, here’s the key quote:
The Warriors could optimize like crazy for the press, but they’d be training and working and trading and drafting to be, at best, a pretty good team.
This is why those that preach from the gospel of Lean try to impress upon us that local optimization is an insidious evil. It often looks good from a certain viewpoint, but it can hide other improvements that would provide a more holistic benefit. It can even prevent you from reaching your true goal.
I generally like reading what Joel has to say. I respect that he is running a reasonably successful software shop and doing it in what he believes is the best way possible. Even though I often find my own version of the “best way possible” a little different, his writings are thoughtful and good fodder for further discussion. However, I have a bit of an issue with his latest article in Inc.
I agree wholeheartedly with the majority of this article. I have heard of Robert Austin’s work before, and agreed with it then. I have personally seen incentive programs fail for numerous reasons. No, it’s not the overall article I have a problem with. It is the very last paragraph. Joel spends the entire article building up a great case for not using traditional incentives because they can’t be set up to work and then, just when you expect a sage solution, completely backtracks and says in essence, “Forget all that. They will work if you set up the right rules.”
Huh? No they won’t. People often don’t even realize they are gaming the system. The problem is not that the right rules are not in place. The problem is that the right thing to encourage is the overall success of the company or (maybe) the project, not success in a single dimension or even of some set of “key performance indicators”.
First and foremost, do not give individuals bonuses at all if you can help it. For example, provide a team with a bonus based on working software delivered to production that has been bug-free for 30 days. If that won’t work for some reason, make sure the bonus is tied to long-term effects. Tie the sales bonuses/incentives to customers that are sold profitably and still happy and profitable 30, 60, or 90 days after delivery.
Frankly, better yet, just pay people a good salary and forget the bonus. Or, if it makes you feel better, go back to a Christmas bonus, but base it on the health of the company as a whole.
This is the second part of a long post on iterative and incremental development. In Part 1, definitions were provided to distinguish both practices from the general term “iterative development”. This part describes some pitfalls of doing one without the other and how each adds value to the other.
The pitfalls of only iterating without incrementing are simple to summarize: nothing new is added. That is, if iterating is the practice of improving what already exists, then it provides no facility to add functionality to a system. While — in theory — the product and/or process would eventually be as near to perfect as humans can make it, the overall value would not increase.
Though it seems contrived, this happens in real projects. For example, assume that a new project starts its first iteration with requirements that are not properly thought out. The product that is created will not make the customers happy. They will want changes: improvements. They iterate on the requirements themselves, resulting in iteration on the product. The project team then discovers that the new implementation could support the changed requirements better with a change in architecture. They convince the customer to allow them to make the improvements. Meanwhile, the customer has spent so much time thinking about this one requirements set that they start to “need” more bells and whistles. Soon, updates to the requirements are created, and the cycle begins again.
The pitfalls of only incrementing without iterating are a little more complex. If incrementing only adds to what exists, then it is not spending effort to improve what is already there. At an extreme, this would be like sealing each iteration result in a shared library file (DLL, jar, etc.) and requiring each subsequent iteration to only use those pre-compiled artifacts. In a more realistic example, this is simply not allowing time for refactoring. Another version is skipping the retrospective or not implementing any of the improvements suggested by the retrospective. Both result in creating or failing to remove hurdles that slow or block progress.
Incrementing without iterating is more common in my experience. It is somewhat easier to see the lack of value increasing when nothing new is being created. It is more difficult to tell when the rate of value increase is stymied by technical, project, or other debt.
If you spend a portion of each period of work improving what has been done before, you can remove those hurdles that prevent progress. By making sure that a portion of each period of work is spent on adding new features or practices, we reduce or prevent unnecessary gold-plating and particularly wasteful forms of analysis paralysis. In short, each practice fills gaps left by the other.
At some point (1994 according to Alastair Cockburn’s article), the project management and process community made the interesting decision to combine these to in the single term “iterative”.
Was it, as Alastair says, because they were just happy to be “repeating the cycle”? My hope is that it is more because they saw the need for both to work together. The term may have been a poor choice, but combining them is a great choice.