Сразу написать код без багов на практике невозможно. Для одного и того же функционала существуют много пользовательских сценариев. Все эти сценарии невозможно предугадывать заранее, потому что программой пользуются пользователи разного уровня владения компьютера и они взаимодействуют с программой абсолютно по-разному. Баги выявляются во время тестирования программы.
На количество багов ещё влияет выделенное время для разработки. Если перед программистом поставлена задача разрабатывать программу в короткий промежуток времени, тогда большая вероятность того, что багов будет много. Так как программист не успеет обрабатывать все предполагаемые пользовательские сценарии.
Если программист работает над программой, у которой унаследованный код, тогда вероятность багов вырастает в разы. Думаю, программистам знакома ситуация, когда добавляют новый функционал в унаследованный код, а в итоге сломается та часть программы, которая уже работает хорошо. Эту проблему решают тесты. Но, если для кода не написаны тесты, работать с ним другому программисту придется тяжело, особенно, когда проект большой.
Больше тестов - меньше багов.