The previous posts contain some great advice. I had to stop to think about whether I was a "professional programmer" -- I don't tend to think of myself that way, but I get paid to write code, so I guess I am.

My job title is "software engineer", and I think that's more than just semantics since someone we might call a "programmer" will also need to be skilled in software design, testing, documentation, etc.
So how did I get started? I think I was born with 1's and 0's in my blood.

Seriously, I was a computer geek from a really young age. I found a programming guide to Apple ][ BASIC when I was in grade 4 or 5. We didn't even have a computer in the house -- but my school had Apple ]['s in their lab. We had "computer class" once a week and most kids were playing Oregon Trail or playing with LOGO (remember the turtle?) Me, I broke into the command prompt and wrote my first program:
10 PRINT "I CAN BEEP!"
20 PRINT CHR$ (7)
(note - on an Apple ][, this causes it to beep)
30 GOTO 10
I ran it and my little self swelled with pride -- my first program! My teacher, however, was less than impressed. Seeing lines of "I CAN BEEP!" scroll up the screen, and all the noise coming out of my computer, she simply observed, "Yes, you can -- now make it stop!"
I spent years after that playing around in BASIC on the Apple ][. I was reading everything I could in the library about computers and how they worked. (Aside: while I was learning programming on the one hand, I was also learning about electronics and circuits and loved to play with one of those Radio Shack project kits with the little springs and wires.)
In grade 8 there were two separate occasions where I wanted to use computer graphics as a presentation aid. Nothing like PowerPoint existed on the Apple ][ (not that I had access to anyway) -- so I wrote my own programs to get it done. This was the late 80's and early 90's, and that hacker/hobby mentality was still alive and well. Magazines like "Compute!" and "Nybble" published listings that you would type in by hand to try out some new game or utility. I often learned techniques from those, too.
By this time my family now had a DOS computer which came with Microsoft QBasic. Everything I learned from Apple BASIC was more or less transferable. I picked up O'Reilly's "Practical C Programming" for $5. It is an excellent book and I would still recommend it. Of course I had no actual C compiler. No worries -- I made friends with the sysop of a local programming-oriented BBS (anyone remember those!) and when he upgraded his compiler he sold me his old compiler disks.
(Grade school boys chatting it up with programmers online? Meeting up at his house to buy stuff? Yes, it sure was a different time and age.)
In high school I took programming classes and did more BASIC programming on the Mac and learned Pascal.
All this to say that by the time I hit university, I was already well versed in Basic, Pascal, and C (not yet C++, it took a lot longer for object-oriented programming to sink into my head). I was using these languages both for assignments at school as well as just playing around at home. Sometimes it was a necessity -- I needed a program to display some graphics, so I wrote a program to display what I needed. I wanted a modem comm program like Telix, but didn't want to pay for Telix, so I wrote my own version.
So, I'm getting long-winded -- how does any of this help you? I guess I agree that the concepts "click" for different people at different rates than others. As you can see from my story, procedural programming might as well have been in my bloodstream, but I simply did not grasp object-oriented programming until many years later. Today, they don't even give you the choice -- they start you with OOP right away. Now you have TWO concepts to grasp -- how to do procedural programming, and then how to wrap that into these things called classes and members and objects.
I think the best programmers like to play around and experiment. It's like learning any other language. You can memorize Spanish phrasebooks so you'll know how to say canned phrases like "How much?" and "Where is the bathroom?" You can even appear conversational by stringing a few of these phrases together. But does this make you fluent in speaking Spanish? If I may continue with this analogy, I think too many computer classes teach you to memorize phrases. You know what that's like -- you use your memorized phrases to ask a question, then get an answer back that you don't understand -- and now you're in trouble. No, to truly learn a language you can't just memorize phrases, you need to delve into it and practice until the language comes to you almost as naturally as English (or whatever your native tongue is).
I think part of it is that it's a moving target, and languages themselves are evolving and becoming more complex. The little BASIC program I posted above, anyone could figure out exactly what it does, even if you've never seen BASIC before. My sister, on the other hand, took an "introduction" course at her high school and the very first thing, the simplest program (in Java) she saw was:
Code:
class HelloWorldApp {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
This is a chicken and egg problem. You don't want to confuse a beginner by explaining what all of those keywords mean, so you say "just type that in and trust that it works". Well, this becomes a "phrasebook" issue, and you can just memorize that string of words, but you don't truly begin to understand what you are typing until you can grasp what classes are, that everything in Java must be a class, that classes have public versus private methods, that statements can be compounded or grouped using braces, that methods can be static (global) or attached to specific instances of objects, that they can have return values and parameters, that parameters can be arrays, etc., etc. Only then do you really understand what's going on. Until that point, you're memorizing phrases. My sister never got that far, so she was stuck trying to memorize strings of words and squiggly {'s and }'s that she didn't know what to do with, and thus she hated her class.
So, bottom line -- keep at it, if you enjoy programming, the specifics of a particular language or a particular way of coding will come to you eventually. In the meantime, keep experimenting!
Wow, that was possibly the longest post I've ever written.