Update: Some of the materials I had originally listed are no longer available, so I've taken the dead links out and added new ones for the same courses, if possible, or if not, alternative options that should be just as good.
===
We programmers are lucky. A world-class education in the subject we practice is literally just a few searches away. There are myriad free and low-cost online courses available, and if you're not interested in the extras that come with taking actual courses you can just crib the notes from literally hundreds of course websites from university computer science courses all over the world.
In fact, if you've ever tried to put together your own self-study computer science/programming program you might find you have the opposite problem from what you'd expect: there's simply so much information out there that it's hard to know what to use.
Here's a list of online courses and a few other resources I've put together to study for myself in lieu of getting an actual degree.
Note that I'm already employed as a programmer, so a degree isn't necessary for me to work in the field. Your experience may vary, and you may decide an actual degree is the way to go. That's fine! There's nothing wrong with that. Sometimes I think we get stuck in this hacker mentality where we feel like we have to go our own way instead of following an established program. If a degree or other formal academic program is right for you, that's totally cool. Do what works best for you to help you meet your own goals.
If it's not, here's one way you might go about educating yourself.
The subjects
I wanted a list of resources that would cover most of the foundational subjects you would study in a top university CS program. These include:
- Programming
- Object-oriented programming and design
- Data structures and algorithms
- Low-level programming
- Computer architecture and organization
- Operating systems
- Software engineering
- Databases
- Networks and networking
- Programming languages
I also picked some "electives" based on my own interests:
- More advanced algorithms
- Parallel and distributed programming
- Data science and machine learning
- Functional programming
- Interpreters and compilers
I also added some relevant subjects in math, since as an arts major my collegiate math background was inadequate for a CS education:
- Mathematical thinking
- Calculus
- Discrete mathematics
- Linear algebra
- Statistics and probability
I've also added an optional physics course on electricity and magnetism, as it's a real-world prerequisite for the MIT Computation Structures course. There's also an optional course on theoretical computer science, which you should only work on if you have a good understanding of discrete mathematics (see the mathematics section).
How I chose my resources
I decided to prefer existing online courses that have certificate options, although these usually require payment of some kind. I find that having an external reward like a certificate helps keep me motivated and keeps me coming back to study when I'm tired after work and would rather just veg out and watch Netflix.
Even though in many cases I've linked to certificate programs that list a cost, you can access the content for the vast majority of courses I've picked for free, although there may be extra functionalities (like grading) that are unlocked by paying money.
This is simply my preference, and if you decide to choose other resources that are completely free that's totally fine; do what works for you.
I couldn't find adequate courses for all the relevant subjects, so in some cases I've listed books, video lectures, and materials available from course websites to fill the gaps.
I'm considering each top-level bullet point to be roughly the equivalent of a 3 credit, semester-long university course (except as noted), but YMMV. Using that as a guide, it should be pretty easy to pick enough from all the major topical areas to equal about 60 credits from a university. That's about average for major requirements in an undergraduate CS program here in the United States.
The program
Introduction to Computer Science and Programming
- Choose 1 of the following 2 options:
- Option 1
- HarvardX, CS50 Introduction to Computer Science
-
MITx, Computational Thinking using Python
- Introduction to Computer Science and Programming Using Python
- Introduction to Computational Thinking and Data Science
- Optionally, you can take any of the following after CS50 to get the listed certificate (must pay for certificate):
- HarvardX, Introduction to Programming with Python (certificate in computer science for Python programming)
- HarvardX, Introduction to Artificial Intelligence with Python (certificate in computer science for artificial intelligence)
- HarvardX, Introduction to Game Development (certificate in computer science for game development)
- HarvardX, Web Programming with Python and JavaScript (certificate in computer science and web programming)
- Option 2
- Rice, Fundamentals of Computing Specialization
- Princeton, Computer Science: Programming with a Purpose
-
Princeton, Computer Science: Algorithms, Theory, and Machines
- These last 2 courses use Java, so you could potentially skip the Object-Oriented Programming section and add an optional course on a topic you find interesting
- Option 1
- Optional:
Object-Oriented Programming
-
Georgia TechX, Introduction to Object-Oriented Programming using Java
- Foundations and Syntax Basics
- Object-Oriented Programming and Algorithms
- Exceptions, Data Structures, Recursion, and GUIs
Software Design and Engineering
-
UBCx, Software Development (equal to 6 credits)
- How to Code: Simple Data
- How to Code: Complex Data
- Optional: finish the parts of How to Design Programs not covered by these courses
- Software Construction: Data Abstraction
- Software Construction: Object-Oriented Design
- Software Engineering: Introduction
- Software Development Capstone Project
- MIT 6.005, Software Construction (Open Learning Library)
- Additional Resources
- Software Debugging and Testing
Data Structures and Algorithms
- Choose at least 1 of the following 3 options:
-
Georgia TechX, Data Structures and Algorithms
- ArrayLists, LinkedLists, Stacks and Queues
- Binary Trees, Heaps, SkipLists and HashMaps
- AVL and 2-4 Trees, Divide and Conquer Algorithms
- Pattern Matching, Dijkstra’s, MST, and Dynamic Programming Algorithms
- StanfordX, Design and Analysis of Algorithms
- Princeton, Algorithms
-
Georgia TechX, Data Structures and Algorithms
- For more advanced algorithm material, check out:
- Stanford 261: A Second Course in Algorithms (course website)
- MIT 6.046J: Design and Analysis of Algorithms (Open CourseWare)
- Harvard CS 224: Advanced Algorithms
- MIT 6.854J: Advanced Algorithms (Open CourseWare)
- MIT 6.851: Advanced Data Structures (Open CourseWare)
Low-Level Programming
-
DartmouthX, C Programming with Linux
- Getting Started
- Language Foundations
- Modular Programming and Memory Management
- Pointers and Memory Management
- Advanced Data Types
- Linux Basics: The Command Line Interface
- C Programming: Using Linux Tools and Libraries
Optional: Electricity and Magnetism
-
MITx, Introductory Electricity and Magnetism
- Electrostatics
- Magnetic Fields and Forces
- Maxwell's Equations
- This course is a required prerequisite for actual EE/CS students at MIT for the 6.004 course listed below
- Optional:
Computer Architecture and Organization
- Hebrew University of Jerusalem, Build a Modern Computer from First Principles: From Nand to Tetris
- Berkeley CS61C, Great Ideas in Computer Architecture
- Optional:
- Princeton, Computer Architecture
- The following are 2 halves of the same course at Harvey Mudd, and require purchasing a hardware kit to build actual, physical systems
- MIT 6.004, Computation Structures (course website)
Operating Systems
- Operating Systems materials
- Optional:
Databases
- Choose 1 of the following 2:
- StanfordX, Database courses
-
NYUx, Introduction to Databases
- Introduction to Database Queries
- Advanced Database Queries
- Advanced Database Administration
- Optional:
- Berkeley CS 186
- Meta Database Engineer Certificate
Networking
- University of Colorado, Computer Communications Specialization
- Optional:
- Network Course Materials (from OSSU/computer-science)
- Computer Networking: A Top-Down Approach (online lectures)
- Interactive Problems
- OSSU's former networking course materials:
- Network Course Materials (from OSSU/computer-science)
Programming Languages and Compilers
- University of Washington, Programming Languages
- StanfordX, Compilers
- Additional materials:
- Structure and Interpretation of Computer Programs
- Structure and Interpretation of Computer Programs
- Berkeley CS61AS (2016 course website)
- Brown CSCI 1730 (2012 course website)
- UCSD CSE 131, Compiler Construction (2019 course website)
- UCSD CSE 231, Advanced Compiler Design (2021 course website)
- Structure and Interpretation of Computer Programs
Parallel, Concurrent, and Functional Programming
-
Rice, Parallel, Concurrent, and Distributed Programming in Java Specialization
- Parallel Programming in Java
- Concurrent Programming in Java
- Distributed Programming in Java
-
École Polytechnique Fédérale de Lausanne, Functional Programming in Scala Specialization
- Functional Programming Principles in Scala
- Functional Program Design in Scala
- Parallel programming
- Big Data Analysis with Scala and Spark
- Alternative FP resource:
- Cornell CS 3110, Data Structures and Functional Programming (2021 course website)
- Optional:
- University of Illinois, Cloud Computing Specialization
- Advanced distributed systems:
- MIT 6.824
Optional: Theoretical Computer Science
-
MIT 6.840J: Theory of Computation (Open Course Ware)
- Lecture videos
- You should have a solid grasp on discrete mathematics before attempting to work through this material
- Building Blocks for Theoretical Computer Science (the textbook for CS 173: Discrete Structures at the University of Illinois)
Data Science and Machine Learning
- Optional introductory course:
-
MITx, Statistics and Data Science
- Probability - The Science of Uncertainty and Data
- Fundamentals of Statistics
- Machine Learning with Python: from Linear Models to Deep Learning
- Capstone Exam in Statistics and Data Science
- Data Analysis: Statistical Modeling and Computation in Applications
- Stanford, Machine Learning Specialization
- Optional:
- UC San Diego, Big Data Specialization
- IBM, Professional Certificate in Data Science
- IBM, Advanced Data Science Specialization
-
Johns Hopkins, Data Science
- Uses R instead of Python
- Johns Hopkins, Data Visualization & Dashboarding with R Specialization
- University of Illinois, Data Mining
-
NYU, Information Visualization
- Uses the D3.js JavaScript library
Math
- Stanford, Introduction to Mathematical Thinking
- UC San Diego, Mathematical Thinking in Computer Science
-
Stanford, Introduction to Mathematical Logic
- This one isn't strictly required, but it would be extremely helpful in preparation for Mathematics for Computer Science
-
MITx, Single Variable Calculus
- 1A: Differentiation
- 1B: Integration
- 1C: Coordinate Systems and Infinite Series
- Discrete Mathematics introductory lecture notes
- MIT, Mathematics for Computer Science
- Georgia TechX, Linear Algebra
-
Introductory Linear Algebra
- Linear Equations
- Matrix Algebra
-
Applications of Linear Algebra
- Determinants and Eigenvalues
- Orthogonality & Symmetric Matrices and the SVD
-
Introductory Linear Algebra
- Georgia TechX, Probability and Statistics
-
Probability/Random Variables
- A Gentle Introduction to Probability
- Random Variables – Great Expectations to Bell Curves
-
Statistics, Confidence Intervals and Hypothesis Tests
- A Gentle Introduction to Statistics
- Confidence Intervals and Hypothesis Tests
-
Probability/Random Variables
- Optional:
-
AdelaideX, MathTrackX
- Polynomials, Functions, and Graphs
- Special Functions
- Differential Calculus
- Integral Calculus
- Probability
- Statistics
- MIT 18.06, Linear Algebra (Open CourseWare)
- MITx, Multivariable Calculus I: Vectors and Derivatives
- MITx, Multivariable Calculus II: Integrals
-
MITx, 18.03x: Differential Equations
- Introduction to Differential Equations
- Differential Equations: 2x2 Systems
- Differential Equations: Linear Algebra and NxN Systems of Differential Equations
- Differential Equations: Fourier Series and Partial Differential Equations
- Transfer Functions and the Laplace Transform
-
AdelaideX, MathTrackX
For further study
The above list will give you a solid foundation in computer science and programming on par with what you would get from a BS degree. These are obviously just suggestions, though; feel free to tailor your own study to your interests and the things that motivate you.
If data science isn't your thing, maybe a course on iOS or Android app development will scratch your itch. You could also look into cloud-based development with programs from AWS or IBM. Chances are good that, if you've got an interest, there's a course out there for you.
I hope this list is helpful for you as you seek your own path to a well-rounded education as a developer.
Top comments (5)
Thank you so much for sharing this list!
I actually signed up for the Harvard CS50 course earlier this week, while in job hunt limbo. There's a lot of concepts being covered with this course. Even though I have been in the front-end development space for while, the origin story to certain syntax wasn't always clear to me and it bothered me that I don't know them. Is it necessary, no not really. But being an odd history nut in my spare time, it builds confidence in my brain!
I can totally see that! I love learning the backstory behind why things are the way they are.
Very good contribution friend, greetings from Argentina. Adiós.
That’s a great list. Thank you!!
But isn’t there too much duplicated information? Like the DartmouthX C programming course and what Harvard’s cs50 teaches.
Sure, there's some material that duplicates things covered in other parts. That's more or less the result of putting together a "program" in an ad-hoc fashion using different sources rather than creating one as a whole where the materials are designed to complement each other.
For the specific example you raise, yeah there's a lot of overlap. It looks to me like the DartmouthX course goes into more depth with C than CS50 to some extent, and then there's the Linux stuff. The Linux stuff is probably the bigger attraction for me.
If someone is happy with their understanding of C they could always do something like skip the DartmouthX course and get a good book on C programming with the Unix interface.