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.
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.
“If you are not currently a Unix user, your biggest decision may be whether you want to become a Unix user. Because most of the programming language stuff (that you don’t have to pay big bucks for) assumes that you work in a Unix-like environment. If saving money is important to you, and you don’t currently know much Unix-speak, then you will find that learning Unix will be just as difficult and time consuming as learning a programming language. But also just as useful—maybe more so.”
I think that learning best practices from the start is much better than getting used to doing things sub-optimally. Yes, one can program on any system, but UNIX and its derivatives are designed for programming in a way that Windows just isn’t. You can learn to play music on a guitar with only five strings if that’s all you’ve got—and it’s easier to start with, one less string to worry about—but you’ll always be at a disadvantage to those who’ve got an extra string on their guitar.
You can get a Unix-like environment on a Windows system by installing Cygwin. This is significantly easier than and less of a commitment than switching operating system.
May I ask where your negative impression of Cygwin comes from? I don’t agree that virtualization is desirable for one’s primary development environment (though it’s extremely handy for testing and porting), because I’ve found it to be a recurring source of trivial inconveniences. But my view of Cygwin is from the perspective of a power user; I’ve been using it for a long time and have gotten used to/found workarounds for all its issues.
You yourself point out that both solutions have their trivial inconveniences. But at least in a virtual machine you can have an off-the-shelf complete linux with no porting issues.
I take your point, but disagree. Cygwin isn’t especially user-friendly, and modern GNU/Linux distros are trivially easy to install as dual-boot systems, so there’s no real commitment there. And if you’re using a real GNU/Linux distro then you’ll be able to find help for your exact version of the software much more easily—cygwin has a fairly small install base by contrast.
Another possibility is to run some variety of Linux in VirtualBox or the like under Windows. I haven’t done this myself, but I know a few people who swear by it.
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.
I disagree—I tend to agree with Perplexed above:
“If you are not currently a Unix user, your biggest decision may be whether you want to become a Unix user. Because most of the programming language stuff (that you don’t have to pay big bucks for) assumes that you work in a Unix-like environment. If saving money is important to you, and you don’t currently know much Unix-speak, then you will find that learning Unix will be just as difficult and time consuming as learning a programming language. But also just as useful—maybe more so.”
I think that learning best practices from the start is much better than getting used to doing things sub-optimally. Yes, one can program on any system, but UNIX and its derivatives are designed for programming in a way that Windows just isn’t. You can learn to play music on a guitar with only five strings if that’s all you’ve got—and it’s easier to start with, one less string to worry about—but you’ll always be at a disadvantage to those who’ve got an extra string on their guitar.
You can get a Unix-like environment on a Windows system by installing Cygwin. This is significantly easier than and less of a commitment than switching operating system.
Nowadays you can just work in a virtual machine. Cygwin is a terrible hack in comparison.
May I ask where your negative impression of Cygwin comes from? I don’t agree that virtualization is desirable for one’s primary development environment (though it’s extremely handy for testing and porting), because I’ve found it to be a recurring source of trivial inconveniences. But my view of Cygwin is from the perspective of a power user; I’ve been using it for a long time and have gotten used to/found workarounds for all its issues.
You yourself point out that both solutions have their trivial inconveniences. But at least in a virtual machine you can have an off-the-shelf complete linux with no porting issues.
I take your point, but disagree. Cygwin isn’t especially user-friendly, and modern GNU/Linux distros are trivially easy to install as dual-boot systems, so there’s no real commitment there. And if you’re using a real GNU/Linux distro then you’ll be able to find help for your exact version of the software much more easily—cygwin has a fairly small install base by contrast.
Another possibility is to run some variety of Linux in VirtualBox or the like under Windows. I haven’t done this myself, but I know a few people who swear by it.