'It is an amazing time to be studying Computer Science - it's kinda like studying Maths in Ancient Greece'

Written on May 27, 2020

The post title is a quote by Chris Piech - a Stanford professor. It was something said by him in an introductory Zoom meeting for the section leaders of Stanford's CS106A - Code in Place online course. I was very lucky to be one of those:

So, what Chris meant was that, for example, Pythagoras created something that serves as a basis to build upon centuries later and students are still learning it today. This is the current state of Computer Science - people will be learning about the magnificent discoveries of today for a long time to come!

Following the end of the course, the other professor behind it - Ali Malik - shared a roadmap for where to go on from here. It is the result of a shared effort of the people behind the course and guides students on how to proceed after the start in their Computer Science journey. I've been reposting it left and right (with permission) as I think it is an amazing resource!

I'm not sure if this blog will ever become popular - for now, I'm just using it as a public diary - I'm writing mainly for myself, and if anyone happens to stumble upon this, well, that's cool! And so I figured - I might as well share it here too. I know I definitely plan to use some of the resources mentioned.

Therefore, this is yet another repost of Ali's guide! As I wouldn't like to edit it, I am presenting it word by word. This means there are lots of references to the Code in Place course. Nevertheless, I think the roadmap is also applicable to anyone that has taken any other introductory computer science course, such as Harvard's CS50. Just replace in your head the Code in Place with my first programming course. And start feeling as if you are in Ancient Greece!

Life after Code in Place

Having completed Code In Place, there are many paths you might choose to take: this handout is intended to provide a possible roadmap for some of them. Like all guidelines, this is an approximate and non-exhaustive list on how to learn about a subject. There are a plethora different ways to achieve mastery that might not be represented here.

We have split up this resource into umbrella topics that students have been asking about. In reality, there are a lot more ways to apply Computer Science, such as music, healthcare, social good and education.

Each area has a list of core topics you need to understand to engage with meaningfully with that discipline. After you develop a solid understanding of these core topics, you can pick and choose whatever subareas you find interesting and focus there.

If there is any topic not covered here that you are interested in, ask about it in the comments! We will try to answer those as well.

How to use this resource:

Since we can’t cover the vast range of possible material in the world, most of the resources linked below are websites of university courses that cover the relevant concept. This doesn’t mean you have to take the academic course to learn that material. Instead, the course syllabus can serve as a reference point for which topics are important to cover. You can then go about actually learning these topics however you want. Some potential ways to learn could be to search for the topic on google or youtube, read textbooks, or browse reddit.

Foundations of CS

These are major concepts that are important to solidify, irrespective of what area of CS you are interested in. It consists of all the foundational concepts: programs, variables, loops, conditions, data structures, and core algorithms.

CS106A:

You have done most of this! Congrats :)

CS106B:

Stanford’s sequel class to CS 106A. In CS 106B, you further develop your toolkit by deepening your understanding of how a computer represents data and learning about additional problem-solving techniques and structures. The class is taught in C++, one of the most popular programming languages in history.

Course website: http://web.stanford.edu/class/cs106b/

Old recorded lectures: https://see.stanford.edu/Course

Area Specific Paths

Data Science, AI, and ML

Core:

AI/ML:

Systems

Core:

Graphics/Game Design/VR

Core:

Areas:

  • 2D/3D Graphics, rendering, animation, geometry (CS248)
  • Virtual Reality (EE267)
  • Animation and Simulation (CS348C)
  • Introduction to Game Design and Development (CS146)

Web dev (frontend/backend)

Web development is how we make websites and online applications to do useful things. It consists of two major areas.

Frontend: This deals with everything related to what a website user can see and interact with such as the design, style, menus, text, images, etc.

Backend: This deals with everything that has to do with all the logic and internal working of a website that is not typically visible to a user. This is stuff like storing data in databases, making a server, authentication, creating users, generating dynamic pages, etc.

These resources will generally cover both frontend (HTML, CSS, javascript) andbackend programming:

Mobile dev

  • iPhone: any Swift resources provided by Apple
  • Android: any Kotlin resources provided by Google

General Resources

Programming Tools

  • One of the most wonderful things about the field of Computer Science is how collaborative and open a field it is. This is enabled by websites like Github, GitLab and BitBucket, in which programmers can share and work together on their code. Underlying each of these websites is a system called Git, which allows you to manage the different versions of your program with minimal fuss. Learn the basics of Git using Github’s tutorial, or BitBucket’s help center. Some SLs wrote up really great intros to Github. See this ed post and this other video!
  • In addition to PyCharm and Ed, there are countless other editors and IDEs, each with their own strengths and which can be customized for your purposes. Two of the most popular editors are Visual Studio Code and Sublime Text.
  • As you work on projects of your own, you are bound to run into bugs. Stack Overflow is a question & answer forum that is probably the single best resource on the internet to get advice on resolving bugs.

Other Programming Languages

Python is a wonderful language, but there are many other wonderful languages you might be interested in learning:

  • HTML, CSS and Javascript are the best tools for developing internet-based application. Mozilla’s resources are a fantastic introduction.
  • C and C++ are two of the most commonly used programming languages, and are great for programmers who want more direct control over what their computers are doing. You can learn C++ from a combination of CS 106B and CS 106L, and you could learn C here.
  • Rust is a more recent language that also affords programmers very low-level control of their computers.
  • Java and Go are great choices to build systems that must handle large amounts of data.
  • Haskell, Scala, and OCaml are programming languages that promote a style of programming known as functional programming, which often is enormously helpful in processing data and is a fascinating intellectual endeavour.

Tech Interviews

Interviews for tech internships and jobs are kind of their own skill that really gets better with practice. These are some good resources to practice for tech job interviews. Remember, you don't want to be memorising these answers. Instead you want to develop your computational thinking so that you can figure out these answers on the spot!

Collection of Resources by SLs

These are a collection of various resources contributed by the section leaders of Code in Place. They aren’t structured in any particular way but they might serve as a useful reference for you!