The Best Classes I took at UC Berkeley

I attended UC Berkeley from 2015-2019, majoring in Computer Science. This is a list of my favorite classes I took as an undergraduate.

Astronomy C10 (Fall 2015) - Introduction to General Astronomy

It’s hard to articulate just how amazing this course is and how much it means to me. Ever since I can remember, I’ve always had a general interest in science, especially anything space-related. I had heard a great deal about Professor Alex Filippenko’s reputation before this class, so my expectations were high. In short, this class turned out to be a transformative experience, and by far the best class I’ve ever taken.

The man himself exceeded all my expectations, and then some. His passion for astronomy is infectious. He takes the most mind-bending material and presents it in a clear, non-condescending, and often hilarious way. He has performed ground-breaking research and contributed to monumental discoveries (he was on the Nobel-prize winning team that discovered dark energy), yet is the most humble and approachable professor on campus. I’ll never forget his optional additional topics sessions when he bought everyone pizza and happily chatted with students for hours on end. He learned my name even though I barely spoke in class. He is such a genuinely good person - its people like him that give me faith in humanity. He is a personal hero of mine.

Besides the greatness that is Alex Filippenko, this course is just a must-take for the content alone. We start off with fairly benign material - atomic structure, spectral lines, blackbody radiation, orbital mechanics, eclipses, planets, stellar evolution - then gradually work our way up to arguably the most far-reaching material in all of science - supernova, quasars, black holes, dark matter, dark energy, the Big Bang and inflation, the geometry of the universe, general relativity, quantum mechanics, interstellar travel, extraterrestrial life, and the multiverse theory. The material is mind-bending, counterintuitive, and far-out - but Filippenko brings it to life with pictures, animations, demonstrations, and analogies.

As for administrivia, the exams for this course are some of the fairest and most well-designed I’ve ever taken. I got an A+ in the class without too much effort, but I did have a solid background in most of the material as a result of general interest. But far more importantly, this class leaves a lasting impression on your perspective on life. This class taught me that reality is more beautiful, mysterious, terrifying, and fascinating than anything in fantasy. I already subscribed to the notion that mankind’s greatest endeavor is to unravel the inner workings of the universe, but this class reinforced it even more. Astronomy truly is the most fundamental science. More fulfilling than any religion could be. One leaves this class with a profound sense of awe and wonder, and a new perspective on life. You realize that in the grand scheme of the things, none of our worries have any real cosmological significance. We must stand humbled at the vastness and complexity of our world, while acknowledging our ignorance.

Computer Science 61B (Spring 2016) - Data Structures

This is an empowering course. Upon completion, you feel like a competent programmer ready to take on any challenge. In terms of industry, this may be the single most important course at Cal - it gives you the toolkit and mindset needed to be a real software engineer. The projects and homeworks in this course are far more rewarding (but difficult) than those in CS61A. You get the satisfaction of making your own algorithm and design decisions from scratch rather than simply filling in a few functions. It teaches the fundamental principles of programming - object oriented programming, inheritance, encapsulation - by means of understanding and implementing fundamental data structures, including linked lists, trees, arrays, hash maps, heaps, tries, and disjoint sets. You also learn about basic sorting algorithms, dynamic programming, and graph search problems. These are the “cool” parts of computer science because you can immediately apply them to solving real world problems. They also happen to be the subjects of most interview questions. On a practical note, it also gets you comfortable with working with version control (namely git) and IDEs (namely IntelliJ IDEA). I think Java is the perfect language for this course - it’s more verbose and maintainable than Python, but not as low-level and frustrating as C. In other words, it provides the perfect stepping stone from CS61A’s high-level treatment of Python to CS61C’s meticulous treatment of C. I have very fond memories of this course and cannot praise it enough.

Psychology C61 (Spring 2016) - Brain, Mind, and Behavior

This course is a far-reaching introduction to neuroscience - the study of the structure and function of the human brain. The class begins with molecules and cells, builds up to brains and nervous systems, and along the way covers neural signaling, sensory perception, memory, language, and emotion, and culminates with the mystery of how brain processes relate to consciousness and mental experience.

Professor Presti was an expert guide to this ambitious course. His soft-spoken and zen-like nature made early-morning lectures enjoyable. His somewhat whimsical but endearing personality shone through in his class textbook, which is full of haikus and philosophical questions. Despite covering information-dense material, the book is remarkably concise and enjoyable. This is the only course in which I can honestly see myself re-reading the textbook for fun.

This course was intellectually stimulating - it forced me to contemplate the fallibility and artificial nature of perception; the evolutionary explanations for our behavior; the study of exotic cases and what they tell us about free-will; the blurry boundary between living and non-living things; and above all, a sense of wonder and awe at the complexity and magnificence of the human brain. This course wasn’t perfect (exams were just rote memorization), but it did change the way I think about life and consciousness.

