Note: the following tips might not be generalizable to everyone, as I only speak of my experience studying Computer Science and Mathematics at Concordia University, Montreal.
1. Extended Credit Program
Due to the difference in high school curriculums between Quebec and Ontario, out-of-province students need to take an extra year of university classes which is formally known as the extended credit program (ECP).
There is a recommended list of elective classes to take to satisfy those credits, which cover various topics like economics, philosophy and astronomy. However, not many people know that you are actually able to take almost any class and have it satisfy your ECP electives.
Due to my interest in music, I got a chance to take a jazz theory class which was really an awesome experience. I also used another elective slot to take an additional math class that wasn’t part of my main curriculum.
If you ever thought of taking a very random class out of pure curiosity, this is your best chance, but please make sure to ask the registrar before enrolling to make sure the transfer will be possible.
2. Quebec Inter-University Transfer
There is a portal that allows Quebec university students to take classes at any other institution within the network. Through this opportunity, I got a chance to take an advanced math class (Convex Optimization with the excellent professor Courtney Paquette) at McGill university.
This portal is great because if some classes are only taught on certain semesters at your university, you might be able to take an equivalent class elsewhere at your own pace. Of course, the main benefit is that you will get to experience another student life and meet new and interesting people.
Another little trick that not many people know about; You can actually skip pre-requisites at the host university, as long as you are able to transfer the class to an equivalent one at your home university.
For example, the optimization class at McGill focused a lot on theory, analysis was a pre-requisite, but since Concordia didn’t have the same requirement for its optimization class, I was effectively able to bypass this rule. This is only something I would recommend doing if you are absolutely interested in the class and do your own research beforehand.
3. Exchange Semester Abroad
This is sort of related to the previous advice, but might be a bit more challenging both financially and logistically. The best time to do this exchange would be on either your 2nd or 3rd year. I already talk about my experience in this blogpost, but to summarize, doing a semester abroad is a great chance to travel around the world, learn about a new culture, and meet new friends.
4. Research Project with a Supervisor
In my last year, because I was in the honours program, I had to complete a project under the supervision of a professor. It was a great experience as I developed some basic research skills and was able to manage my time without strict deadlines. I proposed a project, which combined my programming background with the mathematical knowledge of my supervisor, that eventually led to an open source contribution to NetworkX. In case you are curious to know more, you can read my final project report here.
Doing this project at a relatively early stage of my student career gave me the confidence that I could continue doing research in graduate school. Even if you are not considering further studies, doing such a project can be a truly rewarding experience. It will allow you to explore ideas, read journal papers, work with incredible researchers, and potentially make a contribution to science.
5. Getting work experience
In my opinion, the most valuable thing I retained from my time as an undergraduate student (obviously, apart from the amazing people I have met) are the skills I gained from internships and developing open source software.
For anyone who doesn’t have summer plans, I would really recommend to try and find internships or any other opportunity to develop your skills. Although it can be really stressful and competitive, the things you can learn are truly invaluable. You will have a chance to work on large codebases with real production impact, learn programming best practices, and most importantly, develop communication skills.
At the end of the day, programming is about working with people, understanding what others have done and being able to slowly form your own feature ideas as well. There is no better way to improve than practicing working on large projects with other experienced developers.
Finally, I would like to end this blogpost by saying these are just some things I noticed had a profound impact on where I find myself today, you might have completely different goals from your undergraduate education and that is completely fine. I noticed that we naturally tend to things we like, so just go with the flow.