Done Criteria
In starting a project, one of the important steps we need to do is to and define and agree on what "done" means. There are plenty of good examples around that we can draw from as inspiration for our own lists. On my current personal project, I just put together my own definition of done.
A feature is "done" when:
- Users can use the feature, are happy with it, and any major design flaws or bugs are closed
- UI for the feature has been styled and designed to look nice
- UI for the feature works for normal as well as high-contrast mode, and works equally well for colour blind users
- Keyboard accessors/shortcuts and tab order are set
- End user help/tooltips work
- If necessary, any sample data needed to test the feature is ready
- Automated unit tests are written, with a high enough level of coverage
- Automated UI "smoke" tests have been recorded and pass
- Load tests written and pass
- Each button click/interaction results in the minimal number of service calls
- All UI components are hardware rendered, virtualization is enabled, and no data binding errors
- Any auditing/tracing code is added, and the output is useful and readable
- Any potential failure scenarios are catered for
- Feature is tested for any major memory leaks
- Automated database migration scripts are ready and tested
- Security permission checks have been implemented and validated via automated tests
Some of this revolves around performance. This isn't about premature optimization, just checking for obvious problems. If I find out I'm accidentally doing a SELECT N+1 that isn't a problem on my laptop, but is a problem in a reasonable set of sample data, I want to resolve that before claiming the feature to be "done".
Every project is different. What does your definition of done look like?