INVEST is an acronym to help you remember how to write good user stories.
- Independent - avoid dependencies between user stories.
- Negotiable - is there a possibility to implement both basic and advanced versions of the story?
- Valuable - can the story deliver customer value (i.e. something the customer wants)?
- Estimable - is it possible to estimate the story?
- Small - will the story fit into an iteration (together with a bunch of other stories)?
- Testable - is it possible to test the story? Automatic testing is preferred but not needed.
Negotiable is the part of the acronym I find a little bit funny. Why do we want a user story to be negotiable? I tend to look upon it as this; if the story is too detailed there is no room for adjustments when the story is implemented. Having a few unknowns in the story means it is easier to write a story (since we don't have to be detailed) and it encourages the developer to talk to the customer about the details when the story is implemented. This means the details of the story will be exactly what the customer wants when the story is implemented instead of what the customer wanted when the story was written.
Another hard part is to keep stories small. A good description of different ways to split stories can be found here.