Ben Burns | Picking electives and topics

The goal of the blog post is to build on my CICS intro sequence advice and give some perspective on picking electives at UMass. Unlike my intro advice, which largely contains common or popular opinions, my advice here should be taken as highly opinionated and as biased towards students interested in graduate school.

This post has three parts. In the first part, I do my best to list out the subfields of CS and list UMass courses on corresponding topics (between CICS, Math, and ECE). The goal of this section is to get you to consider all your options, not just what UMass offers.

In the second part, I give my advice on going about picking which electives you want to take. Most people end up specializing their electives to a particular subfield of CS, whether it be because they want a job in that specific area or they want to pursue graduate school. Part of picking electives is figuring out what you like: you want to take electives on topics you find interesting, but you can't really don't know if you like an area without experience. For example, I think cryptography is cool from afar, but found out from coursework that I don't enjoy doing cryptography.

In the third part, I talk what to do when you want to take a course in something UMass doesn't have, namely why I think people should email and talk to professors more and try to encourage you to complete an independent study or honors thesis.

Part 1: Exploring your options

If you just look through the CICS course catalog and use that to pick what area of CS you want to go into, you will get a sampling that is heavily biased towards ML and theory and biased against systems, architecture and security. In the past, I have found it useful to look through the course catalogs of top CS departments and/or large departments to get more context and see what options are out there. Each university has its own strengths.

If there are courses at other universities which you might find interesting that UMass doesn't offer, it's likely that there are faculty at UMass who do research in that area who would be willing to direct an independent study or give you advice on self-study. There have even been CICS courses invented because of student interest, such as CS367.

The major areas of computer science

Below is my (opinionated) list of the major areas of computer science. I have a naturally tendency to list more topics in areas I know more about (e.g. ML and TCS) than in areas I know less about (e.g. information retrieval).

I have also done my best to list UMass courses with their corresponding subfield. Although some areas have few CICS courses listed, there may be relevant courses taught in other departments (for example, there are architecture and hardware courses in electrical and computer engineering). I have attempted to listed relevant coursework at other universities for topics which UMass doesn't have coursework on (to my knowledge).

Theoretical computer science (TCS)

Design and analysis of algorithms. Includes

Artificial intelligence (AI) and machine learning (ML)

Automating decision making and learning patterns from data. Includes

Databases and information retrieval

How to efficiently store and retrieve data. Includes

Computer architecture and hardware

How your computer works at the hardware level. Typically grouped into electrical or computer engineering. Includes

Computer systems and network science

How your computer's software works at the low-level, utilizes hardware, and interfaces with the internet. Includes

Software engineering (SWE) and programming languages (PL)

How to use, design, implement, and analyze programming languages. Includes

Cybersecurity

Protecting and defending computers, applications, and data. Includes

Additional resources can be found in the UMass Cybersecurity Club server.

Computer graphics

How to efficiently generate and render computer graphics (CS373, CS574/674).

Human-computer interaction

Studying and improving how humans interact with computers. Includes

Interdisciplinary computer science

Applying CS methods to an interdisciplinary application. Includes

Part 2: Picking your topic(s)

If you are anything like me, you entered college having little to no idea which area or topics you wanted to study. This is normal: few people know what they really want to study, and many people who think they do will later change their mind.

It's very important to go into the upper-division coursework with an open mind, and try to avoiding forcing yourself to like a certain area of CS because you think it will help you get a job, because it pays better money, or because your parents are pressuring you to pursue it. Even if you end up taking courses that set you up for a career in (for example) ML even though it's not your thing, it's worth trying out other areas to see if you can mix your passions (ML for databases, ML for security, security and formal methods for ML, SWE in an ML division, etc.).

Traps I fell into when picking "my thing"

Lots of people feel pressured to pick a niche early in their undergrad and try to convince themselves that it's what they want. Sometimes this is because their parents pressured them, sometimes it's because people feel pressured to know what they want out of life, to "figure it out", or be "put together". I tried to pick my focus too early before exploring my options and regretted it.

In my experience, this phenomenon is especially common with ML and AI, where people get to junior year not knowing what they want to focus on and just default to picking ML because it's a hot area (lots of people working on it) or because it makes money. Similar to people picking a CS major cause CS is a hot area or because it makes money, this is a good way to end up specializing in an area that you don't enjoy (that is possibly oversaturated).

