Article summary
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 | Coursera’s Calculus One and Calculus Two | 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.
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.
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.
i saw a couple of good courses on data processing (from john hopkins on coursera (https://www.coursera.org/specialization/jhudatascience/1/courses) or from mit on edx. I would mention udacity with loads of cs or related courses. java code geaks launched online courses, too, many are available for free.
Thanks for the recommendations!
database anything?
Hi, Leo. Since you asked, I just added Stanford’s database course, which is actually a collection of mini-courses. It hadn’t made the cut earlier because it lacked a programming component, which I find to be a critical aspect of learning CS. (Many undergraduate database courses involve implementing different layers of a RDBMS.)
Udacity is another source for getting practical programming knowldge.
Thanks for the tip. I think Udacity would be especially useful for those looking for a gentler introduction to programming, or to drill down into a specific technology.
As someone who completed an introductory Java course in Detroit at Grand Circus and visited Atomic Object’s Detroit office, thanks so much for putting this together!
You’re welcome, Israel. Talking with you guys about next steps to take got a lot of this stirring in my head, and was what eventually inspired this post!. Let me know if you end up getting through any of the material.
I take a bunch of online courses, I love them from coursera, Udacity, and edx, some are self paced others are not. I even started some of the ones you mention above, but some of them I can only get through a few weeks, because I have a full time job and some programming assignments can take me hours to complete. The probability one is great (UPenn) Not too many assignments but could only get through 4 weeks, the videos were very long with 20 each week. Most of the good ones are all timed so if you don’t get through a week you get discouraged and just fall behind. I guess the best way to do these is to keep taking them until you become more natural at them.
I feel you there. I’ve dropped many courses after I realized that I wasn’t going to keep up with the workload. On thing that’s helped me is sharing the classes that I’m interested in with friends and coworkers. I’m currently taking From Nand to Tetris with two of my coworkers, and discussing all the different aspects of the class as we progress through it together has really helped me stay motivated.
You can get free Mongodb training at http://university.mongodb.com/ . I’d recommend taking the 101X 102 and 202 streams.
As well there are CPSC classes at khan academy https://www.khanacademy.org/computing/computer-programming
finally, http://codecombat.com/ is a lot of fun.
Thanks for the recommendations. I hadn’t seen Code Combat before, but I’m a fan of creative, interactive learning experiences like that.
I’ve been going through UC Berkeley’s CS61A, and it has been amazing: http://cs61a.org
I highly recommend it to anyone who’s studying CS on their own.
Hey Matthew, that course looks like a fantastic addition to the Intro to CS section. Is it fully accessible by the public? It looked to me like only Berkeley students could actually submit programming assignments.
Yeah, unfortunately not. They do post answers to the homeworks and tests, but you’re kind of on your own for the projects. It definitely requires a bit more dedication and self assessment, but I’ve found that to be helpful in itself.
You overlooked Udacity and Khan which also offers some awesome courses. I currently use all 5 of the following:
-Coursera
-Udacity
-EdX
-Khan Academy
-Mitx
Hi Peter, thanks for pointing those sites out. I see Udacity and Khan Acadamy as great resources to fall back on/supplement the ones I’ve listed above, especially for introductory programming and math.
In my opinion curriculum should also cover optimal order of taking courses, so that compilers would go after automata and algorithms after discrete math.
As the person with quite poor CS background I find difficult to choose which course is optimal for me now. Sometimes I get greedy and take course anyway (who knows when it will be available again?) and sometimes I have to drop it halfway through because I don’t really get much from it.
I’d add computer networks and databases courses in this collection.
Thanks for bringing up course ordering. I mentioned briefly that, of the three sections (Math, Core CS, Advanced CS), you should finish one before moving onto the next. Like you said, algorithms requires discrete math (and also intro to CS). Discrete math requires single var. calculus. It’s best to finish all the core classes before moving onto any advanced ones, but many of the advanced courses don’t require Theory or Architecture.
I Highly recommend Nand2Tetris and Programming Languages Course.
I’ve heard great things about the Programming Languages course, too. Good luck finishing Nand2Tetris!
Hey man this was very helpful! Thank You so much!
You’re welcome Moe!
Thank you! I went for a liberal arts undergrad and a business masters, but I work in IT. For a few years now, I’ve wanted to get a more formalized education in comp-sci than the self-learning I’ve done the past ten-fifteen years to ‘fill in the blanks’ as it may be. But I have no desire to go back to get another undergrad or masters. This fits perfectly. Thank you very much.
You’re welcome, Chris. Now that I’m out of school with a full-time job, I prefer to take only one or maybe two of these classes per year. Not often, but I give myself the time I need to actually stay refreshed and learn the material well. That’s different than the always-overloaded, scraping-by experience I sometimes had in my undergrad.
Hey Ben
I would also recommend to do Edx Embedded systems and coursera’s IOT courses for the deeper understanding of systems course.
Thanks for sharing your experience, it is really valuable for all people with interest at this field .
Hi Ben,
Great work on this post. If you’d like to get involved in an active OSS project working toward a similar goal check out https://github.com/open-source-society/computer-science.
As you said:
“On thing that’s helped me is sharing the classes that I’m interested in with friends and coworkers.”
That’s exactly the component we’re trying to capture. It’s a bit rudimentary ATM but we’re building a site where users can login using GitHub/Bitbucket, track their progress following a specific curriculum path, and have the ability to post their status publicly.
I where almost going to write a mail to Ben , is true i came to this blog from the OSS project on GIthub.
My wuestions i simply to know if PEOPLE with VISUAL DISABILITY can also follow this training program ?
Regarding the single variable calculus section, do you recommend we do all four courses? Or are there four so that we have a choice on which one fits us best? Thanks for posting this, the structure is great!
Excellent post Nash, I quit my programming job last month to: as you say “obtain thorough cs background online”. Currently am halfway through CS50.
Finding your post was like a God-send to further my agenda. Keep blogging