Comments and Recommendations for EECS Courses at U of M

As a student, twice a year I must make the arduous decision of what classes to register for in the next term. Sadly a paragraph in the LSA course guide is not enough to get the real scoop on a class. The best source of information is people who have already taken the class, but if all your friends are at the same point in college as you, that does not work. Here's my commentary on some of the classes I have taken at umich. Hopefully it helps with class selection. Warning: you are not me, so your millage my vary.

Table of Contents

EECS 280

The point of EECS 280 is to take you from beginner to intermediate programming ability. The course is basically a bunch of lectures and 4-5 projects (no homework!!!). One part of it covers linked lists, functional programming, and recursion (I would recommend reading The Structure and Interpretation of Computers Programs if your into that stuff). Another part covers C with pointers, char stars, and all the gory details of manual management stuff (for this part of the class, learning how to use valgrind will be helpful). The last part covers C++ and object oriented design (I am less than found of C++, so I did not like this part. Learn Java if you want to do OOP like a normal person).

If you have already been programming for a few years and know C++, then class will be easy. I finished some of the projects in just a weekend and the only one that was a lot of work was the Euchre project. I you are still new to programming, then this is the class for you. Some of topics like recursion and pointers are confusing at first, but nothing in the class will kill you.

The year I took EECS 280, one of the professors (whose research is on driverless cars) taught a section called EECS 280X. This section covered more advanced topics (such as vtables) and tried to give a motivation for why C++ is designed the way it is. Sadly I have heard that this experimental version was only offered once (I have the slides + lecture recordings somewhere if you are interested).

