When a new student is starting their journey into the field of computer science, it can be hard to figure out which topics to learn first. In this post, I will give my opinionated review on what every computer science student should know for their first internship. This advice is intended for freshmen who are deciding which courses to take during their first year, or rising sophomores who are looking for something to study during the summer before internship applications begin in the fall. It could also be easily used for people outside of CS who are looking to make a career in programming.
I should say that this post was inspired by the similarly named post What every computer science major should know, by Matt Might. However, I think Matt's article is far too comprehensive, to the point of uselessness, since it's almost impossible to really learn everything listed. It's also not practical - the majority of developers work on full-stack development, but Matt mentions very little regarding this.
Hopefully, this post is much more practical and scoped. I'm not going to describe all the subfields of CS, and I won't list topics that are usually required for CS majors but aren't that relevant for most people. Instead, I want this to be very focused on what students will need to be successful in applying for, and completing CS internships.
Along with each of my recommendations, I'll also list some resources online so that motivated students can work on studying these on their own. All of the resources I link are completely free!
How to Program
This may seem quite obvious, but this amusing article states that most programming job applicants can't code. I'm skeptical of the actual claims here, but it should be clear that you need to know how to program in order to get a programming job/internship.
- Have experience writing code in at least one programming language. Python or Java is a reasonable start.
- Be familiar with object-oriented programming. You should understand concepts like classes, objects, methods, and inheritance, and be comfortable writing programs using the OOP paradigm.
- Know how to debug code. This involves using breakpoints and print statements, reading errors inside stack traces, and knowing how to use Google when things go wrong. Chances are, any error you run into already has 1000+ upvotes on Stack Overflow.
All of this should be covered in your first semester "Intro to programming" class that you take. Alternatively, there are plenty of online resources available. I'm personally a big fan of Python for Everybody, and I made my add-on exercise book to this course which you can read about here. If you're looking for a more typical college-lecture style course, Harvard's CS 50 course is freely available online, with lecture recordings, notes, and homework.
If you're already familiar with one language, and you're looking to learn a second language, Learn X in Y minutes is a great way to get quickly acquainted with the syntax of any language. I wouldn't recommend this for your first language though, it'll just be too overwhelming.
Algorithms and Data Structures
This almost doesn't deserve its own section, as it's mostly just learning How to Program better. This is validated by the fact that universities usually put Algorithms as the second-semester CS course. UC Berkeley even calls these courses 61A and 61B. However, the reason I'm separating Algorithms is that it's the backbone of nearly all technical interviews you'll take. Essentially, most phone screens and interviews you take will consist of the interviewer giving you a problem to solve, and you'll have to figure out the algorithm needed to correctly solve the problem and pass all the test cases. This might seem hard, but it turns out pretty much any question you might be asked are already available online on websites like Leetcode, HackerRank, or in books like Cracking the Coding Interview.
If you've already taken an algos course in your school, the only thing you can do to prepare is to "grind Leetcode", or just solve as many questions as you can. If you're ever stuck on a question, feel free to look at the solution and discussion sections, and try to internalize the explanations that they give, so that you could recreate the solution on your own if you needed to.
If you haven't taken any course on algorithms, I would recommend going through a structured course online, like Berkeley's CS 61B, MIT's CS 6.006, Stony Brook's CSE 373, or SDSU's CS 310. However, these courses will not cover every algorithm or data structure that you'll ever use, they just give you the backbone to get started, so that you can start exploring on your own.
- Go through a structured algorithms and data structures course
- Work through Leetcode problems
This probably shouldn't be something you just work on endlessly though, once you reach some threshold, you're probably better off working on personal projects or learning other topics. If you can solve most Mediums in under 30 minutes, you should be in excellent shape.
One other thing to note is that, during interviews, you will need to speak out loud and explain your thought process to your interviewer as you implement the solution. Thus, it can be beneficial to practice doing interviews with others, so you can be more comfortable talking and writing code simultaneously.
Working inside Linux
Unlike Algos, which is probably not very useful once you get the internship, learning how to operate in the Linux environment is the most important skill you will need once you're on the job. An effective command over the command line will make you a much more efficient and productive worker.
- Learn the most common Linux commands
- Be comfortable viewing and manipulating files and directories in the command line and vim
- Understand how git version control works and the most common git commands
Unfortunately, most CS curricula at college don't cover these topics in enough detail, considering that developers spend almost their entire day inside this environment. Recently, MIT created a course called the Missing Semester, which aims to cover these topics, and I highly recommend it. For further reading, there are many pages available online on common Linux commands, just google whenever you're unsure about anything. For more practice on Git specifically, Free Code Camp has a tutorial on practical Git. I also quite liked the list of tasks that Matt Might gave in his blog post (search under "Unix Philosophy")
Full-stack (web) development is almost surely not going to be covered during your freshman year, and probably not in your sophomore year either. However, the majority of developers in the real world work on full-stack development, and your first internship will likely be in this area as well, so having prior knowledge in this area will give you a big leg up, even if you'll mostly be expected to pick up the content on the job itself.
- Put together a basic frontend using a framework of your choice (such as React)
- Put together a basic backend using a framework of your choice (such as Flask)
- Learn SQL, and how to connect a database to a backend
This might seem like a lot, but there are thankfully many resources available online to learn web development. If you're looking for a more lecture-based environment similar to college, Harvard has a course on Web Programming in Python+JS. The Odin Project is an open-source group that has a hands-on full-stack course available in either JS or Ruby. For learning frontend specifically, Scrimba teaches a course on the React framework. For learning backend specifically, I'm a fan of this project-based course on FastAPI, which is a Python backend framework similar to Flask but modernized in a few ways.
This section is optional, and only really relevant if you're planning to specifically do a data science or machine learning internship - otherwise you can just skip this. Like the previous section, most students won't have taken any classes on data science by their sophomore year, so all the content you need to know to apply for data science or machine learning internships will need to happen through self-study.
- Learn the Python data science stack - Numpy, Scipy, Pandas, and Scikit-Learn
- Have experience working with and wrangling datasets
- Be comfortable working inside Jupyter Lab (or similar environments like Google Colab, Kaggle Notebooks, etc)
- Understand the high-level ideas behind Machine Learning, and how to run simple models on a dataset of your choice
Again, there are a lot of resources online for learning Data Science. My favorite is Kaggle Learn. They have courses on a number of different topics, all in notebook form so you can practice writing the code to replicate any analysis. I would recommend that once you have a basic skillset, to just start getting your hands dirty with datasets that personally interest you. Rebecca Vickery on TowardsDataScience has put together a list of free books which are available online, and all these books seem quite reasonable. The last one specifically is based on Jeremey Howard's fast.ai course which I'm a huge fan of - I've used it myself and I'm a huge fan of how fast you can really get going into applying deep learning algorithms onto your own datasets.
Keep in mind that learning from websites, videos, or even courses can only take you a very limited amount of the way towards proficiency. The only way to become truly skilled at any of these topics is by practicing on your own projects, so I've tried to list learning resources that have interactive components or hands-on exercises.
However, once you have a base level of competency for a given area, I definitely encourage you to go start working on projects on your own! Make a website and host it on Github or Heroku. Build an API and make it open to the public. Make a smartphone app (though this probably requires additional prep). Find a dataset on something interesting and train a model on it, or display some cool visualizations.
At first, it might seem impossibly hard to even start working on one of these, but with a basic foundation, you can definitely make something good enough to showcase your skills on your resume or personal website, and something to talk about during your interviews! Here are some sample project ideas:
- An algorithm I created for inserting moves into a chess game
- A simple front-end website my friend Isaac created about tracking our campus dining halls.
- This tutorial shows you step by step how to build a full-stack website on cooking recipes
- Possible data science projects
Hopefully, this was a useful guide to help focus your study as you work towards getting a career in computer science. If there's another resource or online course that you think I'm missing, please let me know by posting in the comments!