Для начала вам даже не нужно думать и пытаться понять суть функционального/императивного подхода, т.к. без опыта это невозможно, да и с опытом многие путаются в этом. Да и неважно это. Можно прекрасно понимать суть вещей, но даже не знать, как это называется.
Вам нужно определиться с тем, какая область программирования вам интересна(игры и другую математику отбросим): будь-то веб, десктоп, мобильная разработка, иное. Дальше нужно понять уровень абстракции, на котором вы хотите работать: низкоуровневые/высокоуровневые языки. Чем более низок уровень абстракции(даже на высокоуровневом языке), тем больше, как вы заметили, вы научитесь думать и обретёте понимание. Далее выбираете язык. Низкоуровневые я бы даже не рассматривал, но дело ваше. Изучаете основы: это как раз функции, типы данных, структуры, как с ними работать, зачем они вообще нужны. Любое программирование - это всегда работа с данными. Вот без понимания этого, включая терминологию, - никак. Далее какой-то мейнстримный фреймворк на этом языке. Далее опускаетесь снова к самому языку, углубляясь в тонкости.
Может потом дополню, надоело печатать с мобилы.