
I’ve been doing some rather “loftier” types of post, let’s return to something a bit more fundamental to (software) product development, user stories and in particular the INVEST acronym as developed by Bill Wake (see INVEST in Good Stories, and SMART Tasks). I was helping a coworker with some good examples of stories to showcase the INVEST criteria and felt this may be a useful post for people.
Let’s start with two formats User Stories may be expressed, we’ll stick with latter:
Who-What-Why
Or more commonly as
As a (role or persona)
I want to (perform some business function)
So that I can (get some business value/rationale)
Usually breakdowns in good user stories fail to articulate one or more of the INVEST criteria. Let’s look at each separately along with some examples.
I = Independent
We want stories to be independent; an independent story should be small vertical slice through most, if not all, of the software stack (UI, business logic, data persistence, etc.). Let’s start with a counter example to help demonstrate this.
As a decision-maker,
I want the data selection table menu to show the latest option results
So that I can determine which one to analyze.
Sounds OK right? Not really, the menu is a UI item. Where is this data going to come from, presumably a database, file, or API. It may get processed in a middle tier to do some filtering or sorting. The UI layer where the menu resides is only one layer; this story would be dependent on other stories in other layers to be able to be implementable. Usually any story that goes into the ‘how’, becomes less independent. Let’s rewrite it to –
As a decision-maker,
I want to view the latest option results
So that I can determine which one to analyze.
Besides appearing simpler, this doesn’t specify the menu, leaving the development team needing to do all the tasks to implement the results. Tasks could be querying the table, apply filter algorithm for outliers, sort from highest to lowest, display as a menu. It also doesn’t lock the team into the how – if the result could also come from an API or web service they can present those as an options to the product owner for selection; same with the menu, perhaps a table would be better.
N = Negotiable
Negotiable means the product owner and development team can make trade-offs on the priority of the story and/or acceptance criteria. Again let’s start with a counter example.
As a survey reviewer
I want to compare multiple respondent data sets
So that I can see if a correlation may exist.
What data sets? What data of the data sets? How is the product owner supposed to negotiate on this? Let’s add some detail –
As a survey reviewer
I want to compare age bracket data to geographic region
So that I can see if particular geographic regions contain particular high levels of a particular age group.
This is more negotiable; why? Suppose there was a second story –
As a survey reviewer
I want to compare income bracket data to geographic region
So that I can see if particular geographic regions contain particular high levels of a particular income.
Now the product owner can negotiate on which one is more important? They could also dig into acceptance criteria and talk about the ages or incomes that make up those brackets or what level of granularity they need to do for the regions. Often non-negotiable stories, ones that seem that MUST be done and can’t be ranked against others that MUST be done also are an indicator they are too big; they encompass too much.
V = Valuable
Another counter example will illustrate a story that doesn’t articulate value…
As a decision-maker,
I want to view the latest results
So that I can see them in order.
Why do I want to see them in order? (It’s presumed the order desired would be acceptance criteria. Better to specify the why, this also usually indicates why not only is the function needed, but why the particular acceptance criteria was chosen. Here is our refined story again –
As a decision-maker,
I want to view the latest results
So that I can determine which one to analyze.
Now we know why we need to do it.
E= Estimable
We don’t care so much about the estimate, which is one reason we use relative estimation based on complexity over trying to nail down an estimate in effort/length of time (hours for either). We care that some amount of certainty in the complexity can be articulated; this gives us a gauge that it is understood well enough to start. The higher the estimate, the less certainty, meaning it is more complex. At some point, this may require splitting into 2 or more stories to reduce complexity.
As a investor,
I want the latest analysis
So that I can decide what to do.
What do we mean by latest analysis? How do we estimate that? And that value statement doesn’t help; what decision are we trying to make – the business function – and why do I want to make it – the why. Here’s a story that may be estimable (providing acceptance criteria can be drawn from this)
As a investor,
I want the latest ROI graph with my minimum threshold shown
So that I can decide whether to continue making this investment.
OK, we want a graph, which we know must draw on data; if the raw data needs to go through calculations, we will need to do that. This threshold, is it entered or stored somewhere? Looks like well need tests to ensure the calculations are done properly. If we need to ensure web accessibility for people with sight disabilities, we may need a textual equivalent. Regardless, even with this uncertainty, being able to see most of the tasks and thinking on their complexity will give me the ability to estimate. Many have found that the estimate becomes pointless once the team actually has confidence they can complete it along with other stories in an iteration; remember this is mostly to describe common understanding. This may take months or even years to get to that point though.
S = Sized properly
Hand-in-hand with estimable, is sizing. If the story is large, really complex, then we need to think about splitting it into smaller independent stories. A good example of a story that is probably too large is the first story that dealt with a survey reviewer. The stories that follow it describing the data sets to compare are smaller and clearer and probably could be successfully implemented within an iteration. Who knows if the first one could? Also, if I couldn’t I get no partial credit for getting some of it done. If I get any small story done, then I can take credit for it.
And lastly, T = Testable
Testable stories are determined by their acceptance criteria. Let’s go to our first good story and fill in some acceptance criteria to see this clearly.
As a decision-maker,
I want to view the latest option results
So that I can determine which one to analyze.
When we turn the card over, we find the…
Acceptance Criteria:
- Display options as menu choices
- Display options in descending order from highest to lowest
- Display results below my threshold in red and bold these
- Don’t display negative results
- Option results are calculated by the uncertainty index to the simulation result
- Return the results in 0.3 of a second
These are easily testable, manually or in an automated fashion. (NOTE: there is a more sophisticated method called Given-When-Then from Specifications by Example by Gojko Adzic that allow these tests to be more easily automated in tools such as Cucumber.)