💻 The Unofficial UofT CS Min-Max Intern Guide (and other general advice) 💪

Or: How I stopped regretting rejecting Waterloo CS

April 15, 2024, Last Modified: April 29, 2024

Table of Contents

1. Disclaimer

2. Introduction

3. Contributing

4. Things to Know

5. Internship and Course Scheduling

6. Applying for Internships

7. Random Asides

8. Useful Resources

9. Closing Thoughts

Discussion

Disclaimer

This document is unofficial and not endorsed by my school or employers

If you are going to follow any advice on here, please read the page in its entirety to ensure that you aren't missing any information that is mentioned in a different section.

All advice is based on personal experience and should not be taken as fact. Information may be outdated or incorrect, please verify yourself before making any decisions. I am not responsible if you blindly follow this guide and something bad happens.

Also do note that even if all the information in here is correct, this is a guide listing the potential optimizations for internships. Purely trying to maximize the number of internships you do and cramming courses wherever they fit with no respect to their difficulty might make life extremely difficult. The purpose of this guide is to show you the potential options you have; you should evaluate whether the choices make sense to you given your goals, skills, ability, interest, and what internships you end up getting, and when you get them.

Do NOT blindly follow this guide as this isn't some magic recipe for success. This is intended as a reference for students who want to maximize their internship opportunity, but do not know all the nuances of UofT.

I'm not telling you to do anything; I'm not telling you to take 2.5 credits in the summer of your first year, I'm saying that if you want to do a winter internship in second year without pushing everything back, you should look into taking these courses ahead of time because there may be complications that you weren't aware of.

Do note that some of the advice on here is atypical and may make your schedule deviate significantly from the norm. It might be difficult to find certain advice because you're doing something that most people aren't doing.

Remember to enjoy life as well. Working hard is good but don't spend all your time grinding.

Much of this advice is specific to the St. George campus, but some may apply to other campuses as well.

This is mainly geared towards students in the Computer Science specialist program looking for Software Development / Engineering internships, but some of this may be relevant to Computer Science majors, students in other fields, and people looking to do research. Depending on your circumstances, much of the advice here may be irrelevant, or even negatively affect you. Do your own research!

Introduction

This guide is meant for helping you maximize internship scheduling based on your situation. UofT does a few things differently from other schools which makes it extremely difficult to fit in a lot of internships, especially if you plan to do internships in the United States. If you want to minmax your internship journey but don't want to be taking a sixth or seventh year, you must start planning in first year.

I wrote this guide because I was in your shoes a few years ago. I was jealous of my friends at Waterloo who already had completed multiple internships by the time I was applying for my first one. Oh, you're not jealous of them? um, well, you should be! or something. How dare you have your own opinion 😠

Our job board is not as good as Waterloo's, we don't start our first official internship until after our second year, and we only get to do two (technically three, which I get into later). Meanwhile, Waterloo students do their first internship in first year, and do five to six internships!

Another reason I wrote this was because there is a severe lack of UofT-centric advice for internships compared to Waterloo. I had to figure things out by emailing, asking older students, reading university webpages and documents, and browsing the Waterloo subreddit and blogs from Waterloo students and seeing what's relevant to me. I don't expect most people to have heard about much of this, and I expect first and second years to have heard about this even less so. So regardless of where you're at, I hope that you'll learn a thing or two from this guide.

It's hard to beat a school whose programs are literally built around doing internships, but that doesn't mean it's over! With some effort, luck, and prior knowledge, I'm sure you'll be able to get an internship that you're happy with.

Contributing

If you want to contribute, leave a comment below in Discussion, open a pull request on the GitHub repository, or email me through the contact on the bottom right of the page. Feel free to ask questions as well if you think something was unclear, or didn't cover it; I'm sure many others might be wondering the same thing you are.

If you want credit, please indicate so and give me a name (real or alias) that I can reference here, alongside with an optional link.

Things to Know

Some prerequisite information that you should be familiar with before discussing strategies.

Course Load

Typically, most people take a full courseload (5.0 credits in fall/winter). A one-semester long course is usually worth 0.5 credits, so you would be taking 5 courses in a semester.

However, some students opt to take less courses in upper years to account for the increased difficulty. However, do note that if you don't have transfer credits / didn't take courses in the summer, this will delay your graduation. Double check with your registrar if you're not sure!

Tuition

Tuition is an important consideration when choosing your sequence. Here's how tuition works:

If you're a domestic student, your base cost is $610 per half-credit. If you're international, it's probably around $6100.

The cost is $610 per 0.5 credits. Then, add around $700 if you're taking 0.0-2.5 credits throughout the year and $1900 if you're taking 3.0 or more credits for random part-time / full-time student fees. Additionally, you must have requested course fees by the last day to enroll in fall courses. If not, you might get charged extra.

If you're taking 4.0 credits or more, you'll always pay for the price of 5.0. Important You will always initially be charged the program fee. You can request to change to course fees at any time, or the change will be automatic if your "locked in" course load is 3.5 or less after the winter enrollment deadline.

After First year (end of april), when you get admitted to the CS program the base cost per half credit will rise to $1142 if you're domestic and Ontario (slightly more if you are domestic, out of province), because CS is a deregulated program, and you pay deregulated fees. There is no running from deregulated fees; if you're taking summer courses, the moment you're enrolled in the CS program you'll have to pay the extra difference in cost, and if you join the CS program in third year or something they'll pretend you were in CS the entire time and you'll have to pay the difference. The rise is not significant for international students.

Unless you're paying course fees (3.5 or less credits in a year) you are not getting refunded when you drop a course after the enrollment deadline. Choose wisely, especially if you are an international student!

Note that if you're taking less than 3.0 credits in a semester, and doing an ASIP work term (more info below) in the other semester during the fall/winter session, despite being a full-time student throughout the entire session, you'll pay course fees instead of program fees. Just because you're a full time student for the whole session doesn't mean you're going to be paying 13k! (thank god)

I heard that even though you're technically a full time student there are some random asterisks (e.g. you get the part-time student union health plan, instead of the full-time student union health plan). Do your research; your college registrar should be able to help you.

Useful resource for looking up tuition fees: link

What is a full time student?

UofT defines a full-time student as a student enrolled in 3.0 credits or more in the Fall/Winter session, or 1.5 credits or more in the Summer session. Source

Seems reasonable for most cases, but this can be problematic. If you decide to not take courses during either the fall or the winter semester, this means that unless you take 3.0 credits in the semester you are in school, you are not considered a full time student.

This means that if you decide to take five 0.5 credit courses in the fall, and not take any courses in the winter to do an internship, you will not be a full time student during fall nor winter!

However, the exception is if you are an ASIP student! More details in the next section.

ASIP - Arts and Sciences Internship Program

ASIP, or the Arts and Sciences Internship Program, is our co-op program. We don't call it co-op, but that's what it is. It's relatively new (I don't think anyone has graduated with ASIP during time of writing), and a lot has changed as it settled into its place. Double-check anything people have said! ASIP has gotten much more flexible over the years, so don't be afraid to talk to them about something you've heard someone get denied for.

Note that this is entirely optional and many students don't apply for it. However, I personally think you should because it's better than nothing. Choose based on your circumstances!

