31 Comments

Obtaining a Thorough CS Background Online

research

I’d like to show you a way to obtain a computer science background that doesn’t involve enrolling in a university program. Maybe you’ve completed an introductory Java course, and now you’d like to pursue a software development position. Or maybe you already have some formal CS training, and you’d like to fill in a couple of knowledge gaps. By utilizing online learning resources, you can obtain that background without incurring the costs of the traditional university approach.

I started with the core requirements of a typical undergraduate CS program and replaced them with online counterparts from a few different learning providers.

Types of Online Courses

Online courses generally take on one of three styles:

  • Interactive with Deadlines: These courses start and end on specific dates, and each assignment has a deadline that you must meet to receive credit. With interactive courses, you submit your assignments and exams online, and the course automatically tracks your performance and progress through the video lectures as you go.
  • Interactive and self-paced: Interactive, but without deadlines. You can start these courses at any time, and you can complete them at any pace you want.
  • Courseware: These are non-interactive collections of course material for you to work through independently, at your own pace. They still contain well-organized video lectures, but you won’t get any feedback on your work or overall progress. Instead, it’ll be up to you to work through the problem sets and then compare your work with the posted solutions. All the courseware-style material that I’ve included are OpenCourseWare Scholar courses, which MIT has specifically designed for online learning.

Of the three styles, I have a preference for interactive courses with deadlines. Since we already have access to so much information about these topics elsewhere online, I find the interaction (assignment feedback, forum discussion, etc.) to be the aspect that creates a special learning experience. Additionally, the fixed-duration, deadline-based approach gives me the accountability I need to push through and finish the course once I’ve gotten a few weeks in.

Curriculum

Total effort (hours)
< 50
50-80
80-120
> 120

I’ve divided the curriculum into three sections: Math, Core CS, and Advanced CS. In general, you should finish one section before moving onto the next. The Intro to CS courses are exceptions, though, that have no math prerequisites.

Many topics have multiple “offerings”, often with different workloads. I’ve categorized the workload of each offering to help distinguish them. For example, I found four different single variable calculus offerings — two for those with prior calculus backgrounds and two that are more introductory.

Math

Of all the math listed here, it’s most important to learn about discrete math, so you can deeply understand algorithms later on. Single variable calculus is a prerequisite for this course. Linear algebra is used in graphics, machine learning, and cryptography, but since it’s not immediately essential to understanding core concepts, feel free to skip it. Multivariable calculus and probability are required by the typical CS curriculum, but feel free to skip these too if you’re math-averse.

Topic Offering Institution Platform
Single Variable Calculus Calculus One, Calculus Two: Sequences and Series Ohio State Coursera
Calculus 1A: Differentiation Calculus 1B: Integration Calculus 1C: Coordinate Systems & Infinite Series MIT edX
Calculus: Single Variable UPenn Coursera
Single Variable Calculus MIT OpenCourseWare
Discrete Math Mathematics for Computer Science MIT OpenCourseWare
Linear Algebra Coding the Matrix: Linear Algebra through Computer Science Applications Brown Coursera
Linear Algebra – Foundations to Frontiers Texas edX
Linear Algebra MIT OpenCourseWare
Multivariable Calculus Massively Multivariable Open Online Calculus Course Ohio State Coursera
Multivariable Calculus MIT OpenCourseWare
Probability Probability UPenn Coursera
Introduction to Probability – The Science of Uncertainty MIT edX

Core Computer Science

These are the core topics of CS. Start with an intro class that’s appropriate for you. Then continue with one of the algorithms sequences. A strong background in algorithms is essential to being able to write high-quality software, as well as surviving technical interviews. Computer architecture and CS theory are also crucial topics taken by every CS student that fill in understanding at the low and high levels.

From Nand to Tetris is a brilliant offering from the Hebrew University of Jerusalem that guides you through building each layer of a simplified computer system from scratch. I’m currently taking it with two other developers here in Detroit, although no programming experience is needed.

Topic Offering Institution Platform
Introduction to CS From Nand to Tetris HUJI Coursera
Introduction to Computer Science Harvard edX
Introduction to Computer Science and Programming Using Python MIT edX
Algorithms Algorithms Part I, Part II Princeton Coursera
Algorithms: Design and Analysis Part 1, Part 2 Stanford Coursera
Computer Architecture The Hardware/Software Interface Washington Coursera
Theory Automata Stanford Coursera

Advanced Computer Science

After completing the core topics, you have the necessary background to study any of the advanced topics. No student can master all of them, so pursue whatever interests you the most. I’ve tried to arrange the classes from low (toward hardware) to high (toward the abstract) level.

I have two personal recommendations from this list: Cryptography is a fun challenge and helped me look at security in general differently. It’s taught by Dan Boneh, who’s an authoritative figure in the crypto field and also an excellent instructor.

Functional Programming Principles in Scala has helped me write better code on a day-to-day basis by combining general functional programming theory with actual knowledge about the Scala language. It’s taught by the designer of Scala, Martin Odersky.

Topic Offering Institution Provider
Computer Architecture Computer Architecture Princeton Coursera
Operating Systems Introduction to Operating Systems University at Buffalo Independent
Databases Databases Stanford Stanford
Compilers Compilers Stanford Coursera
Networks Computer Networks Washington Coursera
Introduction to Computer Networking Stanford Stanford
Parallel Computing Heterogeneous Parallel Programming Illinois Coursera
Cryptography Cryptography I, II Stanford Coursera
Computer Graphics Foundations of Computer Graphics UC Berkeley edX
Artificial Intelligence Artificial Intelligence UC Berkeley edX
Functional Programming Functional Programming Principles in Scala EPFL Coursera
Reactive Programming Principles of Reactive Programming EPFL Coursera
Machine Learning Scalable Machine Learning UC Berkeley edX
Machine Learning Stanford Coursera
Programming Languages Programming Languages Washington Coursera
Natural Language Processing Natural Language Processing Columbia Coursera
Natural Language Processing Stanford Coursera
Software Engineering Startup Engineering Stanford Coursera

As a software developer with CS background, I’m excited that courses like these continue to pop up on Coursera and other sites, and I look forward to jumping into one every so often. What about those of you who don’t have that background? I’d love to hear about your experiences learning online.