When one looks at all the wastes, defects has to be the most obvious one. The cost and repercussions of finding defects varies depending on where in the cycle they're found. Defects found early on in the development life-cycle are way less costly to resolve than defects found later on in the cycle; the most expensive being when applications are already in-production.
Additionally, depending on when the defects are found, defects can and do trigger other wastes like task switching, relearning etc.
Defects can be very costly for an organization. So the trick with defects is that you need to 1) Prevent them from happening in the first place and 2) Find and fix them as early in the development life-cycle as possible.
So what can you do to prevent them from happening in the first place?
- Keep your stories small, and unambiguous.
- Ensure that each story has well defined acceptance test criteria (assisted by input from the customer).
- Ensure that your code is well tested. Adopting good Test Driven Development habits will pay back in spades.
- Pair programming and code reviews are excellent ways in which to prevent bugs from being created in the first place.
- The more you automate the better. So automated functional testing is a good way to automate the functional test plan and get results fast and to ensure that new code changes aren't breaking other parts of the code.
- Ensure staging environments mimic production as closely as possible.
- Make sure that as you find new defects, you add unit tests to your test suite to keep your unit testing current.
- Finally, document your code well.
An interesting quote from Mary and Tom Poppendieck's book called Implementing Lean Software Development,
"If software routinely enters final verification with defects, then it is being produced by a defective process"
.... which needs to be fixed. So...
Step 1. Prevent the bugs from happening in the first place by "mistake proofing" your code
Step 2. Do whatever you can to find the bugs early on in the process while the code is fresh in the developers minds - i.e. ensure you have good functional test plans and test tools.
Step 3. Ensure a proper staging (or test environment) that mimics production environment as closely as possible
Step 4. Get the software into the hands of customers as quickly as possible, so good Agile practices help here.
Step 5. If you find defects, ensure they never happen again by keeping your unit tests current.