Several of the other comments reference useful books on the topics, particularly on algorithms. One book that has a lot of important lessons about becoming a good programmer is Coders at Work.
One of the interviews is with Peter Norvig who tells about a bloggers failed attempt at solving sudoku. Peter's solution used a very novel approach to the problem that is non-obvious, and I would put this in the category of what you can learn from studying algorithms. They are not all about reducing computational complexity. Perhaps the other extreme example is an epic stack overflow answer that repeats many times that you can't use regular expressions to properly parse html. And this keeps coming up, it seems.
And I found the lessons in Coders at Work somewhat startling. I recommend it to new programmers and old programmers alike. It's not about the IDE, it's not about the language, it's not about the testing.