К сожалению сложно объективно ответить на ваши вопросы т.к. сфера разработки приложений и программирования уже настолько огромна, что включает в себя гигантское количество областей со своей спецификой и в архитектуре и в стеке технологий. Постараюсь кратко изложить свои мысли и прошу считать частным мнением.
Увы, готовых рецептов работающих для всех скорей всего не существует и приходится подбирать индивидуально. Однако очень хорошо, что вы задумались о необходимости расширения своих знаний. По небольшому опыту обучения junior'ов могу порекомендовать вам для начала определиться с областью, куда вы хотите развиваться. Это позволит вам использовать roadmap'ы, например, для
machine learning и языку используемому в области вроде
python, на котором у вас уже есть опыт. Как только вы освоитесь немного с технологиями и простыми проектами, где как раз набьете шишки и наметится понимание используемых приемов проектирования; можете уже пробовать взять какой-то небольшой опенсорсный проект (желательно с документацией + сообществом, где можно вопросы задать) и попробовать разобраться в его устройстве, идеологии, используемых библиотеках. Попробуйте составить упрощенную схему устройства проекта, затем каждой системы и т.п. В процессе разбора должен появится список вопросов или тем для дальнейшего изучения.
После этого как раз уже можно переходить к серьезной литературе по проектированию и/или просто вписаться в разработку крупного проекта, где вас направят в нужное русло.
Из общих можете прочитать про
паттерны проектирования, которые встретятся в любом случае; но вот применять их без хорошей мотивации не торопитесь. Т.к. singleton например, где-то считается уже антипаттерном и про его существование просят забыть.