Для начала стоит определиться, на что ориентировано программирование. На объект или аппарат.
Если ООП, то книжек тьма. Вплоть до каких-нибудь методичек из курсов ВУЗов. Почти у всех инженеров есть ООП на первых курсах. С АОП сложнее, поскольку даже в ВУЗах АОП дают на более старших курсах, помимо этого, нужны дополнительные железки. Так или иначе, после любого справочного материала по программированию (функции, операторы, паттерны), приводится список задач/примеров. Есть целые сборники задач. На них, например, базируются школьные олимпиадки (ну и студенческие, но они будут очень сложными, судя по вопросу)
Но это не совсем то, что реально помогает. Самые классные задачи, которые могут стать перед программистом – реальные. Не сделать, что просят, а сделать то, что мне интересно. Например, взять два сервопривода и запрогать какого-нибудь робота, если изучать АОП. Или создать какую-нибудь базу данных или небольшое приложение, упрощающее менеджмент дня. Впоследствии, придумывать для своего детища новые функции, усложняя код. Именно такой подход будет помогать реально понимать, как решаются задачи программирования, где и как можно применять свои знания в программировании.
В целом же, если нужны именно "задачи" – все находится по "сборник задач по *язык программирования*") Этого будет достаточно
ответ совпадает с моим мнением
stepik.org - очень много курсов по программирования с задачами с автоматической проверкой. Бесплатно.
javarush.ru - Очень хороший курс по Java, но платно.
Можно изучать программирование в разрезе практики, например: написать бота для какого-нибудь мессенджера или создать собственный веб-сервис на каком-нибудь фреймворке.