1. По своему, не так уж чтобы очень богатому, но тем не менее опыту скажу, что простое чтение книг или форумов, просмотр видеоуроков и т.д. глубокого понимания не дает. Важна еще практика. Лучший способ, который я открыл для себя - придумываешь интересную для себя задачу, начинаешь ее реализовывать. Если что то не знаешь - смотришь или читаешь уроки по теме, которая тебя интересует. Не стремись сразу написать что то большое и чтобы все было чисто и красиво, пусть будет криво и убого, главное чтобы работало, ты понимал как это работает и было желание и идеи как это улучшить. Почему такой способ хорош - ты сразу качаешь навыки и в проектировании и в программировании и в планировании задач для себя, так как выучить синтаксис языка это на самом деле основы, есть много других важных тем, в которых важно разбираться, если хочешь писать хороший софт - это и методологии разработки и системы контроля версиями и тестирование и проектирование и многое другое. В начале будет довольно трудно, будет куча нюансов, которые придется решать, но со временем, если не будешь сачковать ты заметишь как вырос твой уровень. Если интересует программирование графики - садись писать свой движок. Собственно, я сам сейчас этим занимаюсь, это была тема моей курсовой и сейчас дипломной работы.
2. Их много и большинство зависит от задач и здесь важнее общее понимание как работать с чужим кодом, как найти что то по докам и т.д. А по поводу конкретных библиотек - если пишешь на плюсах, то по любому, как уже написали, стоит обратить внимание на STL и желательно еще на Boost.
3. Только если ты понимаешь какие плюсы ты от этого получишь.
4. Обновлять софт вообще очень стоит. Про Code::Blocks ничего сказать ничего не могу, но не думаю, что стоит переходить со студии. А вообще, я тебе советую поэксперементировать и попробовать компилировать код без IDE, чтобы понять как происходит процесс компиляции и линковки, это тебе очень поможет (но в реальных проектах лучше выбирать самое быстрое рабочее решение)