Vectorspace wrote:
It depends a lot on what you want to do. If you want to program microcontrollers, you need to learn about electronics. If you want to calculate things, you need to learn about algorithms. If you want to process data, you need to learn about data structures. If you want to do something that involves floating point computations, you should learn the basics of numerical mathematics.
Those aren't really "pre-programming" skills – you can learn a lot on-the-fly.
In a professional environment, knowledge about quality management, unit testing and project management is often demanded.
You need a lot of experience to learn how to write good code. I see a lot of bad code written by people who have no knowledge about computer science. Such code may or may not work well, but it's very hard to read and to maintain. A common reason for this is that the code uses bad abstractions or none at all ("spaghetti code").
Typically, most newbie classes have a lot of copy-paste code, if statements and tedious workarounds. Learning to optimize better (the characteristics of data structures, when to use certain algorithms etc.) will give the OP a flying start.