Debugging code and reading others code are the two big ones to point out that are usually equally important to writing good code.
I have experienced that you can compare programmers in these tasks on a micro level and see drastic different results.
Top programmers tend to not only write code with good foundations, but also have an uncanny sense for the root of seemingly obscure issues, as well as the ability to understand other code almost on sight.
When they call me up frustrated that they've wasted hours trying to find a bug, whether it be as innocuous as a typo, as subtle as a type-error, or as painful as a quirk in the framework, I will always consider time spent debugging to be worthwhile. As this is when you pull apart the guts of the code, stretch your understanding of it, and learn to isolate the flow of data within a system. Then you can put it back together in a better way.
At least, that's how I learned to code.