You’re a high school student who is interested in computer science. Maybe you’ve done some programming already. Maybe you’ve taken a couple classes at your high school. Maybe you’re a total beginner1. How do you judge CS programs?
Why Are You Qualified?
In short, I’m not. This is equally a rumination on CS program quality as much as a prescriptive guide.
The long answer is that I’ve spent a lot of time2 thinking about undergraduate CS program quality because I recently graduated from a program that appears prestigious on paper but was, in my opinion, worse than schools with a tenth of the reputation. You can read my thoughts here and here. I’ve spent time going to other school’s hackathons, talking to students at other schools, reading through the degree requirements of various CS program and generally doing my homework.
Some may believe that a professor is better suited to judge programs, since they’ve likely had experience with multiple through their undergrad, grad, post-doc and professor tenures. I’d counter that professors are judging from a rather unique perspective, namely that of a tenured professor. I’ll explore that point in depth in a bit. I’d also note that being a teacher in an undergraduate CS program is extremely different than being a student in one. Professors usually only experience one small part of an undergraduate CS program and therefore can’t really judge it as a gestalt. That said, I’d be very interested to hear a professor’s take on undergraduate CS programs.
If you’d like to give a rebuttal, I’d love to hear it! Heck, I’ll publish it here as long as you’re not unneccessarily mean.
How Not To Do It
Here’s how to not do it. Do not go off of ranking. Not US News & World, not even the wonderful CSRankings.org. Ranking does not relate to undergraduate experience in any realistic fashion. Generally ranking measures the status of the university as a research institution. Even then, in the case of US News & World, these rankings are not well loved among professors. I’d ignore them almost completely.
Do not go off of prestige signifiers such as Ivy League or admission rate. These can indicate a general amount of funding or student quality, but beyond that there is nothing about Ivy League schools that makes them inherently good at computer science.
Do not look up very famous professors and think “oh I’m gonna work with them”. As great of a fantasy as it is, working with Yann LeCun at NYU is pretty unlikely. I get that a common admissions strategy is “demonstrating interest”, but Googling professors is not that much demonstration.
What Do You Want?
For a lot of students, this answer is approximately the same. They want a CS program that gives them a good, thorough education that provides them the skills they need to get a job as a programmer. With this comes other requirements such as a good community of students who are smart and helpful; professors who can teach well; decent resources for job searching and extracurriculars. I’m generally going to assume you’re in this category for the rest of the post.
There’s a few other categories. There’s the future academic. They want to go into academia and become a professor. If you have somehow decided on this as a career in high school, then I am extremely impressed. In which case, I’d recommend looking at CSRankings.org and reading the advice for applying to graduate school page. You’re not going to be applying to graduate school just yet, but this advice will influence where you’d want to go for undergrad. If you’ve managed to even figure out a domain of research (wow!), then of course you can filter by that domain in CSRankings.org.
I will caution that you may believe in your heart of hearts that this is your preordained path, but stuff changes and what may have seemed so certain in high school, may not be so in college. It’s still good to follow the rest of the advice, just in case you end up not going down the academic path.
The other category is the entrepreneur. I’m not 100% sure what is the best combo for entrepreneurs. I will say that a good community seems essential, as finding good co-founders seems to be an essential part of being an entrepreneur. Otherwise the advice should be similar; you’ll need to be a decent programmer either way.
Signs Of A Good Program
Now I’m gonna list various signs that I’ve noticed tend to imply a good CS program. These signs are not always a direct correlation, i.e. absence of one of these does not imply a bad program. They’re also very subjective to my interests and my beliefs in what makes a CS program good.
Take a look at their intro to programming. Is it a perfunctory Java/Python tutorial that you can skip with AP credit? Or is it something deeper that everybody is required to take? Does the course encourage you to think about program design and computation at a deep level? Does it use a book like How To Design Programs or Structure and Interpretation of Computer Programs. Does it use an off-kilter language like Haskell or Lisp? This is a sign that someone put a little thought into the CS program.
What do their clubs and extracurriculars look like? Do they have up to date websites? Are there projects listed on a GitHub organization? Are these projects active? How many events do they run?
Is there a piece of student written software in common use at the school? Something like YACS goes a long way in demonstrating a healthy community.
Is their curriculum thorough? Do they teach classes on systems level programming, operating systems, compilers, databases, theoretical computer science, programming languages, distributed systems, functional programming, cybersecurity, and machine learning? One fact that shocks most programmers is that my school does not have an undergraduate compilers course. Do they require these courses?
Find a course website (at least a few professors have public ones). Compare it to another school’s course site. Are similar topics covered? Does one school cover noticably less ground? Are the assignments based around programming? If not programming, are they at least based around solving difficult problems?
Programming, Yes Programming
You’ve probably noticed that I’ve emphasized programming. Whenever I do this, I inevitably get the same tired response of “Buuuuut CS iS NoT ProGraMmIng”. And yes, reducing down computer science to the act of programming is like reducing down literature to the act of writing news articles. But if hundreds of thousands of companies were clamoring for journalists and these jobs paid six figures easily and 99% of people who enter a literature program intended on becoming journalists, you’d be forgiven for confusing the two as an undergraduate.
And indeed, yes, I will say that effectively, for 99% of undergraduates, computer science is programming. If you respond to the contrary, you are being a pedantic jerk. That isn’t to say that the non-programming aspects of computer science are bad. A CS program can and should have non-programming oriented classes such as Discrete Math, Algorithms, Theory of Computation, etc. It’s just that they’re less important to your average undergrad.
For a while, I used hackathons as a sign. If your school runs a good hackathon, it probably means it’s a good CS program. Now, hackathons are a little passé, what with the pandemic and just general decline. But back in the day, if a school had a hackathon that attracted a lot of students, had good sponsors and good prizes, and was decently well run, that would be a good sign.
If a lot of students show up to hackathons, that’s also a good sign. I clued into University of Waterloo being quite good when I noticed all the damn Waterloo students winning all the damn hackathons.
Of course now that’s all a little dated. I’d be curious to know if there’s a similar event out there.
Signs Of A Bad Program
In some cases, the inverse of the good sign is a negative indicator. Intro class is perfunctory Java/Python tutorial; limited course selection; insipid clubs/extracurriculars. However, I wouldn’t rule out a school if you can’t find good student run projects or if a course is slightly less thorough.
Ironically, a school’s general prestige can be a bad sign. For instance, my school is a fairly prestigious school. It’s not an Ivy but it’s good enough that it took a little effort to get admitted. However, it is not a school that is well known for computer science. Therefore, the students who get into my school are strong in terms of academics, but maybe not so strong in terms of computer science. This leads to students who are really focused on getting good grades, but maybe not on programming or computer science as a whole.
Etch this into your brain: grades do not make me a good programmer.
One area that I’d try to examine are the top students within the program. This is hard. I don’t exactly know how you find the top students. Often times they’re not easily visible. They’re not always on social media. They don’t always show up to class. They may not go to the top companies.
But if you can find people who are doing really cool stuff—stuff like writing a compiler, building sophisticated websites from scratch, developing their own operating system, etc—if you can find dozens of people doing this, then you are in a good place. If there’s a sprinkling of these people, be cautious. If there’s next to nobody, stay away completely.
These people are your potential role models, peers, even rivals. Without them, you are not going to learn half as much.
Of course some may see the professors as potential role models. They can be! But professors are not always great role models. For one, they chose a path that most students will not. If you wish to go into academia, by all means, seek out graduate students and professors as role models. Second, professors were and are profoundly good students. Philip Guo has this excellent memoir of his time as a graduate student3. He has a great observation that his doctoral advisor must had been one of the top graduate students in order to become a tenure track professor at Stanford. Therefore it was rather hard for his advisor to understand Philip’s struggles, because the advisor had never struggled to that degree.
I have a longer piece on this, but becoming a professor is something that requires an extreme amount of talent but also devotion and time. You need to know pretty early on that you want to become a professor, otherwise you’ll have to spend a lot of time hustling back into the academia timeline. Talking to tenure track professors is a great way to experience survivorship bias.
As I mentioned before, top students are not necessarily the people who go to top companies. Getting into a top company does not actually require prodigious programming ability. You need a decent resume, the ability to solve the interview questions, and a whole lot of luck. Second, a lot of top students aren’t always so interested in top companies or willing to play the game. Filling out applications is boring and they’d much rather be programming.
Tell Me More
Again, this is more a bunch of musings on CS programs than a prescriptive guide. I’d love to hear your thoughts. Feel free to shoot me an email at firstname.lastname@example.org.