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. Here are my suggestions.
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. However, you need to start someplace, and if you pick your first language wisely, you’ll drastically shorten the time to hitting your goal.
I wrote in-depth about how to choose the right language as a beginner. It 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:
- Mobile development: Swift (iOS) or Java (Android)
- Windows development: C#
- MacOS development: Swift & Objective-C
- Operating systems, filesystems, embedded systems: C/C++
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 since 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.
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.
- Front-end web development: Free Code Camp
- Mobile development: Swift Lynda’s Swift Essentials or Flatiron school’s free Swift course, Swift Programming book or Java Head First Java, University of Helsinki’s MOOC
- Windows development: Head First C#, Pluralsight’s C# course
- MacOS development: Cocoa programming for OS X, or the same courses for mobile Swift
- Operating systems, filesystems, embedded systems: C++ How to Program book, C++ Tutorial for Complete Beginners
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 art, but unfortunately it’s hard for beginners, who need it the most. So here I’ll give you a some expert hints on how to improve your search results.
- Always include the name of the language you’re using. If you’re using a specific tool, database, or framework, include that as well. Don’t include all of them, just the ones that you believe are relevant. This will take practice.
- If you’re getting an error message, include that in quotes. Edit the message to contain only the core of the message so it doesn’t reference any files, classes, path or filenames that are specific to your program or computer. The trick here is to make the error message as specific as possible while still being general enough to apply to others who are using the same language/tool/etc. but in a different context.
- If you’re working through a publicly-published problem from a book or course, add that information to the search.
- Explain what you’re trying to do, with the fewest words. This is tough for developers of all levels. For a beginner, you may have trouble coming up with the right terminology. This is where the books, tutorials, and course materials come in handy. They should use the right language if you’re doing something similar to what’s covered in them. If not, you’re going to need to try some different wording. Remember, other beginners are going to be having problems too and might explain the problem the same way.
Here are a few examples I’ve used recently (minus the quotes):
- ‘ruby rails form helper checkbox’ – I included ‘rails’ because I knew the form_helpers were part of Rails. I could remove ‘ruby’ here since ‘rails’ is ruby-specific and should narrow the search fine. And yes, I know it’s “Ruby on Rails” but searching google for ‘on’ just doesn’t help.
- ‘ruby devise invitable after invited path’ – Here ‘devise_invitable’ is a gem, a Ruby code library (collection of reusable code) and I wanted to know more about its
after\_invited\_pathmethod. 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”.
- ‘java “cannot refer to a non-final variable”’ – The error I was getting included “cannot refer to a non-final variable” but referred to files specific to my project before that phrase, so I didn’t include those parts.
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 problems, 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 – Look for subreddits like r/learnprogramming or 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 be low-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
I wrote a whole guide on cutting through the crap and deciding on your best path to become a developer. Simply, sign up for my email list and I’ll send it to you for free. The upshot is that both provide ways for you to learn how to code without spending so much time and effort figuring out how.
What to do right now
What you should do now is send me an email at firstname.lastname@example.org. Tell me what language you’re going to learn and what resource you’re going to use to start. If you can’t decide, let me know that too and I’ll help you figure it out. I read all my emails. Cross my heart.