The textbook for this class is a brick. If you know C++ already you'll be fine without it. If you don't know C++ I would recommend reading something like Accelerated C++ by Andrew Koenig instead (disclosure: I have not read the book, but I used to read the author's blog Andrew Koenig - Dr Dobbs journal so I know that he is a good technical writer).

EECS 203

The point of this class is to teach all the boring math stuff that you need to know in order to understand the material in future classes. Actually I am being unfair, the material is fine it's just the presentation. My roommate said "I fell like it would have been a good class if it were taught in the math department instead."

There is homework each week, which can get annoying. Luckily most of the problems are straightforward plug and chug. I forget if they have you type up homework, but I did. Recommendation: do not use Word or Google Docs for this! Save yourself from pain later on by learning LaTex now. In EECS 376 they make you type up all your proofs, but in this class the problems can actually be hard. I use an online service called ShareLatex which nicely polished. It even has support for vim and emacs keybindings. If you really do not want to learn LaTex go with Google Docs because its equation editor is easier to use than Word's (it supports some LaTex).

Here again the textbook is a brick. It's one of those books that is in its bazillinth edition and has pointless biographies of dead mathematicians to pad its page count and price tag. I left the book in my dorm the whole semester and only used it for the homework problems. In lecture (looking at open laptops of people in front of me) I saw that half the class had found pdf copies online. If you want an actual book instead of a paperweight, I can vouch for Discrete Mathematics in Computer Science by Stanat and McAllister its only $3 on Amazon (Rosen is $147). Also, MIT OCW has some nice lecture on overlapping material.

Math 217

I lied, this is not an EECS class. That said, this class can substitute for Math 214 engineering requirement wise. You should be aware that this is a different kind of class. It uses the so called "inquiry based learning" method. Instead of listening to lectures in class, we did collaborative worksheets that were supposed to guide us towards discovering the important results of linear algebra on our own.

Linear algebra as a subject is a lot easier than calculus (all you have to do is add and multiply). That said, math 217 is a lot of work! Each week there is an online plug and chug assignment, a pen and paper problem set, and a handful of proofs you are supposed to write. Oh, and I forgot the weekly quizzes. If you do not have much background in math theory, this class will be hard. A few of the other engineering students in my section dropped out after a few weeks.

Scared yet? Don't be. The impression I got is that the math department decided to make this the class where all the hard proof techniques and abstract thinking stuff gets taught to beginning math majors. They expect that you don't know much and do a lot to help. Specifically, you can sign up on some Google Sheet and meet with someone who has taken the class before to get feedback on your proofs before you hand them in. There are other classes like EECS 203 that try to teach proof techniques, but because they are all giant lectures you do not get any specific feedback. For Math 217, the sections only have ~20 people (less if you are in the 8:30 section), so you get lots of feedback.

This is one of my favorite classes at umich. If you like math (the abstract not plug and chug kind) and want to learn how to write proofs, definitely take this class. Final notes: if you are on the waitlist (like I was) don't worry. Someone who does not know what they are getting into will probably drop. The textbook is ok, you should get it. Get a real paper copy. The bootleg versions online suck because they are from a scan. For math books in general, its helpful to flip back and forth between different sections. The books is not a brick so carrying it around is not a hassle.

Math 286 (with comments on Math 185, Math 186, and Math 285)

This class is part of the "honors" calculus sequence. In my opinion, this sequence of classes is a hidden gem. I always hear people complain about there horrible calc class taught by some bumbling GSI nobody understands. All the classes in this sequence are taught by actual professors who know there stuff. I cannot promise that you will be able to understand them or the material all the time (sorry Shuang), but all three professors I had were nice and went out of their way to help everyone. Also, the class is very generously curved so as long as you are near average, you will get an A.

If you are good at math, it is probably easier to get an A in this class than in the normal calc classes. The difficulty of these classes is in the material not the workload. For Math 286 in particular (because it is 3 credits vs 4 for normal differential equations (Math 216?)) there is less work, but because it is honors they go over the material faster so you end up learning more (someone I knew in normal differential equations told me that they always were a few weeks behind us).

The reason why these classes are hidden gems is you have to get Stephen DeBacker's permission to take them. I took Math 185 and 186 in high school and all I had to do was talk to him and show that I kind of knew what I was getting into and that I liked "pure" math (I get the impression he does not like computer science. Q: "Is it cheating for a human to used a computer to solve math problems?" A: "Is it cheating for a computer to have a human program it?" Also I remember him going on some long rant about how there is another computer science bubble).

Once you take one of the classes in the sequence, you are almost guaranteed a spot in the following ones. For one thing, in the fall there are typically 2-3 sections and by winter half of the class quits because they find out that college math is harder than they thought. I joined Math 286 1-2 weeks late because I was enrolled in a conflicting class I ultimately dropped. The professor was totally chill and I had no problems joining late.

A nice extra of 185-285 is that they all cover some linear algebra in addition to calculus. Differential equations uses some linear algebra, so taking Math 217 with Math 286 is helpful, but not necessary.

The textbook for Math 185/186 is amazingly well written. It is one of the few that I decided to keep. The first week of class Amazon and Ulrich's were out of stock, but there is an older edition floating around online, so it was no big deal. Math 285 had an awful textbook. Math 286 had a pretty good textbook that was not too think. I recommend paper for all of them.

Also I forgot to mention, the professor for Math 185 brought insomnia cookies for the class once and NYPD pizza for the final review session. The Math 286 professor brought the class Washtenaw Dairy donuts. This shows what good taste they have (the other math department events I have been to have mediocre Cottage Inn pizza instead). If there is one reason to take this these classes, its the people. They are a cut above your average wolverine (one of my classmates writes for the Every Three Weekly)

EECS 475

I am biased in favor of this class because cryptography is one of my longtime interests. That said, this class is fun elective if you enjoy the intersection of math and computer science. The only formal prerequisite is EECS 280, which makes it one of the few upper level classes you can take before EECS 281. Because most of the work is in the form of problem sets, it's a good class to take concurrently something project heavy like EECS 281.

Chris Piekart is a solid professor. He is always well prepared and gives clear lectures. Many professors in EECS (cough cough 280 and 281) depend to much on PowerPoint. Chris writes everything out on the white board which means he actually has to remember everything he is going to say. The one downside to this is that the lecture recordings are not great (from what I have heard), but you should attend lecture anyways and not watch shitty recordings. I have not had Compton for any classes, but from what I've heard he is just as good.

A major emphasis of the class is on security definitions and reductions (this helps with EECS 376). This focus makes for an abstract proof heavy class - for EECS. Formalizing cryptography to make it more than just black magic is good science and I learned a lot about what modern cryptography is all about, but I was a bit disappointed that the class did not cover that many examples of attacks against real world systems. I suspect that this is a result of Piekart teaching the class. A few years ago when Kevin Fu taught the class, the syllabus said that the final project was to carry out attacks against a bunch of ciphers, so the level of theory probably varies by professor. Anyways, formal security reductions are harder to learn than attacks, so the theory focus probably taught me more. If you're intrested in attacks look at the Matasano cryptopals challenges.

The textbook for the class is above average and does not take up too much space.

EECS 281

This is one of the most useful classes I've taken at U of M (EECS 482 is another). Almost all of the EECS classes I've had since then use at least some of the material. People joke that EECS 281 is the "job interview" class because lots of interview questions are EECS 281 style algorithm problems. Having had a few interviews now, I can confirm this. This is the class that weeds out the real CS students from everyone else. I know someone who claims he switched majors to data science because of this class. If you make it through, you can claim to be a "legit" (or at least mediocre) programmer.

While 281 is useful, I would not describe it as fun. Correctly implementing the projects is not hard, but meeting all the time and memory constraints is. There is a leader board that keeps track of who has the fastest solution for the projects. When I started the class I thought that it would be fun to see how high on the leader board I could get. What I quickly found out is that optimizing C++ code is not something I'm interested in. I ended up on the leader board a few times anyway (mostly because I started and finished the projects early), but my recommendation is to not worry about losing a point or two on speed and to go outside and enjoy fall instead. Compared with spending a long weekend implementing a pairing heap, waiting a few extra seconds for your program to run is nothing. What is important is optimizing for human - not computer - time.

Darden and Paoletti are respectable lecturers. Last time I looked at rate my professors, they had some of the highest ratings I have ever seen. I've had plenty of professors with lower ratings who are at least as good if not better, so I think Paoletti and Darden are a little over rated. My only beef with them is that they are part of the C++ cult and proselytize the mythic status of EECS 381. Excuse me while I go on a tangent for a moment. Here is an over the top rant by the creator of Linux to throw some ice water on the C++ parade (don't take it too seriously). Google and Mozilla both came up with their own programming languages Go and Rust to replace existing C++ codebases that were giant unmaintainable messes. C++ is not a general purpose language anymore. Its standard library does not have any kind of networking support and there is no convenient repl to use for just playing around. Enough with the rants. I've been programming in C++ since I was a freshmen in high school, and do have SOME appreciation for the language. Just be aware that most of the time there are better options.

