Значительная часть усилий при создании программ тратится на обнаружение, локализацию и устранение различного рода дефектов. Для этого используются как динамические (тестирование, отладка), так и статические (ручной и автоматический просмотр кода, доказательство правильности) методы.