Computer Science 70 (Fall 2016) - Discrete Math and Probability Theory

This course is an epic. The first half is discrete math - which is a term that doesn’t mean much by itself. Essentially it is a collection of miscellaneous topics in mathematics relevant to computer science: set theory, logic, proofs, graphs, modular arithmetic, polynomials, infinity and countability, computability and complexity theory, and counting. And that’s just part one. These topics are hit-and-miss; some are dull (logic, graphs) while some are interesting (counting, computability), and still others are mind-blowing (infinity and countability). But all of these topics are important to know and have shown up in later courses. More importantly, they significantly help with building mathematical maturity. However, the real fun begins with the second half of the course - probability. It is a rigorous and fairly comprehensive introduction to probability theory and its applications (e.g. Markov chains). Although it doesn’t probe too deep into any particular topic, the course sets up strong foundations for solving a wide variety of problems. Probability is an analytical way of thinking, more than anything else. The concepts of random variables and distributions are extremely powerful ideas. In a world full of uncertainty, probability theory provides a reasoned way of approaching it. This course changed the way I view the world and gave me a new appreciation for the diversity of insights mathematics has to offer.

Math 110 (Spring 2017) - Linear Algebra

This was the class that made me “get” what math majors mean when they talk about the beauty of math. I had already developed an appreciation for the power of math from high school AP calculus, but one could argue that this was my first “real” math class. We derived everything from the most basic axioms about vector spaces and set out to rigorously prove everything. There is a certain joy in working out proofs on your own that I think everyone should have the satisfaction of doing at least once in their lives. Zvezdelina Stankova was the best math professor I’ve ever had - she was clear, made sure to explain every step along the way, and made lectures fun. She also gave exceptionally fair exams. Linear algebra as a standalone field is stunningly elegant - the concepts of dimension, linear independence, change-of-coordinates, projections, etc. are actually quite profound to think about. Linear algebra is self-contained but also sheds new light on almost all facets of math. Of course, I probably wouldn’t have taken this course if it wasn’t for the extraordinarily useful applications to other domains. It is at the core of machine learning and computer graphics, and I think having a strong theoretic background is very useful.

Computer Science 61C (Spring 2017) - Machine Structures

This is a course I probably never would have thought would be on a list like this at the time I was taking it. The course itself is a chore to get through - it is an onslaught of dense, difficult material. The profundity of the course doesn’t sink in until after completion. While the projects and homeworks felt dull and tedious at the time, I now realize it was a necessary evil. This is truly a fundamental course for any aspiring computer scientist. It was while working on a simple pipelined processor in LogiSim that it finally clicked for me - how computers actually work. Once you’ve hand-translated a C program to assembly language, made the symbol table and linked the necessary libraries, translated the assembly to hex and binary, converted the physical addresses into virtual addresses, and hand-wired the logic gates used in instruction fetch and decode - there is a beautiful moment of enlightenment as you suddenly see how the hardware meets the software. This course covered so many fundamental ideas that forever changed the way I think about computers. After the magic has been dispelled, I am even more amazed by computers than ever before.

Global Poverty and Practice 115 (Fall 2017) - Challenges and Hopes in the New Millennium

This was one of the most eye-opening and important courses I’ve ever taken. The scope was vast - we considered issues ranging from environmental degradation, privatization of resources, the politics of natural disasters, the implications of globalization, and the challenge of implementing new economic systems. We also reflected on our society as a whole, looking at the effects of capitalism, consumer culture, charities, welfare programs, and how we view those in poverty. Lastly, we looked at potential solutions to poverty in a quickly advancing world, including a universal basic income.

Professor Fatmir Haskaj was an engaging, unpretentious lecturer. His frequent self-deprecating humor and interactive style made the content digestible. The GSIs were very pleasant and kind people. There was never any pressure to take a particular stance on any issue, but just to be cognizant of them. The course was not hard, but you had to take the time to really understand the material to write sufficiently thoughtful responses on the exams (which I did not do).

It is hard to come out of this course without a bleak view of the future. In terms of sustainable environmental practices, international cooperation, power disparities, and educational attainment - we do not appear to be well-equipped to handle the challenges ahead. All signs point to unprecedented automation in the future, and we do not have the social or economic infrastructure in place to address the inevitable displacement. Our consumerist practices are unsustainable and we are enacting irreparable violence against the planet everyday. And there is no indication that things will get better, either; as the global population rises, tensions over limited resources will inevitably lead to conflict. This course was ultimately a gloomy but crucial look at the world’s current state of affairs, and what the future is likely to hold.

