Изучите один из функциональных языков. Проще всего начать со Scheme. Это поставит Вам мышление правильно, и даст общее понимание принципов программирования. Вам уже советовали SICP, я еще от себя добавлю HTDP (How to design programs) - как раз рассчитана на начинающих. Порешайте на нем алгоритмические задачи. Хороший источник - Project Euler. По более общим задачам посмотрите Rosetta Code. Не ставьте задачу сразу начать применять это к Вашим приложениям, просто спокойно развивайтесь.
На первом этапе постарайтесь по минимуму использовать готовые библиотеки - разве что для проверки.
Постепенно переходите к более сложным задачам. Не зацикливайтесь на чисто алгоритмических задачах - они хорошо ставят мышление, но в реальной жизни лишь часть кода полностью алгоритмизуется, и дизайн кода занимает большее место чем именно алгоритмы (если не брать более специализированные области вроде ML). Если не брать математические задачи, то хорошие задачи возникают в областях работы с текстами, преобразования данных. Скажем, упрощенный вариант HTML или XML парсера, или задачи по анализу текстов, или например перевод данных из одного формата в другой. Напишите пару простых интерпретаторов. Реализуйте парсер для какого-нибудь языка (возможно, его упрощенного варианта). Не стесняйтесь находить ресурсы с тем, что близко в Вашим задачам, и читать чужой код (это необходимо!) - но и не работайте по принципу copy - paste.
Неплохой задачей будет например реализовать парсер и интерпретатор для какого-нибудь trading - языка, вроде metastock, с парой десятков основных финансовых индикаторов. И к нему в довесок - собственный упрощенный парсер скажем CSV формата - так что Вы сможете загружать данные по стокам и прогонять торговые стратегии целиком на собственном коде. Ну и например, генератор HTML - отчета с графиком и точками входа и выхода для данной стратегии, плюс отчетом о доходности. Можете потом поднять простое web-приложение, которое будет гонять торговые стратегии на исторических данных, хранящихся скажем как CSV файлы - и все это на Scheme. Потом можете перейти на использование реальной БД. Это уже будет в совокупности неплохой проект. Чем меньше будете использовать готовых библиотек - тем лучше, цель здесь - учеба, а не максимальная эффективность.
Почувствуйте как средства языка позволяют писать лучший код. Освойте на практике основные принципы: отделение интерфейса от имплементации, факторизация общего кода, сокрытие информации, модуляризация кода, отделение поведения от состояния (это общие), ну и вкусные вещи от функционального стиля - преимущества неизменяемого состояния, функции высшего порядка, замыкания, рекурсия, рекурсивные структуры данных, метапрограммирование.
После этого, Вам станет понятным многое из того, что при другом подходе придется просто запоминать и брать на веру, в более распространенных языках типа Java или Python. Вы будете в состоянии отличить действительно важные черты языка от чисто утилитарных. В том числе, Вы сможете увидеть и слабые места изучаемых языков, отсутствие определенных важных абстракций, и как эти проблемы решаются. В конечном счете, Вы сможете на глубоком уровне освоить другие языки в гораздо более сжатые сроки. И не станете бездумным адептом той или иной модной сейчас религии (ООП, шаблоны проектирования, и т.д.) - а будете понимать место этих вещей в общей картине.
И еще один момент: если у Вас хромает Английский, подтяните его. Специально этим не нужно заниматься, просто читайте литературу на Английском - всегда. Это сделает Вас частью большего сообщества, даст доступ к гораздо большей базе ресурсов. На более продвинутом уровне, это важно еще и потому, что Вам будет легче писать код, когда Вы начнете думать на Английском - он ближе к формальным языкам.