Learn coding concepts by building real projects with modern technologies

Comprehensive Guide to Learn Computer Science Online

By Lane Wagner on Nov 18, 2020

Be careful deciding the best way to learn to code, as not all paths are equally effective. Self-taught developers and bootcamp graduates often struggle a lot to find their first coding job. In my experience, it’s much easier to get your foot in the door when you spend the time learning the CS basics that so many “crash courses” skip over when trying to get students to dive directly into the deep end of application code.

Skipping CS basics and starting with web servers is like skipping biology 101 to take a three-week “seminar” in cranial surgery. That said, there is also a problem with students spending 4+ years and thousands of dollars when the same computer science education can be acquired online for a fraction of the investment.

Learning computer science is an inexpensive and effective way to start your coding career, and you can do it completely online. You don’t have to go to university to get a top-notch CS education. Let’s go over all the resources and tips you need to get a job as a software developer, and you can do it without leaving your room.

How to Get Started - The Short Answer

There are several main topics studied by computer science students in universities around the world. We will consider some of these topics as “mandatory” and others as “elective” or “optional”. Take a look at the list below to get an idea. You should study these topics in the order given.

Also, before diving into all the various requirements, I’d like to point out that I recently launched Boot.dev - a resource designed to teach computer science through coding exercises. If you’re interested in a simple hands-on approach be sure to take a look at that, it’s even free to audit.

Study These Computer Science Topics - Required

SubjectsRationale
CodingYou need to learn to code to put computer science concepts into practice
Computer Architecture and HardwareIf you don’t understand the physical machines your code runs on, you’re at a disadvantage.
Algorithms and Data StructuresArguably the most practical application of CS to most day jobs, learn to write fast code.
CS MathI’d rather teach a mathematician to code than teach a coder math.
DatabasesVery few applications get away without a data store, you need to know how to use them.
Web DevelopmentMost jobs in the industry are involved with the web, you need to learn the tools.
Graphics ProgrammingAlmost all users interact with our software graphically, so understanding how that works is incredibly important.
Functional ProgrammingFunctional programming is useful for learning important concepts like recursion and is growing as a practical paradigm.
Computational TheoryYou’ve gotta learn about the limits to what computers can do theoretically, even if we assume the best hardware.

Optional - Choose at least 2

SubjectsRationale
CryptographyCryptography is what makes secure communication possible. If you ever plan to work on the web this is important stuff.
NetworkingWhile you may not need to set up servers on your own, it’s important to know how complex networks are built.
CompilersCompilers allow us to write high-level code that executes on physical machines, a solid understanding of how they work is valuable.
Distributed SystemsWith the advance of Docker, Kubernetes, and the cloud, learning to build scalable distributed systems that can communicate and stay in sync is paramount.
Operating SystemsOperating systems manage all of our code, they have complete control over our execution environments. Get to know them.
Artificial Intelligence and Machine LearningAI and ML are growing more and more each year. There will likely always be jobs in teaching computers to teach themselves.

These topics cover almost everything that a typical CS student would learn at a university, though you obviously need to make sure you go appropriately deep into each topic. Later in the article, we’ll cover each topic in more detail, and supply resources to get you started.

Learn Go by writing Go code

I'm a senior engineer learning Go, and the pace of Boot.dev's Go Mastery courses has been perfect for me. The diverse community in Discord makes the weekly workshops a blast, and other members are quick to help out with detailed answers and explanations.

- Daniel Gerep from Cassia, Brasil

Feeling Overwhelmed? Don’t Be.

A typical computer science undergraduate takes 4 years to complete their degree. Hopefully, this isn’t news to you, that’s just how college works. Have hope! If you’re teaching yourself, you can cut out the fat and speed up the process. If you follow these tips, you’ll likely be able to learn the equivalent of a CS major in less than two years, and should be able to get an internship or a first job after just 3-6 months, depending on how much time you’re able to practice and study daily.

Keep in mind, getting a job usually requires more than just knowing your stuff. Getting certificates and completing real projects along the way gives you something concrete to put on your resume that will fill in for the missing CS degree.

1. Watch Lectures on YouTube, not Tutorials

Tutorials and courses should involve coding, and I’ll recommend some resources for doing that. Lectures on the other hand are useful for learning concepts that don’t necessarily require hands-on experience. You can watch those videos over breakfast or on the train.

