Obtaining a Thorough CS Background Online

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.

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.

Conversation
  • incze says:

    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.

  • Leo says:

    database anything?

    • Ben Nash Ben Nash says:

      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.)

  • Muhammad Taqi Hassan says:

    Udacity is another source for getting practical programming knowldge.

    • Ben Nash Ben Nash says:

      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.

  • Israel Vicars says:

    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!

    • Ben Nash Ben Nash says:

      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.

  • Mathias says:

    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.

    • Ben Nash Ben Nash says:

      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.

  • Mike Graf says:

    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.

    • Ben Nash Ben Nash says:

      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.

    • Ben Nash Ben Nash says:

      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.

  • Peter says:

    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

    • Ben Nash Ben Nash says:

      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.

  • name says:

    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.

    • Ben Nash Ben Nash says:

      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.

  • Mayank says:

    I Highly recommend Nand2Tetris and Programming Languages Course.

    • Ben Nash Ben Nash says:

      I’ve heard great things about the Programming Languages course, too. Good luck finishing Nand2Tetris!

  • Moe says:

    Hey man this was very helpful! Thank You so much!

  • Chris S says:

    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.

    • Ben Nash Ben Nash says:

      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.

  • Mahendher Reddy says:

    Hey Ben
    I would also recommend to do Edx Embedded systems and coursera’s IOT courses for the deeper understanding of systems course.

  • Javier Lainez says:

    Thanks for sharing your experience, it is really valuable for all people with interest at this field .

  • Evan Plaice says:

    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.

    • Marc Stephan says:

      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 ?

  • RJ Dymke says:

    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!

  • egimaben says:

    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

  • Comments are closed.