I found out this past weekend that Berkeley CS students have an internal wiki to share advice, insights and resources with each other. Although I'm interested in creating a similar resource, I don't have time currently; I would like for the Davis Computer Science Club (DCSC) to take on such a project, but until then, I want to summarize advice I have for potential, incoming and current students. I hope you enjoy reading this!
Google also has advice to undergraduates.
If your answer to the above question is "Parties, sex and drugs," you can stop reading now. If your answer is instead "To get a good paying job," I urge you to think a little more deeply. Coding academies (e.g. angelhack, App Academy, devbootcamp), which teach you how to write code at a level sufficient to get hired for a well-paying job, are a fraction of the cost of a UC education and take much less time to complete. The correct answer (or so I believe) is that you find the subject material to be inherently interesting and you seek more than a superficial understanding of it. Academia is driven not just by a desire to solve problems, but by a desire to advance our specie's comprehension of difficult subjects. If you feel like pursuing this goal would be a valuable way to spend your limited years, then you're in the right place. If you don't, then maybe you should consider your life's trajectory. To quote Alexander Coward's email to his students:
"In order for you to navigate the increasing complexity of the 21st century you need a world-class education, and thankfully you have an opportunity to get one. I don't just mean the education you get in class, but I mean the education you get in everything you do, every book you read, every conversation you have, every thought you think.
You need to optimize your life for learning.
You need to live and breath your education.
You need to be *obsessed* with your education."
I had difficulty deciding whether to place exercise first or last. Although not an academic pursuit per se, exercise is instrumental towards nearly everything you'll want to do. Exercise improves your mood, your academic performance, your sleep, your immune system, your social network, your confidence, your discipline and so much more.
When you come to college, come up with an exercise plan. What your plan is isn't as important as that you have a plan and that you follow through on that plan. The goal is to build a habit of exercise that will stay with you for the rest of your life. Personally, I woke up at 6 every morning and went running all over Davis. It was a great way to learn the campus and the city, which was great as living in a new place can be disconcerting. Another option is weight lifting. I highly recommend reading Henry Rollins's piece on why everyone should lift. However, lifting can be dangerous, which is why you should consider learning how to do it properly in a PE class.
PE classes are one of the best academic opportunities at Davis. For doing what you should already be doing, you receive (1) academic units, (2) a community of friends joined by a common interest and (3) coaching from a UCD Division 1 athletic coach. I tried water polo with Steve Doten and Kandace Waldthaler my sophomore year and it's been one of my favorite experiences at Davis. Don't miss out on a similar experience.
Also, one last thing - shut up about it. No one likes the person who won't stop talking about how awesome their exercise program is. Plus, it makes you less likely to follow through.
Exercise should be your foundation, but classes are the core of your education. They are the basis by which you learn, develop your interests, make friends and receive letters of recommendation from professors. Choosing classes is not just a question of which classes offered next quarter look interesting to you. Companies and graduate schools are much more interested in someone with specialized knowledge (an expert in one domain) than someone with generalized knowledge (a novice in all domains). The department publishes "Major Tracks", course recommendations if you have an area you want to specialize in. For this reason, you should complete your lower division classes (20, 30, 40, 50, 60) as soon as possible so that you can explore before choosing a specialization. The department has default multi-year course plans in the office to give you a sense of what this entails. The major tracks aren't complete, so I recommend scheduling time with professor(s) to get a more complete picture of which additional courses they recommend.
Students frequently debate between taking a course with a professor who is known to be a generous grader and a professor who is known to be an excellent teacher (read: difficult grader). My opinion is that the second is always to be preferred. Even if a subject holds no interest for you, that subject is almost guaranteed to pop up in other areas. For instance, security depends heavily on networking, operating systems and cryptography, which in turn depend on algorithms, statistics, computer architecture, number theory and more. Attempting to skirt learning a subject will only come to bite you in the ass. Additionally, many students feel that a course gives you a relatively good understanding of that subject. This is nonsense. Courses barely scratch the surface. Students should consider a course's requirements (x programming assignments, y written assignments, z exams) to be the bare minimum towards learning that particular subject. Prof. Matloff told me a story about his time in grad school in which (because of time constraints) a professor skipped a few chapters in the book. When the professor later used a theorem contained within a skipped chapter, the whole class became confused. One student, however, had read the skipped chapters and was able to provide a summary sketch of the theorem's proof. This is a standard that students should aspire towards.
To convey the material that each course aims to teach, the department publishes course descriptions. If you're like me, you'll find that these course descriptions fail in three ways. First, until you've taken a given class, the vocabulary is meaningless. For instance, ECS120 references finite automata, context-free languages, pumping lemmas, reducibility and more; to a student just entering the field, these words are meaningless. Second, courses differ greatly depending on which professor is teaching in a given term. It would be extremely impolitic for the department to advise students which professors to avoid, so I don't blame them, but it leaves students without an effective way of evaluating whether a professor-course pairing is right for them. RateMyProfessor can be helpful, but more often than not, the comments are along the lines of "This professor is mean" or "This professor is an easy grader." If you're interested in taking classes to learn the material, as I believe should always be the case, this information is unhelpful. Third, courses can complement each other in non-obvious ways. For example, ENG6 overlaps substantially with MAT22A, and ECS122A overlaps somewhat with ECS120. Understanding these nuances can increase the educational value one derives by taking these courses concurrently.
The following is my attempt to rectify these three failings. For each class, I add an ELI5 description so that incoming/new students can better understand what each class covers. I also add details regarding the comparative strengths and weaknesses of professors, aimed at helping you decide whether a professor-course pairing is right for you. Rather than proceeding in numerical order, I sort the courses by the order that you will take them (because of prerequisites, your first few CS classes will be largely deterministic). Where appropriate, I note which courses complement each other.
If you have no interest in this, skip ahead to Senior Design.
ECS120 - Theory of Computation
In 1954, a famous computer scientist named Alan Turing wrote an article in Science News titled "Solvable and Unsolvable Problems." Although he wasn't intending to write a course description for ECS120, he basically did. He tells the reader to imagine being given a puzzle (a crossword, a Rubik's cube, the Riemann Hypothesis, etc.) to solve. If you don't know how to solve it, you might ask if a solution exists. If a solution does exist, you might want to know how hard (computationally) it is to find that solution. For an addition problem, a computer can produce the sum in a flash. But for other problems, a computer might take a very long time to find a solution, or in some cases, might be unable to even determine whether a solution exists! ECS120 gives you a formal way to categorize problems based on how difficult they are to solve. Along the way, you'll learn about different computational models (abstract ways of thinking about how a computer works) and reducibility (the idea that you can prove two problems are equivalent by "reducing" each problem to the other).
Rogaway and Franklin are the two professors for ECS120. They approach the course differently. Franklin is solemn and follows the book very closely. Rogaway is animated and successfully engages the students by turning in-class problems into games. Franklin's lectures are slightly more rigorous, but sacrifice any semblance of intuition, leaving students to flounder when approaching the homework problems. Franklin's homework problems are optional, whereas Rogaway's are required. In my opinion, Rogaway's problems were the most enjoyable homeworks I've ever done. They were challenging, not too hard but not too easy, and satisfying to finish. I've heard students say that Franklin's class is more predictable, meaning that the midterm and final are easier to do well on. Rogaway reduces the stress of the midterm and final by using frequent quizzes; this makes cramming your way through his class very difficult. Disclaimer: Rogaway is one of my favorite professors in the department and this is my favorite class after taking it with him.
ECS122A - Algorithm Design and Analysis
This is the simplest class to understand. You've been dealing with algorithms your entire life. Informally, an algorithm is a set of steps where we take in some input, follow the steps, and produce a desired output. Two questions can then be asked. Did our set of steps correctly modify the input to the output? Assuming the answer is yes, we next ask, can we do better? In other words, what is the most efficient (with respect to space and time) way of mapping the input to the output. This class covers some common strategies.
I took that class with Bai. Friendly guy, but a poor instructor. I will give him credit for constantly repeating "Can we do better?" Although he spoke in the context of specific algorithms, his question can and should be asked with respect to virtually every subject in your life. I found my time to be much better spent (1) reading the textbook and (2) implementing the various algorithms we examined. I highly recommend doing (2).
ECS122B - Algorithm Design and Analysis
ECS124 - Theory and Practice of Bioinformatics
ECS127 - Cryptography
Scheduled for Spring 2016.
ECS129 - Computational Structural Bioinformatics
ECS132 - Probability and Statistical Modeling
ECS140A - Programming Languages
Although the majority of programming languages are Turing-complete (meaning they're all capable of performing the same tasks), there are substantial difference between languages. This class covers the types of design decisions that go into making a programming language and gives students the ability to experience different programming paradigms through Java, LISP and Prolog.
Since the two professors for 140A teach the class the exact same way, it doesn't really matter who you take it with. Since I expect Olsson to retire soon, that number is likely to decrease to one. Instead of talking about the class, let me instead suggest reading this article, which advances the controversial thesis that not all languages are equivalent and that some languages are more powerful than others.
ECS150 - Operating Systems
There are three professors who teach this class: Levitt, Wu and Nitta. I advocate taking this class with Nitta. Nitta has a very different approach towards teaching this class and I believe his approach to be more conducive to learning. Wu and Levitt provide students with real operating systems and then ask students to find and modify small functions with side effects. Nitta wants students to learn the necessary components of an operating system (memory management, process management, command line interpreters, file system mounting, etc.), so he has students build their own virtual operating systems on top of a virtual machine that he created. The workload is significant, so much so that Farrens and Lori Avellar (the former undergraduate advisor) spoke with him about toning it back, but if you put in the work, you will learn the subject. Wu and Levitt are also ridiculously easy graders (one of my friends passed the final in Levitt's 150 by writing his name on the test, nothing more.).
ECS152A - Computer Networks
I took this class
ECS153 - Computer Security
ECS154A - Computer Architecture
ECS154B - Computer Architecture
Scheduled for Winter 2016.
ECS160 - Software Engineering
ECS165A - Database Systems
ECS170 - Artificial Intelligence
Scheduled for Winter 2016.
ECS171 - Machine Learning
ECS175 - Computer Graphics
ECS188 - Ethics
The goal of this class is to remind students that before we are computer scientists or software engineers, we are people and as such, are ethical beings bound by the obligations of morality. This class is completely unpredictable. Depending on the professor you get, you will have a radically different experience. I took this class with Ian Davidson, who favored readings for homework and debates for classroom activities. Ilias Tagkopoulos, I'm told, takes a more practical approach. Allegedly, on day one, he showed up late. He told his students that he didn't want to teach 188 and would be willing to make a deal - everyone receives As in exchange for students giving him excellent reviews at the end of the quarter. When only one student objected to the deal, he thanked his students and left the room. When his students filed out of the room, they found him standing there. He said, "And this is why we have an ethics class."
What's Senior Design?
ECS193AB is a two quarter class, taught every Winter and Spring quarter, aimed at giving seniors hands-on experience. Students place themselves in groups of four, submit bids for projects that clients have opened, and then spend the two quarters creating whatever the client asked for. Projects are widely varied; some previous projects include creating an Android PC, a student-employee scheduler, a geofenced music player app, image analysis of fuel droplets aboard the International Space Station and more.
Do Senior Design
Senior Design is the most undervalued class offered by the department. I have a few reasons for saying this. First, you will learn new languages, frameworks and algorithms not covered in traditional classes. Second, you will learn how a project should be developed, from designing to specifying functionality to developing to testing. Third, you will learn how to function on a time scale much longer than any other project you will complete here at Davis; I find this to be particularly valuable, since most real-world projects are not short sprints, but marathons with continual checkpoints. Fourth, you will learn to function in a (relatively) large team that will show you aspects of coordination, cooperation and antagonism you haven't previously experienced. Fifth, it will force you to learn how to use revision control software (Bitbucket or Github, usually), which you've probably looked at once before but forgot how to use; given that these are standards in industry and academia, learning how to use them is very valuable. Sixth, it will give you a large, concrete, impressive item to place on your resume. These benefits are unique to Senior Design and are not easily obtained through other classes.
Isn't Senior Design for Seniors?
Senior Design is supposed to be for seniors, but there's no actual restriction preventing other students from signing up. Professors frequently permit third year students to enroll, and this year a sophomore was let into the class. The question is how you can convince the professor in charge to let you in. In all likelihood, you will be too inexperienced to contribute to the coding. Emphasize that you can contribute in other ways. No one likes writing design, specification or testing documents, but it is a way that a relatively inexperienced programmer can contribute. Doing these documents for your team will ensure you fully understand what your team is attempting to do and how, and your teammates will love you for reducing their workload. You will need the consent of the instructor, so you will have to argue your case. Be polite, be persuasive, be firm. I've yet to see a professor turn down an interested, committed student.
Can I Take Senior Design Repeatedly?
Unfortunately, currently, no.
What is Research?
You Can Teach!
Since the 60s, Berkeley has a program called DeCal which enables students to design and teach ad hoc courses to other students for academic credit. As of May 2014, Davis approved similar student-led courses. Although the process for planning and approval is still being established, if you're an undergraduate, you can design and teach your own course!
If you're thinking that you have no interest in teaching a class, I urge you to reconsider. Designing and teaching your own class has a number of benefits that cannot be easily obtained by other means. Such benefits include:
- Learning a subject beyond what classes can offer
- Working one-on-one with a professor, something that rarely happens, even with research
- Developing communication and classroom leadership skills amongst your peers
- Enhancing the overall educational experience for other UCD students
- Enabling you to view one aspect of the life of professors, beyond what a day of shadowing might teach
How to Teach
To be clear, you are not teaching an already existing class. You are designing your own unique class to complement already existing classes. Choosing a topic is difficult. The topic you choose must have several properties:
- Interesting: the topic must be interesting to both you and your students.
- Useful: Studying Babbage's difference engine might be intellectually interesting, but without modern-day applications, the course will not likely be approved.
- Relevant: It must be related to the department. One could make the case for a Kiswahili class, but the CS department will tell you to find another home for it.
- Unique: Your course cannot overlap with other courses, both inside of and outside of the department.
- Manageable: your course will likely be 1-2 units, meaning the amount of material you cover should be scaled appropriately.
- An explanation of the program. Most professors won't have heard about it, so they'll want to know what it is and how they can learn more about it from an authoritative source.
- A argument for why they should spend their limited time suppoting your course. You need to argue (1) that student-led seminars augment the educational experience, (2) your course is worth teaching, and (3) they are the best professor for your particular course. If it's not obvious, you should not approach professors randomly!
- Evidence of your relevant expertise. Professors do not want to babysit you, so convince them that you know the material you want to teach.
- A tentative course syllabus and tenative course materials (assignments, readings, etc.). This shows that you have carefully considered how you plan on structuring and teaching the course. Ideally, you found similar courses at other universities and used them to create your class. Emphasize that your material is tenative and that you want their expertise to shape your course.