Introduction
Brown's Open Curriculum and S/NC policy1 encourages students to take courses outside of their area of concentration2.
⭐ denotes courses that I think everyone should take.
❤️ denotes courses I personally enjoyed a lot.
| Semester | Course | Title |
|---|---|---|
| Fall 2023 | CSCI 0190 ⭐ | Accelerated Introduction to Computer Science |
| CSCI 1450 ❤️ | Advanced Introduction to Probability for Computing and Data Science | |
| CSCI 1951X ❤️ | Formal Proof and Verification | |
| COST 0120 | The Classical Chinese Philosophy of Life | |
| Spring 2024 | CSCI 0300 ⭐ | Fundamentals of Computer Systems |
| CSCI 1470 | Deep Learning | |
| MATH 0540 | Linear Algebra with Theory | |
| PHIL 1665 | Modal Logic | |
| CLPS 0800 | Language and the Mind | |
| Fall 2024 | CSCI 1680 ⭐ | Computer Networks |
| CSCI 2952R | Systems Transforming Systems | |
| CSCI 1970 | Individual Independent Study | |
| MATH 1530 | Abstract Algebra | |
| EGYT 1310 | Middle Egyptian I | |
| Spring 2025 | CSCI 1670 | Operating Systems |
| CSCI 1690 | Operating Systems Lab | |
| CSCI 1515 ❤️ | Applied Cryptography | |
| ENGN 0520 ❤️ | Electrical Circuits and Signals | |
| EGYT 1320 | Middle Egyptian II | |
| Fall 2025 | CSCI 1650 | Software Security and Exploitation |
| CSCI 1951Q | Topics in Programming Languages | |
| CSCI 2690 | Datacenter and Cloud Operating Systems | |
| ENGN 1630 | Digital Electronic Systems Design | |
| BIOL 0210 ⭐ | Diversity of Life | |
| Spring 2026 | CSCI 2680 | Networks and the Internet |
| CSCI 2951O | Prescriptive Analytics | |
| ANTH 1720 | Human Skeleton | |
| BIOL 0800 | Human Physiology |
Fall 2023
CSCI 0190 Introduction to Computer Science ⭐
Professor: Shriram Krishnamurthi
For an undergraduate institution of Brown's size, it is impressive they managed to have four different computer science introductory classes.
15 is the only one that teaches object-oriented programming, and the rest teach functional programming. Difficulty is roughly 11 < 15 <= 17 < 19, and size is roughly 19 < 11 < 17 < 15.
Let me put in a note about demographics as well. In Fall 2023, 15 had 450 students, 17 had 150 students, and 19 had 60 students. Because of that, 15 and 17 are very lecture-based, and 19 feels more like a seminar. However, the gender-ratio is also worse. (I have the impression that Shriram tries very hard to address this, but it is what it is.)

