Over the years I’ve read in quite a few places that programmers are somehow ‘special’, that there is something unique about the ability to program, and that if you haven’t got that (whatever it is) that you won’t make the cut.
It is rumored to be genetic, and it is just too bad if you don’t have it, better forget about becoming a programmer. Just what it is is something that we unfortunately can’t tell you, let’s call it the programmers gene.
I don’t believe any of it. But I do believe that because of the way we program that there is one - definitely genetic - component that can make a huge difference in your ability to program, but which has plenty of application outside the field of bit manipulation.
Good programmers typically hold mountains of data in their heads and they can access it more or less at will. Meet someone with a very good memory and chances are that that person would make an excellent programmer. I’ve always attributed my own ability to ‘code’ to being able to remember lists of opcodes, API specifications and command line tools without reference to the source after reading them through once, in rare cases twice. It doesn’t make you better by some magic mechanism, but it makes you a lot faster so you get more done in a shorter time, including learning how to program.
The coming of the IDE changed that to some extent. An IDE functions in part as an auxiliary memory, it takes away the chore of having to remember the order of parameters to a function, or even what a function does, all the documentation is only a mouse click away. But this is a two way street. If you don’t use your memory or force yourself to remember stuff you get lazy. Just like an athlete may have a genetic advantage they exploit without training that advantage amounts to nothing. And someone without that advantage can still get very far with proper training. Case in point: the address book in my phone is like an IDE in that it remembers all the phone numbers of all the people that I know. I used to know all of them by heart, now the only phone number I remember is my own (and my bookkeepers, mostly because he hasn’t changed it in the 20 years since we work together and I knew it by heart long before I got my first mobile).
At the same time, a really good memory is a curse. Time and again I’ll run into people that I remember from long ago (decades or more), I will still remember where our last conversation was, what we ate and whether it was raining or not, they’ll not even remember knowing me… (probably I didn’t leave a favorable impression ;) ).
Remembering the opcodes of processors that you can’t even buy any more, or gfa basic peculiarities, hardware addresses of memory mapped peripherals of computers that haven’t been seen in the wild for a long time, all of that is a burden too. Unfortunately a good memory does not include automatic garbage collection.
But what is garbage anyway, maybe one day I’ll find a use for the registers of the 6522 again.
So, if there is one thing that might help you to move forward in coding, just like reading algorithm books, papers, knowing some math or reading other people’s (good) code: train your memory. Consciously try to remember things without looking up the same details over and over again. If you can, try to work without an IDE for a bit and see how much of the APIs in the environment you normally use you actually remember. Over time you will find that you become much more productive by being able to tap in to the knowledge that you’ve retained, and that you can use to help to choose the right function or tool or algorithm without having to refer to any outside source of information.