I’m now in my sixth semester at Cal as a Computer Science major in the College of Letters & Sciences. For many high school students recently admitted to Berkeley, I’d like to share my thoughts about the courses I’ve taken/am currently enrolled in. If you’re a Berkeley student interested in taking upper division classes in the AI/ML tack, you may find this guide helpful too.

__Fall 2015__

**CS 61A (The Structure and Interpretation of Computer Programs)** This is considered a very large course even by Berkeley standards. It consists of 1500+ students (and growing) that teaches the basics of python and programming in general. There are a mix of students here, ranging from CS-intended, EECS, physics, cognitive science, and other engineering majors. For me, because I had 4 years of programming experience coming into Cal, the concepts were quite familiar, but I still learned a lot. The course primarily focuses on python, which I would later use in CS 61C, CS 170, CS 189, EE 126, EE 127, and in my research at the Berkeley AI Research Lab. Python is really the heart of Berkeley courses, and 61A does a great job going into the nitty gritty details. The only downside is that the midterms are “artificially” engineered to be very challenging, and it seems like the only purpose for that is to create a nice grade distribution. I found some parts, like environment diagrams, to be very tedious. The instructor, John DeNero, studied at Stanford and Berkeley as a NLP specialist and later worked on the Google Translate Team. He is universally loved by students, and is considered a role model coolness, intelligence, and good looks.

**Math 54 (Linear Algebra and Differential Equations)** I really enjoyed this class, despite most students bashing on the course and the teacher for being too boring. Lecture wasn’t very fun, but I loved my discussion section. My discussion section GSI (graduate student instructor) challenged me and was very accessible and eager to help me fully understand the proofs for all of the linear algebra theorems. Despite what many other students say about the course material being too shallow, I found the concepts satisfactory and sufficient for later courses such as CS 189.

