CS rising junior, indecisive about choosing a sub field.
I want to pursue CS research before I graduate for its own sake and partly to compensate for my lackluster GPA for grad school. But each field seems to have a pet peeve:
1) AI/machine learning: too saturated, fear of an AI winter
2) Networks/security: boring, reading a research paper seems torturous
3) Bioinformatic/quantum computing: may never find their place in real world and die out
Etc.
It continues to amaze me how some people know exactly what they want to do in their freshman year or even earlier. My question is: what motivated you to pursue what you're doing right now and at what stage in your academic career?
'elonmollusc's advice is really sound: at least at the beginning, choose the advisor or collaborators, not the subfield. You can probably get yourself interested in any problem if you put effort into it and enjoy the work or the people you're working with. And even if you don't enjoy it, you'll learn something about your own preferences and what kind of environment and style of work you want to build around yourself. Is there a class you've taken where you really enjoyed the material or the professor's style? Go to their office hours and talk to them about research. It's even better if you bring some of your own ideas for what you might be excited to work on (perhaps keying off some of the professor's own recent work; do you have an idea for a way to extend it or a new place to try it?) -- faculty love it when students are a source of new ideas.
If you want to do grad school in CS, here is some stock advice:
- Read some of the essays that people have written about "what grad school in CS is like." I did an interview on this with my friend Eugene Wu (http://www.pgbovine.net/PhD-interview-eugene-wu-keith-winste...), and our friend Adam Marcus (http://marcua.net/writing/gradschool-guide/) also wrote a guide after finishing his PhD. Our other friend Phil Guo also wrote a depressing book about his (not-so-good, but also not horrible) time in grad school at Stanford (http://pgbovine.net/PhD-memoir.htm), and he ultimately ended up in a great job where he seems happy and productive (and now tenured) too.
- Read some of the advice for grad-school applicants, e.g. Michael Ernst's (https://homes.cs.washington.edu/~mernst/advice/) and Jennifer Rexford's (https://www.cs.princeton.edu/~jrex/advice.html) and Justine Sherry's (http://www.eecs.berkeley.edu/~justine/advice.pdf)
- Think real carefully about "Why do you want to go to grad school?" Do you want to use computational thinking to help people in a tangible way? Or do you want to learn about computer science for its own sake, as a quest for knowledge? Do you think you would enjoy a teaching-focused job, or an industrial research job, and these require a Ph.D.? All of these can be great answers, but they are different. What projects or independent activities have you done (things nobody told you to do) that you enjoyed or found satisfying? How can you aim to best continue that? (By contrast, "I did well in undergrad and would like to continue my education" is not a good reason to start a Ph.D. in computer science!)
- Consider taking time off between undergrad and grad school, or at least deferring for a year after you are accepted. Depending on the subfield, the people that do this often have a real leg up, because they can bring a nontraditional perspective to the table. There's little benefit in being "smarter" than everybody else in the group if all that means is that you are saying something first that somebody else was going to say anyway 90 seconds later. It's better to be the one contributing ideas (about new problems worthy of attack OR ways to solve them) or a point of view that wasn't going to get contributed at all. And the people who have exposed themselves to more diverse environments often have had more time to understand themselves and what kind of environment they need to build around themselves (advising, style of work) to be happy and productive. Depending on your advisor's style and the culture of the department, grad school can be almost a totally unstructured and self-directed environment (quite different from undergrad) so you really don't want to go into it as a sort of default. (If you are saying to yourself, "but I don't know what I would do during that year off," that is not a good reason to make grad school become your default! By contrast, if you are saying, "but I am in theory or another mathematically inclined subfield and literally the only way to get better at it is to keep doing it; there is nothing the outside world has to offer me," then maybe you are right -- theorists often do seem to adhere to this kind of thinking.)
- Start thinking about how to demonstrate (by December of the year when you plan to apply) to your letter writers that you have the initiative/resourcefulness/creativity/grit and can see a project through to completion even over obstacles. (Ideally, by participating in a research project that submits a paper for publication.) The letters of recommendation do matter a lot, probably more than anything else in the application, and the letters will ideally be from people that the readers can trust are well-calibrated to speak to your promise at doing CS research.
If you're going to pursue undergrad research, I don't recommend choosing based on field, but based on potential supervisors. Who are your favorite professors? What subjects have you really enjoyed and would like to explore further? A good project is at the intersection of what you're interested in, what your faculty mentor can realistically supervise, and what you can complete and bring to a good result in 1-2 years. You're going to get the best experience if you're able to work with a faculty mentor you like that can teach you about the research process and devote time to mentoring you. Those skills, more so than any specific project you complete, are what will help you be successful in grad school.
There are probably examples of successful researchers who started in one area as undergrads and stayed with it for decades, but it's more common to switch as your interests change and you get more exposure to different subareas of CS, particularly once you get into a grad program and get more exposure to the open problems in different fields. Grad schools will not require you to stick with the area or theme of research that you may have been pursuing when they accepted you.
To give you a concrete example: my first undergrad research project was writing a simulator for acoustic reverb. I continued working with the same advisor, but we switched to projects related to imaging and remote sensing, which led to experimenting with weird neural network architectures (before the current boom in deep learning really took off) and their applications to multispectral imaging. When I started my Ph.D. program, I was originally working on nonlinear optimization and its applications to sensors, but ended up switching to performance modeling and queueing theory, which became the subject of my dissertation. My research has evolved even more since I became a faculty member and shifted to working with real undergrads; I've recently been doing a lot of qualitative research with community organizations about their uses of data and analytics, which is only tangentially related to traditional disciplinary CS research.
How did I choose? Mostly by accident and I definitely did not plan this much in advance. I enjoyed web programming during my undergrad. I got interested in how to make web programming easier (and if you could write both client-side and server-side code in the same language - in the pre-Node.js and pre-transpiler days :-)) and I stared working on a project to translate .NET code to JavaScript. Through a few random lucky accidents, I ended up working with F# and met Don Syme from Microsoft Research. This got me the idea that I could actually do PhD! Through working with Don, I got interested in functional programming and PL research more generally and then applied for PhD with some ideas about reactive programming.
I have no idea how to choose a field or plan a career (I only have one data point!) In my case, it was a mix of doing things I found interesting (without thinking about why this might be useful) and meeting a fantastic mentor at the right moment.
In any case, good luck, no matter what field you end up choosing!
I wanted to go into PL and compilers until I met the prof who later became my PhD advisor. He introduced me to HCI, which still let me dive into some PL topics too!
I got enough statistics and machine learning experience in graduate school to be doing machine learning research now as part of the defense industry. Even if machine learning seems like it might be too hot to touch, it will aid you in any number of jobs you could have in the future: automation, data science, etc. It really is perhaps the easiest sub field to cross disciplines. I've always been a PC gamer and the TD-Gammon paper really pushed me forward in my desire to do machine learning -- check it out, its a classic (https://www.bkgm.com/articles/tesauro/tdl.html).
Anecdotally, my first research position was the result of getting my last-choice internship for that summer. I thought I would hate it and was planning to quit after the summer. My advisor was incredible, and I ended up working in that lab for 3 years. That field (human-computer interaction) is now my primary discipline!
It's pretty easy. People try things out and if they don't like it, they pick something else. When someone appears to know what they want it is because they did the experimentation phase before they chose their field. It looks like you have the "experimentation phase" still ahead of you and there is no shame in that.
Same for neural nets, I could rattle off 3 idea that no one is working on. I don't think the field is saturated.
Just look at what you enjoy doing and specialize in that. You don't need to mixmax the decision and try to predict the future.