software defect life cycle