Goal: CS major, computer graphics and computer systems concentrations. I am planning on applying to grad school (PhD) in graphics or systems (or both). I also enjoy algorithms, but am prioritizing the former, which I am better at.
Background: I entered CMU with an extensive programming background (systems + real-time graphics) and solid math background, but no super high level math or competitive math/programming experience.
☆: courses which I thought were worth attending CMU for. Courses without a star are still worthwhile unless stated otherwise, but did not particularly stand out.
- Doing research freshman year isn’t a great idea - you can’t do that much without completing the CS core, even if a professor gives you a real project. First year, I would instead recommend focusing on doing excellently in/doing more of the core. Over the following summer, however, getting into research is a great idea if you don’t want/get an internship. (FYI - freshman internships are unusual.)
- Many people recommend taking fewer classes to make time for other cool things, so I’ll reiterate that, especially if you want to do research. However, to get into these ‘other things,’ I would also encourage trying to stand out in classes whose content you are particularly interested in, doing projects, becoming a TA, or any other activities that build a relationship with faculty, even if it means putting in a little less effort in other areas. This great presentation goes into what I’m talking about here.
- TAing is a rewarding experience: you will deepen your understanding of your subject, teach others about what you enjoy, and can even affect course development by designing assignments and tests, etc. I will note that the latter is more difficult to do in core courses, which tend to be larger and more set in stone. You also get paid peanuts.
- Don’t expect transfer credit for other university courses…
- 15-122: Principles of Imperative Computation
- An important class to take, but was not useful for me. Should have skipped.
- Practices like defensive programming with contracts and invariants are valuable for all future coding.
- ☆ 15-151: Mathematical Foundations of Computer Science
- Very good class, well-run and Mackey is a great lecturer/leader.
- Necessary and sufficient preparation for cs theory, algorithms, and proof-based math.
- Pretty straightforward if you have competitive math background (I didn’t, but had taken a CS math/logic class, so it wasn’t too bad). Difficult otherwise.
- 21-241: Matrices and Linear Transformations
- This semester had a SCS specific section that included short programming assignments implementing lin alg results in Python. I don’t think this added much.
- Also had some applied topics like SVD and a final project on spectral clustering, which was interesting and new.
- Overall should have taken 21-242 (Matrix Theory).
- 76-102: Gothic Literature
- Pretty standard lit class. Topics vary per semester.
- Good alternative to 76-101 if you enjoy reading & discussion.
- 85-102: Introduction to Psychology
- Secretly the hardest class at CMU. Minimal work, though.
Notes: I’m still mad that I didn’t get transfer credit for 21-241, 21-259, or 15-122…I really did not need to re-take these. Thanks, Jacobo. I also regret not taking the honors freshman math track, which is 21-242 and 21-269. I wasn’t selected for 21-242 based on the freshman math maturity survey, but I am pretty sure I could have handled it. In a perfect world, I probably would have taken 15-150, 15-151, 21-242 first semester and 15-213, 15-251, 21-269 second semester (although that might have been a deathly workload).
- ☆ 15-251: Great Theoretical Ideas in Computer Science
- Very interesting overview of many topics in cs theory. Enough depth to legitimately understand and apply the topics to other areas, but not so much as to make you hate the less interesting parts.
- I didn’t like the weekly homework writing session; it felt like a test every week. I would have preferred to have time to write-up the problems more formally, which I didn’t do for about half the weeks.
- Past the solo problems, the homeworks were usually very difficult.
- You need to find a good group.
- 15-150: Principles of Functional Programming
- I think everyone should have to take at least one class in a functional language, and this is a great introduction.
- Not super hard if you grok the functional style.
- The grading was pedantic and often wrong.
- 21-268: Multidimensional Calculus
- Objectively a good class, but early morning and pretty boring lecture.
- It was a more rigorous treatment than what I knew, but I should have taken 21-269 (Vector Analysis).
- 80-135: Introduction to Political Philosophy
- Highly recommended if it fulfils a gen-ed requirement you need.
- A lot of reading but light writing.
- Gray is very interesting and engaging.
- 80-150: Nature of Reason
- Pretty useless, don’t take this. Minimal work, though.
Workload: probably moderate, but felt quite heavy due to living situation & not sleeping enough
Notes: I really hated living in a dorm…
- NVIDIA: 3D graphics software intern
- I talked to their recruiters at one of the career fairs, but I don’t think that turned into anything. I just applied online and interviewed for the position.
- This was the only internship offer I received, which was highly unusual because NVIDIA mostly hires juniors and sophomores.
- The position turned out to be kind of boring for me; I got to work on some interesting GPU performance metrics, but it alternated between being too much high level build-service-benchmark-gluing and too much low level hardware stuff, as opposed to working on actual graphics software.
- Two particularly memorable parts were touring their silicon failure analysis lab and visiting the house of Jensen Huang.
- I don’t want to be a software engineer, although it paid a lot.
- 15-210: Parallel and Sequential Data Structures and Algorithms
- Algorithms are cool, and you do a lot of problem solving with them. Another solid cs theory class, but not as special as 15-251.
- Also taught in a functional language; also not super hard if you grok the functional style.
- I felt like there was less emphasis on parallelism than the name might suggest - this just meant that you analyze the span as well as the work of each algorithm.
- 15-213: Introduction to Computer Systems
- Gigantic class and hence hard to run efficiently, but covers essential systems topics very well. Should probably be taken by anyone going into software engineering, even if not systems-oriented.
- I was already familiar with most of the topics (as well as programming projects in c from scratch), so it didn’t take me much time.
- ☆ 15-462: Computer Graphics
- Deep but accessible lectures, rewarding and complex projects. Good introduction to many sub-fields within graphics.
- Unfortunately almost totally lacks real-time graphics, and the codebase is a bit of a mess (but I’m working on that now).
- Keenan is great.
- 15-295: Competition Programming and Problem Solving
- Basically a club rather than a class (3 hours a week).
- Doesn’t teach much content - you just solve problems.
- I didn’t have any experience and wasn’t extraordinarily good at it, but with a 15-210 level of algorithms knowledge I was able to do enough problems for an A without putting in much time outside of class.
- 33-104: Experimental Physics
- Chill class, but morning lecture was unfortunate.
- Teaches laboratory skills but the physics is quite basic.
- Minimal work outside of class.
Workload: moderate-heavy depending on how many due dates coincided
Notes: The freshman advisor wouldn’t let me register for graphics without the pre-requisite (15-213), even with instructor permission, but I got into it anyway by talking to the assistant dean (Tom). Moving into an apartment was great.
- ☆ TA: 15-462 - Computer Graphics
- See General Advice regarding TAing (TLDR: you should try it).
- Working with students at OH can be fun, although it can be very hard to pinpoint issues in their code.
- Over winter break I started working on re-writing the course codebase to be much cleaner, faster, and less confusing. I hope to deploy it fall 2020. Support for this project has been very encouraging, and being able to have this much influence over the course is surprising.
- ☆ 15-259: Probability and Computing
- Very well run, in-depth, and fast-paced. Highly recommended over the other probability options unless you want pure math, in which case you should take 21-325 or a measure theory course.
- Includes CS applications of probability such as randomized algorithms, performance modeling, and Markov chains, which are all relevant to many areas of CS.
- Mor is great. She is experienced, enthusiastic, and cares about student success.
- Moderate workload: one problem set every week. Exams are pretty easy.
- ☆ 15-458: Discrete Differential Geometry
- More of a math class than a CS class, but the CS portion (implementing results & algorithms on real meshes) makes results tangible and very rewarding.
- Probably my favorite math class ever, highly recommended if you are into geometry at all.
- Keenan is great (again), and in this class especially, his slides, diagrams, and animations are very elegant. They’re used to teach this content all over the world.
- Light workload: one moderate problem set + one short programming assignment every 2 weeks.
- ☆ 15-410: Operating System Design and Implementation
- Infamous for being the highest straight workload class in CS. It really is a ton of work, but maybe not quite as much as people say.
- The staff will not make design decisions for you or debug your code—you must learn to design, test, evaluate, and debug a substantial project, from scratch, yourself.
- I found that most of the work is debugging—if you’re not an effective debugger, this course will make you become one.
- You need to be able to work well with your partner.
Workload: moderate, but heavy during OS project weeks.
Notes: as you can see, everything this semester has a star—all are highly recommended. Coronavirus made everything a bit crazy, but PnC & DDG finished more or less normally, and, while I don’t think OS changes were handled/communicated well, the kernel got completed and end-of-semester work was reduced. Also note that OS is not recommended as a first systems elective (especially as a sophomore), and I’m going to agree with that unless you had enough systems experience that you found 15-213 easy.
- Apple: GPU software intern
- Update soon (tm)
- TA: 15-462 - Computer Graphics
- Put new codebase into production.
- ☆ 15-411: Compiler Design
- 15-451: Algorithm Design and Analysis
- 15-300: Research and Innovation in Computer Science
- 21-355: Principles of Real Analysis I
- 60-125: Introduction to 3D Animation
Other: Started working with the Geometry Collective
Workload: Always heavy
- Research or working at Jane Street
- TA: 15-462 - Computer Graphics
- 15-400: Research Practicum in Computer Science
- 15-418: Parallel Computer Architecture and Programming
- 15-464: Technical Animation
- 15-468: Special Topic: Physics-Based Rendering
- 33-120: Science and Science Fiction
Preliminary Future Schedule
- 15-740: Computer Architecture
- 15-463: Computational Photography
- 15-xxx: [Logics & Languages Elective]
- 11-485: Introduction to Deep Learning
- 80-251: Modern Philosophy
- PhD/research MS/nothing