Philosophy 4 (Spring 2018) - Knowledge and Its Limits

This was my first and only course in philosophy, and I thoroughly enjoyed it. I’ve always had a mild interest in philosophy, so I was curious enough to give it a shot. I was pleasantly surprised at how refreshingly organized the content was, especially compared to other humanities courses. Professor Holliday was a highly engaging and intelligent lecturer who came prepared with well-prepared presentations everyday. Lectures were abstract and thought-provoking, and always generated good discussion. It was a good exercise in critical thinking. There was little to no work outside of lecture required, except for two papers. The papers emphasized “clear, concise, and charitable” prose, which is a good skill to practice.

At a high-level, the class is divided into four parts. In the first part, we looked at “Can we know anything at all?”. The skeptic holds that all beliefs are susceptible to doubt, including, for example, the belief that we are not currently in a dream. Drawing from the authors we read, my personal opinion on the matter is that certain foundational beliefs cannot be subject to inquiry in any practical sense. Perhaps we cannot know anything in an absolute sense, but I am content with ‘it is unreasonable to doubt that’.

In the second part, we looked at “Are any of our beliefs justified?”. In particular, we looked at the Regress Problem, which implies that for a belief to be justified, we seemingly require a chain of justifications that either (1) ends at some belief that cannot or needs not be justified; (2) loops back on itself to some belief it started with; or (3) goes on forever. I personally liked coherentism - it suggests thinking about epistemic justification as arising in a web of logically consistent and mutually supportive beliefs. It avoids the arbitrary privileging of a set of basic beliefs and instead advocates the interdependent nature of beliefs.

In the third part, we looked at “What are the conditions for knowledge?”. In particular, we began with what had historically been the most commonly accepted answer: justified true belief (JTB). However, a number of cases, called Gettier cases, challenge the sufficiency of these conditions. JTB can be shown to allow an agent to have knowledge in cases where we would be uncomfortable in proscribing it - mostly because the agent is right only because of “luck”. We then examined a number of interesting responses to these Gettier cases.

In the fourth part, we looked at the social aspects of knowledge. We looked at an author (Clifford) who challenged the adage “everyone is entitled to their own opinion”, by asserting it is wrong to form beliefs based on insufficient evidence. In particular, “no real belief, however trifling it may seem, is ever truly insignificant; it prepares us to recieve more of its like, confirms those which resembled it, and weakens others”. The danger of this reinforcement loop extends past ourselves, but onto future generations as well - our words, phrases, and modes of thought are fashioned and perfected from age to age; an heirloom which each succeeding generation inherits.

The four parts of the course are related but distinct. It was necessary to start with the first part because in order to have a course on knowledge, we must first come to terms with the skeptical question of whether knowledge is even possible. Assuming we accepted that it is, we could then move on to the structure of justification. Then, we could finally answer the question of what knowledge entails, and what role, if any, justification plays. Lastly, we looked at knowledge in a more contemporary social setting, recognizing that knowledge is not an individual quest but a collective effort.

Computer Science 184 (Spring 2019) - Computer Graphics

This is a wonderful and enjoyable course for the experienced computer science undergrad. The professors and course staff put together a solid curriculum with well-made lectures. Every aspect of the course is designed with clarity, succinctness, and elegance in mind. Other than keeping up with lecture, the only real workload for the class is the projects. And I cannot praise them enough. They are the rare CS projects that directly match what is discussed in lecture, and greatly improve understanding of core concepts. Not to mention they are interesting as hell and the results are often breathtaking.

There isn’t anything truly life-changing in computer graphics, and the field is advancing so rapidly that many of the techniques discussed will soon become relics of the past. But the projects are so damn cool that you don’t mind. The field of 3D graphics is so rich and fascinating, and after this class, you feel like you have a solid grasp on the fundamentals. It is far more accessible and fun than say, databases. Path tracing, the state of the art rendering technique used in all modern animation films, is one of the craziest, most elegant, and coolest things I’ve ever learned about. In a nutshell, given a geometric 3D scene and camera location, it works by casting rays through each pixel in the output and averaging their values to calculate the final color of each pixel. The values of rays are a sum of direct and indirect lighting; whenever a ray intersects a surface, the direct lighting of that point is computed from casting shadow ray(s) to the light sources in the scene while indirect lighting is computed by recursively casting a new ray from that hit point in a random direction. This description is only a tiny taste of the real mechanics under the hood, but it gives a sense of the extradorinaiy inventiveness found so often in computer graphics. I highly recommend this to all upperclassmen in computer science.

© Andrew Campbell. All Rights Reserved.