Coursework
Past, present, and (tentatively) future classes:
I’ve enjoyed nearly all of my classes at Stanford and am happy to give a rundown of some of my favorites. Note that Stanford’s course catalog can be queried at Explore Courses.
Completed Courses (Autumn 2015 - Spring 2018)
CS 103 - Mathematical Foundations of Computing
The first portion of this class more closely resembled a math course than a traditional computer science course, with the focus on building the foundation for writing rigorous proofs. Around the middle of the quarter we were introduced to computational theory, starting with formal languages and finite automata. We finished with Turing machines and their usage in computational complexity theory, learning about some of the most famous problems such as the SAT problem. Keith Schwarz was a phenomenal lecturer and is now my major advisor.
CS 106X - Programming Abstractions (Accelerated)
This was my first computer science course at Stanford! The content wasn’t much different from what I learned in high school, save for an introduction to pointers and dynamic memory in C++. Our final assignment had us create an Excel spreadsheet-like program that could catch cyclic references in cell formulas.
CS 107 - Computer Organization and Systems
The infamous course introducing computer systems and low-level coding in C. Some of the more grueling assignments include building a vector and hash map implementation in C as well as reverse engineering code by reading pure x86-64. The final project involves implementing malloc(), realloc(), and free() to create a full-fledged heap allocator, with baseline requirements for our throughput and memory efficiency.
CS 108 - Object-Oriented Systems Design
A strictly project-based course (i.e., no exams!) that drilled object-oriented concepts as well as good software engineering practices in Java. Our final project required us to create an adventure game player and editor (a spinoff of the 90s game “Myst”) in Android Studio. My team probably put in a combined 120+ hours of work, and we got a feel for tackling a large problem as a group.
CS 109 - Introduction to Probability for Computer Scientists
True to its name, this class lays out the basics of probability, starting with random variables, independence, and expectation/variance. We then moved to probability distributions (both univariate and multivariate), learned about the central limit theorem, and finished with parameter estimation (MLE and MAP). Our final pset had us implement Naive Bayes and Logistic Regression algorithms, which for many of us was our first hands-on experience with machine learning.
CS 110 - Principles of Computer Systems
The successor to CS 107, and one of my favorite courses at Stanford. We covered the basics of file systems, multiprocessing, multithreading, and application networking throughout the quarter. I’ve been blessed with the opportunity to return and TA this class twice now.
CS 124 - From Languages to Information
A nice introduction to some of the problems and techniques in natural language processing, taught by the well-known Dan Jurafsky. Assignments included training a Naive Bayes classifier for sentiment analysis, implementing different models for spell checking, and constructing a question-answering system to play Jeopardy! Our final project involved implementing a chatbot to recommend movies based on its conversation with a user.
CS 144 - Introduction to Computer Networking
My favorite part about this class was how relevant all the concepts were: everytime I opened a webpage, I knew there were packets whizzing across the world, made possible by the very same topics we were learning in lecture. This class was a difficult one, with tough programming projects and a lot of different concepts to learn, but despite the struggle I’m very glad to have taken this course.
CS 145 - Introduction to Databases
Taught by the charismatic Chris Re, this was a fun introduction to the world of databases. About half the quarter was spent on the basics of SQL and creating schemas, while the second half focused on higher-level concepts such as join algorithms and query optimization.
CS 155 - Computer and Network Security
A survey-like class giving a broad introduction to cybersecurity. After getting our feet wet with basic control hijacking methods like buffer overflows and format string exploits, we moved to web and network security and finished the quarter learning the basics of mobile cybersecurity. My favorite homework problem involved writing a JavaScript profile worm based on the infamous MySpace Virus written by Samy Kamkar. Having this class under my belt was enormously helpful during my cybersecurity internship at Intuit the following summer.
CS 161 - Design and Analysis of Algorithms
This course is somewhat divisive among Stanford students, but it must be taken if you want to major in computer science here. It’s actually quite well-structured, beginning with sorting algorithms, moving to hashing and graph algorithms, and finishing with dynamic programming and greedy algorithms.
CS 166 - Data Structures
Contrary to what the title implies, this course is by no means an introduction to data strucures. We hit the ground running by learning about Range Minimum Queries and the Fischer-Heun structure, revealing that even simple problems can have a wide range (no pun intended) of solutions, each with its own pros and cons. Other concepts we studied included splay trees, lazy heaps, and what seemed like 900 different ways to hash something. This class was one of the most difficult I’ve ever taken, but I loved it and cannot say enough good things about Keith Schwarz.
CS 221 - Artificial Intelligence: Principles and Techniques
A fast-paced class hitting multiple areas of artificial intelligence such as game theory, reinforcement learning, and Bayesian networks. Some of my favorite assignments included writing an agent to play PacMan and implementing Gibbs sampling to power a (virtual) self-driving car.
CS 228 - Probabilistic Graphical Models
This was without a doubt one of my favorite classes, as we covered directed and undirected models, implemented sampling and message passing algorithms, and studied how we can learn the parameters and structures of these models from data. What surprised me about this course is that PGMs appear to be a small niche in the field of AI, yet studying them reveals important and foundational insights into statistical learning.
CS 229 - Machine Learning
The famous ML gauntlet taught by Andrew Ng and the equally-as-cool John Duchi. To be honest, I struggled in this class; my mathematical maturity was nowhere near what was required for the class, and I had way too much on my plate the quarter I took it. That being said, it’s a wonderful class that I still very much enjoyed and learned a lot from, and my final project was a big role in landing an internship at Oracle the following summer.
CS 231N - Convolutional Neural Networks for Visual Recognition
Another well-known class outside of the Stanford community, this course is probably the most polished out of all that I’ve taken so far. The assignments were engaging, the lectures hit on cutting edge topics, and the Google Cloud/GPU resources were seamless. Even for people who know nothing about computer vision or neural networks, seeing a style transfer network take Starry Night and repaint it in the style of The Scream is pretty cool.
Math 50 Series (51, 52, 53):
A 3 quarter series covering the basics of linear algebra, multivariable calculus, and differential equations. It helped that I had learned all of these topics in high school, but these classes were still a nice introduction to university-level math.
Math 113 - Linear Algebra and Matrix Theory:
My first proof-based math course, and one that can be viewed as a sequel to Math 51. We started with the basics of vector spaces, linear maps, and matrices, and then moved on to more interesting topics like Jordan Normal Form, inner product spaces, and the spectral theorem. I haven’t read that many math textbooks, but our course text Linear Algebra Done Right by Sheldon Axler is definitely one of my favorites.
Math 115 - Functions of a Real Variable:
The gentler introduction to real analysis compared to Math 171. We took the path from limits to continuity to derivatives and finally to integration, culminating in the ability to prove the Fundamental Theorem of Calculus. Elementary Analysis by Kenneth Ross was a great course text.
Math 143 - Differential Geometry:
A fast-paced course whose content included moving frames, geodesics and parallel transport, and the Gauss-Bonnet Theorem. In the middle, we defined a lot of the machinery necessary to do calculus on surfaces, like differential forms and the wedge product. My favorite problem set question had us calculate the number of hexagons and pentagons on a soccer ball by using Gauss-Bonnet.
Math 146 - Analysis on Manifolds
This class was simultaneously beautiful and downright frustrating, as my mind bent trying to understand why the image of an embedding is a submanifold, among other things. Differentiable manifolds are an incredibly cool branch of math, and I hope to study them more on my own in the future.
Math 158 - Basic Probability and Stochastic Processes:
A broad class covering limit theorems of probability, MLE, monte carlo methods, and Markov chains.
Math 171 - Fundamental Concepts of Analysis
Stanford’s honors real analysis course that teaches the basics of metric spaces. We went through foundational concepts like open/closed/compact sets and continuity, and finished the quarter with an introduction to the Lebesgue integral. Our writing assignment involved constructing the Lebesgue integral via completion arguments.