The textbook is not used by the class very much, but I would recommend getting it just because every computer scientist should have AT LEAST one book on algorithms. CLRS is pretty standard elsewhere from what I've heard and is high quality (Ron Rivest the co inventor of RSA is one of the co authors!!!). If you just want to be a software developer and don't care about correctness proofs you might want to look elsewhere for more applied reading material. The library has digital versions available, so in the worst case you can use those.

EECS 370

EECS 370 is the class that teaches all the CS majors how computers actually work. It is one of my personal favorites and from talking to other people, I'm not alone in this sentiment. The projects are short and there only are ~4 homework assignments the whole semester, so the workload is not bad. The only trouble is that the material takes a while to digest and the projects are harder to debug that EECS 281's. This class is good preparation for EECS 388 (the buffer overflow part) and EECS 482.

In most lower level EECS classes, you can get away with not reading the textbook. Here that is not the case. There is some online textbook with mini quizzes in it for the class. Most of the time I hate online textbooks because they are poorly put together pieces of junk that are a pain to use compared to pdfs or plain old paper, but the Zybooks people actually got the recipe for ebooks right (probably because they actually have a background in computers as opposed to textbook companies like Pearson). Additionally, the lecture slides for EECS 370 are amazing. The PowerPoints have all sorts of diagrams for processor data paths with color coding and must have taken forever to make. Most PowerPoints are garbage, but this class sets the gold standard.

