Posts Tagged agile
Years ago at one of my previous jobs, I remarked to a coworker when we were trying to move the organization to agile that “Before, we were about as agile as an 80 year old man with arthritis. Now we are about as agile as an 80 year old man with arthritis wearing a leotard.” We had done a lot of work dressing ourselves up with agile methodologies, but our core way of operating did not change. And when that happens, the result is about as pretty as the analogy implies.
Agile, it seems, is yet another example of a promising technique that has degraded down to a technology buzzword. As an abstract concept it is easy to wrap your head around, but attempts to implement it seem to have mixed results. But I think there is still quite a bit of usefulness in it, if you know where to look. Lets start by pulling out the thing that began the whole movement, the Agile Manifesto.
Manifesto for Agile Software Development
We are uncovering better ways of developing software by doing it and helping others do it. Through this work we have come to value:
Individuals and interactions over processes and tools
Working software over comprehensive documentation
Customer collaboration over contract negotiation
Responding to change over following a plan
That is, while there is value in the items on the right, we value the items on the left more.
I find a few things about this interesting. Lets start with the first value. “Individuals and interactions over processes and tools”. Yet despite this ‘value’, think about how many agile tools are in existence. Tools that let you draw up story boards, generate burn down charts, calculate velocity, etc., all without needing to directly interact with other individuals in the project (and don’t get me started about ‘agile processes’). As far as the second one goes, I’ve heard it remarked how ironic that a philosophy that demphasizes documentation has so many books written about it. The third one is a nice idea, but largely depends on your customer. Often customers see the whole point of paying someone to build a software product for them is so they don’t have to be involved, and to be frank, I’m not certain they are wrong.
But its the last value that I think is both the most core to agile development, and is most often misunderstood. Being able to quickly respond to change, such as new requirements or new discoveries about existing requirements. Because unless you are working on a tiny project you can hack out in a weekend, its unlikely what you finish building looks much like what you had in your head when you started. This idea has been often interpreted as meaning skimping on the design phase, and just go through endless cycles of code, test, repeat until you get something that meets your requirement.
In fact, I think this tends to accomplish the exact opposite of the stated goal; being able to respond to change (unless by change you mean throw everything out and start from scratch). Without considering design principles such as encapsulation and separation of concerns, changing the direction of your codebase is going to be a painful exercise of pushing mounds of unmaintainable spaghetti code around. And not going through a design phase requires you to solidify assumptions in your codebase, which then becomes hard to fix should those assumptions turn out to be false (which, as agilists like to remind us, they likely will).
The best way to write code that can respond to uncertainities and changing requirements is to break the problem down. Then should a requirement change that renders one part of it obsolete, you don’t have to rewrite your entire application, just that single module. And if each module can be made small enough that its risks can be better understood, you will have a much better chance at mitigating those risks once you have reduced the scope of the problem to a small enough size. Of course this break down requires some up front design and thought about the problem. You can’t just divide everything up willy nilly and expect to get pieces that will eventually fit together. For instance, if you have requirements that the application be both reliable and scalable, you can’t separate those two out as distinct requirements. Not only are those requirements that tend to be impacted by every part of your application, but if they are implemented incorrectly they can conflict each other.
Nowhere in the Agile Manifesto’s right side items is the word ‘design’ mentioned as a lesser value, so its odd that its so often assumed agile dismisses it. In fact, much of what agile preaches applies to design just as much as code. Work with your stakeholders when designing software, don’t just throw it in a modeling tool never to be seen again. Make sure your design is focused on working software, not just building up documentation. Make sure your design is not too rigid that it can never respond to change. And always, always remember to test your design decisions, which typically requires working with your customers to make sure what you are designing is what they indeed want.
You a member of an agile development team planning out your next sprint. You have estimate your velocity at 33. You currently have a load of 32. There is a remaining story that has been estimated as having 2 story points (using a Fibonacci sequence). Would it be a mistake to try to fit it?
If you find yourself asking this, you are doing it wrong.
One premise of most agile techniques is that we are really bad at estimating. Story points do not try to correct that fact, they simply work around it. Unless you have the gift of psychic clairvoyance, there is no point in attempting high precision estimates because any such estimate will be wrong. Hence the use sizes that increase either exponentially or through a Fibonacci sequence. Assuming you were reasonably accurate, that story you estimated at 13 points might be as little as 12 points. Or it might be closer to 15.
Remember high school chemistry when you learned about significant digits? Story points are so low precision they don’t even have one significant digit. And in a calculation involving low precision measurements, claiming a higher precision result is misleading at best. Its downright fraudulant at worst.
So back to our above scenario, claiming your story point load is “32” is wrong. You don’t have enough precision in your measurements to say that. In reality, your load without that extra story is better expressed as “around 30”. And with the extra story, it is also “around 30”. If your current load is dominated by a couple 13 point stories, those are what will determine whether or not you meet your goal. If it is dominated by many small 1, 2, or 3 point stories, you are misleading yourself if you argue you can predict exactly how many you are going to finish.
Is my point that you should give up on estimating? Of course not. Just don’t obsess yourself with getting all your numbers to line up. Commit to enough that you feel comfortable with, and then give yourself plenty of stretch goals. That way you can meet your commitment if your estimates were too low, and you will have enough to do the entire sprint if your estimates were too high. Because all you really know is that it is unlikely your estimates are spot on.