I was already pretty set on taking 19 after doing the summer placement. The first person to introduce me to programming was Zed A. Shaw, who wrote Learn Python the Hard Way back in 2013. His authorial voice was very serious, very pedantic, and somewhat sarcastic. I think Shriram gave me the same impression. You don't really have that sort of voice unless you care very much about teaching.
19 was a small class with a few partner projects, so I knew most of my classmates and made many close friends. Shriram is also—truly—the best lecturer I have ever had. I can say a lot more about this class, so if you are thinking about 19, please feel free to reach out.3
CSCI 1450 Introduction to Probability ❤️
Professor: Eli Upfal
I was very impatient to get my math prerequisites out of the way, and I calculated that taking probability would unlock more courses than linear algebra.4 There were three courses that fulfilled the requirement: CSCI 1450, APMA 1650, or APMA 1655. I chose CSCI 1450 fairly arbitrarily, mostly on the basis that a friend of mine was taking it.
I did not attended lecture—this will be a recurring theme for math courses—but CSCI 1450 actually ended up being my favorite class that semester. I remembered that the TAs were extraordinarily brilliant (as math people tend to be). I would go to every TA hour just to hear how they thought about things.
Really, I spent so much effort on this class that I regret taking it S/NC.1
CSCI 1951X Formal Proof and Verification ❤️
Professor: Rob Lewis
In high school, I tried to make an natural deduction solver to solve boolean simplification problems. I saw that CSCI 1951X did not have any formal prerequisites and thought that the field was somewhat similar, so I took it.
CSCI 1951X is not actually about automated solving.5 I would better characterize it as an intersection between mathematical foundations and computer science, which also happens to touch on program semantics and metaprogramming. It has weekly coding problem sets in Lean and a soft final project.
I liked the course so much that I ended up becoming a TA (Fall 2024) and HTA for it (Fall 2025).
COST 0120 The Chinese Philosophy of Life
Professor: Larson DiFiori
I thought COST 0190 would help me solve a few existential problems I had at that time. It did not help that much, but I did learn a lot about Mengzi, Xunzi, and Zhuangzi.
Spring 2024
CSCI 0300 Computer Systems ⭐
Professor: Malte Schwarzkopf and Nick DeMarinis
I have had many uperclassman tell me that CSCI 0300 is the best course ever.
Well, now that I have taken it, I can become one of those people who say that CSCI 0300 is the best course ever.
The professors are some of the most caring and sympathetic people around. You want that in a systems course, because systems are hard. When you're running into a segmentation fault for the nth time, you don't want hard love; you want comfort and support and understanding. I think they get that just right.
Here's something I wrote about the transition from 19 to 300 a year later.
Underclassman:
for the people who've taken both 19 and 300 how did you find the latter in terms of difficulty as opposed to 19?
Me:
conceptually around the same difficulty, but 19 and 300 are almost like the antithesis of each other. some things i can point out:
- pyret is functional and C/C++ is not. it's probably easier to pick up imperative after learning functional programming, but that does mean that some things don't transfer. after a few segmentation faults, you'll understand why ideas like "immutable by default" comes about
- you will need to pick up some tooling. by tooling, i mean getting comfortable with your editor (vscode, vim, emacs) and its keyboard shortcuts and with the terminal. the pyret editor is very simple. this is fine because 19 assignments are small and usually contained within a single file. for 300 projects, you'll want to be able to quickly open multiple files at a time and also have gdb running in the terminal. i suspect that 15/17 students might be more comfortable doing that
- 300 projects have a lot of boilerplate code. you'll have to be comfortable with reading and extending code that you have not written yourself. you don't really learn this in 19 because you write all of the code and design all of the data structures yourself. (data-driven programming is amazing, it's just not that useful in 300 because of how structured assignments are)
it is because they are so different that i usually recommend everyone in 19 to take 300 afterward. learning a memory-unsafe language really concretizes how ideas in modern programming languages came about. i would also argue that the only way to really learn software development is by thinking about how a complex system works. good coding practices (which you learned in 19, and you'll learn more of in 320) comes afterward
Anyway, highly recommend. This is another course that I came back to TA later.
CSCI 1470 Deep Learning
Professor: Ritambhara Singh
I think CSCI 1470 faces a classic problem: the professor teaching it changes every semester, so institutional knowledge does not get passed down, and the course never improves. This is different from CSCI 0190, CSCI 0300, and CSCI 1951X, which are taught by the same professor every year.
I also think I'm just not interested in AI/ML. The best part of the course for me was the final project, where I spent three straight days chugging Monsters, debugging legacy Tensorflow v2 code, and spiraling between "it's joever" and "we're so back" with my teammates.
MATH 0540 Linear Algebra
Professor: Christine Briener
MATH 0540 is in this weird category where (1) I tried very hard and (2) I didn't learn anything. I think I don't understand things very well when there isn't a practical or physical analogy for the thing I am studying.
PHIL 1665 Modal Logic
Professor: Eric Guindon
PHIL 1665 spun my brain around and scrubbed it with soap. I'm afraid of taking another analytic philosophy class again.
I think I faced the same issues as with MATH 0540: there wasn't something for me to imagine happening. I never truly understood the modal ideas of necessity and possibility, and it became especially hairy when we added in first-order logic, like forall and exists.
CLPS 0800 Language and the Mind
Professor: Roman Feiman
CLPS 0800 is a pretty well-taught course and exposed me to a lot of cool ideas in psycholinguistics, like the perceptual magnet effect and the McGurk effect. It also taught me that designing a good clinical experiement is hard.
Fall 2024
CSCI 1680 Computer Networks ⭐
Professor: Nick DeMarinis
When anyone asks me for course recommendations, I always tell them to take CSCI 0190, CSCI 0300, and then CSCI 1680 in that order.
CSCI 1680 is possibly my favorite course at Brown. Some of its features are:
- There is no stencil code. You write everything from scratch. You know the codebase intimately. Your design decisions matter.
- You can choose to do the project in C, C++, or Rust. This course made Rust finally click for me.
- The two major projects, IP and TCP, are built on top of each other. This encourages you to write clean and maintainable code.
- IP, TCP, and the final project are also partner projects! You learn to communicate with your partner, and you learn to read and extend code that you have not written yourself.
The workload is fairly high, and I would recommend clearing out your schedule for it, especially if you decide to not do the projects in Go. Here was my breakdown, including time spent watching gearups:
| Assignment | Time to complete |
|---|---|
| Snowcast | 36.5 hours |
| IP | 38 hours (personal), ~60 hours (group) |
| TCP | 52 hours (personal), ~100 hours (group) |
Total: 36.5 + 38 + 52 = 126.5
CSCI 2952R Systems Transforming Systems
Professor: Nikos Vasilakis
CSCI 2952R is a course on systems research and scientific communication. It was quite good. I learned about the entire paper-writing pipeline and learned about tons of cool systems topics.
I think I could have gotten more out of the course if I had the computer science maturity at the time to really understand all of the projects—but I don't think there is any way to get that experience other than by engaging more with research.
CSCI 1970 Individual Independent Study
Professors: Rob Lewis and Nikos Vasilakis
My independent study course, CSCI 1970, was also tied to the research project I was doing in CSCI 2952R. I was in charge of writing the Lean code to prove some correctness properties about automatically synthesized aggregators.
MATH 1530 Abstract Algebra
Professor: Sachi Hashimoto
I wasn't originally planning on taking MATH 1530, but (1) I really enjoyed the first lecture by one of the professors, and (2) I thought I should probably learn about abstract algebra at some point.
Unfortunately, my friends were in another section with another professor, so I switched over. And then they ditched me to take Computer Graphics instead! (This is the last time I'm blindly following my friends with course choices. It never works out.)
I found MATH 1530 to be challenging and existentially abstract, so I think it's going to be a while before I take another pure math course.
EGYT 1310 Middle Egyptian I
Professor: Christelle Alvarez
I remembered that Red from Overly Sarcastic Productions once said that she took a course on Egyptian hieroglyphs in college. Also, I saw a news article on one of the department monitors about an alumn who worked on deciphering dead languages. It seems like that was enough subliminal advertising for me to want to take EGYT 1310. It was quite interesting, would recommend.
Spring 2025
CSCI 1670/1690 Operating Systems
Professor: Tom Doeppner
I took CSCI 1670/1690 because all of my friends were taking it. Plus, CSCI 1670 is taught in C, and I was TAing CSCI 0300, which is in C, which made me feel like there's a good kind of synergy there. (The reasoning was not very sophisticated.) This whole thing was not a easy choice for me though, because I knew that if I waited two more years, it would be taught by a really great professor.
I think, at the end of the day, I didn't like it. I'll tell you what you need to know if you're thinking about taking the course:
- You won't become a better programmer, like you would in 1680. There's no design element to it; it's all about following the instructions as best as you can. Maybe you learn a bit about reading complex codebases.
- Debugging what you wrote is basically all of the effort. You'll become well-acquainted with GDB. You'll figure out what your limits are before you throw in the hat and call a friend for help.
- Did I emphasize the fact that you're mostly reading other people's code and trying to figure out what they want you to write enough? The abstractions get pretty ridiculous.
But taking CSCI 1670 did let me take CSCI 2690 next fall and TA CSCI 1670 the following spring, so I will say: there's no reason to delay learning something useful.
CSCI 1515 Applied Cryptography ❤️
Professor: Peihan Miao
One of my main takeaways from CSCI 1515 was how to think at the right level of abstraction. On a high level, you have to think about how you would combine primitives (like homomorphic encryption and blind signatures) together to in an application (like a voting system). But on a low level, you have to think about how to actually construct these primitives. That's all the math.
Also, Peihan puts a lot of care into making sure we understand lecture, and her passion is infectious. Some courses leave you with the impression that the field is awfully boring and unmotivated. Not 1515. Hashing is actually, like, magical. Do you know how many things you can do with it? You can make signatures, pseudorandom generators, non-interactive proofs, commitments...
It's all super exciting, even though it's never going to be my main thing. Highly recommend.
ENGN 0520 Electrical Circuits and Signals ❤️
Professor: Jacob Rosenstein and Edward Tracy
I wasn't planning on taking ENGN 0520; I only went to the first lecture on a whim. But the first lecture was very good, and it reignited that curiosity I also had toward electronics and hardware. I have had some experience with it in my high school physics class, but I never felt like I really knew how circuits worked. I also thought ENGN 0520 could also solve some existential problems I have about "what is real" and whatnot.
Well the problem was: I discovered I didn't remember how to do math anymore.
In my previous math classes, we just had to write words. ENGN 0520 required a kind of numeracy that you better have when you're armed with only a pencil and a piece of paper.
There are actually a lot of practical considerations, like:
- When should you round?
- Where should you round to?
- When should you include units?
- How do you show your work?
- How much of your work should you show?
I got clobbered by the two midterms. Definitely below median (and the median was 50%). It took me until the final exam to lock in and relearn everything I had forgotten.
I am going to give a special thank you to the ENGN friend for helping me study even when I was a below-average student for most of the course, and they were setting the high score on every exam.

(The lab part was great too, but I was totally relying on my friend to handle the oscilloscope.)
EGYT 1320 Middle Egyptian II
Professor: Jonathan Russell
I continued learning Middle Egyptian in EGYT 1320. EGYT 1320 is substantially more difficult than EGYT 1310, and we had to translate multiple paragraphs before each class. There was also a lot more grammar and vocabulary to learn than I expected.
Fall 2025
CSCI 1650 Software Security and Exploitation
Professor: Vasilis Kemerlis
Notes: /csci-1650
Even though CSCI 1650 seems like such a specific topic, in retrospect I actually learned a lot of fundamental things about memory layout and code execution. I think this is the only course at Brown that actually explains how a C program is compiled, assembled, and run. Highly recommend.
| Assignment | Time to complete |
|---|---|
| CTF-1 | 11.5 hours |
| CTF-2 | 5 hours |
| CTF-3 | 9 hours |
| CTF-4 | 10.5 hours |
Hours spent on assignments: 11.5 + 5 + 9 + 10.5 = 36 hours
CSCI 1951Q Topics in Programming Languages
Professor: Will Crichton
Notes: /csci-1951q
Final project: Rust MIR-Level Integer Range Analysis
CSCI 1951Q has both CSCI 1260 (Compilers) and CSCI 1730 (Programming Languages) as a prerequisite. I have taken neither of these courses, so taking this course feels like getting a two-for-one deal.
| Assignment | Time to complete |
|---|---|
| Warmup | 18 hours |
| Type | 20 hours |
| Optimization | 35.5 hours |
| Flows | 37.5 hours |
| Dynamism | 16.5 hours |
Hours spent on assignments: 18 + 20 + 35.5 + 37.5 + 16.5 = 127.5 hours
CSCI 2690 Datacenter and Cloud Operating Systems
Professor: Deepti Raghavan
Notes: /csci-2690
Final project: Troubridge
CSCI 2690 is a seminar course on operating systems in datacenter and cloud settings. It's very well-organized. For example, the IX paper (9/16) references the the Dune paper (9/11), the Exokernel paper (9/11), and also mentions multicore scaling, which is addressed heavily in the Multikernel paper (9/9). The professor selects both papers that are very relevent, and papers with obvious flaws, and makes us think deeply about whether the findings were valid and useful. I feel like I am getting a guided tour through the literature of operating systems.
ENGN 1630
Professor: Sherief Reda Notes: /engn-1630
Most of ENGN 1630 felt like review of ENGN 520, except for the Verilog and the discussion of memory at the end. I found the labs very frustrating to do, since Quartus is such a difficult piece software to work with.
I kind of became burnt-out on engineering and decided not to continue with ENGN 1640.
BIOL 0210 ⭐
Professor: James Kellner
Notes: /biol-0210
Really amazing lectures. The professor talks at a great pace and is great at emphasizing what is important. I know a bunch of disparate facts about ancient life from doing the fossils event in Science Olympiad, but this class really helped me piece together the bigger image.
Spring 2026
CSCI 2680 Networks and the Internet
Professor: Akshay Narayan
Notes: /csci-2680
CSCI 2690 is a seminar course on networks... and the Internet. The format is identical to CSCI 2690, but I think the papers are broader and more interesting to me.
CSCI 2951O Prescriptive Analytics
Professor: Serdar Kadioglu
CSCI 2951O is a grad course that meets once every Friday. It's a great potpourri of tons of different optimization topics, including boolean satisfiability, constraint programming, linear programming, and integer programming.
ANTH 1720 Human Skeleton
Professor: Andrew Scherer
Notes: /anth-1720
ANTH 1720 is a course that goes through all of the bones in the human skeleton. I'm really enjoying learning something practical and physical. There are bone identification quizzes every week.
BIOL 0800 Human Physiology
Professor: John Stein
Notes: /biol-0800
BIOL 0800 is a course about human physiology. I wish the course content was organized a bit more logically.
Links
If you're looking for more course suggestions, here are some write-ups from Nick Young, Zachary Espiritu, and Eric Jang.
Here is some advice I found helpful:
- College advice for people who are exactly like me. College is not about choosing courses, but about all of the other things you can do in college when you're not choosing courses.
- Bluebooking for happiness argues that only the professor matters when it comes to a good course.
The best course on automated solvers at Brown is actually CSCI 2951O, which is very unhelpfully called Prescriptive Analytics.