Another trap I see is people picking an area just because it's popular or (worse) picking an area cause it's generally accepted as "hard". Sophomore year, I convinced myself (based solely on enjoying CS250) that I really wanted to do pure math cause it was challenging. I loaded up my schedule solely with pure math courses, I did an REU, took some grad classes, and was miserable. It took me all the way until my junior-year spring to try out TCS and ML coursework, which made me realize I liked theoretical machine learning.

Be open to the reality that you might find an area of CS to be interesting conceptually but really unfun to work in. Do not use sunk cost as a reason to stick to a topic you don't enjoy.

Try out as many different subfields as you can

Part of picking your specialization too early is not giving each area a fair chance. In my sophomore year (when I was only a math major), I took at least one course in each of: algebra, number theory, graph theory, real analysis, complex analysis, cryptography, and topology. This helped me enormously when it came to figuring out what areas I was interested and disinterested in, and what types of math I found enjoyable to study.

In my experience, your first couple semesters of electives are best spent trying lots of different things. If you specialize early and then decide to switch areas, you have to start from square one. Also, if you take classes in various related areas, it helps put things into perspective, build intuition, and see connections between concepts. For example, it's better to learn HPC from an HPC professor in an HPC course than to get an incomplete presentation of it in a single lecture of your ML course. Taking the HPC course isn't possible if you've only ever taken ML classes and skipped out on systems and algorithms.

Having background in many areas has been very useful to me for understanding talks, talking to researchers outside my area, and reading papers. You also get better at picking up new things if you try lots of different stuff, and you might find that you like multiple, unrelated areas if you go into things with an open mind and avoiding just trying to superficially pick a single topic.

Give systems, architecture, and cybersecurity a fair chance

My personal opinion is that people are taking too much AL and ML coursework and not enough of computing "fundamentals" like systems and architecture. There is a decline in the number of people interested in these fields despite their increasingly importance in big data and machine learning systems in industry. Practically all large systems are trained in a distributed manner on cluster and/or hosted on the cloud, and everyone in ML is doing their best to use GPUs and TPUs to speed up their models.

For systems, the popular opinion is that CS230 and CS377 are "too theoretical"/not hands-on enough to teach the content fully. Some of my friends came away from 377 feeling they had an incomplete understanding and had to do projects on their own time to be satisfied. CS577 used to exist as an advanced OS course, and I've heard that previous students were able to get the course offered as an independent study. In terms of self-study, the CS230/CS377 textbook is good for self-teaching, and you can do any of Linux from Scratch to learn how Linux works, writing your own virtual machine, or even writing an operating system.

For architecture, I have heard great things about CS335 + CS535 sequence, and recommend it to everybody. I did not take it but badly wanted to. CS535 ends with the best group project I saw in a CICS course, where you essentially design and implement your own architecture and simulator. These are great courses and the fact that they aren't taken by more people is unfortunate in my opinion.

For cybersecurity, there is a budding curriculum of coursework at UMass. As of Winter 2024, both CS367/CS590F and CS564 are taught by industry professionals with real-world systems experience. Additionally, the cybersecurity club is an active student organization which I learned a lot from (by going to the room and talking to the eboard). Playing weekly capture the flags with the club is a good way to quickly obtain a lot of solid cybersec experience.

Take courses in areas you'd find difficult to self teach

At some point you're probably going to have more courses you're interested in than you have spots in your schedule. Personally, I've always given a higher priority to courses that I'd have a difficult time self-teaching. I feel that these courses more utility to me, and that it's harder for me to abandon learning the topic or skip the difficult parts because I don't understand them.

For example, I wanted to learn web programming to make my own website, but didn't find it necessary to take CS326 because there are plenty of good HTML and CSS resources on the internet. Furthermore, there is a lot of CS326 content (on JavaScript) I didn't want to use, and so I felt other courses were a better use of my time. On the flip side, I knew that if I tried to self-teach something like CS501 or MATH605, I would do my best to dodge all the parts I didn't like and that I wouldn't learn the content properly, and so I knew I needed to take the courses if I was going to learn.

For me, this leads to enrolling in mostly graduate courses, which I don't think is a bad thing. There are more likely going to better resources for self-teaching (for example) SQL if you need it on your job than graduate reinforcement learning or probability, so I felt these courses were a better use of my time if/when I could handle the extra time commitment.

Part 3: what if UMass doesn't offer courses on my interests?

Sometimes you want to study something that UMass doesn't offer coursework in. For example, later in my junior year I became interested in generative modeling after reading into how ChatGPT and Stable Diffusion work, and found that UMass had no courses on it (this is no longer the case now that MATH690STF exists). So what do you do?

