Согласен с другими ответами, что научиться программировать можно только на реальной задаче. Но вот проблема, что делать, если желание решить задачу есть, а самой задачи нет. Вывод прост: нужно её себе придумать. Например, я написал себе на PowerShell решалку судоку. Код получился далеко не идеальным, но в процессе написания я наткнулся на несколько интересных особенностей языка, которые потом сильно помогали мне и моим коллегам в реальной работе. Возможно у Вас тоже есть любимые головоломки, которые хорошо поддаются алгоритмизации и для которых можно написать решалку. Сейчас думаю написать решалку для японских кроссвордов.
Правда есть один побочный эффект. Я полностью потерял интерес к судоку. Ну а какой смысл решать его самому, если я знаю что моя программа решает любое судоку самое большое за 117 проходов основного цикла (в случае полностью пустого поля).
Есть приложение и сайт SoloLearn. Там сначала дается теория а потом задачки. Задачки, как правило несложные.
Еще Codewars, который сам активно пользуюсь. Здесь тоже задачки но посложнее.