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.
|Total effort (hours)|
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.
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.
|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|
|Multivariable Calculus||Massively Multivariable Open Online Calculus Course||Ohio State||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.
|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|
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.
|Computer Architecture||Computer Architecture||Princeton||Coursera|
|Operating Systems||Introduction to Operating Systems||University at Buffalo||Independent|
|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|
|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.