При поиске ошибок необходимо использовать системный и структурный подходы плюс дедукция.
Например, у вас есть ошибка "Клиент не получает уведомление о заказе".
В данном случае у вас есть система заказа и система доставки почты.
Нужно выяснить, какая именно система не работает, заказ или почта.
Если другие письма доходят, то значит что-то не так с системой заказа.
Аналогично разбираем на части систему заказов до момента вызова функции отправки почты.
В данном случае нам нужен
отладчик в связке с хорошей IDE.
Устанавливаете брейкпоинт и смотрите, вызывается ли функция после создания заказа. Если да, то проверяете аргументы, нет - значит ошибка происходит до этого момента. Следовательно вам потребуется стек вызовов функций/методов. Обычно он доступен через отладчик. Используя отладчик вы можете идти по стеку вызовов как сверху вниз, так и снизу вверх. Как вам будет удобнее.
Данный метод позволяет отлаживать ошибки в проектах любого уровня сложности.
Помимо использования отладчика необходимо совершенствовать знания о языковых примитивах и их использовании (надо курить маны), использовать
современные методологии разработки, потихоньку учить разные паттерны проектирования и фреймворки.
Кроме изучения самого языка, необходимо понимать, как работает почта, DNS, базы данных, очереди, стек TCP/IP и сетевые операционные системы в целом.