This advice is oriented for new or aspiring University of Waterloo students, especially those seeking a career in the tech industry. This advice is mostly for academic and career success. This means that other very important aspects of university life, like socializing and managing your physical and mental health are not covered as much, even though they are equally as important.
The advice throughout follows some common themes:
Surround yourself with the right people.
Think ahead: anticipate your future needs early. Even if you don’t know what you want, you can maximize your future opportunities.
Gain as much career-relevant experience as you can, as fast as you can.
Prioritize your needs and manage your time properly.
Applying To Waterloo
Choosing the right program is a very personal question and there’s no right answer. However, there is an optimal way to apply to programs at Waterloo. This is because it is easier to switch from a more competitive program to a less competitive one (or get rejected from a competitive program and still receive an alternate offer). The best strategy, then, is to apply to the most competitive programs, even if you think you might want to be in a less competitive one.
The main benefit of competitive programs is not the courses you get to take. It’s the network of incredibly hard-working and intelligent peers you will get access to. It’s crucial to surround yourself with friends who you can get help from for assignments and job hunting. Even if you think a program like Software Engineering is too much work for you, you will have the flexibility to opt out. Keep your options open, and try out the more competitive program. You can even make your most important friendships in a hard program and then switch to an easier program, giving you the best from both programs.
Choosing Residences, Courses, Co-op Streams
Choose stream 8 if you can: Getting 8 months of school before your first co-op is strictly better than only getting 4 months. Employers prefer students who have had more school, and it is easier for you to adjust to university life without immediately needing to job hunt.
Choose apartment-style residences: The main critique of apartment-style residences is that it’s easier to be social in a dorm. Personally I had no problem socializing, and apartments are undeniably higher-quality living situations. It’s easier to get apartment-style if you have a group to live with beforehand. I would avoid getting a meal plan, which is just a way of forcing you to spend money; dorms have mandatory meal plans while suites typically have the option of no meal plan.
Choosing courses: Your courses are a personal choice based on your ambitions and how much work load you want to take on. That said, you should go through the required courses for your program as early as possible. You don’t want to get stuck in a situation where you find your schedule in 4th year does not allow you to take the courses you need to graduate, delaying your graduation. This can happen due to not having pre-reqs to take courses, or it can happen because certain courses are only offered in certain terms. Getting requirements out of the way early lets you have more flexibility in the future. Look up which terms (winter, spring, or fall) the courses you want and need to take are offered. Plan out your schedules for future terms ahead of time, as soon as you know what courses you will be taking. You can schedule some time with an academic advisor to go over your plan and verify it meets your program’s requirements.
One interesting note for CS courses: Algorithms and Operating Systems are the two major third-year courses that bottleneck your ability to take fourth-year courses. You can fast-track one of them based on your interests, by delaying any pre-reqs for one but not the other. I recommend taking Algorithms earlier, since the concepts there are more useful for technical interviews. You can also look into fast-tracking your statistics courses.
Succeeding At Your Courses
Use UWFlow: UWFlow is an amazing tool that does a lot for you:
Best way to explore which courses to take (shows you which courses you meet the pre-reqs for, course schedules, how easy and useful people found courses, which courses your friends have taken, etc.)
Exports your course schedule for you, so you can have your schedule in your favourite calendar app automatically (I prefer Google Calendar)
Create a wishlist of courses you want to consider for the future
Go over the syllabus and put everything in your calendar: Assignment due dates, midterms, office hours, everything. The goal is to expect how busy you’ll get throughout the term, so nothing catches you by surprise. You should also know all of Waterloo’s important dates: https://uwaterloo.ca/registrar/important-dates/calendar
Optimize your course schedule: Use RateMyProf and UWFlow to make sure you are in the course sections with the best professor. The professor is much more important than the time or location of the section. You can usually attend a different section even if you are not enrolled, unless too many people do the same thing. When this happens, you may get your ID checked. Be ready to change your schedule as soon as you are able to (look up what dates course selection are); it’s much harder to change later.
Collaborate on assignments: Make friends with others taking the same courses as you, and never submit an assignment without collaborating with friends. This doesn’t mean copying answers; it means verifying that you are understanding the course materials correctly before losing out on marks rather than after. Seriously, no copying.
Go to office hours: One-on-one help from the professor or TA will usually spell out for you how to do an assignment or understand an example. Don’t waste hours being stuck on one part of an assignment; usually you just need one quick hint to finish the question quickly. You should attempt the assignment before going to office hours in order to have specific questions to ask. In fact, treat the office hours before an assignment is due as a soft deadline for the assignment.
Take organized notes: Basically, copy word for word what the prof writes down on the board. If your prof does not write everything down or writes things in a disorganized way, perhaps you have a bad prof. If you have no alternative, you may need to take some extra time to organize the ideas and examples into a way that makes more sense to you after class. Alternatively, you can see if there are course materials on Learn (like a textbook or slide decks) and write notes that summarize those materials instead. Worst case, Google the course and see if you can find old course notes shared by past students.
(Quick shoutout to Anthony Zhang’s notes: https://anthony-zhang.me/University-Notes/)
Just skip class if you’re extremely confident the course materials are sufficient for you. Regardless, always take notes.
Study effectively: My personal method for studying:
Summarize all your notes: Go over your notes and concisely but thoroughly cover every major concept. If you need to, cross reference your notes with other course materials. Of course, omit any notes that you have been told will not be on the exam. The goal is to make the shortest possible cheat sheet that, if you knew everything covered in it, you would get 100% on the exam.
Go over assignments, practice exams, and past exams (in that order): Redo all your assignments; try to do them with as little help from your cheat sheet as possible. Reference the answer sheet after you’ve given your best try. Edit your cheat sheet as needed if you find anything missing. Repeat this process for practice exams and past exams. Ideally by the end, you will not need to reference your cheat sheet.
Ask for help: Only after doing the above steps should you study with friends or go to office hours. Ask about specific questions you were unable to do on your own and specific concepts you could not understand from your notes. Help your friends: you will know you are ready if you can teach your friend any concept. Compare cheat sheets and see if you all agree on what will be covered on the exam.
Good study spots:
The criteria for a good study spot:
Appropriate noise level (for group studying or solo studying)
Not too crowded
Roomy table space
Accessibility to outlets and nice washrooms
Some good study spots (some are more hidden gems than others):
E6 soft seating across from the elevators (go to any upper floor)
Laurier Library and other Laurier buildings (way less crowded than Waterloo! But not always open 24/7)
Tatham Centre (when it’s not busy during interview season, you can book an entire room)
M3 study lounge and upper floors
DC or DP libraries I guess…
Join a club; clubs have the ability to reserve rooms
Certain residences, programs, and student housing have study lounges
MC Tutorial Lounge
Quiet areas in upper floors of MC
Understand what works for you: Be critical of how your note-taking, studying, class attendance, and etc. factor into your success, because it’s heavily dependent on you as an individual. Explore whether you take notes better on paper vs laptop. How should you format your notes for your future self? Do you learn better from lectures or from reading a textbook? Figure out your preferences early.
Read Evy’s Guide to Internships
I cover many of the same topics in this post, but Evy goes into a lot more detail here: https://evykassirer.github.io/playing-the-internship-game/
Gain Coding Experience - The First Step To Building a Great Tech Resume
If you don’t have high quality experience on your resume, no amount of wordsmithing or hyperbole is going to impress an employer. If you’re like most first-years, you have little to no experience to fill out even a one-page resume. Start gaining experience as soon as possible. There are many ways to do this: work on a side project, join a coding club, go to a hackathon, practice/participate in coding competitions, or contribute to open source. Try out each of these methods, and stick with the ones that you find most effective.
Start a side project: This is difficult for first-years since you’ll have little coding experience and you also need to come up with an interesting idea that will motivate you to see it through to completion. Keep in mind the originality of the idea is not that important. You can even completely copy an existing app that you really like. What’s important is that you find the motivation to complete the app, and you learn a lot from the process of working on the project. Side projects are best suited for you if you enjoy product design. An easy first side project is to make a portfolio website.
Join a tech club: This option is great because it also helps you meet new people. The most obvious club you’d first look into is Computer Science Club. Do not join Computer Science Club. I recommend joining clubs that are trying to complete a project within the term. This time constraint almost guarantees that you will get something impressive to put on your resume. Time constraints are also beneficial because these clubs will need to be more selective of its members, which helps you find mentors and friends who will support you with school and jobs. Any club that meets this criteria is a good bet, but the clubs/residences I have in mind are Hack The North, UW Blueprint, and Velocity Residence. Apply to a club/residence like these right away, because they recruit before the term starts. Despite being selective, these clubs highly value developing the skills of less experienced students, so your chances of getting in are better than you think.
Go to a hackathon: A hackathon is a 24- or 36-hour event where participants form teams of 1-4 and build a project idea entirely during the time of the event. The goal is to have enough of the product built so that they can demo it to a pane of judges. A select few teams are chosen as winners. This is not much different that starting a side project, but hackathons help motivate you, provide mentors, and you can even join a team with a cool idea if you can’t come up with your own. Go with ambitious friends - surviving a hackathon together really brings people closer together. The best hackathon in Waterloo is Hack the North, but there are plenty of others like TerribleHack and EngHack, as well as hackathons hosted at other universities or by tech companies. The best way to learn about hackathons is making friends with people who go to hackathons. Hackathons often pay for the cost of transportation and provide food and free swag throughout the event. Some hackathons even provide fun break activities like therapy puppies or juggling lessons, or mini coding competitions. Hackathons can be a great opportunity to network with peers and employers.
Coding Competitions: This option is appealing because it both builds your resume and is practice for technical interviews at the same time. The best websites for coding challenges are HackerRank and LeetCode. I will cover how to get the most out of these websites in this post’s section on Practicing for Interviews, but I encourage you to save the code you write, host it somewhere like Github, and link to it on your resume.
Contribute to open source: Open source projects on Github always have tasks that they want people to do. As you use open source tools, you may likely find a bug or feature that you yourself can submit a change for.
Be an undergraduate research assistant: This option is best suited for if you are considering pursuing a Masters or PhD. You get to collaborate with a prof on their research project, you get paid, and you are eligible for a small scholarship.
Engineering: https://uwaterloo.ca/engineering/ura
Computer Science: https://cs.uwaterloo.ca/current-undergraduate-students/research-opportunities/undergraduate-research-assistantship-ura-program
Writing Your Resume
In the tech industry, a resume should be one page.
The format I recommend:
Your name in a large font
Links: your personal website, your Github account, LinkedIn, and email (get started on making all of these!)
Skills:
Languages: programming languages. Put any down if you’ve used them.
Technologies: specific frameworks or tools you’ve used.
Algorithms: This section is optional. Remember when I said you should save your solutions to HackerRank and LeetCode problems? Link to it here.
Work Experience: All your past tech internships. Only put non-tech jobs if you really can’t fill up your resume any other way.
Projects: Your side projects, open source contributions, hackathon projects.
Other, as needed: Maybe you have research experience, or participated in a coding competition.
Education: The least important section, since you can’t really differentiate yourself here. But still include it, because employers need to know what program you’re in and when you expect to graduate
For each past experience (whether it be work, research or a project): use point-form to detail what you did. It is important to highlight:
What did you make
How did you make it (what tools; which parts of the tech stack)
Why is this impressive (did you earn any prize or other form of recognition from this experience? what was its effect on real people? did it make/save money? why was it challenging?) If possible, quantify why this is impressive (e.g. made a process 50% faster, or acquired 500 users).
Keep the points concise. Set a one or two line limit for them.
The best way to improve your resume (besides gaining more experience) is to look up the resumes of Waterloo students with good careers (they’ll usually link to it on their personal websites). Analyze the format they use, how they word their bullet points, and so on. Keep an eye out for on-campus resume critiques run by more experienced students. They are usually shared on Facebook, or on posters around campus.
Applying for Jobs
Waterloo uses a tool called WaterlooWorks for you to manage your job applications. You have a limit of 50 applications in the first round. 50 is a lot. The less experience you have, the less selective you should be, so in first-year, use all 50. There are multiple rounds of job postings: first round (the most important round when all the best companies hire), second round, and continuous round (when you basically have unlimited applications). Note that any rejections you get from your first round of applications actually replenishes your number of applications, as long as the second round hasn’t ended. Apply to some jobs that you don’t have the requirements for. You should still have plenty of applications after this to apply to jobs with requirements that sound like they fit your experience. Your experience does not need to perfectly match the job posting’s requirements; be ambitious. Often, I’ve heard students scared of applying to jobs they aren’t sure they’re qualified for because they’re afraid of failing the interview. But getting hard interviews is exactly what will help you get better at interviews in the future. Don’t be afraid to fail interviews.
Unless you have other very positive signals, avoid applying to places that no friend or friend of friend has ever worked at: The best way to know if a company is good is through testimonials from people you trust. This is why it’s important to make good friends - chances are a friend of a friend has worked at any given company. You could even try asking the company to connect you with a past/current intern.
When are other positive signals for a company? To answer this, you need to research the company much like how a venture capitalist would before investing. Unlike a venture capitalist, you have much less resources at your disposal. See who the company’s investors are (do these investors have a good track record?), the resumes of employees at the company, and how well they pay.
Postings with few applications should be avoided: You can see how many other students have applied to a posting. It can be tempting to use that number to apply to jobs with less competition, but really this is just a sign that you should likely avoid the company.
All else equal, prefer companies that will have multiple interns: It’s a great way to make friends.
Go to info sessions: Learn more about what a company is like, get free food and swag. Bring a physical resume to give to the speakers. Look at the info session calendar and add all the interesting ones to your calendar app. Click here to see UWaterloo’s info session calendar.
Jobs in the US are generally more desirable: The tech industry is simply more competitive in the US. Even if you prefer staying in Canada, a job in the US will make getting future jobs easier.
Avoid returning to the same company: Co-op is an amazing opportunity for you to try out different companies. Each new experience gives you a better resume to get an even better experience next co-op.
Other networking and recruiting events: Besides info sessions, companies tend to throw events such as:
Women in Tech socials
Office tours
Tech talks
The Google Tech Challenge! This is an incredibly fun event held every year at Google’s Waterloo office. https://buildyourfuture.withgoogle.com/events/tech-challenge/
Interviewing
Read Cracking the Coding Interview: You really do need to know everything in there. It’s always best to cross-reference when you study, so read other sources that cover the same topics as well. I also recommend the CS Handbook: https://www.thecshandbook.com/
Practice on HackerRank and LeetCode: Start off with the easiest questions and proceed to harder questions at whatever pace is comfortable.
There are two skills needed for coding challenges:
Implementation: Proficiency with the coding language
Algorithms: Knowing what algorithms and data structures you need to solve the underlying problem efficiently
Try to do the coding problem on your own at first. If you get stuck on implementation, just Google it. If you get stuck on the algorithms, look up the answer (usually there is a discussion section where people share answers). Do you understand the answer? If not, go back to reviewing Cracking the Coding Interview. If you do understand it, close the answer and try to implement it without looking back at it. Look at multiple answers to see if any of them are easier to understand.
Do you understand run-time? You will almost always be asked about the run-time of an algorithm you code in an interview. Make sure you practice identifying run-time while using HackerRank and LeetCode.
Once you’ve practiced on HackerRank and LeetCode enough, try practicing on paper. Make sure you ask yourself the time complexity of your solution. It’s also good practice to come up with your own test cases, even before you start coding. Try talking through your thought processes out loud.
Practice with friends. Some clubs like UW Blueprint or engineering societies hold mock interviews. They will likely be advertised on posters or on Facebook.
Prepare for non-coding questions: You should be comfortable answering questions about:
Your past experiences (technologies used, implementation details and decisions)
Your courses (coding-related courses especially - you may need to explain course concepts)
Your program (you have to sell to the interviewer why your program is good and why you’re passionate about it)
Definitions (of things like data structures, object oriented programming concepts, recursion, types of tree and graph traversals, etc)
Role-specific concepts (Android, iOS, web, databases, etc.)
Some companies may also test you on things like:
Writing test cases
Systems design
Logic puzzles
Behavioural questions (what would you do in this situation?)
For non-coding questions, the breadth of topics is very large, so spread out your time evenly when working on them.
Choosing an interview slot: These are micro-optimizations.
Check WaterlooWorks and your email regularly to see if you have new interviews. You want to get first choice on interview slots, so be ready at all times. Keep your email notifications on.
Go at a time when both you and the interviewer are going to perform your best. Not too early in the morning, when neither of you are fully ready. Not too late, when the interviewer just wants to go home. Not right before lunch, when the interviewer is hungry
During the interview:
Remember you are also evaluating the company. How much do you actually know about the company? Do you think you would like working for them?
If they ask you why you’re interested in working at the company, the easiest generic answers are to state the obvious benefits of working at such a small/big company. You should also talk about why you are passionate about the field of work that the company does.
Try to keep confident. Remember, you either pass the interview or you get good practice for your future interviews. Both are greatly beneficial to you, so be happy with either result. (There is a third possibility: the interview is a waste of time because the interviewer is bad at their job or the company misrepresented the role. Hopefully you still learn what kinds of companies to apply for in the future.)
During the coding question:
Start by making sure you understand the question. Ask for clarification if needed. Before you code, write out interesting test cases. The interviewer will confirm if the test cases are correct. Even if you think you understand the problem perfectly, make sure.
Think over what algorithms and data structures to use. If you have to, brute force this by going over every data structure you know and think about if it makes sense to use.
Start by coding the easiest thing to implement that comes to mind. Do not worry about the efficiency. Worry instead about how complicated your solution is. Every interview question has a short, easy to understand solution, so if yours is convoluted, try to restart and think of alternate approaches. Otherwise, you likely won’t finish coding, and you likely have many bugs.
Before the interviewer prompts you, you should immediately go back to your test cases you have already come up with, and run through your code with one of them. Communicate every step to the interviewer. You will likely catch bugs in your code at this point. Catching bugs without any help from the interviewer is great.
Now look over your solution and judge its efficiency. Write a more efficient solution if you can.
Try to communicate your thought processes as much as possible at every step.
At the end, ask the interviewer questions: This is not a test. This is your opportunity to evaluate the company. Ask questions like:
What sets the company apart from others? Why did you choose this company?
What is an example of a challenging problem you work on?
What do you like least about working at the company?
If you could change one thing about your company or team, what would it be?
(more question examples in Evy’s internship guide!)
Some companies will contact you about interviews and offers outside of WaterlooWorks and some don’t. If they do, you’ll likely have the chance to ask about pay later. If they don’t, ask about pay during the interview.
Choosing Offers
Even if you only have one offer, you need to do some soul-searching: Is taking this offer valuable for your career? Most of this evaluation process is covered by the same tips for applying to companies.
When is a job offer negotiable? Companies with lots of interns might be difficult to negotiate with because they don’t want to pay one intern more than others. However, there is no downside to negotiating. The company has already invested a lot to acquiring you, so you can leverage your position to increase your pay, or changing your start and end dates. Ask friends for help with negotiating. I like this resource for learning how to negotiate: https://haseebq.com/my-ten-rules-for-negotiating-a-job-offer/
Good Habits
Seek help proactively: Getting stuck and not seeking help is a total waste of time. Go to office hours, ask friends, and check Piazza (a website Waterloo profs use for Q&As from students).
Use your calendar to budget your time: Anticipate the busiest parts of your term by looking at all the midterms and assignments in your calendar. You don’t normally need to start assignments or studying super early (it’s a lot easier when others have already clarified every detail on Piazza for you to leisurely read), but you will need to start early if your upcoming weeks are incredibly busy. Block out time for working on assignments and studying.
Take care of your body: Sleep well, eat well, and take your physical and mental health seriously.
Don’t stop meeting new people: The people are the most important thing you get out of university.
Practice learning independently: Don’t let a bad prof lead to bad grades - you can stay in control by learning from just the lecture slides and reading materials.
Learn how to prioritize: Getting that last one mark you’re missing in an assignment isn’t worth hours of your time. An interview from a good company is more important than doing well on a midterm (but not more important than at least passing the midterm, obviously). Do not neglect your physical and mental health.
Considerations for First Years
Interviewers may not even give you coding questions: They assume you lack experience and will try to differentiate candidates based on non-coding questions.
Marks matter more in first year: Companies can only differentiate first years by marks, since almost everyone has little-to-no experience.