Last semester I took CS161: Computer Security, CS170: Efficient Algorithms, and EECS127: Optimization Models and Applications. Going into the semester, I knew it was going to be difficult as CS170 and EE127 are known to be higher workload theory courses and CS161 had long projects, but for the most part it turned out pretty well. I went through a lot of hard challenges, some of them that were out of my control and some of them that were my fault, but I ended up doing pretty well. :D
Let’s start with my favorite course at Berkeley so far: CS170. It’s a highly theoretical course with awesome difficult problem sets that really challenged my thinking and gave me a deeper insight into computer science. I think the reason why I loved this course so much was that it solidified and explained many thoughts I had about computer science that I couldn’t prove before. We also learned how to prove things rigorously without going through a formal process like in cs70. But just the topics in the class and how they related to each other: Divide and conquer, graph algorithms, dynamic programming, linear programming, greedy algorithms, streaming algorithms, random algorithms, and much more topics. I especially liked learning about NP-completeness and reductions, trying to reduce one problem to another problem that at first seemed completely unrelated. Also, the textbook is spectacular; it’s very clear, explains the purpose of each algorithm as well as the intuition behind it, and has many practice problems. At the end of the course, we had a group project where we competed against other students on who had a better solution to a problem that was created by combining 2 NP-Hard problems: TSP and Steiner Tree. We ended up finishing in the top 20%, after a rollercoaster of emotions where we went through many “fixes” that actually made our algorithm worse, until we fixed those fixes. I'm also going to be a reader for this class next semester!
Now with EE127. I have many mixed feelings about this class. Let’s start with the cons. This semester is the first semester where the class has grown wildly in popularity due to mainly Professor Sahai advocating it as one of the ML courses you should take before CS189. Therefore, I feel the staff was not prepared for the amount of students and had a hard time scaling the course. Office hours were very cramped as there were very little hours and many students, which is at times frustrating because the material is very difficult. And at times, the material was very difficult, but it did not seem like it had a purpose. We solved or proved some crazy matrix problems ,but it felt like you didn’t “learn” from solving the problems. At times, the course depended on knowledge from CS189, which got me in a crossfire as I was taking this course to prepare for CS189…The first exam caught me way underprepared as I got 16%(!!!), but then I doubled my studying effort and I did a lot better. Which is ridiculous, because the amount of time I spent on the course on the first place was more time than I spent on all my other courses combined. It was also unfortunate that during one of the later exams, I was very sick the whole week, which was something that was hard to fight through.
Now, about the pros of this class. My mathematical maturity really…matured and I learned to be a lot more familiar with matrix operations and tricks. And not in a way of “I know how to compute Gram Schmidt”. We learned about covariance matrices, how to phrase problems to be convex, and went into some modeling ideas as well. There was a problem set due every two weeks, and we spent countless hours in Moffit solving them. I have started to read over the CS189 notes, and I know a lot of the notes wouldn’t make sense if I didn’t take this course. Also, I’ve never been a part of a class that felt more like a community. Mostly because we were all struggling in the same way without the course staff support. I’d like to emphasize that I do not think that the course staff to blame, as they could not have expected Sahai to hype this class up so much that it would increase over 2.5x in size and they did not have the manpower to support. But anyways, the students pitched in so much support. One of the students was making the Tex templates for us to turn in our homework. My CS170 Head TA was also in the course and constantly answering questions on Piazza. There was just so much encouragement from the other students to help everyone succeed, which is saying something, because I believe Berkeley CS community in general is very supportive. But the genius students in this class went above and beyond what they had to do to help the rest of us out. I ended up doing well, a lot better than 16% I am glad to say.
CS161 is a very cool project class. This class goes into many areas in security such as cryptography, encryption, web security, network security, and memory safety. But to go into security, we also covered many of these areas in general first, which is cool because I got to learn at a high level many different areas of CS that’s really helped me during my internship now. The projects are very cool as well. The first project we had to find memory leaks and exploit them and it had a very fun plot to go with it. The second project we had to create an efficient secure file-sharing system using an insecure server. The last part of this project, my partner and I BOTH forgot to push our final version to Bitbucket so we received 0 points on it, but that’s a lesson we had to learn the hard way. Still angry about that sometimes. And our last project, we were given a vulnerable social media website called Snapitterbook, and we had to exploit the website with sql injections, XSS attacks, and stuff like that. My partner and I spent a lot of time on these projects as we weren’t used to projects where WE were the attackers, and it was frustrating at times that we spent so many hours trying to come up with a solution and we only had one line of code to show for it. But a lot of thought and experimentation went into these few lines of code. And I think we learned that although sometimes we want to measure our success by the amount of lines of code we write, that’s not true. What you write needs to work, be efficient in time and space, and take into consideration many other factors. I think it's interesting how the lessons you learn from courses aren't necessarily related to the course material itself. And sometimes the most enlightening courses are the ones you don't appreciate at the time since you were too busy grinding out the hours to understand the material.
Anyways, onto the next semester! Feel free to contact me about any of these courses.