2. Get Involved in Dev Communities

Do you browse Reddit, Twitter, or Facebook in your free time? Make a small change to your online content consumption and start reading about technology-related content instead, or in addition to what you already consume. Check out this list of communities to make yourself a part of.

3. Interview and Get a Job Early (within the first year)

You are teaching yourself online, and the best way to catapult your education is to get an internship or entry-level job as soon as you are able to. Depending on the kind of CS job you’re interested in, you can start earlier or later, as some require more or less experience.

Why Learn Computer Science at All?

Many developers do land well-paying programming jobs without computer science degrees, but it can be hard, it often requires luck or friends in the industry, and once they have a job they often stagnate and are unable to participate in seriously innovating and challenging work.

Knowing the first thing about React, Node, and Mongo might be enough to get a low-paying entry-level job, but I’ve found that so often those developers hit a ceiling on their earning potential and get burned out of using the same tools quickly.

Don’t be that developer, or if you are that developer, you can easily go back and learn the fundamentals.

Like myself, you may have been hearing for the past 15 years that “there are more programming jobs than there are candidates to fill them”. While still true, the software engineering career outlook is changing.

We’ve recently had an influx of thousands of self-taught developers or Bootcamp grads that are all looking for entry-level jobs, but don’t have the fundamental math and CS skills to solve more technically challenging problems. By having a deeper understanding of computational theory and algorithms, you can set yourself apart to land jobs faster and command a higher salary when you get there.

Required Topics

1 - Coding

Coding can be really fun and has a low barrier to entry. The goal here is to get a solid grasp of one or two programming languages. I recommend JavaScript, or Python as some of the most well-suited first languages for new developers. The goal here is simply to start writing code and have fun with it! There are tons of projects and courses out there that are great for absolute beginners.

Coding

Resources

Goals

2 - Computer Architecture and Hardware

Computer architecture is arguably the most overlooked subject among the bootcamp and self-taught developer community. It’s almost impossible to write performant and efficient software without a basic understanding of the hardware it runs on.

Computers are built of various components (hardware) including the CPU, memory, busses, clocks, and the peripheral devices you are familiar with like the mouse and keyboard. All of these components must communicate with each other and provide a necessary service to the user, but as software developers, the most important components for us to understand are memory (RAM) and the processor (CPU).

Computer Architecture and Hardware

For example, how does a processor know to take the following expression written in JavaScript, let sum = 5 + 3 and compute the result of 5 plus 3?

Who taught the processor to understand the Arabic numerals? The answer of course is that it doesn’t, processors only work bitwise, on binary numbers.

Javascript is run by an interpreter (Node.js or the browser) which itself is a compiled program. The interpreter was written in a compiled language, like C, Rust, or Go, but then compiled into raw byte code that the CPU understands. To get a better handle on how computers actually, you know, compute things, writing assembly code can be very helpful.

Assembly is the native language of the processor, and writing a bit of it can really help us understand how the CPU processes stuff. Because assembly is so tightly coupled to CPU architecture, the language changes depending on the processor type. I recommend starting in ARM, it has a more elegant syntax than x86 in my opinion.

Resources

Goals

3 - Algorithms and Data Structures

The study of algorithms and data structures is the bread and butter of computer science. It’s fundamental that we learn about making computer programs fast so that they can delight our users and find meaningful answers quickly.

I’m in complete agreement with the traditional education system that that familiarity with common algorithms and data structures is vital to the success of any developer. Understanding these basic problem-solving skills will also benefit you in any aspect of your career and life.

Resources

Goals

4 - CS Math

Computer science, like many sciences, is just applied mathematics. Many software engineers do their best to ignore this fact, and make ignorant claims like, “I’ve never had to use math while coding”. I’ve always said that I would rather take a math student and teach them to program than take a programmer and teach them to do the math.

Having a solid understanding of the math that makes computer science work will give you a tremendous edge over developers that lean on the academic understanding of their peers to get by.

Resources

Goals

5 - Databases

Database knowledge and theory is one of the most practically applicable topics to most engineering jobs. I’ve never worked at a company where we didn’t have multiple databases, and the most successful engineers at the company wee usually the ones who knew a little something about how to use them.

Resources

Goals

