Why is it so hard to figure out where to start?
It's no secret that software development has exploded in the past 20 years. New software startups pop up like dandelions in the spring. It then follows that a lot of people think software development is a good career choice and are afraid of missing out on a lot of great opportunities.
Software developers are, in general, pretty opinionated. I doubt this is unique to developers, but it gets tiresome when you've dealt with it for years. If we're not fighting over what operating system is better, then it's what language is better. If it's not that, then it's code editors, or databases, or frameworks, or bug trackers, or development processes, or...or...or. It's like we enjoy fighting.
In a time where more and more people are becoming developers, it's not enough to be just "a developer" anymore. No, to feel superior now, developers need to somehow differentiate themselves from both the non-developer "rabble" and their fellow developers.
This mentality has lead to more coding languages being developed that purport to "fix" issues with other languages. New frameworks are built to "fix" issues with previous frameworks. And on and on.
All this leads to a huge amount of choices, opinions, and resources. Naturally, that makes starting to learn, daunting.
Since I'm a developer too, I'm susceptible to the same opinions and biases that I just railed against. The difference is, I'm right. I'm kidding, seriously, calm down everybody. Here are my suggestions.
Choose your weapon language
As someone once said: "the weapon doesn't make the man." It's probably a quote from some B martial arts movie or Dragonball Z, but the philosophy holds true for programming languages. A good developer is a good developer regardless of language. Learning any language will help you understand the core concepts of programming. However, you need to start someplace, and if you pick your first language wisely, you'll drastically shorten the time to hit your goal.
Picking a language boils down to what you want to do. This is a quick list of general development goals and what language(s) are your best options to get there (NOTE: this is not meant to indicate that these are the only languages that you can use for a given domain, just my suggestion on what to start with):
Naturally, there are other options for each of these. Javascript is useful for items 1-5, for instance. But the list is a good starting place as-is. NOTE: A number of people contacted me and mentioned that in certain places, especially outside the US, the above list is different for back-end web development. In those locations, C# and Java are used more often than Python or Ruby. The suggestion is to check job postings where you plan (or hope) to work for the job and companies you want to work in and see what languages they require.
How to find good resources to start learning
There are a ton of resources to learn to code out on the web. How do you sift through the chaff and find the real gems?
Most resources fall into the following categories:
Books are the traditional go-to resource. Search Amazon.com for your topic and read reviews. Make sure that any books you're considering are new. Languages change and older books could slow your progress.
A lot of people have gravitated to videos to learn coding and other topics. YouTube is the first place most people look. Fair warning, this is going to turn up a bunch of crap. Look at how many subscribers a given instructor has, and watch some videos to see if their style and method works for you. Another possible issue is that because video is more difficult to update for new versions of a language (or corresponding tools), some videos might be outdated.
For blogs and tutorials, a simple google search like "best python tutorial" or "best swift tutorial for beginners" is a great place to start. As with videos, you'll have to try a few to see how they work with your learning style.
Online courses are the newest resource on the scene. Codecademy is one that a lot of people find immediately. However, after I talked to a lot of people who tried it, none really thought it did a good job. Free Code Camp or The Odin Project are both highly regarded for web development. Udacity, Coursera, Udemy all have courses in different genres. Each has reviews so you can compare and only look at ones that helped others. My specific examples follow in the next section.
Where you should start, specifically
Each development goal in the above list is different enough to require different starting points. I'll list the place that I'd recommend you start for each one. I have not personally tried all of them, but have come across them when doing research. There also might be better ones, and so if you know of any, let me know and I'll update this list.
Once you pick your language and starting point and you start learning, some things will be obvious, but others will be difficult to understand. You're going to run into trouble and with concepts and code errors. That's normal. We've all been there. Getting unstuck takes practice too.
How to get unstuck once you've started
Once you start learning to code, you're going to run into problems that you don't know how to solve. This is normal and part of the process. You don't really learn unless you struggle through it. That said, you won't always be able to move forward without some help. So how do you find that help?
First off, forget books. They aren't a great place to start here, because the number and types of errors they can cover is so small.
Online is the easiest place to find help. Most devs look for solutions on StackOverflow or just google the error message (if they have one). Other solutions are to find newsgroups or forums dedicated to the language you're using.
How to use Google to get unstuck
When you first try to google an answer to your problem, you're going to run into the issue of what to search for. Experienced developers are really good at this part, but unfortunately, it's hard for beginners, who need it the most. So here I'll give you some expert hints on how to improve your search results.
Here are a few examples I've used (minus the quotes):
after_invited_path
method. Google usually gives better results when you remove the underscores, '_'. If not, try adding them in and enclosing the underscored words in quotes: "devise_invitable", "after_invited_path".Once you find a solution, DO NOT COPY AND PASTE. This is a huge no-no. Copying code verbatim from the web is a good way to slow your progress and keep you from becoming a better developer.
You need to understand the code, adapt it to your situation, try it and rinse and repeat. There's a risk of copying bad or wrong code, but you also may find yourself going deeper down the rabbit hole. If the code you copy or adapt doesn't fix the errors or creates new ones, you could be making your code more complicated and harder to understand all while trying to fix a problem.
So go slow, understand the changes you're making and don't be afraid to back out and try a different solution. Sometimes the problem you're seeing is caused by multiple issues, but not usually.
Getting help from a person
Since googling for a solution is an art that takes practice, it's easier and quicker just to ask someone. That assumes you have access to someone of course. A couple of ways to find someone to ask are, starting with the best:
* Friends or family, or friends of friends or family.
* Local meet ups, a la meetup.com or user groups (google for 'ruby user groups near me' or similar). This is a great idea anyway, in order to build a network of peers, mentors, and possible employers.
* Campus groups if you're in or near a college campus.
* Reddit.com - r/learnprogramming is a good place to start (you're here!) or language-specific subreddits like r/learnjava.
* Local, virtual groups on Slack. Google for something like 'tech slack <my city>' or 'developer slack <my city>'
* IRC, Internet Relay Chat. This is what slack has modernized and has been around for decades. A surprising number of tech companies have a presence on IRC. Google '<my language> IRC channel' to find one.
* Facebook groups (although I've found these to usually be lower-quality).
If you work better with more accountability and people, there are other options
Self-teaching is great but it takes a lot of work. You have to figure out what to learn. You have to find where to learn it from. You need to understand how to get unstuck and what projects to do. You have to find people to meet to build relationships with. Furthermore, you're not held to any commitments other than your own. For some people, that's enough. Others, myself included, work better when held accountable to others.
There are 2 main alternatives to self-teaching that address most of the difficulties, albeit for a price:
* Degree programs at universities
* Coding bootcamps
Which is best for you is too big a topic for this post, but if you're interested you can DM me or add a comment and we can chat.
I hope this is useful. If there are parts that are unclear, or you feel something is missing, let me know and I'll revise it.
If you disagree with parts of this post, as I know some people will, let me know that too (I know you don't need an explicit invitation :) ) and if we agree, I'll update the post.
How to Learn Anything
Someone made a search engine to solve this exact problem.
It shows the best path for how to learn any topic on Earth in a linear way. Here for example is the path to learning programming.
Or if for example you want to learn python, you can do it here.
Just search for what you want to learn. :)