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