Learning software development is one of the most frustrating endavours you can partake in. You see these sophisticated web apps and advanced operating systems and you want to do like them. You want to make a great triple-A game with your own amazing story. However, few realize the amount of effort into making these. These pieces of software are built by big teams with dozens of members who spent the past 5 years churning out code.
On top of that, it's not just about writing and understand code, but it's about writing it in a way that it can be re-used, easy to read and understand years down the line and easy to fix and maintain. Yes, you can make something work by copying code you don't understand and having a big giant mess of spaghetti, but it's not something that you call software engineering. At best, you're a script kiddie.
Like in any field, you need to start really small. Writing command line applications that add two numbers. Understanding the very fundamentals of how computing actually works, how code is converted into something the CPU understands.
Many want to become computer scientists and software engineers, but I honestly don't believe that academia is the best route for this. The knowledge they offer is often out-dated and doesn't really apply to the real world. In school, you get these lab exercises with perfectly commented code but when you start your job, things are really different and way more messy. Yes, you might need a degree for you next job, but an Arts or Math degree will get you far enough. To build software, you need to be passionate about it and teach yourself. You need to get deep into the books and learn by reading other people's cryptic code. Unlike other fields that have been the same for centuries, software changes every day. Just look how often your phone apps get updated and changed. It's not just about trends, it's about constant improvements.
Don't be discouraged when something doesn't work, keep trying until you get the results you want. Keep re-inventing the wheel until it is a well-oiled machine. You won't get there in a few days but trust me the ramp up will be quicker than you think.
You need to pick a path before you start on your adventure. Do you want to write games, cool web apps for budgeting or how about an advanced modeling and simulation library? Just like any other field, there are specializations and you can be good on as many as you want. The secret is time.
When someone asks me about where to start, I usually throw this list of resources with books and websites. Somewhere in there, you'll find something that tickles your fancy and will get you started on your programming adventure.
No Excuse List
There's a lot of free programming courses in there if you prefer lectures and interactive exercises instead of reading. Codeacademy is really popular.
Freely available programming books
Basically anything related to computer science can be found here. There's even some IT related books in the list. Updated all the time.
A meta-list of useful libraries for different programming languages. Before trying to code something on your own, see if there's a library that does it already.
Pick your preferred method of learning and you'll on your way to make whatever you want. The sky is the limit, or perhaps your imagination.