A free (or mostly free) computer science education
Published: 2021-07-01 01:13:37

---
title: A free (or mostly free) computer science education
published: true
description: How to get the equivalent of a BS-level education in computer science from some of the world's top universities
tags: 
cover_image: https://www.evansville.edu/majors/eecs/images/studentWithRobot.jpg
---

**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](https://www.edx.org/course/introduction-computer-science-harvardx-cs50x)
        - [MITx, Computational Thinking using Python](https://www.edx.org/xseries/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](https://www.edx.org/course/cs50s-introduction-to-programming-with-python) ([certificate in computer science for Python programming](https://www.edx.org/professional-certificate/harvardx-computer-science-for-python-programming))
            - [HarvardX, Introduction to Artificial Intelligence with Python](https://www.edx.org/course/cs50s-introduction-to-artificial-intelligence-with-python) ([certificate in computer science for artificial intelligence](https://www.edx.org/professional-certificate/harvardx-computer-science-for-artifical-intelligence))
            - [HarvardX, Introduction to Game Development](https://www.edx.org/course/cs50s-introduction-to-game-development) ([certificate in computer science for game development](https://www.edx.org/professional-certificate/harvardx-computer-science-for-game-development))
            - [HarvardX, Web Programming with Python and JavaScript](https://www.edx.org/course/cs50s-web-programming-with-python-and-javascript) ([certificate in computer science and web programming](https://www.edx.org/professional-certificate/harvardx-computer-science-for-web-programming))
    - Option 2
        - [Rice, Fundamentals of Computing Specialization](https://www.coursera.org/specializations/computer-fundamentals)
        - [Princeton, Computer Science: Programming with a Purpose](https://www.coursera.org/learn/cs-programming-java)
        - [Princeton, Computer Science: Algorithms, Theory, and Machines](https://www.coursera.org/learn/cs-algorithms-theory-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
- Optional:
    - [University of Illinois, Accelerated Computer Science Fundamentals Specialization](https://www.coursera.org/specializations/cs-fundamentals)

### Object-Oriented Programming

- [Georgia TechX, Introduction to Object-Oriented Programming using Java](https://www.edx.org/professional-certificate/gtx-introduction-to-object-oriented-programming-with-java)
    - Foundations and Syntax Basics
    - Object-Oriented Programming and Algorithms
    - Exceptions, Data Structures, Recursion, and GUIs

### Software Design and Engineering

- [UBCx, Software Development](https://www.edx.org/micromasters/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_](http://htdp.org/) 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)
    - [Software Construction in Java](https://openlearninglibrary.mit.edu/courses/course-v1:MITx+6.005.1x+3T2016/about)
    - [Advanced Software Construction in Java](https://openlearninglibrary.mit.edu/courses/course-v1:MITx+6.005.2x+1T2017/about)
- Additional Resources
    - Software Debugging and Testing
        - [Software Debugging](https://www.udacity.com/course/software-debugging--cs259)
        - [Software Testing](https://www.udacity.com/course/software-testing--cs258)
        - [Georgia Tech, Software Development Process](https://www.udacity.com/course/software-development-process--ud805)

### Data Structures and Algorithms

- Choose at least 1 of the following 3 options:
    - [Georgia TechX, Data Structures and Algorithms](https://www.edx.org/professional-certificate/gtx-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
        - [Algorithms: Design and Analysis, Part 1](https://www.edx.org/course/algorithms-design-and-analysis)
        - [Algorithms: Design and Analysis, Part 2](https://www.edx.org/course/algorithms-design-and-analysis-part-2-2)
    - Princeton, Algorithms
        - [Algorithms, Part 1](https://www.coursera.org/learn/algorithms-part1)
        - [Algorithms, Part 2](https://www.coursera.org/learn/algorithms-part2)
        - [Analysis of Algorithms](https://www.coursera.org/learn/analysis-of-algorithms)
- For more advanced algorithm material, check out:
    - [Stanford 261: A Second Course in Algorithms](http://timroughgarden.org/w16/w16.html) (course website)
    - [MIT 6.046J: Design and Analysis of Algorithms](https://ocw.mit.edu/courses/6-046j-design-and-analysis-of-algorithms-spring-2015/) (Open CourseWare)
    - Harvard CS 224: Advanced Algorithms
        - [Lecture playlist](https://www.youtube.com/playlist?list=PL2SOU6wwxB0uP4rJgf5ayhHWgw7akUWSf)
        - [Course website with assignments](https://people.seas.harvard.edu/~cs224/fall14/index.html)
    - [MIT 6.854J: Advanced Algorithms](https://ocw.mit.edu/courses/6-854j-advanced-algorithms-fall-2008/) (Open CourseWare)
    - [MIT 6.851: Advanced Data Structures](https://ocw.mit.edu/courses/6-851-advanced-data-structures-spring-2012/) (Open CourseWare)

### Low-Level Programming

- [DartmouthX, C Programming with Linux](https://www.edx.org/professional-certificate/dartmouth-imtx-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](https://www.edx.org/xseries/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:
    - [MIT 8.02 lecture videos](https://www.youtube.com/playlist?list=PLyQSN7X0ro2314mKyUiOILaOC2hk6Pc3j)
    - [All About Circuits](http://www.allaboutcircuits.com/textbook/)

### Computer Architecture and Organization

- Hebrew University of Jerusalem, Build a Modern Computer from First Principles: From Nand to Tetris
    - [Part 1](https://www.coursera.org/learn/build-a-computer)
    - [Part 2](https://www.coursera.org/learn/nand2tetris2)
- Berkeley CS61C, Great Ideas in Computer Architecture
    - [2015 video lectures](https://archive.org/details/ucberkeley-webcast-PL-XXv-cvA_iCl2-D-FS5mk0jFF6cYSJs_)
    - [2015 course website](https://inst.eecs.berkeley.edu//~cs61c/sp15/)
    - [Current course website](https://cs61c.org/)
- Optional:
    - [Princeton, Computer Architecture](https://www.coursera.org/learn/comparch)
    - The following are 2 halves of the same course at Harvey Mudd, and require purchasing a hardware kit to build actual, physical systems
        - [HarveyMuddX, Digital Design](https://www.edx.org/course/digital-design-2)
        - [HarveyMuddX, Computer Architecture](https://www.edx.org/course/computer-architecture)
    - [MIT 6.004, Computation Structures](https://computationstructures.org/) (course website)

### Operating Systems

- Operating Systems materials
    - [Berkeley CS162: Fall 2013 course website](https://inst.eecs.berkeley.edu/~cs162/fa13/)
    - [Berkeley CS162: Fall 2013 lecture videos](https://www.youtube.com/playlist?list=PLRdybCcWDFzCag9A0h1m9QYaujD0xefgM)
    - [Book: _Operating Systems: Three Easy Pieces_](https://pages.cs.wisc.edu/~remzi/OSTEP/)
    - [Projects](https://github.com/remzi-arpacidusseau/ostep-projects)
- Optional:
    - [Operating Systems: 0 to 1](https://tuhdo.github.io/os01/)
    - [Operating Systems: Design and Implementation (the MINIX book)](https://csc-knu.github.io/sys-prog/books/Andrew%20S.%20Tanenbaum%20-%20Operating%20Systems.%20Design%20and%20Implementation.pdf)

### Databases

- Choose 1 of the following 2:
    - StanfordX, Database courses
        - [Relational Databases and SQL](https://www.edx.org/course/databases-5-sql)
        - [Modeling and Theory](https://www.edx.org/course/modeling-and-theory)
        - [Advanced Topics in SQL](https://www.edx.org/course/advanced-topics-in-sql)
        - [Semistructured Data](https://www.edx.org/course/semistructured-data)
        - [OLAP and Recursion](https://www.edx.org/course/olap-and-recursion)
    - [NYUx, Introduction to Databases](https://www.edx.org/microbachelors/nyux-introduction-to-databases)
        - Introduction to Database Queries
        - Advanced Database Queries
        - Advanced Database Administration
- Optional:
    - Berkeley CS 186
        - [Course website](https://cs186berkeley.net/)
        - [Old video lectures](https://www.youtube.com/user/CS186Berkeley/playlists)
    - [Meta Database Engineer Certificate](https://www.coursera.org/professional-certificates/meta-database-engineer)

### Networking

- [University of Colorado, Computer Communications Specialization](https://www.coursera.org/specializations/computer-communications)
- Optional:
    - Network Course Materials (from [OSSU/computer-science](https://github.com/ossu/computer-science))
        - [Computer Networking: A Top-Down Approach (online lectures)](http://gaia.cs.umass.edu/kurose_ross/online_lectures.htm)
        - [Interactive Problems](https://gaia.cs.umass.edu/kurose_ross/interactive/index.php)
        - OSSU's former networking course materials:
            - [Stanford CS144 video lectures](https://www.youtube.com/playlist?list=PLEAYkSg4uSQ2dr0XO_Nwa5OcdEcaaELSG)
            - [Assignment 1](https://github.com/PrincetonUniversity/COS461-Public/tree/master/assignments/assignment1)
            - [Assignment 2](https://www.scs.stanford.edu/10au-cs144/lab/reliable/reliable.html)
            - [Assignment 3](https://nptel.ac.in/content/storage2/courses/106105080/pdf/M2L7.pdf)
            - [Assignment 4](http://www-net.cs.umass.edu/wireshark-labs/Wireshark_TCP_v7.0.pdf)

### Programming Languages and Compilers

- University of Washington, Programming Languages
    - [Part A](https://www.coursera.org/learn/programming-languages)
    - [Part B](https://www.coursera.org/learn/programming-languages-part-b)
    - [Part C](https://www.coursera.org/learn/programming-languages-part-c)
- [StanfordX, Compilers](https://www.edx.org/course/compilers?)
- Additional materials:
    - Structure and Interpretation of Computer Programs
        - [_Structure and Interpretation of Computer Programs_](https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book.html)
        - [Berkeley CS61AS](https://berkeley-cs61as.github.io/) (2016 course website)
    - [Brown CSCI 1730](http://cs.brown.edu/courses/cs173/2012/OnLine/) (2012 course website)
        - Textbook: [_Programming Languages: Application and Interpretation_](http://cs.brown.edu/courses/cs173/2012/book/)
    - [UCSD CSE 131, Compiler Construction](https://ucsd-cse131-f19.github.io/) (2019 course website)
    - [UCSD CSE 231, Advanced Compiler Design](https://ucsd-cse231-w21.github.io/) (2021 course website)

### Parallel, Concurrent, and Functional Programming

- [Rice, Parallel, Concurrent, and Distributed Programming in Java Specialization](https://www.coursera.org/specializations/pcdp)
    - Parallel Programming in Java
    - Concurrent Programming in Java
    - Distributed Programming in Java
- [École Polytechnique Fédérale de Lausanne, Functional Programming in Scala Specialization](https://www.coursera.org/specializations/scala)
    - 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](https://cs3110.github.io/textbook/cover.html) (2021 course website)
- Optional:
    - [University of Illinois, Cloud Computing Specialization](https://www.coursera.org/specializations/cloud-computing)
    - Advanced distributed systems:
        - MIT 6.824
            - [Video lectures](https://www.youtube.com/watch?v=cQP8WApzIQQ&list=PLrw6a1wE39_tb2fErI4-WkMbsvGQk9_UB)
            - [Course website](https://pdos.csail.mit.edu/6.824/schedule.html)

### Optional: Theoretical Computer Science

- [MIT 6.840J: Theory of Computation](https://ocw.mit.edu/courses/18-404j-theory-of-computation-fall-2020/) (Open Course Ware)
    - [Lecture videos](https://www.youtube.com/playlist?list=PLUl4u3cNGP60_JNv2MmK3wkOt9syvfQWY)
    - You should have a solid grasp on discrete mathematics before attempting to work through this material
- [Building Blocks for Theoretical Computer Science](https://mfleck.cs.illinois.edu/building-blocks/index-sp2020.html) (the textbook for CS 173: Discrete Structures at the University of Illinois)

### Data Science and Machine Learning

- Optional introductory course:
    - [University of Michigan, Applied Data Science with Python Specialization](https://www.coursera.org/specializations/data-science-python)
- [MITx, Statistics and Data Science](https://www.edx.org/micromasters/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](https://www.coursera.org/specializations/machine-learning-introduction)
- Optional:
    - [UC San Diego, Big Data Specialization](https://www.coursera.org/specializations/big-data)
    - [IBM, Professional Certificate in Data Science](https://www.coursera.org/professional-certificates/ibm-data-science)
    - [IBM, Advanced Data Science Specialization](https://www.coursera.org/specializations/advanced-data-science-ibm)
    - [Johns Hopkins, Data Science](https://www.coursera.org/specializations/jhu-data-science)
        - Uses R instead of Python
    - [Johns Hopkins, Data Visualization & Dashboarding with R Specialization](https://www.coursera.org/specializations/jhu-data-visualization-dashboarding-with-r)
    - [University of Illinois, Data Mining](https://www.coursera.org/specializations/data-mining)
    - [NYU, Information Visualization](https://www.coursera.org/specializations/information-visualization)
        - Uses the D3.js JavaScript library

### Math

- [Stanford, Introduction to Mathematical Thinking](https://www.coursera.org/learn/mathematical-thinking)
- [UC San Diego, Mathematical Thinking in Computer Science](https://www.coursera.org/learn/what-is-a-proof)
- [Stanford, Introduction to Mathematical Logic](https://www.coursera.org/learn/logic-introduction)
    - This one isn't strictly required, but it would be extremely helpful in preparation for Mathematics for Computer Science
- [MITx, Single Variable Calculus](https://www.edx.org/xseries/mitx-18.01x-single-variable-calculus)
    - 1A: Differentiation
    - 1B: Integration
    - 1C: Coordinate Systems and Infinite Series
- [Discrete Mathematics introductory lecture notes](https://cims.nyu.edu/~regev/teaching/discrete_math_fall_2005/dmbook.pdf)
- MIT, Mathematics for Computer Science
    - [Open Learning Library](https://openlearninglibrary.mit.edu/courses/course-v1:OCW+6.042J+2T2019/about)
    - [Video lectures](https://www.youtube.com/playlist?list=PLB7540DEDD482705B)
    - [Lecture notes](https://courses.csail.mit.edu/6.042/spring17/mcs.pdf)
- Georgia TechX, Linear Algebra
    - [Introductory Linear Algebra](https://www.edx.org/professional-certificate/gtx-introductory-linear-algebra)
        - Linear Equations
        - Matrix Algebra
    - [Applications of Linear Algebra](https://www.edx.org/professional-certificate/gtx-applications-of-linear-algebra)
        - Determinants and Eigenvalues
        - Orthogonality & Symmetric Matrices and the SVD
- Georgia TechX, Probability and Statistics
    - [Probability/Random Variables](https://www.edx.org/professional-certificate/gtx-probability-random-variables)
        - A Gentle Introduction to Probability
        - Random Variables &ndash; Great Expectations to Bell Curves
    - [Statistics, Confidence Intervals and Hypothesis Tests](https://www.edx.org/professional-certificate/gtx-statistics-confidence-intervals-and-hypothesis-tests)
        - A Gentle Introduction to Statistics
        - Confidence Intervals and Hypothesis Tests
- Optional:
    - [AdelaideX, MathTrackX](https://www.edx.org/xseries/adelaidex-math-trackx)
        - Polynomials, Functions, and Graphs
        - Special Functions
        - Differential Calculus
        - Integral Calculus
        - Probability
        - Statistics
    - [MIT 18.06, Linear Algebra](https://ocw.mit.edu/courses/18-06-linear-algebra-spring-2010/) (Open CourseWare)
    - [MITx, Multivariable Calculus I: Vectors and Derivatives](https://www.edx.org/course/multivariable-calculus-1-vectors-and-derivatives)
    - [MITx, Multivariable Calculus II: Integrals](https://www.edx.org/course/multivariable-calculus-2-surfaces-and-integrals)
    - [MITx, 18.03x: Differential Equations](https://www.edx.org/xseries/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

## 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](https://www.edx.org/professional-certificate/curtinx-mobile-app-development-with-swift) or [Android](https://www.coursera.org/specializations/android-app-development) app development will scratch your itch. You could also look into cloud-based development with programs from [AWS](https://www.edx.org/xseries/aws-developer-series) or [IBM](https://www.edx.org/professional-certificate/ibm-full-stack-cloud-developer). 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.