6 - Web Development

This is what most Bootcamp and self-taught developers learn, and unfortunately not much else. As you can probably imagine, the reason why web development is taught at bootcamps is because this is the money-maker. The majority of development jobs, especially jobs with a low barrier to entry are web development opportunities. As you dive into various web development resources, try to focus on a single backend language (and maybe a framework), and a single frontend framework, if you choose to learn one at all.

Personally, I recommend learning backend APIs using the Go programming language with no framework. I would also advise building a frontend using vanilla JS, as well as another one using Vue.js or React.js. The practice is worthwhile, and don’t skip the vanilla javascript! Frameworks are great but they come and go.

Resources

Goals

7 - Graphics Programming

From gaming and video editing software to web browsers, graphics programming is a high-performance, rapidly evolving subject within the industry. You’ll want to start with a fairly low-level tool like OpenGL so you can understand what most frameworks like Unity and Unreal Engine are built upon. Once you’ve built a few small projects, I’d recommend using a higher-level framework like one of the ones mentioned above, or even a browser-based tool like WebGL to build a simple game.

Resources

Goals

8 - Functional Programming

Functional programming concepts and styles are especially important in web development as frontend applications and frameworks are starting to use functional styles to help make codebases easier to maintain. Recursion, the avoidance of side-effects, and purely functional data structures are must-know concepts that will make finding a job in the industry that much easier. Even if you never end up working in a purely functional language, the fundamentals of functional programming apply universally to all coding environments.

Resources

Goals

9 - Computational Theory

Computational theory, apart from pure math, is one of the most “pure” computer science topics due its theoretical nature. Alan Turing, who is often called the father of computer science, pioneered many of the theories that we now use to compute the solutions to complex problems. In my opinion, computational theory is the crowning jewel of a CS education, and understanding its concepts truly sets students apart from their competition in the job market.

Resources

Goals

Learn JavaScript by building real projects

I was a field service engineer and I wanted to learn to code, but work and family limited my options. When I found Boot.dev, the "Intro to Coding in JavaScript" course got me up and running immediately, and I knew I made the right decision as soon as I joined the Discord community.

- Özgür Yildirim from Germany

Optional Topics - Choose at Least 2

1 - Cryptography

Cryptography underpins the security of all digital applications. Valuable engineers need an understanding of not only the best security practices but how and why those best practices work. Cryptography can be a math-heavy subject depending on how deep you dive into the material, so it’s probably a good idea to brush up on your math basics as you work through crypto material.

Cryptography

Resources

Goals

2 - Networking

Every once in awhile, something goes wrong with a companies server connections, and only the most experience developers are able to deal with the outage. Those developers are more valuable resources, and as a result command higher salaries. An understanding of networking basics is a huge boon to your engineering career.

Networking

Resources

Goals

3 - Compilers

While many popular programming languages like JavaScript and Python are interpreted, many are compiled directly to machine code.

Compilers

Resources

Goals

4 - Distributed Systems

The internet has become so unbelievably huge, that very few popular services online can get away with running their systems on a single machine. Previously companies purchase larger and more powerful machines, but Google was one of the pioneers of writing smarter software that can simply leverage the power of many smaller and cheaper machines.

Distributed systems is the study of programs that can efficiently take advantage of hardware wired together over a network, and it’s become more relevant all the time.

Distributed Systems

Resources

Goals

5 - Operating Systems

It’s hard to write good software without understanding the software that your software runs on. Just like an understanding of CPU architecture, a good knowledge of how operating systems work will make you a valuable asset to any organization. Most developers only have a cursory knowledge of how Linux operates, and if you deploy on Linux like most of the world, your expertise will be well-rewarded.

Operating Systems

Resources

Goals

6 - Artificial Intelligence and Machine Learning

While AI and ML used to be fairly niche fields, they are becoming more and more important as companies are turning to big data to answer long-standing marketing and product problems. If you have any interest at all I would highly recommend at least taking a look at the basics of some of the open-source frameworks like Tensorflow and Keras.

Resources

Goals

Good Luck!

I wish you the best on your CS journey! Computer science and programming have changed my life for the better. I now have a comfortable salary, a job I enjoy, and I get to meet and work with the most interesting people. Let me know if this guide has helped you and how I can improve it!

Learn to code by building real projects