Be careful about deciding the best way to learn to code. 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 ๐
Subjects | Rationale |
---|---|
Coding | You need to learn to code to put computer science concepts into practice |
Computer Architecture and Hardware | If you don’t understand the physical machines your code runs on, you’re at a disadvantage. |
Algorithms and Data Structures | Arguably the most practical application of CS to most day jobs, learn to write fast code. |
CS Math | I’d rather teach a mathematician to code than teach a coder math. |
Databases | Very few applications get away without a data store, you need to know how to use them. |
Web Development | Most jobs in the industry are involved with the web, you need to learn the tools. |
Graphics Programming | Almost all users interact with our software graphically, so understanding how that works is incredibly important. |
Functional Programming | Functional programming is useful for learning important concepts like recursion and is growing as a practical paradigm. |
Computational Theory | You’ve gotta learn about the limits to what computers can do theoretically, even if we assume the best hardware. |
Optional - Choose at least 2 ๐
Subjects | Rationale |
---|---|
Cryptography | Cryptography is what makes secure communication possible. If you ever plan to work on the web this is important stuff. |
Networking | While you may not need to set up servers on your own, it’s important to know how complex networks are built. |
Compilers | Compilers allow us to write high-level code that executes on physical machines, a solid understanding of how they work is valuable. |
Distributed Systems | With the advance of Docker, Kubernetes, and the cloud, learning to build scalable distributed systems that can communicate and stay in sync is paramount. |
Operating Systems | Operating systems manage all of our code, they have complete control over our execution environments. Get to know them. |
Artificial Intelligence and Machine Learning | AI 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.
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. Start writing code and have fun with it! There are tons of projects and courses out there that are great for absolute beginners.
Resources ๐
- Boot.dev’s Basic Intro to JavaScript
- Edabit JavaScript Challenges
- A Byte of Python
- The Python Tutorial
- Python for Everybody
- FreeCodeCamp’s Learn JS
Goals ๐
- Understand and write small programs
- Use variables and expressions
- Use conditional statements
- Use iterative structures
- Use list/array structures
- Understand the basic elements of a programming environment including libraries and modules, editors, interpreters, and the command-line
- Use fundamental programming constructs including control structures, functions, keyboard input, classes, and objects
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).
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 Arabic numerals? Will, in reality, 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, 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 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 ๐
- eBook: Computer Organization and Design
- Binary and Hexadecimal (Khan Academy)
- Azeria Labs Writing Arm Assembly
Goals ๐
- Convert and understand the differences between number bases like binary, hex, octal, and decimal
- Understand the basics of computer instruction sets and an assembly language (probably ARM)
- Compose low-level programs that interact directly with the operating system
- Have a basic knowledge of how a CPU works
3 - Algorithms and Data Structures ๐
The study of algorithms and data structures is the bread and butter of computer science. We must 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 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 ๐
- Boot.dev’s Learn Algorithms course
- Boot.dev’s Learn Data Structures course
- Boot.dev’s Learn Advanced Algorithms course
- Data-Structures & Algorithms with JavaScript
- Steven Skiena’s Video Lectures
- “Algorithms” book by Dasgupta
Goals ๐
- Understand the basic principles of various software data structures, including their efficiencies and tradeoffs
- Implement and use several data structures in a known programming language
- Brush up on algebra including exponents and logarithms
- Understand Big-O complexity
- Review structures such as stacks, queues, unsorted lists, and sorted lists
- Implement a Binary Search Tree (BST)
- Practice with balanced trees
- Learn about hashing
- Searching and sorting algorithms
- Learn about graphs and how to traverse them
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 ๐
- Khan Academy’s Linear Algebra
- Concrete Mathematics Book
- Discrete Mathematics - On Open Introduction
- Statistics 110: Probability (Stanford)
Goals ๐
- Pigeonhole Principle
- Induction and Strong Induction
- Propositional Logic
- Equivalences and Normal Forms
- Basic Probability
- Conditional Probability
- Bayes Theorem
- Understand systems of linear equations
- Understand basic probability theory
- Diagonalization of a matrix
- Linear transformations
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 ๐
- W3 Schools SQL Tutorials
- ElasticSearch (NoSQL) Tutorials
- eBook: Database Design and Relational Theory
- Relational databases and SQL: edX
- SQL Tutorial: Scaler Topics
Goals ๐
- Understand the difference between relational and non-relational databases
- Understand the complexity of different lookup operations
- Be able to design effective database schemas for realistic purposes
- Become proficient in using relational, key-value, and document systems
- Understand the basics of transactions and ACID
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 web development is taught at bootcamps is that it’s 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.
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 ๐
- Develop modern web applications on both the client-side and server-side
- Assess various client-side and server-side web application frameworks and contrast their differences
- Create an interactive user experience using JavaScript, HTML, and CSS in the browser
- Create a RESTful API that a browser-based frontend application can create, read, update, and delete information from
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
- gltut - OpenGL tutorials on GitHub
- Book: 3D Math Primer for Graphics and Game Development
- Book: Real-Time Rendering, Fourth Edition
- Book: Ray Tracing in One Weekend by Peter Shirly
Goals
- Understand why we use GPUs instead of CPUs for graphics rendering
- Understand why OOP can make our lives a lot easier in the context of game development
- Use basic geometry and trigonometry to build beautiful simulations
- Learn about the performance implications of languages that don’t give access to memory
- Have fun - this is the creative side of programming
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 ๐
- Boot.dev’s Learn Functional Programming course
- eBook: Common Lisp: A Gentle Introduction to Symbolic Computation
Goals ๐
- Understand the difference between functional and imperative programming paradigms
- Implement recursive versions of many common algorithms
- Learn about Lisp and how interpreters work, ideally write a basic interpreter
- Learn about the benefits of pure functions
9 - Computational Theory ๐
Computational theory, apart from pure math, is one of the most “pure” computer science topics due to 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 ๐
- eBook: Sipser’s Introduction to the Theory of Computation
- Dan Gusfield’s Lectures on YouTube
- Online LaTeX Editor: Overleaf
- ADUni.org lectures and resources
Goals ๐
- Understand the capabilities and limitations of different computational models
- Learn about formal notation (LaTeX) and how to analyze formal systems.
- Recognize different classes of computational complexity
- Learn about the Halting problem and turning machines
- Study finite automata and how they can be used to model real-world problems
- Understand the limits of computational models and the real-world systems that rely on them
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.
Resources ๐
- Boot.dev’s Learn Cryptography course
- Christof Paar’s Youtube Lectures
Goals ๐
- Understand crypto primitives like XOR and one-time-pad
- Implement and study symmetric encryption systems
- Understand the revolutionary concepts introduced to the industry by public-key systems
- Learn and implement block and stream ciphers
- Learn about the standard open-source crypto libraries of a language of your choice
- Create and work with digital signatures to send authenticated data securely
2 - Networking ๐
Every once in a while, something goes wrong with a company’s server connections, and only the most experienced 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.
Resources ๐
- Lectures on YouTube, Kurose and Ross 5th Edition
- FreeCodeCamp’s 9-Hour Course
Goals ๐
- Fundamental parts of the Internet
- Layered network model
- Domain Name Services (DNS)
- Networking APIs for application developers
- Common network diagnostic tools
- Network performance - throughput, delay, and packet loss
- TCP - Reliability & Congestion Control
- IPv4/IPv6 Addressing / Routing
- Network address translation
- Routing in fixed and ad-hoc wireless networks
- Basic Network Security - Botnets, DoS/DDoS, Viruses, and Worms
3 - Compilers ๐
While many popular programming languages like JavaScript and Python are interpreted, many are compiled directly to machine code.
Resources ๐
Goals ๐
- Theory of Languages, Grammars, and Machines
- Scanning and Lexical analysis
- Parsing and interpreting
- Interpreting
- Machine Code
- Code Generation
- Storage and symbol management
- Write your own toy compiler from scratch
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.
Resources ๐
- Boot.dev’s Learn Go course
- Dixie State’s Chord Assignment
- Google’s BigTable Research Paper - Read and take notes!
- Understanding Paxos
Goals ๐
- Differentiate the approaches and solutions to distributed systems implemented by real-world projects (Kubernetes, ElasticSearch, Kafka, etc)
- Design and implement programs that use multiple computers across a network connection
- Learn to use Go for its concurrency patterns, and understand how that helps with the implementation of distributed systems
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.
Resources ๐
- Dixie State’s Sharks and Divers Exercise
- eBook: Operating System Concepts
- Learn a systems language like Rust: Tour of Rust
Goals ๐
- Understand and interact with the major components of an operating system
- Analyze the tradeoffs between competing goals in a system’s software, including safety, performance, convenience, and ease of future maintenance
- Assess and criticize the design of modern and historical operating systems
- Understand boot sequences
- Learn the basic Unix commands and become familiar with using advanced command-line
- Learn about the Linux kernel
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 ๐
- Classical AI search algorithms: uninformed search, informed search, local search
- Important AI concepts like heuristics and greedy algorithms
- Propositional and first-order logic
- Probability and probabilistic reasoning
- Machine-learning basics and neural networks using a Keras
- Design problem definitions suitable for use in search algorithms
- Implement and use search algorithms,
- Design and implement propositional logic to solve problems
- Design and implement Bayesian networks to solve problems
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!