Как построить архитектуру приложения?
Дело в том, что если сейчас (как я понял, после аж полугода изучения программирования) вы начнете что-то читать по архитектуре программных систем -  90% информации, которую вы найдете вы просто не поймете. 
Ну например:
https://habr.com/ru/post/276593/
https://www.rea.ru/ru/publications/AttachmentsLibr...
https://martinfowler.com/architecture/
https://www.amazon.com/Fundamentals-Software-Archi...
И это не ваша вина. Просто проектирование архитектуры - это не то, чем занимаются юниор-программисты. Для того, что-бы нормально спроектировать архитектуру мало знать язык программирования - надо знать еще очень много чего "вокруг". От баз данных до особенностей сценариев взаимодействия компонентов типа  Peer-to-peer, Клиент-серверной и прочих (коих десятки) , от умения работать с требованиями до навыков написания  технического проекта, от умения обосновать выбор (одной из многих) технологий реализации проекта до умения оценки качества программного продукта, от алгоритмизации до  многопоточности,  соответствующие инструменты (нотации) и очень много чего еще. Этому всему люди учатся годами. Даже в универах, на соответствующих специальностях вводный курс архитектуры ПО часто читают уже магистрам, и все равно этот курс весьма обзорный  и ознакомительный.  Поэтому не торопитесь. Займитесь пока усовершенствования своих базовых программистских навыков. И самообразованием в области компьютерных технологий. И наработкой практики. Вот когда вы это все освоите -  вот тогда и можно будет задуматься о решении архитектурных задач.
К сожалению сложно объективно ответить на ваши вопросы т.к. сфера разработки приложений и программирования уже настолько огромна, что включает в себя гигантское количество областей со своей спецификой и в архитектуре и в стеке технологий. Постараюсь кратко изложить свои мысли и прошу считать частным мнением.
Увы, готовых рецептов работающих для всех скорей всего не существует и приходится подбирать индивидуально. Однако очень хорошо, что вы задумались о необходимости расширения своих знаний. По небольшому опыту обучения junior'ов могу порекомендовать вам для начала определиться с областью, куда вы хотите развиваться. Это позволит вам использовать roadmap'ы, например, для machine learning и языку используемому в области вроде python, на котором у вас уже есть опыт. Как только вы освоитесь немного с технологиями и простыми проектами, где как раз набьете шишки и наметится понимание используемых приемов проектирования; можете уже пробовать взять какой-то небольшой опенсорсный проект (желательно с документацией + сообществом, где можно вопросы задать) и попробовать разобраться в его устройстве, идеологии, используемых библиотеках. Попробуйте составить упрощенную схему устройства проекта, затем каждой системы и т.п. В процессе разбора должен появится список вопросов или тем для дальнейшего изучения.
После этого как раз уже можно переходить к серьезной литературе по проектированию и/или просто вписаться в разработку крупного проекта, где вас направят в нужное русло.
Из общих можете прочитать про паттерны проектирования, которые встретятся в любом случае; но вот применять их без хорошей мотивации не торопитесь. Т.к. singleton например, где-то считается уже антипаттерном и про его существование просят забыть.