Я никогда не встречал книг где рассматривались бы исключительно причины появления багов. Почитайте лучше просто книгу о тестировании. Например
Базовый курс тестирования Святослава Куликова.
Причин много, всех не перечислить. Из-за чего может быть несоответствие требованиям / техническому заданию / документации (шире - несоответствие ожидаемого результата фактическому)?
1. Конфликт функциональностей: код новой фичи случайно затронул код другой фичи. Какая-то функциональность перестала работать должным образом.
2. Вышла новая версия используемого ПО (например новая версия ЯП) - и часть кода приходится переписывать, чтобы функционал снова заработал.
3. Какие то вещи просто сложно реализовать и у разработчика не хватает квалификации. И на выходе получается нечто страшное-ужасное.
Чтобы все это предотвратить нужно просто ответственно подходить к работе.
1. Менеджерам (в том числе менеджеру по продажам) и аналитикам лишний раз уточнить требования и сценарии использования.
2. Четко определить что именно понимается под понятиями: быстро, медленно, хорошо, долго, красиво...
3. Программист должен сообщать какие другие функциональности могли потенциально быть затронуты в процессе разработки. Чтобы тестировщик их тоже проверил.
4. Просто отталкиваться от здравого смысла.