What Should You Learn First?

Looking out over the Atlas, it is easy to get intimidated. Confronted by a massive terra incognita, it is difficult to know where to even begin. New programmers get a lot of conflicting advice about how they should learn, so let’s unpack it.

Disclaimer: this is a long-winded rant meant to help you understand the conflicting advice given to new programmers about what they should learn first. If you just want to take my word for it, check out the curriculum.

Most of the popular “learn to code” apps like Code Academy and Free Code Camp instruct new programmers to start by teaching HTML & CSS, the languages that define the content and style of a webpage. Why these and not something else?

After all, HTML is not a real programming language. HTML is a markup language, essentially a form of annotated text. Unlike a programming language, it can’t give the computer instructions to, say, play chess or calculate the square root of a number. Saying that you’ve "done some coding in HTML” will instantly make you sound like a novice. (Not that there’s anything wrong with that!)

Many grumble that we’re wasting time teaching it to beginners. Instead, they insist, you should start by getting a solid grounding in the fundamentals of programming. High school’s AP Computer Science course, for example, starts by teaching Java and gets all the way to object-oriented programming without ever justifying its practical upside.

There’s a universal frustration amongst new coders that despite all of their progress and effort, they still can’t make anything “real.” While your professor blabs on about creating a Java class called “Dog” that can inherit properties from “Animal”, you sit there anxiously reflecting on how the prospect of you building the next Facebook feels hopelessly remote.

Who is right? The punchline is that “learning to code”, as most people use the phrase, involves acquiring lots of skills and knowledge besides just programming. These can range from the math that makes databases fast, to the protocols that run the internet, all the way to the hotkeys for your text editor. Your grandma is going to assume that you can fix her computer.

In our young field, nobody quite agrees on what exactly falls under the domain of what a developer “should” know, and every developer’s skillset is a little bit different. The goal of the Atlas is to lift the veil and help you get a better idea of what you’re up against.

What language should you learn first?

...So not Java then? That grumpy developer who argued against teaching HTML & CSS will also say that it isn’t important what programming language you start with, because they are all fundamentally similar. Pick anything, because once you learn to “think like a programmer”, picking up additional languages will be much easier.

Their reasoning is that since the realm of software development is so vast, sticking to the fundamental, transferable skills is the best use of your time upfront. For example, learn what a “variable” is in Java, and you’ll grasp the concept in every language.

Take this idea to its extreme, and you get the traditional Computer Science university curriculum. You’ll (probably) learn Java and OOP, algorithms and data structures, and continue all the way to writing assembly or a compiler before ever getting around to building a real app.

This approach has its own issues. Slowly building your foundations is a reasonable approach when you are in a long-term school setting, but emphatically not a good idea when trying to teach yourself.

The way that you will fail to learn how to code won't be by wasting time learning the wrong things, but by getting frustrated at your slow progress and quitting. It's a marathon, and it takes patience, self-awereness and self-discipline to stick it out. Anything you can do upfront to see progress and have fun is a good idea.

...So not Java then? Programming languages differ in many subtle ways, and different languages tend to get used for different tasks. Crucially, the language you learn will dictate the types of projects you’ll be able to do, and working on projects that are interesting to you is critical to staying motivated.

The /r/learnprogramming FAQ gives a big table to help you choose: if you want to make iPhone apps, learn Swift. Build robots? learn C. Websites? learn HTML, CSS & Javascript.

Overwhelmed yet? What if you don’t have something specific in mind?

Why HTML & CSS?

The reason that HTML & CSS are such a popular starting point is because even though they aren’t really programming, they are the first step in learning to make web apps. Of any other place to start, web development will give you the biggest rewards the quickest.

Making websites is visual and fun, and you can get to the point where you can make your own pages almost immediately. Far and away, the most important skill that will determine your long term success will be your ability to stay motivated and teach yourself, and it doesn’t hurt to stack the deck in your favor at first.

Web development certainly isn’t the only type of software development, and when you are just starting, it is too early to know what type of developer you will want to become. But note this: according to the Stack Overflow survey last year, the overwhelming majority of professional developers are doing some kind of web dev. So even if it isn’t where you end up, it is exceedingly likely that knowing HTML & CSS will be useful to you.

So, where do you start?

You're probably more confused then when we started, huh? My point is to illustrate that of all the things you can learn, there exists broad split between the deep, heavy theoretical stuff and the easier, more pratcial stuff. The former takes longer to learn and much of has dubious practical value in a day to day developer job, but the latter is more commoditized and paradoxically won't get you as good of a job. It is a false choice: in the long term, everything in the Atlas is important.

There's no single path to go from zero to developer, so the best thing to do is just start with something that interests you. Otherwise, start by learning basic web development, and once you've gotten a feel for coding in general, take it to the next level by thinking about whether or not you should go to school.

To get a grip on what I mean by Web Development, click and read that node on the map.

To jump right in, check out the Developer Atlas Curriculum.

Feeling eager? Alternatively, consider checking out Harvard’s wildly popular Introduction to Computer Science, available for free online. Despite the name, CS50x doesn't only cover Computer Science as I define it in the Atlas. It is, instead, a broad survey of Software Development as a whole, and for that it is hard to beat as an introduction to the discipline.