In agile development, “done” should really mean “DONE!”.
Features developed within an iteration (Sprint in Scrum), should be 100% complete by the end of the Sprint.
Too often in software development, “done” doesn’t really mean “DONE!”. It doesn’t mean tested. It doesn’t necessarily mean styled. And it certainly doesn’t usually mean accepted by the product owner. It just means developed.
In an ideal situation, each iteration or Sprint should lead to a release of the product. Certainly that’s the case on BAU (Business As Usual) changes to existing products. On projects it’s not feasible to do a release after every Sprint, however completing each feature in turn enables a very precise view of progress and how far complete the overall project really is or isn’t.
So, in agile development, make sure that each feature is fully developed, tested, styled, and accepted by the product owner before counting it as “DONE!”. And if there’s any doubt about what activities should or shouldn’t be completed within the Sprint for each feature, “DONE!” should mean shippable.
The feature may rely on other features being completed before the product could really be shipped. But the feature on its own merit should be shippable. So if you’re ever unsure if a feature is ‘done enough’, ask one simple question: “Is this feature ready to be shipped?”.
It’s also important to really complete each feature before moving on to the next…
Of course multiple features can be developed in parallel in a team situation. But within the work of each developer, do not move on to a new feature until the last one is shippable. This is important to ensure the overall product is in a shippable state at the end of the Sprint, not in a state where multiple features are 90% complete or untested, as is more usual in traditional development projects.
In agile development, “done” really should mean “DONE!“.