Suggestions in this post are based on my undergraduate experience. These are just my two cents. FYI, I only had one major: Computer Science.

Course Selection Advice

To begin, EECS Undergraduate Workload Survey Results could give you a general idea of the workload of each course. However, a sense of workload varies from person to person. Below I will give you my suggestions based on the courses I have taken. I have taken EECS 280, EECS 281, EECS 370, EECS 376, EECS 388, EECS 442, EECS 445, EECS 482, EECS 484, EECS 485, EECS 595, and some EECS 498 special-topic courses.

My general advice is to take at most two EECS courses every semester. The reason is simple. There is a lot you need to study in each area beyond course materials covered. Each course only gives you the ability to open the door of an area of Computer Science. How far you can go is entirely dependent on your effort.

Let me give you a solid and concrete recommendation. Let assume you take EECS280 in your second semester at the University of Michigan. I recommend you take EECS 281 and EECS 370 in the third semester. I recommend taking EECS 376 after EECS 281 and EECS 370. It is doable to take it along with EECS 281, EECS 370. However, I think EECS 376 covers a different range of topics. It may not match your senses of worlds at the beginning. On the other hand, it is crucial to strengthen your knowledge in EECS 281 and EECS 370. They will be useful all the time.

In your fourth semester, I recommend you to take EECS 484 and EECS 376. I highly recommend taking EECS 484 as your first upper-level course. It covers SQLs in the first half of the semester, which is helpful and useful for EECS 485. It also covers system-related topics in the second half of the semester, which helps EECS 482 and EECS 485. Taking EECS 484 first will reduce your burden in the future. EECS 376 covers algorithms related stuff in the first 1/3 semester. EECS 281 will be helpful during this time. EECS 376 will cover cryptography in its last 1/3 semester, which will be useful for EECS388 and EECS 475. I like this part of EECS 376 best. Its core is all about math. As long as you put time, you will thank yourself in the future.

In the fifth semester, I recommend you to take EECS 388 and EECS 485. Both of those two courses cover web-related knowledge. Following my suggestions, you should have enough experience to succeed in them. By taking EECS 370, EECS 376, and EECS 484, now cryptography, SQL injections, and buffer overflow attacks are much easier to understand. Many materials covered in EECS388 can also help you understand materials in EECS 485, such as Tor, SQL injections, etc. EECS 485 also includes a lot of systems degisn stuff, which I think will help you understand 482.

After this point, you can take whatever courses you want to take, and you should have enough skills you need to succeed.

If you want to take AI-related courses, I recommend you to take EECS 445 first. The math and stats covered in it are comprehensive. They will help both EECS 442 (Computer Vision) and EECS 595 (NLP). You see the stacks I build up for you, right? It may not be the fastest way to take your favorite courses. However, this schedule is the least stressful and most organized. Please consider my opinions. You can make your schedule based on my advice.

Research Advice

SURE program is an excellent summer research opportunity for you. I recommend you to apply for it for your junior summer. At that time, you will have enough skills to take more ownership of one research project. It is also important to contact professors after you submit your application. Positions are limited. You have to show your ambitions. If you are interested in one area after taking one upper-level course with one professor, you could ask him/her to join his/her lab. This is what I did. Or you could send emails to professors whose projects you are interested in. You can find projects’ information on their websites. Do your researches on what professors are currently doing is important. Also, I highly recommend you only do one research at a time.

Internship Advice

Get interview

Umich Career Fair is a great resource to utilize. You can find out information online or ask other senior students about which company will have on-campus interviews. Your targets on career fair should be those companies having on-campus interview opportunities. Microsoft is one example. For those companies who do not have on-campus interviews, my suggestion is to spend your time on median or small-size companies, such as Pure Storage. Those companies could give you phone interviews if you hand out your resume to them. I highly discourage you from wasting your time in queue for big companies like Google and Facebook. First, it takes you roughly three hours to have a five-minute talk with recruiters. Second, finding an employee to refer you is the best option for those companies. The most important thing is to find an employee in your target companies to refer you for internship positions. I recommend you to use Linkedin. It takes time to find someone willing to refer you. Please be patient. A side note for students interested in pursuing a Ph.D., I highly recommend you to get an internship job in your freshman or sophomore summer. Those technical skills you gain from internships will help you get research positions in labs. Also, you could get a sense of industrial experience. Junior Summer is a valuable time for you to do research because you will have essential and enough skills to have significant impacts on research projects and get strong recommendation letters from professors.

Prepare for interview

Leetcode is a great platform to help you prepare for technical interviews. I highly recommend you to buy its yearly premium membership. With premium membership, you could practice technical interview questions based on company tags. It’s also important to express your ideas efficiently. During your interviews, you need to convey your solutions to interviewers.

Conclusion

I hope my blog could help you to succeed at the University of Michigan. In my opinion, peer advice is sometimes the most useful. When I look back now, I feel I could have done a lot of places better. However, my limitations in the past restricted me. I hope other students can reduce more or less their disappointments with my advice.