**CS 9H (Python for Programmers)** Looking back, I don’t know why I took this course along with CS 61A at the same time. The staff was very great, but the course policies were tedious. There were a number of quizzes I had to take, and I had to get 100% on all of them to pass. If I got a single part wrong on a quiz I had to retake the quiz all over again :( Toward the end they made us learn tkinter, the python package for GUI’s. Overall, I don’t recommend this course as the best use of time, but perhaps other courses like C++ for Programmers or Matlab for Programmers may come in handy (although I insist you could still self-learn the material rather than take a course).

__Spring 2016__

**CS 61C (Machine Structures aka Computer Architecture)** This course focuses on low level concepts in CS, such as C programming, assembly programming, CPU design, parallelism, and caching. I found the class very fun and exciting, but other students generally find the concepts uninteresting and dry. Unfortunately the questions on the exams can sometimes be really “annoying” and tedious to go through, again to create a nice grade distribution. The course staff isn’t the most motivated compared to other courses such as CS 70, and they tend to leave off grading for several weeks. That said, there were amazing TAs in the class that really really cared about the material, but there were a few that slacked off. Despite this, I highly recommend others to take the course early and not leave it off for junior or senior year.

**CS 47B (Self-paced 61B - Data Structures)** I didn’t have to take 61B, because I had taken an equivalent data structures course at community college, while I was in high school. The admins still made me take this “lightweight” version of 61B. Many people told me that skipping 61B is a bad idea, and I wouldn’t recommend doing this in general, but for me it was the right choice. For me, I had a good grasp of data structures after doing USACO in high school.

**CS 70 (Discrete Mathematics and Probability Theory)** Coming into the course I thought it would be very easy because I had taken a discrete mathematics course at community college before while I was in high school. It turned out to be a more intense course than I had expected. One reason is that I was in 3 other techs that semester, and the pressure from all these courses just mounted. Another reason is that this is the last course students take before declaring in computer science, making the course very competitive. The lectures were always quite intuitive to understand, but the exams were pretty hard. I didn’t do super well on the midterms, but I studied hard for the final and in the end managed to end up in the top 5% of scorers in the final. Overall, this course was very interesting, and the course staff was AMAZING. They graded all our exams in 1 day, kudos to them! Shoutout to the head TA Alvin Wan, he is literally a superstar!

**Math 53 (Multivariate Calculus)** I had professor Stankova for this course. Great teacher, not so great content. Many of the arguments were taught at a 2D or 3D level because they were easy to visualize, but it was not easy to understand how they would extend to high dimensions. At times the class felt very physics oriented, so I didn’t find those parts very interesting. But the parts about gradients and double integrals were very useful. Green’s theorem, Stokes’ theorem, uhhh not so much. Not so much at all. I’d recommend taking a class like Math 104 (real analysis) to get a more rigorous understanding of the concepts that were covered in math 53.

__Summer 2016__

**CS 188 (Introduction to Artificial Intelligence)** This course, like most other summer courses at Berkeley, was not actually taught by a professor, but rather two very talented students. The course material has been mainly designed by two CS legends, Robotics and AI professor Pieter Abbeel and NLP professor Dan Klein. In general students don’t find this the course material to be very hard or complicated, but the exams are again “engineered” to be very challenging. That said summer courses tend to have more pity on students, offering slightly easier exams. The course covers CSPs, Graphical Models, HMMs, Reinforcement Learning, and a very crude introduction to machine learning. They even have a project that uses Tensorflow! It’s a great course to take over summer, because the course is condensed into just 8 weeks. But I would not recommend die-hard fans of AI to take the course over the regular 15-week semesters, because the course is not very mathematically rigorous and may feel slow. Again, the course staff is awesome, and they grade exams really fast.

__Fall 2016__

**CS 170 (Introduction to CS Theory, aka Algorithms)** I found this class to be really fun, way more chill than CS 70. Strangely, for many other students 170 is much harder, but I guess since I did USACO it seemed more second nature to me. In terms of learning, I sort of learned some things, but I wish if the proofs were more rigorous. The homeworks were somewhat challenging, but doable. I went to the homework parties every week, and they felt like social events where I met lots of cool people. One day I hope to be a TA for this course!

**CS 189 (Introduction to Machine Learning)** The material is really fun and exciting and I found professor Ben Recht to be the coolest, nicest person I’ve ever seen. The staff was a little bit disorganized — they kept canceling their office hours all the time, and were quite late on the homework grading, but they were nevertheless very helpful in office hours and discussion section. Turns out, they offered me a position to be a TA for the course this semester!

**Math 110 (Linear Algebra)** Lots of computer science students are interested in taking this course because they hear that it is the “true” linear algebra course, unlike math 54. I disagree. Some of the topics that math 110 goes over are just not really relevant to the CS curriculum, like jordan canonical forms, or T-invariance. Unfortunately, this course doesn’t go over the more relevant linear algebra topics in CS, like SVD, quadratic forms, and convexity. For those critical topics, you should consider EE 127 and CS 189. What this course does well is that it reviews the main concepts from math 54 in a deeper and more formal way. It doesn’t necessarily introduce anything new, but tries to prove all the things we took for granted in math 54. I love that aspect of the course. But overall, for CS students interested in acquiring stellar linear algebra skills, I would not place high priority on this course; instead I find math 54 + the linear algebra portion of EE 127 to be the best choice.

__Spring 2017__

**EE 126 (Probability and Random Processes)** This course is considered quite small, it has only 70 students. The students are very sharp, and very competitive. The material in the textbook and the lectures is not too hard, but the homeworks are very hard. Compared to the probability portion of CS 70, this course goes in more depth, and covers a few new topics such as moment generating functions, Poisson processes, and continuous Markov chains. The course also goes introduces hypothesis testing and Kalman filtering. Professor Kannan Ramchandran is so amazing! Probably the best professor I’ve had so far. He is very neat, has a clear mind, and explains concepts quite well.

**EE 127 (Convex Optimization)** This course covers fundamentals of linear algebra (such as FTLA, Eigenvectors, SVD), convexity, convex programs, and duality. The students are quite sharp and motivated. Professor Laurent El Ghaoui is an expert in optimization; he is heavily application focused and spends his time as a consultant for numerous financial and engineering firms. His teaching style is not as appealing, because he tends to repeat the same concepts over and over again. The textbook of choice in this class was not El Ghaoui's own book, but rather Professor Stephen Boyd's. As with EE 126, the popularity of this course is on the rise, and the recommendation now is to take EE 126 and 127 together before taking CS 189.

**CS 294–112 (Deep Reinforcement Learning)** This is my first graduate course at Berkeley. I’ve noticed that it has a much different vibe than other classes I’ve taken, in that it isn’t very rigorous and there isn’t much to the course slides or lectures. Rather, the course is just supposed to motivate us to learn more on own, by directing us to read relevant papers on our own. Specifically, this course is focused on using deep learning to make reinforcement learning algorithms more powerful. I’ve noticed many other students recently show interest in this field, and I encourage them to take this class the next time it is offered! The instructors, Sergey Levine, Chelsea Finn and John Schulman are pioneers in robot learning, and have been mentioned in numerous news outlets.

__Fall 2017__

**CS 162 (Operating Systems)** CS 162 is regarded one of the most time intensive EECS courses (I certainly hold this view) but at the same one of the most worth-while and interesting that I have taken. The course covers a broad range of fundamental topics such as threads, processes, scheduling, virtual memory, and filesystems. Towards the end of the semester, the course covers a hodgepodge of random topics that I did not find very enjoyable, but as a whole the course is very interesting. Most of the time students spend on this course is on the projects.

**EE 221A (Linear System Theory)** This course starts by covering basic linear algebra topics and later delves into linear systems and control.