If you don't do ASIP, you'll have to choose one of the integrative, inquiry-based activity courses (essentially project course, CSC207 doesn't count). See what counts in the CS degree page here. Note: A lot of the courses on here aren't offered consistently, and a few you have to apply for.

Application

Applications usually open during winter semester, and if you’re considering it, it’s best to apply during your first year, as it’s rare they accept 2nd year applicants.

The application requires a resume and some essays, this might change every year so do your research!

Cost

ASIP unfortunately is not free. Look up the costs on their website. Note that there are additional fees that you pay during internships as well.

Workload

ASIP does require you to take a couple non-credit courses, but they're very light. I guarantee you it will not get in the way of school.

Job Board

I personally did not find the ASIP job board helpful, but many of my peers have found jobs through it. A few people have told me that their callback rates for jobs on the job board have been much higher than for jobs they applied externally. YMMV.

The jobs on there aren't great with a few exceptions, but it's definitely better than nothing especially for your first job. Don't expect too much, but it's definitely not useless!

ASIP actually has two job boards, CSM and ECC. ECC generally has better jobs, but they have few listings. CSM has a lot of listings, but you'll quickly find that half the jobs aren't even CS related and another half of the CS jobs aren't great...

Remember that ASIP does not guarantee you an internship. You need to put in effort or else you'll get nothing.

IMPORTANT: With ASIP, there are a few restrictions that could be annoying (Note that these restrictions are pretty much universal to university co-op boards in general, so don't blame ASIP). You can only reject 1 offer from CSM/ECC ever. If you try and reject a second, you'll be kicked from the job board.

Note that rejecting a company because you accepted another does not count.

Vaguely implying you accepted counts as accepting, and once you've accepted you CANNOT UNDO THIS or you risk being kicked out of ASIP.

Try and only apply for companies that you would take if you got offered. If you're a second year, I'd still just apply for everything because you really should just take anything (unless the job is really irrelevant or is long (see my rant on longer internships below. I don't like longer internships, and I think longer internships as your first internship is even worse.))

Note that any jobs you find outside of the ASIP job board is free game; you can reject them all you want, just don't reject them after you tell ASIP about it.

Warning: For some reason, CSM doesn't give you any sort of notification or indicator that you received an interview. You don't get an email, you don't even get an icon on the tab that indicates something has changed, you have to actually go into the interview page to check. I know a few people who missed some interviews because of this.

Scheduling

Typically, ASIP students do one shorter internship in the summer after second or third year (4 months), then a longer internship (8, 12, 16 months). However, if you have a job offer that doesn't fit in with the standard schedule, you can request alternate sequencing. It'll probably get approved, provided that it meets the ASIP guidelines (basically if you're getting paid, the job is relevant to your degree, and it meets the minimum hours). Some people have done their longer internship first, and some people have done multiple four-month internships.

Do note that they'll only let you do three 4-month internships. Essentially, once you meet the requirements for graduation with ASIP, you're forced to finish. Looking at the fact that ASIP has a 20 month (4 + 16) experience option, I asked if they'll ever let someone do five 4-month internships, and I was told that they'll probably never do that.

Full-Time Student Status

Even if you aren't going to use the job board at all (I didn't even get to in third year because I got my internships quickly), ASIP can still come in useful, because it allows you to be a full-time student when you wouldn't otherwise.

During an ASIP work term, you will be considered a full-time student.

If in the Fall/Winter session you do one semester of school of 1.5 credits or greater, and a work term with ASIP (in either order), you will be considered a full time student for the entire session. If you weren't doing ASIP, you would have to take 3.0 credits throughout the session, meaning that if you don't want to take courses during your internship, you would have to take six courses in the semester you are at school.

Do note that getting an enrolment letter from ACORN might say you're a part-time student even though you're a full-time student due to ASIP. I'm assuming this is because the ACORN system is ancient and doesn't have support for ASIP. You can ask your college registar for an enrolment letter, and they'll be more than happy to give you an enrolment letter confirming that you are a full-time student. (Their enrolment letter also states your degree, which neither the ACORN enrolment letter and official transcript does, so if you're looking for a way to prove that you are doing a CS spec, this is it! You might have to ask them specifically to put that on there though, give them a call or email).

Why should I care?

For international students, I believe being in an accredited university co-op program and having a full-time student status for 2/3rds of the year can be important, but I'm not too sure as I'm a Canadian citizen. If you have any information, please add it!

Even if you are a Canadian Citizen or a Permanent Residents, this can still be important! Since you are a student at UofT (even for international students I believe), you can be eligible for the J-1 visa, which you will need if you want to intern in the United States! Read more in J-1 Visa Considerations.

Additionally, I'm not sure but this may impact your student loans since it asks whether you're a full time student or not. If anyone knows, please submit an issue or a pull request!

TLI - Technology Leadership Initiative

Disclaimer: TLI is constantly changing, and the information below may no longer be accurate. See the TLI webpage for the most up-to-date information

TLI is another program that’s useful when it comes to building the foundations of your career in CS. It consists of a modified version of CSC207 and regular workshops to strengthen your business and technical acumen. Note that throughout this guide, I refer to the non-TLI version of CSC207 when I discuss the course.

Note that TLI and ASIP are not mutually exclusive, you can take both at the same time!

Modified CSC207

Usually, CSC207 consists of creating a team project built in Java with the Spring framework. The focus on this course is building good code, and you do this by applying specific software design patterns and the SOLID principles of software design. This alone makes CSC207 a useful course in the context of interviews and whatnot. However, the course projects for the TLI version of CSC207 generally consists of creating a website built on the MERN stack (MongoDB, Express.js, React.js, and Node.js), and involves slightly smaller teams than the standard CSC207 (i.e. 3-5 people per team instead of 6-8). Each year, TLI partners with a different company to create industry-relevant tools. The tutorials are also completely different; instead of learning about GitHub and having TA meetings, these tutorials involve weekly stand-ups (i.e. you’ll be presenting your progress on your project over the past week to the class, as well as your plan for the next week) and you’ll be learning about a number of different topics related to business (anything from EBITDA and its applications to case studies on decisions company leadership should take). On occasion, resume roasts and LinkedIn roasts have also happened during tutorials. Finally, the final project presentation is done in front of a panel of industry professionals, whereas for the standard CSC207 the audience is just your TA.

Workshops

There are monthly workshops in 2nd year (and additional workshops at a lower frequency in upper years) as well. There have been mock behavioral interviews with industry professionals, general technical interview prep, and more. There have also been guest speakers who have expanded on their industry experience and discuss their journey over the course of panel interviews. There’s a lot of variety with these, but in general you keep seeing the same subset of students, and this allows you to build a network with upper-year CS students that you probably wouldn’t meet otherwise.

Application Process

You would generally apply for TLI in early winter semester of first year (there are two rounds of applications, but it’s usually more difficult to be accepted in the second round). The application process is... unique, especially the interview. But first, you need to submit a written application. The exact prompts and questions vary each year, but generally assess three main qualities; curiosity, grit, and intellectual agility. If you get past this stage, you’ll be invited to an in-person interview. The content of this multi-stage interview varies each year as well, but it’s a very unique interview in the sense that your creativity and problem-solving abilities are the main topics being assessed. Other components of the interview assess your integrity, and some parts are just like standard behavioral interview questions. You can’t really prepare for it, but you should definitely be familiar with your responses to the initial written application.

J-1 Visa Considerations

Note: I am not an immigration lawyer nor am I claiming to have any real knowledge. Please verify all facts yourself.

Unless you are a US citizen or permanent resident, you cannot legally do an internship in the United States without an appropriate visa. If you receive an offer for a US internship, your company will likely sponsor you for a J-1 visa.

Some companies, like Tesla will opt for a TN, which is a totally different conversation which I have very little understanding of. While the TN is supposed to be for students who have graduated, apparently there are exceptions which allow it to be used for internships. Do your own research as I don't know much about it, so will not be going over that here.

Once you have your offer, sometime between then and your start date, your company will begin the visa application. You will be given guidance throughout the process, and there are many other resources for what to expect, so I won't be going over them here.

One very important thing that you need to know is you can only apply for the J-1 visa if you are a FULL TIME STUDENT at the time of visa application. If you are not, you will be unable to apply for the visa, and you may be unable to do the internship. If you're lucky, your company may have a Canadian office, and they might send you there.

Note that due to how ASIP works (from the previous section), you can make yourself a full-time student in cases when you normally wouldn't be. Use this to your advantage to ensure that you are a full time student in the semester before you do a US internship.

In theory, because you only have to be a full time student when you apply for the J-1 visa, so if you get your offer early and the company acts quick, you could avoid having to be a full time student in the semester or even two before. However, this feels risky imo.

Consecutive US internships is possible, but you won't get the second visa until you finish your previous internship and return back to Canada. If two companies use the same visa company and are willing to collaborate, I've heard you can transfer the visa as well. See the Unofficial Waterloo USA Intern Guide for additional information.

Some examples to better illustrate the situation:

Example 1: You are doing a summer internship, and received an internship offer in the United States for the fall. You are taking less than 1.5 credits worth of courses because the internship takes up a ton of time, and you didn't think to register your internship through ASIP. Your fall internship company's visa sponsor asks you to provide proof that you are currently a full-time student so they can start the visa process. However, you aren't, so you can't do an internship in the fall.

What should you have done?: You should have either taken 1.5 credits during the summer, or registered your internship through ASIP in order to maintain full-time student status throughout the summer. If either of these options were not available to you (e.g. taking three courses while doing an internship would have been impossible, or you aren't in ASIP), what you could have done is apply for the J-1 visa when you were a full time student. However, this is contingent on you getting the fall offer before the summer, and your internship company agreeing to start the J-1 visa process that early. I am unsure on this one, but I believe if your summer internship was in the United States with a J-1, starting the process earlier wouldn't have been possible since you can't do the fall one before the summer one. I can't seem to find official documentation prohibiting this (not being allowed to hold two J-1s concurrently isn't the same thing!), but I wouldn't be surprised if you aren't allowed to do this. If someone decides to take the (imo extremely high) risk and try this out, please let me know!

What can you do at this point?: There might be a way to salvage this situation. Apparently it is possible to enrol in courses during the second sub session for the summer even after the summer registration deadline, so if you get permission to do that, enrol in 1.5 credits in order to get the full-time student status. Source: reddit. This could work if you are in this situation already, but I wouldn't plan your schedule with using this in mind. Otherwise, unless you can somehow find some visa that will let you do the internship (which honestly is very unlikely), you will not be able to do the fall internship in the United States. However, if your company allows you to, you may be able to either do the internship in their Canadian office (assuming they even have one), or ask to push the internship to another time, like winter. This can be quite risky depending on the company, so it's best to not let it get to this point.

Example 2: You took 2.5 credits in the fall like most students, and are currently doing a winter internship. During the internship, you are not taking any courses, and you didn't register the internship through ASIP. You have a summer internship in the United States, and the company's visa sponsor asked for proof of full-time student status. However, you aren't so you can't do an internship in the summer.

What should you have done?: You should have done something to make sure you are taking 3.0 or more credits in the fall and winter session. This could include taking 3.0 credits in the fall, or spreading them out (2.5 credits in the fall, 0.5 credits in the winter, etc.). If the course load is too much, you could have found a very easy course to CR/NCR. Alternatively, you could have registered your winter internship through ASIP to maintain full time student status throughout the fall and winter.

What can you do at this point?: If winter course enrolment hasn't yet closed (which it does quite early), enrol in enough courses that your fall + winter course load is 3.0 or greater. However, if the deadline has passed (which it probably has), you're out of luck like in Example 1. You can hope that your company lets you do the internship at a Canadian office or push your internship.

Internship and Course Scheduling

Now that you have all the relevant information you need, you should start planning when you'll do your internships, and balancing it with your courses.

How many Internships should I do?

The answer is as many as you need to be happy with your current company, maybe plus one or two if you want to beef up your resume before graduation. Whether that means one or six internships is going to depend on your goals, and what internships you get.

Recall that the most internships you can do with ASIP is three, if you choose to do three 4-month internships. However, you can still do more by doing it not through ASIP, and just taking a four-month break from school to do an internship.

It's difficult to give a schedule that'll work for everyone because there are so many variables involved. Will you be successful in getting an internship in first year? Will you choose to take courses over the summer? Do you think you have a shot at getting an internship at an American company? How many years are you willing to stay here? Are you in ASIP? Are the courses you want even offered in that semester? - just a few of numerous variables.

So, I've decided to give you a list of choices divided by year, so you can choose what's best for you given your scenario.

The following sections are divided up into school years, which start in the fall, and end in the summer (not really convention but I think it's easiest to follow for this).

Delaying Graduation

In a typical ASIP schedule, you'll do a five-year degree. This is very common for students doing internships during their degree; most students I know at UofT, UBC, and Waterloo are doing a five-year degree as well.

If you take courses in the summer, schedule your internships well, and / or came to university with transfer credits from IB / AP, you could graduate earlier. For example, I'm planning on doing a four-year degree despite doing internships, mainly thanks to taking summer courses, having 2.5 transfer credits from IB, and getting lucky with my internships.

Delaying your graduation so you do say, a six year degree isn't that big of a deal as it sounds. A lot of people on their resume only put their graduation year so the companies won't even know that you're doing a longer degree, and as long as you haven't been slacking off and you have a valid reason for extending your graduation (e.g. doing additional internships), I don't think any reasonable company is going to look twice.

Delaying your graduation to squeeze in more internships can be a pretty effective way of getting a good new grad job. Many people I know have plans to just keep doing internships until they get a company they're happy with, whether that takes four or seven years. However, note that this could be extremely expensive, especially if you're an international student!

Longer Internships

8, 12, or even 16-month internships are quite common in Canada, and under the normal ASIP schedule, you would be doing this for your second work term.

However, I am personally very against them and would recommend that you do three 4-month internships instead (or more). I wish ASIP wasn't built in a way where long internships are the norm, but thankfully doing multiple 4-month internships is as easy as sending an email and signing some forms.

Note that I'm going to be using the concepts of doing a longer internship and doing fewer internships somewhat interchangeably because well, in the time you did a longer internship you could have done two or more.

Here are some pros and cons of doing longer internships. Note that I am quite biased against long internships so there are way more cons listed. Do your own research and consult with other people! If there are pros (or cons) for longer internships that I missed, leave them in the comments below!

Pros of longer internships:

1. Ability to work on more meaningful projects: Realistically, 4 months (or 12 weeks in many places) is not a lot of time to do much. You'll be getting used to the company for a few weeks, learning for another few, maybe even take a week doing fun company activities, and realistically only have a few weeks to actually work on your intern project or contribute to the company. Several people have told me that around the 4-month mark is right about when they get familiar with everything, but they have to leave. Also because of this, your intern project, if you have one, is probably going to be scoped appropriately and is going to be smaller.

2. Ability to learn more about the company: If you landed a role at a company you like, a longer internship is a great way to get an in-depth look at what they do.

This definitely isn't everything, I just can't think of any at the moment. Comment below!

Cons of longer internships:

1. Risk of being stuck with a bad company: There are a million reasons why you might want to stop your internship early. Maybe your day-to-day tasks are irrelevant to what you want to do. Maybe your company is making you use some weird, proprietary, esoteric toolset leaving you with no transferable skills. Maybe your company hired you to exploit cheap labour subsidized by your co-op status. Maybe your company pays $20/hr, and you literally lose money doing the internship because of rent.

Regardless of the reason, the good thing about 4-month internships is that if things go bad, you'll have an exit plan. At worst, you'll only waste a semester, and you'll still have something to write on your resume. In contrast, if you were doing a longer 8, 12, or 16-month internship, you'd be stuck there for much longer, wasting semesters where you could have been doing an internship elsewhere.

Of course, you can choose to break contract and leave early, but there may be potential problems, such as you getting kicked out of ASIP and maybe getting an NCR on your work term?. If you want to do a longer internship, it'd be much better to do a 4-month one, then ask for an extension if you enjoy the company.

2. Putting your eggs in one basket: If you're doing a lot of shorter internships, you'll have a lot of chances. Terrible job market? Bombed your interviews? Just got plain unlucky? Well, you'll have more chances in the future. Even if you've planned your schedule around doing three 4-month internships, you can still afford to "fail" once. If you're planning to do something like five, even better.

However, with longer internships you have less chances. Got a long internship that you don't really like? Well you can try again in the future but not really without delaying your graduating even further.

3. Less to fall back to: One of my biggest jealousies of my friends at Waterloo is the fact that because they've done so many internships, they've built quite the network with people at different companies. Naturally, having done multiple internships, they'll meet more people, and get a lot of proper networking done (not just adding random people on LinkedIn or talking to someone once).

One of my friends talked about how at the end of his internship, his manager told him to shoot him an email if he ever wants to come back after graduating. By doing more internships, you'll get more of these opportunities in case you can't find anything as a new grad (I've heard finding jobs as a new grad is a whole other level).

So if you've done five 4-month internships, you might have a couple companies that you actually liked working at and would like to go back. Even if your first job sucked, your last job didn't give you a return offer, and you didn't like the work you did at one, you'll at least have two candidates.

If you've done one 4-month internship and one 16-month internship, good luck if you didn't like your first job and the second one didn't give you a return offer 💀.

4. Less chances to climb: One of the biggest advantages to the Waterloo system is that you can climb your way up on every internship. With more and more experience under your belt, every time you apply, you'll have a greater chance of receiving an offer at a better company. Your second internship will probably be better than your first, and your third internship will probably be better than your second. But if you only do two because one of them is longer, in the same time as someone else who's jumped up twice, or even more if you're doing a longer internship, you'll only be able to jump up once.

Why is climbing up so important? Aside from the obvious fact that bigger companies pay more (which imo you shouldn't focus on too much), they have much more resources to help you learn.

Small companies hire interns with the intention of having you do stuff, big companies bring on interns as an investment and don't care about losing money over giving you resources like good mentorship and paying you to work on a project that might be thrown in the trash after 12 weeks.

I'm sure you'd be able to learn far more at a top company in 4 months than at a smaller company in 8, 12, or even 16 months, depending on how good / bad each company is.

Also, as much as it sucks, clout really is huge when it comes to hiring. You'll probably have more success with finding jobs having worked at a bigger company than a smaller one, even if you did nothing at the big company vs built the entire backend at the smaller one.

5. Most big companies don't even do more than 4 months: Most big tech companies don't even do long internships. Some companies will let you extend a 4-month internship, but regardless you'll still have to apply for a 4-month position. This is especially troubling given the fact that a lot of these companies won't even read your resume if you don't have a previous internship. So if you want to do a 4-month internship, then a longer one, you kind of can't work at a big company with a few exceptions.

6. More Breadth: I believe that as a student, you should be looking for breadth, rather than depth. You should look around and explore as much as possible to see what you like, what you don't like, what you're good at, etc. Being a student presents a unique opportunity where you can hop internships every 4 months several times and no one will bat an eye - try doing that after you graduate, see what recruiters think.

Once you graduate, even if you job hop, you'll probably have to stay at one company for longer before doing so, and I would assume that it is more difficult to transition to a widely different section of the industry as well (note: this is purely speculation, but I think it does make sense). Meanwhile, many internship opportunities don't look too closely at your specific skills, but rather evaluate your potential to learn, meaning that as long as you can show that you're capable of learning, it should be easy to switch.

There are so many things you can do with a Computer Science degree. Even something more specific like "backend development" has so many subfields. If you're going to focus on a specific area, I would rather know what's out there than blindly go into something because I didn't like my first internship and what I did in my second internship was okay.

Yes both depth and breadth are important, but you'll eventually gain depth anyways if you're going to work in this industry until you retire.

7. Not much resume benefit: You're only going to write a couple of points for each experience anyway, it's not like you're going to write 4x the points because you worked 4x longer. While the points may be better, the company name and role is doing 99% of the heavy lifting anyway, so does it really matter?

8. Might as well just graduate: Even if you're planning to take the same number of internships regardless of their duration, I'd still do shorter internships. The sad thing is that much of your internship experience isn't seen as "real work experience". So why not just graduate then get some real work experience in the same time it would have taken to complete a longer internship?


There definitely are advantages to longer term work terms. To name some, you'll learn more things in depth, your intern project will be more advanced, and you might have a better shot at a return offer. However, I think the disadvantages greatly outweigh the advantages. Of course, you should make the decision yourself; if it makes sense to do a longer internship for your situation, by all means do it. I'm just saying that in my opinion, in most cases it does not make sense to do a longer internship in favor of a shorter one.

Fall, Winter, Summer

Most people refer to internships in the fall and/or winter as "off season", with the main season for internships being the summer. There are, quite literally, hundreds of times more internship listings in the summer than the fall and winter combined. Many companies exclusively have summer internships, and many companies which have off-season internships will take way fewer students than in the summer. I have also heard that some companies' off-season internships aren't as good as the summer internships as well.

So I think if possible, you should aim to do an internship over each summer. It's not like there are many alternatives anyway; if you want to take courses, good luck because the number of computer science (or well, any) courses offered during the summer is pitiful. There are a few 200-level CSC courses offered in the summer, and CSC311 and CSC384 are pretty much the only 300+ level courses offered in the summer (aside from the special ones you have to apply for).

You should still look for off-season internships as well. I heard from a friend that UBC co-op recommends their students do their first co-op in the winter, because it is much less competitive than the summer. So perhaps you could squeeze in a winter coop during second year (read more below on how to do this, you need to plan ahead if you want to do this!).

If you're lucky, it's possible that you get multiple offers for the summer, and one of the companies lets you push the internship to a different season. For example, if you got two summer internships, you could try and move one to the fall. This is highly dependent on the company; some companies don't push internships and will ask you to apply again, and some don't do off-season internships at all.

Aside: Part-Time Jobs During School

There are many types of part-time jobs, and it can be a great way to gain additional experience for your resume, especially if you are starting out and your resume is almost blank. However, it can be a double-edged sword as it'll eat into the little time you have. Attending lectures, doing assignments, studying for exams, applying for internships, and preparing for interviews is already a full-time job and a half in it of itself! Unless you've been breezing through school getting 4.0s on every course, and you're genuinely bored, you're going to sacrifice something. I'm willing to bet it's going to be either sleep, happiness, grades, or future internship opportunities.

Before choosing to do a part-time job, I think the main considerations are whether the resume value is worth it, and if the pay is worth it. You might have different priorities!

As far as resume value goes, if the job is irrelevant, not great, or a continuation of a previous full-time experience, it might not be worth it. Some companies (typically startups) might ask you to continue working for them part-time after an internship. I don't think this is super worth it because you already have the experience on your resume, and as a part-time worker, you're probably not going to do that much anyway, so your resume points aren't even going to improve that substantially. You could say you'll be learning during the part-time job, but will you really learn properly as you juggle between that and school? However, if it's a new experience that is relevant to your career, you'll be able to add a new bit to your resume and get good experience!

As far as pay goes, if you can help it I think it's best to look for a full-time internship instead. If money is what you need, getting a top internship will blow whatever part-time job you had out of the water. At top internships you'll literally make enough money to pay off your entire tuition (assuming you're domestic) in a few semesters or even less than one at top ones (although this is rare!), so unless you're working as Google CEO part-time, I think putting your efforts into studying and getting an internship is better if the main benefit of a part-time job is the pay.

If you want to make life easier while taking on a part-time job, consider taking a lighter course load or dropping down to being a part-time student. Do note that this may affect your graduation plans.

You can find any part-time jobs on clnx. I've heard that work-study jobs can be very flexible and there are many opportunities (e.g. tons of development roles with startups with the Hatchery). I'm sure there are ones you can find externally as well, although they seem to be more rare.

Aside: Courses During Internship

You can take courses during an internship, which could be useful if a certain important course is only offered in a specific semester.

If you're doing the internship through ASIP, you need to fill out a form, and with approval from ASIP and the employer, you'll be able to take one 0.5 credit course during each 4-month work period.

If you're not doing the internship through ASIP, you can take whatever courses you want, although you probably shouldn't take too many on top of a full time internship.

However, I would personally not plan my schedule in a way where I need to take courses during internships for a few reasons:

  1. Time Conflicts: If you're doing a full-time internship you're definitely going to have to skip all your lectures unless they happen to be at 7pm or something. While it is possible to skip all lectures and read the slides / watch recordings / read course notes (I don't go to lecture despite living 10 minutes from campus 💀), what are you going to do about exams?
  2. You won't know the course syllabus ahead of time: What if the course you took ends up requiring you to be in-person more than anticipated? Some courses have mandatory tutorials, and you'd be losing out on a lot of free marks. Even if you have the syllabus of past course offerings, there are no guarantees on whether it'll be the same. Different instructors may have different policies, and even the same instructor may decide to revamp the course one year or try something new.
  3. Distance: Related to the previous points, what if your internship is not in Toronto? What if your internship is in Vancouver, or California? Are you going to fly across the continent, take the exam, and fly right back? You're not him.

Of course, if there was an easy online course I might be willing to take it alongside an internship. However, I don't think there are any CS courses that fit that bill, so I think it's better to assume you're not going to take any courses during your internship.

I suppose if you got a fully remote internship you could do this, but even remote internships may require synchronous participation.

If it makes sense in your situation, by all means do it. However, at the very least I think you shouldn't plan your schedule with taking courses during internships in mind.

Considerations for Each Year

You'll need to plan your first and second year extremely well if you want to squeeze in internships without delaying your graduation significantly. This is almost like a puzzle, with the most awkward pieces being:

  1. Courses near the root of the prerequisite tree (e.g. CSC207 would be such course as CS spec needs CSC369 which needs CSC209 which needs CSC207)
  2. Courses not being offered in certain semesters
  3. Full-year courses

If you don't plan carefully, you might accidentally not take a certain course that isn't offered till next year, which is a prerequisite for several other courses, which is a prerequisite for others, and before you know it, you're taking second year courses as a fourth year, accidentally doing a seven-year degree. (can you imagine the tuition?)

First Year

Welcome to UofT CS! You're in for a ride.

First Year Courses and POSt

You likely don't want to do any internships during fall or winter because you need to take the required courses to make POSt. In UofT you aren't really in any program until after first year, and to get in a program you need to register/apply, and for some courses, meet the minimum requirements.

If you're an in-stream student (aka you got into the Computer Science admission category in high school), great! Things will be relatively easy for you. Admission is guaranteed as long as you meet some basic requirements. Read this page by UofT for more information. You must take CSC110, CSC111, and MAT137 in first year.

If you're an out-of-stream student (aka you got into something else like Mathematical Sciences or idk Life Sciences and want to do CS), while you are still able to apply for the CS program, you cannot do the Computer Science Specialist program (only CS Major or Minor, they changed this in 2022 or something. Note that because of this, some things in this guide may not apply to you as it is mainly intended for CS specs.), and there are no guarantees. Read this page by UofT for more information. Note: It says that the minimum grades 70% in the required courses. This is to be eligible to apply. To actually get in you'll need more than 90%, with the exact numbers being based on how competitive it is that year.

Regardless of whether you are in-stream or out-of-stream, while not officially required, it is crucial you take MAT223 in first year, or risk pushing everything back.

In the fall, if you are in-stream you'll take CSC110. It is a full credit course, meaning that in theory it has double the workload of a normal course. However, I've personally found it to be no different from a normal course, maybe even easier (EDIT: I have been told they added more content since I took it and made it more difficult, do your research!). Because this is a full credit course, some may suggest taking only four courses in the fall. I highly disagree and think you should take five. If it's too much for you, you can always drop one course without penalty, provided that it's before the drop deadline.

Instead of MAT137, you could take MAT157 if you're really into Math. And no, getting a 98% in your high school doesn't mean anything here, because there is so much variance in the grades. You could take MAT157 with the intention to drop down to MAT137 but beware that there may be challenges in this (e.g. different lecture times, you'd have to catch up on homework that you missed, etc). I personally think MAT157 is not going to be worth it if you're looking to go into software development.

You should almost always take MAT223 (yes it is a 200 level course, but you pretty much need to take it if you don't want to be behind). You can take it in the fall or winter, it doesn't really matter unless you want to take MAT224 in first year as well, which needs MAT223. MAT224 is not a required course, nor is it useful for CS, although some people looking do more higher level mathematics might want to take this course.

I would recommend trying to finish as much of your breadth requirements as possible in first year. You might not really have a choice, since you can't even take any CS courses in first year aside from CSC110, CSC111, and CSC240. However, it could be good to save a few breadth courses for later years, so you can have an easy course or two when you're taking challenging CS courses. As a first year student, you are able to take what are called First-Year Foundations Seminar courses which you won't be able to later on. They could be interesting, and some might fulfil breadth requirements.

You can take STA130 if you like, take it in the winter if you do. I believe this is required if you want to do the Data Science Specialist instead of the Computer Science Specialist. I have heard the DS program is just a worse CS program though, but I haven't taken it so do your research.

You could also take CSC240 if you want, but be warned that it is a very difficult course. Like with MAT157, you better be confident in your theoretical ability; around half the people in this course end up dropping it. If you're not having a good time in MAT137, you might want to reconsider. There's not much benefit to taking this course unless:

  1. You are really interested in theoretical computer science
  2. CSC236 is not offered in the summer, and you REALLY want to take CSC263/CSC265 in the fall.

I think point 1 is pretty important since the extra content you learn in CSC240 compared to CSC236 is irrelevant for software development. If you're unsure, enrol in six courses with the intention of dropping one course. I would not recommend waiting till second year to take CSC240 as it is offered only in the winter, and it will push everything back. There is some more information on what happens to your schedule if you take CSC240 in first year in the following section: 5.7.1.3.2. Taking Courses during First-Year Summer

A lot of students struggle in their transition to university because they haven't built up adequate studying habits. Once you fall behind, it can be very difficult to catch up, so make sure to put in your best effort. Also, never overestimate your skills just because you breezed through high school; the cold truth is that Canadian education kinda sucks and it's possible that you didn't really learn anything for twelve years 💀.

Free Time

You're probably going to have more free time in first year than any other year. Sorry if you thought it possibly couldn't get worse 😁.

In the little free time you do have, you should work on polishing up your resume as much as possible.

However, don't forget to enjoy life as well.

See the 6.1. Getting Ready section for more information.

Planning for the Summer

While you can just chill and take it easy, I would recommend doing something over the summer. In upper years, you're not going to have much free time so summer breaks are a very important asset.

There are three main things you can do during the summer: do an internship, take courses, or do something else like work on personal projects.

Of course, you can also do some combination of these as well depending on your situation.

Internship during First-Year Summer

I highly recommend looking for an internship in first year. As you're a first year with little to no experience, you'll be put at a huge disadvantage, but with some networking and a bit of luck, you might get something. You're way ahead of the curve if you've gotten something already. I would cold email people at smaller companies as referrals go a long way there. Read more in the 6.2. Internship Search section.

Aside from that, there are many opportunities geared towards first and second year students such as Google STEP and Microsoft Explore, but they are quite competitive. Apply early!

Taking Courses during First-Year Summer

Alternatively, you can choose to take courses. I would try and take as many second year CS courses that are available if you want to save time. If you take all the courses listed below during the summer, you'll be able to do an internship during the fall / winter without having to push courses back.

Warning: NEVER MAKE ASSUMPTIONS ON WHAT THE CS DEPT WILL OFFER IN THE SUMMER! Usually, CSC207 and CSC236 are offered, but CSC209, CSC263, and CSC258 aren't guaranteed.

In Math and CS, summer courses tend to have higher drop rates! Ensure you're not burnt out.

Do note that you need permission to take more than 2.0 credits over the summer, so plan ahead! Whether you are allowed likely depends on some combination of your college registrar, the courses you're planning to take, your current grades, etc.

Here are what you should take if you are going to take courses:

CSC207 and CSC236 (if you haven't taken CSC240) are sometimes offered over the summer, which are prerequisites for many future CS courses.

Additionally, I would suggest taking MAT235/MAT237 (continuation of MAT137) over the summer as it will let you compress a two semester course into one semester (or MAT257 if it's offered and you unironically thought MAT137 was easy. I honestly think even MAT237 is overkill, there's no point in taking that course unless you're looking to do advanced mathematics which you're probably not going to do as a software developer).

In addition, you should take one of the four stats courses required for your degree and CSC263/CSC265 over the summer. If you don't take a stats course in the summer, CSC265 will allow you to take the stats courses as a co-req meaning that you'll be able to take the two courses during the fall simultaneously. CSC263 will not let you use the stats courses as a co-req even if you ask for a waiver. If you enrol next semester, they'll kick you out. So unless you really want to take CSC265, or you are fine with taking CSC263 in the winter or later (which means you probably won't be able to do a winter internship), take the stats course with CSC236.

So this would be 2.5 credits (MAT235/MAT237 counts as 1.0), so basically a full semester worth. Sounds difficult, and I'd hate to do a whole semester with a full-course load after doing two, and I can't really tell you how bad it's going to be, because I haven't done this (I would have considered it if I knew it was an option). However, this should let you effectively move a semester of second year to first year summer, which will let you squeeze in an internship in second year during the fall/winter without delaying your plans. If this is too much, you can pick and choose which ones you want to do.

There are three "pieces" in here: CSC207, MAT235/MAT237, and (CSC236, one of the stats courses). If you're looking to remove one, but you still want that fall/winter internship, you shouldn't remove MAT235/MAT237 since that's a full year course and unless you want to take courses during your internship, it won't fit in your schedule.

Choose to do CSC207 or CSC236 + stats depending on whether you want to take those, and CSC209 or CSC263 respectively before your internship. I would say the CSC207 + CSC209 pair is vastly more important for doing the internship (very practical courses, useful for getting stuff done), but CSC236, stats (not really but required for CSC263) and CSC263 is more important for getting the internship (very theoretical courses, useful for interviews). (of course, this will depend on what the interview asks you! It'll usually be theoretical leetcode style questions but some companies might rather ask about systems fundamentals or software design principles, although less common).

If I were to pick between these two options, I'd take the CSC207 + CSC209 pair because if you really need interview practice, you can just go and do LeetCode which is probably more relevant than any of our courses (and I mean actually do it, not be like everyone else who says they will and end up not touching it).

Of course, if you're not planning on doing a fall/winter internship, or you're not worried about the potential of pushing everything back a year, you can just take any subset of these courses without too much worry.

Additionally, near the end of the winter semester ASIP applications should open up.

Alternative Options

There definitely are other things you can do if you didn't get an internship or if doing another semester of school sounds like hell, and you need a break.

I think the most important thing is going to be preparing for the next internship cycle, so plan ahead on when you're thinking of doing an internship and try and polish up your resume by then.

See the 6. Applying for Internships section for more information.

Second Year

This year, you'll have to take CSC207, CSC209, CSC236, CSC263/CSC265, CSC258, MAT235/MAT237/MAT257 (see what I said about these courses in the last section), and one of four statistics courses.

If you have already taken CSC207, you can take CSC209 in the fall! (if offered, it's always offered in the winter, and sometimes in the fall)

If you have already taken CSC236 or CSC240, and one of the stats courses, you can take CSC263/CSC265 in the fall! Note that CSC265 is apparently the hardest course ever (often argued to be one of the most difficult undergrad courses offered at UofT); even the monsters who thought CSC240 was easy, admit this course was hard. Do note that unlike CSC263, which requires you to have taken the stats course ahead of time, CSC265 lets you take the stats course concurrently. Check the section above.

Otherwise, you can take those courses in the winter semester. Note that CSC265 is only offered in the fall.

Complete all your 200-level course requirements as early as possible since they aren't persistently offered in all terms. Not doing so could hold you back as nearly all 300-level courses require CSC209 or CSC263/CSC265.

I would recommend trying to take all the important courses in the fall, and trying to get an internship for the winter semester. This unfortunately only really works if you took CSC207, CSC236 (or CSC240 in first year winter), and MAT235/MAT237 in first year summer. If you didn't and choose to do a winter internship, you'll have to take CSC209, CSC263/CSC265 and MAT235/MAT237 in third year, which is going to push things back.

You could alternatively try and get an internship in the fall semester if you've taken the relevant courses in the first year summer. However, do note that ASIP will not let you register this with them, so I would discourage this unless you don't think you're going to do a US internship in the summer, or if you're planning to take 6 courses in the winter to retain full-time student status throughout the session. However, like in the case for doing an internship in the winter semester, if you didn't take the aforementioned courses in the first year summer, you'll have to push back things to third year. This isn't the end of the world, but is definitely something to consider.

If you anticipate that you might be doing a US internship in the summer, and you are doing a winter internship, make sure to register the winter internship with ASIP for the full time student status which you'll need for the J-1 visa. As this is a non-standard work term, make sure to talk to ASIP about it, and show them that it won't interfere with your studies. Note that you'll probably have your summer internship offer pretty early on if it's based in the United States (maybe even oct / nov), so you might not have to guess. Do note that there are some US companies that have given out summer offers as late as March, so definitely take that into consideration. Do note that while they'll probably be okay with letting you do an internship in the winter if you have the offer, they discourage doing this (I asked). You'll have to take PD2 remotely during your work term however, but this is not that big of an issue.

If you did an internship in first year so you didn't take the courses in the summer, you already have one internship so it's not that big of a worry.

If you take CSC263 in the fall, you can take CSC373 in the winter.

If you take CSC209 + CSC258 in the fall, you can take CSC369 in the winter.

I don't think it's particularly beneficial to take these two courses so early, since they're lower down in the prerequisite tree. However, it may be beneficial to open up third year for more alternative scheduling if you're planning on squeezing in more internships and you weren't able to get one for second year despite taking all those courses in the summer.

Regardless of whether you took the courses above in the summer or not, there are a few 300-level courses in second year that you can take:

  • CSC300 (I heard this is super easy, also fulfils BR3 if you need it)
  • CSC311 (winter only, fall MAT237 suffices. HARD!!!! this is my only A- in my entire undergrad career; everything else has been A or A+ 💀)
  • CSC318 (Very easy course, has mild workload but this is mostly writing / conducting interviews / designing UIs)
  • CSC343 (winter only, quite useful, relevant, and not too heavy. Highly recommend)

This is not a comprehensive list, do your own research!

If you've taken the courses mentioned in the summer and everything in the fall, you should be able to take virtually any 300-level course in the winter semester.

Regardless of what you do however, you should do an internship in the summer. Summer is when most internships are available, and as a second year (maybe even with a previous internship), you'll finally be somewhat competitive in this market, although you're still a second year, so you're still their last pick.

In second year, if you were admitted to ASIP, you will have the choice to tell ASIP about your internship or not (you don't have a choice if you got the job from the ASIP job board however). If you anticipate that you might be doing a US internship in the following semesters, you may want to tell ASIP about it (see above section).

Or, you could just not tell them about it. ASIP doesn't require you to do an internship in second year, so not much changes if you pretend you didn't get a job (or if you actually didn't get a job). If you want to save one of your work terms for later, this is a good option.

Do note that ASIP doesn't have fees for a second year summer internship (INT200), although there are minor fees for being a full time student that you might have to pay (on the order of a hundred dollars).

Third Year and Above

At this point, there aren't that many things to worry about. You have to complete degree requirements (obviously) but it's not like first and second year, where picking the wrong courses might delay everything. You can choose to do an internship whenever you want, although again be mindful of the whole full time student status for J-1 thing.

Also take into note that some 300/400 level courses aren't offered every year. Some of the more niche courses are offered only every other year, and only in specific semesters, so if there's a course you're interested in, do your research and plan ahead!

If you haven't taken CSC369 and CSC373 yet, you'll have to do that eventually. I'd recommend doing these as soon as possible as they are very important courses.

I think everyone I know found CSC369 heavy; there's a lot of content, exams are hard, and the assignments take a long time.

CSC373 seems to have quite divided opinions. While there isn't that much overall content, much of the difficulty comes from the problem-solving aspect, which means if you have a good theory background and/or are good at LeetCode, you'll find this course pretty light. If you're unfamiliar with concepts such as dynamic programming, you might have a harder time and find this course more difficult due to the unfamiliar concepts and new ways you have to approach problems. Depending on where you're at, it could make sense to take CSC369 and CSC373 concurrently, or not.

The vast majority of 300-level courses (actually, all but CSC302) do not have 300-level prerequisites. Also, many 400-level courses do not have 300-level prerequistes, but decide if you're ready. So basically you can take almost any course at this point.

Random side note: If you're taking CSC367 you should take CSC369 first.

Choosing Courses

Aside from the required courses, you'll have a lot of courses to choose from to fill up your degree requirement. See the list here. Do note that for CS spec you only need like ten non-required CS courses, so you can take non-CS courses if you want. Some people choose to add a minor to their degree. Depending on the program, it might be relatively easy to add a minor to your degree due to the overlaps in required courses.

I would recommend taking a large breadth of courses to learn more about the various parts of computer science, even if you're not necessarily going to use the course content in the future. I mean, it's not like we have enough courses for you to only do ones directly applicable to software development (or any other area) anyway, so you're going to have to try out a variety of courses. I'm not particularly interested in ML, took CSC311, had a bad time, vowed to never take an ML course again, but I'm still glad I took the course. Not only did I confirm that I should never touch this ever again, but I was able to learn a variety of methods in ML which even if I'm not ever going to use them myself, I'll know what they mean, and what limitations there are to current methods (maybe that's cope but it never hurts to learn).

Of course, you should still try and take courses you think will be relevant to your career, but don't focus solely on those!

Be warned that courses can have radical changes from one offering to another. Just because a course was taught well, or it was easy in one semester, doesn't mean it's going to be the same for another!

Also, have contingencies in case you don't get the course you want. Many higher level courses, especially on the 400-level, aren't offered every year; some are offered every other year, and some are offered whenever the professor teaching the course feels like teaching. Additionally, some of the 400-level courses are balloted, meaning you have to apply to get in. There's also a good chance that you don't get a course you want because it filled up, especially if the course is popular. Use this student tool to see how fast past courses filled up to get an idea of how popular it is: UofT Timetable Tracker. Always have backup plans!

If you're on the waitlist, I've heard that a good rule of thumb is that about 10% of the people enrolled in a course will drop before the drop deadline. Of course this may depend on various factors; check the tool above to get an idea of how fast the waitlists drop for each course. After the waitlist period there is a free-for-all period where there is no waitlist, but you can still enrol in courses. If you keep refreshing you might be able to get the course you want.

Also, if you aren't really sure about if you'll like a course or not, you could enrol in extra courses with the intention of dropping a few after you figure out which ones you like. Just be mindful of the drop deadline.

Personal Course Recommendations

Here are a few personal recommendations for courses. Note that this is my own opinion, and also that courses may change over time!

CSC317 - Computer Graphics

  • Probably my favorite course so far, the assignments are interesting and very relevant to the lecture content. Despite the fact that assignments took a while, it was still overall a pretty light course.

CSC343 - Introduction to Databases

  • I didn't really like the course but learning about databases is probably going to be important regardless of what you do. It's also a relatively light course.

CSC367 - Parallel Programming

  • A must-take course for the modern age of multicore processors and distributed computing. The course is very heavy, but I think this course is essential for anyone going into software development.

CSC463 - Computational Complexity and Computability

  • A highly theoretical course where you learn about the specifics of what it means for something to be computable, and what time and space complexity really is. I really liked this course because we were able to finally learn the core of theoretical computer science. Despite its name looking scary, it wasn't a very difficult course. If you've taken CSC373 already, much of the course will be review. If you haven't, both courses will complement one another, so I think it's a good idea to take them concurrently. If you really hated reductions in CSC373, maybe skip this course 😅.

CSC469 - Operating Systems Design and Implementation

  • No, you don't build an OS in this course, as fun as that sounds. Instead, you'll learn all about the design decisions that shaped the operating systems we use and love today: how have the advent of multicore processors shaped modern memory allocators? What problems are there now that memory is measured in the gigabytes, instead of kilobytes? What do we need to change in the kernel now that CPUs can now run over a hundred clock cycles in the time it takes to bring data from main memory? This is an extremely heavy course with lots of paper readings, hard assignments, hard exercises (each exercise felt like a CSC209 assignment 💀), but I think it's a must take for anyone looking to do low-level/systems programming. I think this course goes well with CSC367, but they're both really heavy so take that into account if you want to take them concurrently like I did.

Focuses

If you are doing a CS spec or major, you have the option of enrolling in focuses. For example, you could do a focus in Computer Systems, or Artificial Intelligence, or whatever. Check the link in the previous section.

I think the consensus is that while focuses don't really matter, using focuses as a guideline for what types of courses you should take in order to become proficient in that area can be extremely useful.

Applying for Internships

Getting Ready

Now that you know when you're going to do your internships, it's time to get ready to apply. This means you'll need a resume.

If you don't have any past-experience, your resume is going to look quite empty. If you're a first or second year, you already have a huge disadvantage so you need a way to differentiate yourself. You can join clubs (please actually do stuff so you'll have things to talk about on your resume), attend hackathons (with the intent of winning! Prepare well!), and working on projects.

I can't really talk much about clubs because I haven't joined any except like... anime club.

Hackathons

Hackathons are events where you'll often be given some sort of theme, and you have typically a day or a weekend to make a project. Most hackathons are geared towards first and second years, and many even accept high school students! My friends and I have been doing hackathons since high school, so once university rolled around, we knew what to do and won a couple awards.

A huge thing at hackathons are the sponsors. There will be a lot of companies at the event, so make sure to talk to them and maybe you'll even land an interview! Even if you don't, you'll have a sick company t-shirt (I only wear hackathon t-shirts 😭).

There are many hackathons everywhere. UofT has UoftHacks which happens around January, so don't miss that, along with a bunch of others (see the list below).

Waterloo has Hack the North in September, and you do not want to miss this. Huge event, sponsors from huge companies, lots of people. Admission is free, and they'll bring over a couple buses to drive everyone from Toronto down to Waterloo. They also have places to sleep although if you're like me, you'll be sleeping on some random table you found with a sleeping bag.

Stanford University has TreeHacks in April. They reimburse flights. It’s even bigger than Hack the North. It’s in California. It’s Stanford. Need I say more? Here’s a (somewhat comprehensive list of) hackathons in Canada (with a focus on Ontario Hackathons) with a few in the US. Most of these often have buses / travel reimbursements:

  • NWHacks at UBC (BC)
  • Hackville at Sheridan (ON)
  • Hacked(); at UAlberta (AB)
  • MacHacks at McMaster (ON)
  • McHacks at McGill (QC)
  • QHacks at Queens University (ON)
  • Conuhacks at Concordia University (ON)
  • ElleHacks at York University (ON) (for women and gender-diverse students)
  • CMD-F at UBC (BC) (Women only)
  • Hack the Hill at UOttawa (ON)
  • UOttaHack at UOttawa (ON)
  • CUHacking at Carleton (ON)
  • TreeHacks at Stanford (US)
  • UTMIST hackathon (UofT)
  • MakeUofT (UofT, hardware hackathon)
  • UTRAHacks (UofT, robotics hackathon)
  • DeerHacks (UTM)
  • GryphHacks at UGuelph (ON)
  • ETH Toronto / ETH Waterloo (ON, blockchain hackathon)
  • Olympihacks at Waterloo (ON, blockchain hackathon)
  • HackTheValley (UTSC)
  • HackThe6ix (Toronto, Usually in Aug)
  • The GoldenHack at Laurier (ON)
  • NSBEHacks (UofT)
  • UofTHacks (UofT)
  • HackPSU at Penn State (US)
  • HackMIT at MIT (US)

This Discord server is dedicated to the Canadian / Ontario hackathon community, and they have a bunch of resources set up to keep track of new hackathons, make teams, and more.

Projects

Work on impactful, long-term projects to put on your resume. If you have little to no experience, projects are the next best thing, and they need to be good if you want to differentiate yourself.

No tic-tac-toe app, no stock forecaster that uses "AI and ML" that barely works, no chatgpt wrapped project, no to-do list app, no poorly made web app, no school projects. You need to differentiate yourself so make something unique, and ideally actually useful. It's not exactly easy coming up with unique ideas, so think about it for a while. I personally like working on tools that I can see myself using, because not only is it easier to think of (think of a few annoyances in your life that you could automate), you'll also be motivated to finish it, so you can use the tool.

Group Projects

Group projects are a good way to make a very impressive project, but you should make sure your group members actually want to make the project and don't just like the idea of having a project. At best, you'll just end up doing everything. At worst, you'll be slowed down by people who say they'll do something but they forget about it for a month so you can't proceed and after waiting a month you end up doing it anyways.

Writing the Resume

You can't go wrong with Jake's Resume format. It's practically industry-standard at this point. I would recommend against using your own resume format because most companies will use ATS (applicant tracking system) to automatically read your resume, and some formats may not work properly. However, since pretty much everyone uses this template, it's probably fine.

When writing your points, be specific, and use the xyz resume format, which says your points should be in the form: "Accomplished [X] as measured by [Y], by doing [Z]."

"But my project doesn't have numerical stats!", well find something to measure. Performance improvements can be easy to measure, or maybe you can write about the number of users if your website is gaining traction. Maybe you could write about how much time your tool saves you in your day-to-day life. It can be anything.

Did I mention you should be specific? If someone can copy your resume points, change a word or two (C++ -> Python, Company A -> Company B) and still have an accurate resume, your points suck. So many people's resumes effectively boil down to "I did some stuff". What is some stuff? I don't care that you used Python and pandas to read data, I want to know the details of what you did. How did you use pandas? What considerations did you have while implementing a function?

If your points are too broad, I'd recommend picking one specific concrete thing you did and writing about it.

Example Resume Points

(these may not actually make sense, this is mainly to show how much better the points can get)

"Used Python and Pandas to pre-process machine learning training data to improve consistency by 78%" -> "Improved consistency of machine learning training data by 78% by adding a preprocessing step using Pandas to invalidate malformed data points and log them for manual review"

"Boosted performance by 2x by using custom patches on X library" -> "Boosted end-to-end encrypted message passing performance by 2x by patching X library's encryption function to use an optimized implementation of the hashing algorithm"

"Made the processing step 18x faster by rewriting parts of the code in Rust" -> "Increased data normalization processing speed by 18x by rewriting the data matrix solver in Rust"

I think the "improved" examples could still use a little work, but I'm sure you can tell that they're a lot better.

I cannot stress this enough. APPLY EARLY!!!

Many companies, especially big companies and US companies, hire very early, often eight or more months in advance. This means that for a summer internship you should be starting to send out applications in September, or even earlier.

Smaller Canadian companies usually don't hire as early. You're probably looking to apply early January for a summer internship, although you should still apply to whatever companies have postings out before then!

The ASIP job board for second years will likely not open until around January. Apply externally in the meantime, the job board doesn't have that many jobs to begin with so you'll be doing most of the applying externally anyways.

I recommend using Simplify to speed up filling out applications. For your first job you might have to apply to hundreds before you even get an interview, so this will help out a lot.

Cold Applying vs Referrals

Cold applying refers to just applying on the company website. This is the easiest method but has the lowest success rate. Better would be getting a referral, with referrals to small / med sized companies being best, especially if the person referring you can really vouch for you.

If your parents or family friends work somewhere with software jobs (whether that be at an actual software company, or places like banks), great, go ask them. If you're like me and the only referral you can get from your parents is for a dishwashing intern position, you're going to have to work a bit harder.

As mentioned before, hackathons are a great way to meet recruiters and have your resume put further into the hiring pipeline (some hackathons even have coffee chats / on-site interviews). Additionally, career fairs can be useful in getting an interview (Intel at YNCN seems to like UofT students, although it is only for 8+ months), but be warned that the majority of companies are just going to tell you to apply on their website, making you wonder why you even bothered showing up.

Additionally, you can ask people on LinkedIn for referrals. Don't feel bad for connecting with random people and asking for referrals, most people are nice and are sympathetic to the fact that it's hard for students to find internships. Crazy, I know; people are nice? Also depending on the company, the person referring you literally gets free money if you get hired. They literally enter your name and email into some system and get a thousand dollars out of it, so don't feel bad, if you actually get the job you're doing them a favor 😅.

However, do note that because more and more people have been doing this, referrals aren't as effective as before, especially for larger companies, but they're still better than nothing.

My personal approach is to cold apply to as many places as possible, but get referrals for specific positions I really want + I believe I have a good shot at. Getting referrals for every company you apply to would be ideal, but that's going to be a lot of work.

Keep in mind that a lot of companies don't let you get a referral after you've applied! I mean, it doesn't really make sense does it, if the point of a referral is for someone to advertise a position to you. Anyway keep that in mind and don't be like my friend who applied before asking for a referral only for the referrer to not be able to do anything.

Online Assessments / Take Home Assessments

A lot of companies will give you an online assessment or a take home project before giving you an interview. Some companies give OAs automatically to everyone (auto oa) then review your resume if you did well on it, or some companies review your resume first, then give you the assessment.

OAs differ by company, and by role, but often it's going to be leetcode-style problems. I can't say much aside from practice!

  • If you get an OA on a website called CodeSignal, check if the name of the test is "General Coding Assessment" or something along those lines. If so, it means that your OA is using a general, non company specific assessment, for which you can reuse the results. However be aware that there is a cooldown period before you can take the assessment again, so you might be forced to send a previous result, which can be bad if you've bombed one. Try not to bomb it.

Take homes are usually going to be pretty unique. This seems to be pretty common with startups because they want to see that you can actually build something.

I got an interview!

I would include this in this page but the blog is already over ten thousand words long.

Read Interview Advice for Computer Science Students for advice instead.

Random Asides

Random information that could be useful but didn't really fit anywhere

Grades

There are pretty divided opinions on this. Some even say you shouldn't care about grades at all and only look for internships!

My personal opinion is that it doesn't hurt to have high grades as long as you have time to do other things such as work on projects and apply for companies.

When I was applying for jobs I had a 4.0/4.0 GPA and some companies really liked that (me when the recruiter circles my GPA on my resume 😩), although it definitely wasn't as useful as you'd think. Many places don't even ask for your GPA!

Some companies have a hard GPA-cutoff. It seems to be around 3.5 for many larger companies, and 3.7 for companies with stricter requirements. I've heard that if your GPA is lower than 3.5 you should omit it from your resume.

However, even if grades didn't matter, if you're neglecting your grades, you're not going to learn anything. If you want to do anything remotely complicated, concepts you learnt from school are going to be essential in not only the interview process, but performing your duties as an intern, and also as a full-time employee after graduation. Don't waste your time here!

I will admit that UofT is quite unforgiving when it comes to grades, and it can be hard to balance school and other stuff. I don't really have advice for this aside from try to use your time effectively and sacrifice fun 💀.

Grad School

I'm not planning on going to grad school, nor have I researched much about it as much as my peers, so take this with a grain of salt. But from what I've seen, I think the consensus is that grad school won't help that much for software development / engineering jobs, and it's better to spend that time getting work experience instead.

Don't go to grad school to get a better job in this area because it's not really going to help in that regard, go to grad school because you're interested in some field and want to learn more.

If you want to go to grad school, you'd be doing a lot more research and connecting with professors, which somewhat conflicts with what you're going to be doing if you are following this guide (although you could use this guide as reference to schedule research internships, and having past-experience as a software development intern probably doesn't hurt when applying for research positions).

There are a handful of industry-focused masters programs (e.g. UofT’s MScAC focuses on research in industry, and UIUC’s Masters in Computer Science is purely industry-focused), but again it might not be too useful. Make your choices based on your own assessment!

It's definitely possible and many people do software development internships and research throughout their degree, but I can't really help you there. Ask someone else.

Many people, being unsure whether they should pursue grad school or dive straight into industry, try to keep both options open until they figure out what they want. While this is a great way to explore if you are unsure, keeping options open requires some sacrifice unless you're able to make your courses, industry interests, and research align. If you're trying to go into research, you may be taking more advanced courses to show that you are prepared for grad school, working or volunteering in research labs, working on papers, keeping your grade up as high as possible, getting to know professors, etc. At best, they'll help marginally for industry internships. At worst, you'll have to allocate more time keeping that door open, taking time away from the little time you have already.

It really does suck because I feel like university should be a time for you to explore around to see what you want to do for the rest of your life. However, in the increasingly competitive world we live in today, you're going to have to choose to one to focus on if you want to be better than the rest, at least in my opinion.

Useful Resources

Advice on CS Research, written by Alston Lo. If you're interested in grad school and research, this is a must-read!

Incoming First Year Computer Science Students: General information by UofT for first-year computer science students. Note that this is only for the CMP1 admissions category, meaning for students who were accepted into CS in high school. If you were accepted into UofT through a different program, but want to do CS, this will not apply to you.

First Year's Guide to CS: A guide by the Computer Science Student Union. Note that this seems to have not been updated for a while, but most of it should be relevant.

Past CS Course Outlines: Useful if you want to see what a course was like in previous sessions.

UofT Courseography: A visual map of what courses you need to focus on specific domains of Computer Science.

UofT Timetable Tracker: Useful for figuring out which courses are popular and fill up quickly, and also which courses are hard and have high drop rates.

Unofficial Waterloo USA Intern Guide: While this is for Waterloo, there are a lot of useful and applicable information about the J-1 visa process and the logistics of doing an internship in the United States. Do note that this guide is over a decade old.

Closing Thoughts

Thank you if you read up to this point. I hope this guide was useful. Please do keep in mind that this is based on the experiences of one student who hasn't even graduated yet (with feedback from other students). Once again, use your discretion and verify facts before making sensitive decisions.

There's unfortunately a lot of weird nuances about UofT and ASIP you need to know about in order to do everything optimally, which I don't expect any first year students to have figured out. I know that I didn't even know that half these problems existed when I was a first year. Hell, half this information I figured out in third year! But you can't really wait to find out if there are time-sensitive decisions you should make in first year.

Realistically, we're never going to catch up to Waterloo's co-op program, but that's not the school or ASIP's fault! Please don't email ASIP telling them we need to do whatever Waterloo is doing; there are so many changes that would need to happen not only on ASIP's end, but also at the department and faculty level that it might as well be impossible.

Also, a lot of students here are focused on research and don't want to do software development anyway, so it would be an awful lot of effort to completely revamp the whole system just for a portion of the students to benefit. Just follow the guide and do six internships if you really want the Waterloo system.

Once again, I'm not encouraging anyone to read this guide and optimize everything in your school schedule. There's more to life than just filling it up with work. If you want to, by all means do it. However, what you really should be doing is reading the points, and use it to understand what considerations there are if you want to do something. Such a simple choice like wanting to do an internship in second year winter has a lot of considerations which would have needed to be planned out in first year, if you don't want to push your schedule back. Don't forget that postponing graduation is always an option too, although it may be extremely expensive if you're an international student.

Anyway, I hope this cleared up a lot of questions, and you learnt a thing or two. Please share this with anyone that might find this information useful!

If you have anything you'd like to add, please submit a pull request or open an issue on the GitHub repository.

Discussion

This work by Hanmin Kim is licensed under a Attribution-NonCommercial-ShareAlike 4.0 International License. Copyright 2024 Hanmin Kim.