Option 1: Find textbooks or courses at other universities to self-study

I do not recommend this. In general, I am not a fan of self-studying when you are still figuring things out. Being able to teach yourself things becomes a very important and valuable skill if/when you do to graduate school, but it's hard for you (as a novice) to discern what content is important when you're new, and so I think you need some direction. This is a skill you build up over time as you learn more things: an ML graduate student self-teaching themselves reinforcement learning to be able to read papers is very different than an undergrad trying to self-teach RL after taking only CS389 or CS589.

Option 2: Find UMass faculty who work in that area

This is something I regret not doing earlier. This can be anything from an email asking for advice on resources to study to approaching the professor for an independent study". You can get a lot of valuable knowledge from meeting with and emailing professors, and (if you are prepared and make it a good use of their time) they will likely be more than happy to talk to you. For example, here is an example of a student reaching out to a (now retired) UMass professor asking about their experience working on the programming language CLU.

The two easiest ways to find UMass faculty are by scrolling through the CICS faculty directory and going through the research centers and labs page. To tell what a faculty works in, your best bet is to check their personal website (if they have one) or their Google scholar (which usually lists research areas at the top of the page).

Emailing faculty is how I got involved in my research area: I saw a UMass Math REU posting for "mathematics of machine learning" and emailed the REU sponsor for more information. We met to talk about topics and background, which lead to an REU, which lead to an honors thesis, which led to me going to graduate school to study generative modeling. All from an email.

You will be much more successful cold-emailing professors if your email clearly shows that you have put in some work, makes an effort to make the faculty's life easier responding, and is not written by ChatGPT. Consider the following emails from Student A

Hello Professor Doe,

I hope that you are doing well. I was wondering if you could give me resources to self-study ML. Thank you!

Best,
Student A

and from Student B

Hello Professor Doe,

I hope that you are doing well. I wanted to ask if you had any advice or resources for learning about generative modeling. I am specifically interested in learning more about diffusion models.

For context, I have taken both CS589 and CS688. I have read some of Murphy's Probabilistic ML, but found the book to be too terse and found that it doesn't show enough steps in the derivations, and reads more like a reference book. Since you work in generative modeling, I wanted to ask if you had any recommendations for resources on generative modeling, or if you'd be willing to meet for 15-30 minutes (in person or over Zoom) to chat.

Best,
Student B

The first email reads like Student A has made no attempt to do any research on their own, and is asking for self-study materials on an incredibly broad topic. You can't tell from the email if Student A has any background or experience, or even if they know that UMass has ML coursework.

The second email gives more information about what specific area of ML that Student B wants to work on and gives the professor concise context on the student's level of background. Student B gives a concrete example of a famous resource that they've tried to learn from, why it wasn't the type of resource they are looking for, and is clear about what they are asking of the professor. Student B is more likely to get a response and is more likely to get a helpful response.

Assume that the professor you are messaging is very busy and will spend at most minute reading your email. Give them the important context, be concise (which ChatGPT is not), and be clear about what you are asking from them. The easier you make it for them to respond, the more likely it is they will respond.

Option 3: Complete an independent study or honors thesis

Independent studies are the primary mechanism to supplement CICS's core curriculum by giving students an opportunity to study one-on-one with faculty. You basically get a personal office hour with the professor for a semester, where they mentor you through a course that you propose and design (which is typically in the faculty's area of expertise). You and the faculty agree on the course, the materials, and the measurable goals/deliverables. A perk of doing well in your classes, being active on Piazza/Campuswire, and going to faculty office hours is that is makes your life easier if you then want to ask the course instructor for an independent study because they'll know you, know you are serious about learning the content, and be more likely to agree to mentoring you in an IS.

An honors thesis is a year-long commitment, typically completed in the last year of your undergrad. The formal requirements are one semester of dedicated research, after which you complete a literature review, and one semester to write the thesis. In practice, it's really two independent studies back-to-back, procrastinating the thesis part, and writing in the last week of your undergrad (I don't know anyone that didn't do this). My thesis is how I figured out what I wanted to do in graduate school.

Option 4: Learn it with a friend

I strictly prefer this to self-study. Learning something with a friend keeps you accountable, gives you someone to bounce ideas off of, and another person who thinks and learns differently from you to give a different perspective. If you find writing a VM or an OS to be overwhelming, make it a group project, or do it at a hackathon like HackHer or HackUMass. Even better (if you can swing it) would be a group independent study. If not, make a study group or (if they are fine with it) stop by a faculty's office hours.