For context, I've been teaching myself programming for about 10 years, and I'm currently a professional programmer.
The most important thing in programming is that you find something that you enjoy. There's enough variety in terms of languages and problems out there that you're bound to find something that works for you. Once you find something that's fun (and therefore easier) for you, it won't be too hard to bootstrap into more complicated languages and problems.
As far as problems go, start with something simple, and work your way up. An excellent way to do this is Project Euler, which many people here have recommended as well. I think it would fit particularly well in your case, since many of the problems on that site are mathematical. Another great thing about Euler is that it is language-independent. Make sure that after you solve a problem, you read the solutions other people have posted. You can find examples of a lot of different languages and styles.
As to language choice, I'd go through some tutorials online, and see what makes sense to you. One you might try is Why's Poignant Guide to Ruby. Maybe some other people have other good recommendations for other languages. Try the first few problems in several languages, and see what makes the most sense to you. I like Java and Python. Personally, I'd avoid LISP, Scheme, Haskell, and other more academic languages unless you're particularly ambitious, and/or you know people who use them.
An important skill in programming I think most people forget is this: Research skills. I've got a lot of experience programming, but I come across an enormous amount of things that I simply don't know how to do. Get used to using google to find answers. It's much faster than asking people or looking it up in a book.
Subscribe to RSS Feed
= f037147d6e6c911a85753b9abdedda8d)
http://www.catb.org/~esr/faqs/hacker-howto.html That's by Eric Raymond, who at that time was a respected programmer (he's now a disrespected far-right-wing blogger).
To summarise his advice, first get an open-source UNIX on your computer (e.g. Debian GNU/Linux, which can be downloaded from http://debian.org ). UNIX is a much better programming platform than Windows, and you can install it so your system can switch between it and Windows (though personally I'd just drop Windows altogether).
Then start with Python. http://www.pythonlearn.com/ seems a very good resource (I found that yesterday via ciphergoth's twitter feed).
I second the recommendation of Project Euler. The problems there are simple enough that you can probably solve them very quickly, but still tricky enough to stretch your programming muscles.
Once you've learned Python, you really need to look at at least one of C or C++. These are the standard languages for low-level systems programming, but they're also the basis for a huge number of other languages - if you know even a little bit of C, then Java, C#, Perl and so on will all be trivial to pick up.
If you really don't want to switch operating systems (though I really, really urge you to do so if you ever want to do serious work), I recommend trying to learn one of Microsoft's proprietary languages using Visual Studio Express ( http://www.microsoft.com/express/Windows/ ). Visual Studio lets you knock together quick-and-dirty GUI apps for Windows in a matter of (sometimes literally) seconds. If you're sure you don't want to use another OS, then it's the only way forward, really. I'd recommend starting with Visual C# (which is very similar to Java, so you can switch to that with relative ease) - C++ is a bit hard as a beginner's language, and while I quite liked Visual Basic when I played with it, there's a consensus among programmers that learning Basic rots your brain.
Hope that helps.
I'd recommend against installing Unix/Linux unless you're already familiar with it. Learning programming and learning Unix are both non-trivial tasks. While I agree that Unix is generally a better environment for programming, I think it's better to focus on one thing at a time. Optimizing your programming environment is secondary to using an environment you're comfortable with.