What is a User Story?
I have absolutely been guilty of this in the past - when I first learnt about user stories, I too thought that there was a right and wrong way to write them, because when you’re starting to learn these methods, good, concise information is hard to come by. So here’s my attempt to explain the concept in all its complexity as concisely as I can, so that you can understand the theory and then figure out your own way of practicing it.
WHY ‘Stories’ and not Features or REquirements?
It’s the difference between saying “I need a calendar” and “I need to know if I have any plans next Tuesday". The former is prescriptive - a calendar is a calendar whichever way you look at it. But the latter is a story, because it’s a conversation starter. There are dozens of ways to solve the problem of knowing if you have any plans next Tuesday, and a better solution than a calendar might be a virtual assistant.
This change of perspective reduces the risk of a project failing by allowing development teams to work in a more flexible way. If we understand why something needs to be built, we can use our expertise to problem solve at every stage of development. So if our initial idea doesn’t work, we can quickly pivot to try something else to solve the same problem.
Stories also allow us to break the product up into small chunks of working software that we can build and get into the hands of users for real-world testing. So we don’t need to wait for years to find out if what we had planned to build was actually any good, and if it sucks, we can figure out why and fix it.
How do we Write user stories?
As is often the case with agile methods, the concept isn’t straightforward, so people often cherry-pick aspects to create an easy-to-follow formula. And so, many companies that implement user stories focus almost entirely on the written part, using the Connextra format (named after the UK software company that came up with it):
As a [user], I want to [do something], so that I can [achieve something]
Now, there’s nothing wrong with this format in the right context. But when the whole concept of user stories is boiled down to nothing but this format, everything goes a bit wonky and you end up with garbage user stories like this:
As an app user, I want to go to the homepage, so that I can navigate to all the other pages on the app
This sentence provides us with zero insight. We don’t know anything about the user, we don’t know why they want to visit the pages of this app, and we would have to build all the other pages of the app before building the homepage if we were to complete this story. The act of writing this sentence down is a waste of someone’s time. We might as well just write: ‘build homepage’ in a to do list, listing all the pages it needs to link to. And that’s fine if you’re building a really simple app - why overcomplicate things?
For complex products which will take months or years to build, user stories are powerful. And their power comes from context.
Context Is Everything
What if it was somebody who worked in a warehouse? If you sat down with them to ask why they needed a clean table, they might tell you that they needed it to be clear for stacking boxes. So our plan to give it a wipe with a duster would probably do the job. But what if the person was a chef, and they tell you they need a clean table so that they can prepare food on a hygienic surface? What if it was a surgeon, and they tell you they need a sterile table so that they can remove someone’s appendix? You’re going to look like a bit of an idiot if you rock up to that job with a duster and a can of Mr Sheen*.
However we write them, even if we don’t write them down at all and we just have them in our heads, user stories are powerful because we create them in conversation with our users. They give us insight into the needs of the person who will benefit from the thing we’re building.
A great way to have that conversation is to sit down together - user groups, development team, stakeholders - and build a story map.
Make a Story Map!
A story map is created by using cards on a grid to create a visual narrative of a user journey - these might be sticky notes on a whiteboard, or virtual cards on a digital board. Whichever medium you choose, just ensure that your cards are easy to move around as your ideas develop.
To create a story map, first we need to know whose story we are telling. For this we can use a simple user persona - this is particularly useful if we have multiple user types (e.g. consumer user vs. internal staff member). Who is your typical user? What role do they have? How will they access the product? What are their overall goals or desires in using it?
Once we know who our users are, at the very top of the grid, from left to right, we list the activities that they need or want to do. There are two formats this could take - a ‘now map’ which maps out the narrative of a current system which needs improvement, or a ‘then map’ which maps out the future state of a product which is yet to be built.
To learn more about the difference between now and then maps, I strongly recommend reading User Story Mapping by Jeff Patton - nobody is going to explain the whole concept better than he does. If you can’t be arsed to read the book then at least check out his website where he provides some excellent resources.
If you’re just keen to learn how to use a story map to plan to build a product, let’s look at a quick example…
>> Click here to view the full-size story map from this example in Miro
Let’s say we’re building an online marketplace with two user types - buyer and seller. At the top you can see all the activities each of these user types would need to do to buy and sell products online.
Now we’ve got our ‘big narrative’ mapped out, under each of those activities, we break down the tasks the user would need to do to complete each activity. Again, these are at a high level.
We now have a high-level overview of all the steps our users might need to take, but each of these tasks is large, and could be complicated to build. So under each one, we break up the task into smaller stories - these are still like tasks as each one represents something the user is doing, but broken up into smaller, self-contained chunks.
Here’s where story mapping gets really clever. We could view everything on this map as our ‘finished product’, but it might take months or years to build and we could spend millions before anyone is able to buy a single item from our online marketplace. We could also waste a lot of time building features that nobody actually wants.
Instead, we want to create a simplified version of the product that will take less time to build but will allow people to use the system in a functional, end-to-end user journey. As people use it, we will learn whether or not they like what we have built, and then build upon that starting point to improve it based on their feedback.
In the case of our online marketplace, here’s what that first version might look like:
It’s very basic, but it would provide enough working functionality for us to begin building a pool of users and gaining feedback from them to help us to decide what to add next.
A story map helps us to understand our user’s needs and visualise their desired journey before we have any idea what the software will look like. It also allows us to consider the long-term plan for our product while working in small, releasable chunks of software, helping developers to make small decisions with the bigger picture in mind.
Building an individual story
Let’s go back to the Connextra format - as controversial as it might be in some circles, if you’re new to the concept of user stories, it can be helpful for breaking things down. And we want to keep things small and simple.
The features we decide to build first should be based on the value they provide to our users and, in turn, the business. A product upload feature provides no value to sellers if there’s no way for buyers to find the products, so search is more valuable.
If we were to write this story in the Connextra format, it could be:
As a buyer, I want to search for products, so that I can buy them.
But that suggests we’re also going to build the functionality that allows them to make a purchase, which would add a lot of complexity to this story. A more self-contained description would be:
As a buyer, I want to search for products, so that I can see if what I want is available.
To help yourself think in this way, you could start with the ‘So that’:
So that I can see if what I want is available, as a buyer I want to search for products.
Or you could just write “Buyer: find products”. It really doesn’t matter how you write it down, as long your user’s desired outcome is understood by you and your team.
Stories should be small and testable
However you choose to record your stories, you and your team simply need to agree what problem you’re going to solve, and then how you’re going to solve it. But everything you build will be an unproven theory until somebody uses it, so it’s a good idea to keep your stories small, simple and self-contained.
In your conversations about a story, you should agree a set of criteria that the story needs to meet in order for it to be done. Generally we call this acceptance criteria, and again, people can lose their minds over how much detail needs to be written down in this regard. But just ask yourself this question:
If I was to run a test to confirm if this story was completed, what things would my user need to be able to do?
So in our search for products story, our acceptance criteria could be as follows:
Buyer must be able to:
Search for items
See search results
There are countless ways that these functions could be delivered, but really those are the only two things a buyer would need to do to complete this story. As you start thinking about how to build it, you’ll have more questions; How does the user want to enter search terms? What bits of information do the users want to see in the search results? Ask those questions, keep having conversations, draw pictures, create mockups, confirm that what you are intending to build is what the user wants to see. Then build it!
Our users might also want to filter their search results by price, or order them by newest items first. Each of those filtering and sorting functions adds more complexity to your code, will take longer to build and increase the risk of bugs being introduced, so treat each additional feature as its own story, built as an add-on to an already working, testable system, and you will save yourself a lot of headaches.
In Summary: Don’t Overthink it
So much time and energy is wasted on writing user stories. Forget the format, just try as much as you can to talk to the people who will be using your product, find out what they need, confirm that what you’re intending to build meets those needs, then build something small and give it to them so they can test it. Really you should be able to do that in any way that works for you, but if you do choose to try user stories, start with a story map. And when it comes to writing things down, as long as it makes sense, the format shouldn’t matter.
*Credit for this analogy must go to the authors of this excellent book which I recommend reading if you fancy a deep dive into the world of enterprise agility.