(in)formal education

I'm surely not the first self-taught computer person to wonder about the gaps in my theoretical knowledge.

Illustration of waves.

I value all the knowledge and, more importantly imo, experience that 5 years of professional programming has given me. But I'm surely not the first self-taught computer person to wonder about the gaps in my theoretical knowledge.

I've made a plan to fill in those gaps, and more. I've selected a set of courses, all of which are available online and none follow a rigid schedule. My aim is to grow, develop the muscle for consistent self-study, grow some more.

I don't worry that a course is too basic or too advanced. There are no hard deadlines, after all-I want a strong habit for self-learning, but I also have a professional career to run.

Projects and self-learning curricula go together like peanut butter and more peanut butter. I'll use the project work to:

  1. ground my study in practice, and
  2. apply what I learn in constructive creation.

A friend has kindly agreed to help me choose these projects, for which I'm grateful. I'd prefer to have projects which span multiple topics I'll be covering; their computer science experience can help me see how potential projects could overlap and evolve.

On their advice, I will select up to three projects, although fewer is better. I expect fewer projects to be easier to manage in the long-term.

It'll be a better learning experience for me to build up the projects as I move along my curriculum, instead of abandoning the work already done.

Projects are one of two possible artifacts I expect, the other being a simple language glossary.

I didn't create this curriculum from scratch, oh no! The thing about a gap is that one doesn't necessarily see its boundaries, especially before beginning to explore it. I relied heavily on the experiences of others (mainly teachyourselfcs.com) to create a broad personal curriculum. I fully expect it to change as I progress, especially when I discover advanced topics that interest me years from today.

(in)formal curriculum

Course Category Level
How to Code: Simple Data, by UBC Programming Intro
Structure and Interpretation of Computer Programs Programming Intro
Brian Harvey’s Berkeley CS 61A Programming Intro
CS50: Introduction to Computer Science, by Harvard General Intro
Intro to Data Structures and Algorithms, by Grow with Google Algorithms and Data Structures Intro
Introduction to Operating Systems, by Georgia Tech Operating Systems Intro
Intro to Relational Databases Databases Intro
Computer Systems: A Programmer's Perspective Computer Architecture Core
Berkeley CS 61C Computer Architecture Core
The Algorithm Design Manual Algorithms and Data Structures Core
Steven Skiena’s lectures Algorithms and Data Structures Core
Data Structures and Algorithms Specialization, by University of San Diego Algorithms and Data Structures Core
Mathematics for Computer Science Math for CS Core
Tom Leighton’s MIT 6.042J Math for CS Core
Operating Systems: Three Easy Pieces Operating Systems Core
Berkeley CS 162 Operating Systems Core
Computer Networking: A Top-Down Approach Computer Networking Core
Stanford CS 144 Computer Networking Core
Joe Hellerstein’s Berkeley CS 186 Databases Core
Databases: Relational Databases and SQL, by Stanford Databases Core
Crafting Interpreters Languages and Compilers Core
Alex Aiken’s course on edX Languages and Compilers Core
Designing Data-Intensive Applications by Martin Kleppmann Distributed Systems Core
MIT 6.824 Distributed Systems Core
Advanced Data Structures, by MIT Algorithms and Data Structures Advanced