I've had several developers contact me recently asking for advice on getting into a development career and how best to learn about programming. I'm not sure that I'm the best person to ask since I sort of lucked into my career and got great mentoring and training as a junior developer, but here are my thoughts.
Not Just New Developers
Before we dive into this, I want to point out that this advice does not apply only to new developers. Our industry is constantly changing, which means that we need to be constantly learning. And experienced developers need to figure out new technologies and where we want to concentrate our efforts. So we get to keep going through this process every few years (or less).
Find What You Love
The first thing to do is figure out what technologies you need to learn. Something that we need to realize is that we can't learn everything. If you try to do everything, then you'll eventually find that you're competent in nothing. It's best to concentrate on one or two key areas where you can build a strong understanding, and then get a peripheral understanding of other technologies that are available in that environment.
Pick an environment or technology that you love. This is something that took me a long time to learn. Life is short, and work takes up a big part of that time. Do not do something that will make you miserable. There was a time in my career where I dreaded getting out of bed in the morning just thinking about all the things that I had to do. It's totally not worth it.
Finding what you love may be based on a particular industry. Maybe you want to be in entertainment or finance or medical devices. If this is the case, then investigate the companies that are working in that industry. Find out what technologies they use. Most industries gravitate toward similar technologies. For example, functional programming is big in the finance industry; embedded programming is big in the medical device industry. If you are working in an industry that you are passionate about, then you'll want to be productive and motivated to learn the necessary technologies.
Finding what you love may be based on a particular technology. Maybe you find that you love to tinker with Raspberry Pi devices; maybe you like to understand how humans work and want to make user interaction experiences better. At the same time, check to see how the technologies are used in the real world. We have to be practical. It may be that our favorite technology does not have many career prospects. But we can usually find something similar that is widely used in some industry.
Conversely, I've been exploring functional programming through different languages, and that has me much more interested. I've found that I've been using functional concepts without realizing it, so this seems like a more natural fit for me.
Find How You Learn Best
As humans, we learn in different ways. Some people learn best from books, some from videos, some from working with a mentor, some through formal training, some through reading the documentation, some through labs, and some through tinkering around.
Try a couple different learning techniques, and find which one works for you. Not everyone learns the same way. So, try a couple different techniques. I've found that I learn best through books. It lets me easily go back to previous topics, re-read sections, pause and concentrate on a particular topic. When I watch video, my mind tends to wander or I find that I want to open up an IDE and try some stuff out. So I usually find myself re-playing parts of a video over and over. (I say "re-playing" rather than "re-watching" because I really wasn't watching it the first time.)
But that's just me. Explore and find what works for you.
The best thing we can do is talk to other developers, especially when we're exploring new technologies. Find someone who's been working with the technology in the real world. You can get some great advice from that person: what works, what doesn't work, the things that are awesome, the "gotchas" that you have to work around. Talk to other people.
Get involved with a local user group (or several user groups). This has been a huge eye-opener for me. I was pretty late to the game; I've only been involved in the developer community for about 4-1/2 years. Before that, my developer interaction was limited to the people that I worked with. I was fortunate to work with some really good people, but I was missing out on a much, much broader community.
What I've found is that developers love to talk to other people, but (stereotypically) we don't want to *start* the conversation. If you're new to a group or are with a bunch of developers you don't know, just go up and introduce yourself to someone. Ask about what that developer does, and you'll find that a conversation gets started. And usually, other people will come over to join the conversation. I've seen this happen many times; I just had to be brave enough to get the conversation started.
If you don't have a user group in your area, start one. It might just be putting something on MeetUp to have coffee with a couple other developers. And it doesn't matter if you're working with the same technologies are not. Just start talking to other people.
In addition to getting advice on technologies, you'll also build relationships. Over time, you get to know a variety of developers and they get to know you. When you're looking for work, this is invaluable. After being involved in the developer community for a few years, I found myself looking for a new job. I was amazed at how many job prospects I got through people that I knew in the community. Not all of these prospects will work out, but you only need one job (hopefully).
As developers, our industry is constantly changing. That means we need to be constantly looking at new technologies and we need to be constantly learning.
It is a challenge, but it is also exciting. We get to do new things all the time. We get to discover new ways to meet the needs of our business and users. We get to create on a daily basis. We get to keep learning. That's a pretty awesome job to have.