Self-taught developers and Bootcamp graduates often have a hard time finding employment because they skipped learning computer science fundamentals and jumped right into application code. Taking such a haphazard approach to a programming education would be similar to skipping biology classes and just doing a three-week crash course in surgery. Luckily, it’s possible to get a state-of-the-art computer science education without breaking the bank, and it can be done completely online.
How to Get Started – The Short Answer
There are several main topics studied by computer science students at Universities across the world. Some of these topics we’ll consider “required”, and some will be “elective” or “optional”. Take a look at the list below for an overview, you should study these topics, roughly in the order presented.
Study These Computer Science Topics – Required
- Computer Architecture and Hardware
- Algorithms and Data Structures
- CS Math
- Web Development
- Functional Programming
- Computational Theory
Optional – Choose at least 2
- Distributed Systems
- Operating Systems
- Artificial Intelligence and Machine Learning
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 down in the article we will cover each topic in more detail, and supply some resources to get you started.
Feeling Overwhelmed? Don’t Be.
The average computer science under-graduate takes 4 years to complete their degree. Hopefully, this isn’t news to you, that’s just how college works. I have good news for you, however! If you are teaching yourself, you can cut out the fat and speed up the process. If you follow these tips, you will likely be able to learn the equivalent of a CS major in less than two years, and you can likely get an internship or a first job after just 3-6 months, depending on how much time you are able to spend daily.
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 content consumption and start reading about technology-related content instead, or in addition to what you already consume.
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.
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.
Here at Qvault, we are doing our best to build out a single platform that will give students one place to learn all the following CS topics in a linear fashion. Qvault is still a new project, however, so for now we will recommend our own content where available and point you over to what we consider to be the best alternative resources until we can publish more ourselves.
1 – Coding
- Qvault’s Basic Intro to Coding Courses
- A Byte of Python
- The Python Tutorial
- 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 arguable 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).
- eBook: Computer Organization and Design
- Binary and Hexadecimal (Kahn Academy)
- Azeria Labs Writing Arm Assembly
- 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. 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.
- Qvault’s Big-O Algorithms course
- Steven Skiena’s Video Lectures
- 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.
- 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.
- 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 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.
- 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 a RESTful API that a browser-based frontend application can create, read, update, and delete information from
7 – 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.
- Qvault’s Intro to Functional Programming course
- eBook: Common Lisp: A Gentle Introduction to Symbolic Computation
- 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
8 – 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.
- eBook: Sipser’s Introduction to the Theory of Computation
- Dan Gusfield’s Lectures on YouTube
- Online LaTeX Editor: Overleaf
- 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.
- 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 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.
- 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
- Theory of Languages, Grammars, and Machines
- Scanning and Lexical analysis
- Parsing and 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.
- Qvault’s Go Mastery course
- Dixie State’s Chord Assignment
- Google’s BigTable Research Paper – Read and take notes!
- Understanding Paxos
- 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.
- Dixie State’s Sharks and Divers Exercise
- eBook: Operating System Concepts
- Learn a systems language like Rust: Tour of Rust
- 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.
- Classical AI search algorithms: uninformed search, informed search, local search
- 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
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!