It seems to me that, apart from books, practice is important.
Read someone else's code, try to understand each line, advantages and disadvantages, ask experienced colleagues, do not hesitate to seem like a noob. Develop a style, learn to distinguish bad from good code.
Try to write your (interesting to you) project, not very difficult to begin with. Write it as correctly as possible, know how to justify your decisions. Grow above yourself. Anyway, after 2 years, the old code always seems bad (if not, you are not growing above yourself and this is bad).
Choose a subject area (graphics, databases, network technologies, websites, calculations, whatever) and improve on it. Try to answer all the questions here and on StackOverflow on this topic, read other people's answers. Debate! Find out why other people's answers are better (or worse). Be sure to learn English in order to freely read the documentation (it is much more in English!) And communicate in SO (as well as on occasion with foreign customers).
Regarding books: in C ++ I would advise Bruce Ekkel "Philosophy C ++" . When you master, read whatever Scott Myers, Herb Sutter, and Andrei Alexandrescu will do, they will take you into the world of modern programming, and we all will look like dinosaurs to you.
I was somehow helped to understand the basics and to discipline the thinking of “Algorithms and data structures” by Niklaus Wirth. Note that the Pascal dialect in which he writes there is far from modernity, but the book will teach you a correct understanding of structured programming.
If you want to develop into the world of managed languages ​​(not a bad idea, by the way), I would advise Albahari "C # xx in a Nutshell", John Skit "C # in Depth" (great thing!). Java by Joshua Bloch’s book "Java. Effective Programming", Mast Rid.
If you want to know the lower level (how everything is actually arranged) for real Indians, read anything Jeffrey Richter (in all directions). But remember: this will change your mind more than drugs. :) Classmates recommend Art Baker to understand the level of drivers.
From the books that change attitudes, it is impossible not to call Abelson / Sassman "The structure and interpretation of computer programs." It is about very high-level pieces, understanding what programming is. When you master, you will reach zen. Brain viruses Haskell and Lisp are bundled.
Well, the obligatory link to the founder Generally All Donald Knuth: pull in the library "The Art of Programming" in a good translation and read. He is complex and breathtakingly fucking, I warned.