I learn better, or should I say I only learn how to program when I have an actual problem to solve.
My current "problem" is figuring out how to generate more data out of my Ode blog's filesystem for my Ode Counter add-in.
I already report on the number of blog entries, how many are "real" entries and how many are Ode-generated social-media updates, plus how many images are in the filesystem and how many of those appear in actual blog posts.
Another thing I have wanted to do since I began using Ode was have the system generate a Categories/directories list in HTML for both a dedicated "site map" page as well as a sidebar display.
As I said recently, I'm a huge fan.
This one is about "getting shit done":
I’m one of those people who wants to write code to solve every problem that comes along. If I could figure out how to make a Perl script make my bed, or clean my room, then those things would certainly get done a hell of lot more often. I’d put it in a cronjob. I’ve written code to calculate my kids’ allowances, email daily chores to them, track my hours for clients, keep track of info when hiring employees, reset the database for my music player, search for things in my instant messaging logs, organize my music collection, figure out how much space I have left in my Dropbox, balance my checkbook, query package management systems regardless of which flavor of Linux I happen to be running at the moment, calculate Weight Watchers points, track my todo list, count lines of code, print out certain lines from a file, and make a Gimp plugin to help me make cards for my favorite wargame ... and that’s just a small fraction. ... I write a lot of code, even outside work. If there’s any obvious way to use code to solve a problem (and sometimes even if the way is non-obvious), I’m going to write a program. I can’t fix a car, I suck carpentry and plumbing, I’m not very good at yardwork or gardening, and I’m not even particularly useful at administering my family’s eclectic collection of personal computers, laptops, and tablets, but I can write the hell of out of some code. And I’m the type of person who will gleefully spend days trying to solve a problem with code that I could have probably just done manually in a few hours, because I don’t mind spending days on a program, ’cause it’s fun. But just because I don’t mind it doesn’t mean I want to do it all the time. What I’d really prefer is to get in, write the code, and get out. Just Get Shit Done. And that’s what Perl lets me do.
That's a programmer, all right. I don't usually drop quotes this big into entries, but there's way more I could have quoted from this excellent entry.
Again, the entire series is essential reading.
Buddy Burden writes a great eight-part series, Perl and Me, on his approach to programming, how he came to code in Perl and what he thinks is wrong (and right) with the profession and teaching of programming.
It's not all about Perl, though much of it is. Every programmer should read it.
Like many other people who work or play at web design and development, I've spent a considerable amount of time learning new (to me) languages in recent years. Now I'm starting to take a good look at Python. Why? First, because there seems to be a lot of promising activity around Python. But more importantly, I suppose it's because Python, like Perl, is readily usable beyond the web.
Keep in mind that I'm an IT guy more than I am a developer. That tends to be the way I look at things. Perl is a fantastic language for accomplishing all sorts of programming tasks (virtually anything you're likely to want to do that doesn't require a dedicated team of developers). Python is the same sort of language. By comparison PHP, Ruby, and others are not so much (which is not to suggest that they aren't perfectly fine languages for what they're used for).
The interesting thing is, the more I learn about these languages, the more I appreciate just how sensible Perl is. It makes me appreciate Perl all the more.
There's a lot more to this thoughtful entry, and I highly suggest you read the whole thing.
Find something that interests you. Find a way to automate it. Keep a list of changes or improvements or new techniques you might apply. Write down what you think about when you're commuting or walking or falling asleep or bathing. When you can't get it out of your head, break it into small pieces, test and experiment, and see what happens.
Programming well requires knowledge, certainly, but like anything else it requires passion to keep you practicing in a disciplined way. The resources I've mentioned here can give you knowledge and will help you develop your discipline. (They're not the only resources, but I believe they're great resources.) What's left is up to you.