I can tell you what I think would be ideal. This is just theorycrafting though, in practice you can get away with not having a lot of these qualities if you're doing something very special / unique.
For game programming, sharpen up on your maths, especially geometry. You need to be comfortable with first year university maths if you want to get into the interesting 3D stuff. Even for 2D stuff, if you have a problem and can define it mathematically, you'll want the tools to be able to the solve it without busting a gut and wishing you'd paid better attention (which is where I'm at
) Maths is important for graphics programming, not so much for gameplay stuff. These days you can get away with mediocre mathematical ability by using libraries for physics, etc. and that's what I do.
Then you'll want to have experience playing a lot of games and know what's out there. What can change the nature of a man?
Be familiar with gaming's history and development so you don't reinvent The Wheel 8: Zombie Revelations
. And that experience has to translate into getting to understand the underlying mechanics of gameplay, why are things happening like this? Why do I enjoy Diablo 2 but not Sacred 2? Then some theory type stuff, what is positive feedback, negative feedback and cybernetics? I would also recommend becoming familiar with how the DND rules work. This is something I don't really understand, but I do know that they are the basis or inspiration for the combat rules of almost all computer RPGs out there. Write down all your ideas and see which ones sound silly in a month's time.
For general programming, you want to learn about data structures and algorithms. Data structures: When is it correct to use a vector, binary tree, hash map? What's the difference between a stack and a queue? Algorithms: How do I express the complexity of an algorithm with big-O notation? How do I do the following: sort numbers, find shortest paths on graphs, efficiently search for strings, compress data? When do I apply the strategies of: brute-force, space vs time trade-off, divide and conquer, recursion and dynamic programming, greedy algorithms? I wouldn't have learned about most of this stuff without going to university, but that doesn't have to stop you from buying "The Design and Analysis of Algorithms" by Levitin
and teaching yourself. Remember: this stuff is not complicated, but applying it is. Practice
is the only solution.
Also under general programming: learn how compilers and operating systems work. For this, you'll need to have a very high level understanding of how computer hardware works (CPU, memory, hard drives). You'll end up learning how the stack and the heap work, memory management and a bunch of pretty cool / complicated algorithms and data structures that compilers use. You can skimp on this and previous paragraph a lot, but code quality and speed will suffer.
Going a bit beyond actual programming to code architecture: read Code Complete
and the light of understanding shall shine down upon OOP for you. I'll leave it at that, OOP is a topic by itself and more related to software, rather than programming. Skimping on this will make your projects impossibly difficult to maintain and will make your team-mates hate you