Изучай теорию, потом применяй полученные знания на практике. Так ты поймешь какие есть пробелы, где нужно подучить ЯП, апи фреймворка или библиотеки или какую-то концептуальную штуку(допустим, асинхронное программирование). Пока ты читаешь, смотришь - одним словом, пассивно воспринимаешь информацию, очень сложно ответить даже самому себе, насколько ты хорошо разбираешься в топике. но без теоретического этапа никуда, главное не затягивать с ним. Соответственно изучение программирование можно разделить на две части, с теорией, думаю, все понятно, здесь ты знакомишься с инструментами(в первую очередь это ЯПы и разные оболочки поверх них в виде фреймворков, плюс какой-то принятый воркфлоу), практику я бы разделил, условно, на 2 части - процесс создания алгоритма, набора инструкций для решения стоящей перед тобой задачи с помощью имеющихся инструментов(непосредственно само программирование), желательно, чтобы в процессе этих мучений рождался не говнокод. Отдельно можно выделить умение дебажить/гуглить на стак оверфлоу. Очень полезный скилл :D