EECS 388

If you are looking for a fun class that is not that much work to take with something like EECS 482, this class is the perfect choice. The best description I've thought of is the class is a computer security buffet. The class had units on a variety of areas of computer security including cryptography, SQL injection, cross site scripting, network scanning, buffer overflows, forensics, and a bunch of other topics. The emphasis is definitely on breadth over depth, so the class is not that hard. That said, you are expected to go learn a bunch of possibly new languages like Python and JavaScript on your own - which some lazy people have trouble doing.

As with most EECS classes, the lectures are so so and the projects are where are the real fun is. Each project has its own flavor which is a nice change from most other EECS classes. Some of them have extra credit challenges which adds to the fun (I tried to do as many as possible). The blind sql injection and linked list ones are worth doing, while the callback shell and ROP ones are only worth it if you are willing to spend/waste half a day in gdb.

For the lecture on government surveillance, we had a guest speaker - Edward Snowden! He was piped in over some Google Hangout clone from Moscow and the class got to ask him questions. The speech he gave touched on most of the same points his other ones have, but the Q and A was one of a kind. Because of the time difference, only the morning lecture go to see him. The course staff did not announce who the speaker was going to be ahead of time, so I did not bother skip EECS 376 to go to the morning lecture. By the afternoon, news started to circulate and all the people who missed the morning lecture started kicking themselves with regret. There was a video that surfaced on YouTube, but last time I checked it had been taken down. Moral of the story: if Halderman says, there's going to be a guest speaker, don't miss it like I did.

Because the projects are easy, the grades for the class are decided by the final exam (there is no midterm). The first page of the final said "Security is hard. So is this exam. Don't panic" (or something like that). In preparation, I made a twenty page review guide. It must have worked because I ended up with the high score on the final. (Tangent: becoming an IA at U of M is surprisingly hard. Even with the highest score on the final, I still was not able to become one) For best results you should write your own guide, but if you're lazy here's mine: EECS 388 Final Review Guide.

One final note, during the past few semesters the class has been split between multiple lecturers - unlike all of the other EECS classes I've taken. One side effect is you might have someone besides a normal professor for some of the lectures. The semester I took 388, Kyle Lady (who works at Duo Security) taught ~1/3 of the class including the portion on lock picking.

EECS 376

Many people have strong (often negative) feelings about this class. I talked to a former IA and he said that he had to deal with a bunch of seniors who threw temper tantrums because they had trouble with the material and did not want to take the class. The common complaint is "this class is hard theoretical stuff I'm never going to use, so why do I have to take it?" If your life plan is to become a web developer, then this is understandable. That said, suck it up. Nobody is forcing you to take this class or study computer science. This is a university where the classes are supposed to be hard. If don't like that and just want to be a programmer, you can drop out and read JavaScript for Dummies. This class is supposed to teach you want computation is anyways and how various problems relate to each other. It might be "hard" for the mathematically challenged, but at least is not boring like EECS 203.

From what I've heard, this class changes around from semester to semester more so than most of the other core computer science classes. How the class is organized depends on who is teaching it. I had Schoenebeck and I later heard that he forced the course staff to revise the problem sets each week to make them harder. Maybe you'll get lucky and have easier problem sets, but if not, at least you'll learned something about FFT.

In terms of subject matter, the beginning of EECS 376 is useful because it covers dynamic programming is more depth than EECS 281. After that, it's just a bunch of reductions of reductions of reductions until the end where they cover Turing machines and finally RSA. Reductions themselves can get a little boring and repetitive, but what's nice is you get exposed to lots of problems (min cut, vertex cover, integer partitioning, coloring....). Going into the class, I was waiting to get to Turing machines, but NP completeness and RSA turned out to be more interesting.

The textbook is a brick because it covers dozens (hundreds??) of various computational problems and algorithms. The end has chapters on quantum computer, which sounds exciting. I tried reading one but gave up (nobody I known has a quantum computer yet, so who cares anyway). Except for being a brick, I think the book is pretty good.