The “User story” or “use case” is a powerful tool for designing software. You pick a user, or “actor”, with a specific goal, and you diagram the process / workflow by which the user employs your system to accomplish the goal. Many of the projects that I see do not use this tool effectively, and as a result end up lengthening development cycles. Here is a list of issues, and fixes, that will make your stories more useful.
Generic user: This is the single most damaging user story mistake. You define an imaginary user with very broad needs, a “scientist” or a “mother”. You run into two problems that kill your ability to release software early and often. First, this generic user has a very broad set of needs. You end up looking at a huge number of features. Second, you can't actually call this user and ask specific questions - “red or blue?”, “do we need a lookup here?”. So, you don't get any of the details that you will need for implementation. When you diagram a user story, you should have a specific user in mind. This user only has a small number of specific requirements, and this user can answer detailed questions.
One demanding primary or reference user: You can go too far and pick one user. This causes delays because this one user may have some one particular feature they really really want, even if it is irrelevant for most other users, and hard to build. They probably volunteered to be the reference user because they have an agenda. It pays to shop around and find less demanding users for your early releases.
Unfamiliar user: Software design is most effective when you are designing software for yourself. The user stories in this case are easy to get, accurate, and nuanced. A high proportion of really good software is built by people for their own needs. If you find yourself building software for users that you don't understand, you have a difficult problem. You can learn a huge amount from interviews with the intended users, but you will miss some things that will only come out when they test the prototype. I suggest two maneuvers in this case. First, you should make yourself into the user by walking through the process yourself. You will be like the hotel company CEO that takes a day a year to work the reservation desk, and ends up leading a rebuild of the entire reservation system. How many times have we heard that story? One way to get started is with a paper trail. I like to collect all of the pieces of paper that go into or come out of a business process, and pin them into a storyboard. You find a lot of data structures that way, and some workflow. Second, you need to partition your user base and find users that will take early alpha and beta releases. Your user stories will come more by feedback than by initial specification, so getting releases in front of external users becomes more important.
Non-user features: The user story concept isn't very useful when you are working on features that users don't see: infrastructure, architecture, middleware, administration, etc. You can make it more useful in these cases by remembering two things:
System administrators and developers are users too. They have user stories.
If you really want to be agile, you build the underlying infrastructure As Late As Possible. You get releases to users faster, and you save yourself a lot of work in the cases where you find you don't end up needing the infrastructure. So, there is an argument to build the minimum amount of stuff that supports a visible user workflow.
Vague stories: Vague user stories without a specific user or actual example task will not give you the details that you need to do an implementation. You aren't doing any damage with them, but you are wasting your time, because you aren't learning very much.
Textual stories: If you have been in software development business long enough, you will eventually encounter a specification that has been built with use cases and formal requirements based on something like the Rational Unified Process. The first encounter is very impressive. It drops onto the table with a loud THUD, 400 pages of printouts. In some ways, this is a very useful document, filled with details that will help the developers go forward. However, it incomprehensible to the human brain. It has long lists of labeled requirements and step by step processes. You cannot absorb information in this format, and you cannot explain it to your users and project sponsors. It fails the first purpose of a user story, which is to get feedback from the subject of the story. So, you end up getting diminished benefit from the (expensive) planning process, since the user will ignore the specification and instead provide feedback only after seeing the prototype.
The solution: Make pictures, storyboards, and not text. Everyone will understand the storyboard. A storyboard is simple, even simpler than a flowchart. It's basically a flowchart with only the components that a user will see. It shows screens that the user will encounter while working with the system, and links that represent transitions between screens. It can be converted directly to a mockup. You can skip most of the text and write it in later as ticket detail and comments.