Самый простой способ научиться решать задачи - это решать задачи. На лоу уровне ничего лучше мне неизвестно. Способности формализовывать задачи и оперировать большой цикломатической сложностью можно тренировать и искуственно, но я не знаю как делать это достаточно эффективно.
Паттерны - это уже имхо advanced уровень, когда ты умеешь нормально писать на каком-то языке и озабочен всякими архитектурными задачами и взаимодействием с другими разработчиками.
Теперь про алгоритмическую подготовку.Нужно понимать одну вещь: алгоритмическая подготовка - вещь безусловно очень полезная для программирования, но в основном потому что она мозги шевелиться заставляет. Для работы хорошее знание тех или иных алгоритмов пригождается немногим. Если чисто для себя интересно - другое дело.
К конкретике:
Решение практических задач:
basic - любой задачник по информатике/учебник с задачами (в том числе
учебник Кантора конечно), студенты набегающие в сессию на множество программистских форумов, работа
middle - работа
Паттерны:
basic - ненене!
middle -
банда четырех
Алгоритмы:
Basic: Теория - мне понравилась 1я часть
этого курса на курсере от того же автора. Она там где-то есть, просто искать лень).
Ну то есть это не basic-для идиотов, но достаточно понятно. Курса для идиотов по алгоримам мне неизвестно)
Практика: Идешь на topcoder.com, регишься, смотришь список задач на algorithm competition и пытаешься решить самые легкие из них.
Advanced - хз, я еще близко не адвансед, но думаю продолжение тех же алгокурсов и решение более сложных задач могут помочь
Хрена я много написал, мне бы это лень читать было