Reflecting on my life at UofT
Posted on
I have finally graduated from University of Toronto with Honours Bachelor of Science with my focus being computer science specialist, and math minor. This is quite an outstanding achievement for myself, since computer science isn’t an easy program by any means, as it requires one to be efficient with their resources, and to be able to think abstractly, logically, and algorithmically. It also requires one to be persistent with whatever challenge they may face, especially when the program is taken at UofT. I do want to take the time in this post to reflect on the five years I spent at UofT, as I had learned a lot in my journey.
In the beginning, when I first got to UofT, it wasn’t a super smooth experience for me, since I was immediately dumped with work from my math proofs course. The problems I faced were something that I haven’t seen before, or at least have very rare encounters with. It wasn’t something that I faced back in high school, where you’re just given a problem, and expected to compute a solution. The problems I got were ones that expect you to prove or disprove some mathematical claim, and it isn’t always straight forward. So of course, I got stuck on it at first, but slowly I have adapted to understanding the methods or techniques in how to go about solving those problems.
I took other courses such as Introduction to Computer Programming, and Calculus, which were required for me to apply to POSt (Program of Study). I admit that this was something that I never knew at the beginning. For anyone who don’t know, when you apply and get into UofT, you aren’t exactly in. Getting accepted to UofT really just means that you have gotten into the university itself, and not the actual program that you want to get in for. For that, you need to prove yourself worthy by taking the required courses and having the required marks to be accepted in your desired program. Some programs are of Type 1, where you can automatically get in when you apply. Type 2 programs requires you to fulfill certain requirements to get in, and Type 3 programs are like Type 2, but they have limited seating; you’ll be competing with other students to get in.
There are pros and cons with such system. For instance, an advantage is that you can freely apply or switch into any arts and science program, without having to go through some specific process through a faculty (Engineering is an exception, where they have own system.) A disadvantage would be is that if you don’t get into your desired program, then you’ll be stuck in a state of limbo, where you can’t graduate at all, unless you can get into some program(s) and successfully fulfill their requirements.
Well anyways, I took some additional courses, such as Introduction to Computer Science, Linear Algebra I, Introduction to Sociology, and Financial Accounting I. And after that, I managed to get accepted into my first program: Computer Science Specialist.
Yes, at UofT, there are majors and minors. But there is a third category, called specialist, which has greater weight than a major in terms of requirements and workload. I chose CS Specialist, because I really wanted to focus in this specific field, as I found it to be a fascinating and exciting field to learn new things. Also, there is the inherit advantage where completing one specialist is enough for a student to graduate. I of course wanted to keep options open and see if there are more fields for me to explore.
Second year rolled by, and man…I remembered it being a bigger step up from first year. In first year, we had to learn Python, and object-oriented programming. In second year, we had to learn Java in my Software Design course. I had to learn about design patterns, Git, Scrum, and working in teams. It was exciting stuff! My team and I got to make a paint application in Java, although not everything completely worked out, since we were short on time. But still…I learned a lot. I learned some CS theory from my first theory course, where I learned about computer scientists generalize about the computational complexity of a program. I learned C in my systems programming course, where I learned about the memory model, system calls, and socket programming.
I think the one course that fundamentally changed how I viewed computers was a course on computer organization. In that course I learned about what actually makes up the computer hardware, how a CPU actually works. It changes our perception of computers from being a magic black box to…well…a powerful machine that we now know more about the internal workings of it. I already had the idea that ultimately every code we write will get compiled down to machine code, but this course helped me out in clarifying how the computer would interpret those codes.
I remembered in second year that I did attend the MCSS (Mathematical and Computer Sciences Society) first coding competition. In this competition, we all had to write programs to solve various problems. It can be any language, but the point is that we would solve those problems and earn score depending on how fast we were able to solve the problems within some given time frame. I worked along with a colleague, and we managed to earn first place in the competition! 😄
As for my third year, I decided to take ten CS courses, which made it quite stressful. But I felt happy at the time, because I felt that I had finally gotten to the root or the actual meat of the program itself, where I would be study computer science full time.
I took:
- Principles of Programming Languages
- Introduction to Databases
- Introduction to Information Security
- Operating Systems
- Algorithm Design and Analysis
- Introduction to Software Engineering
- Programming on the Web
- Principles of Computer Networks
- Computational Complexity and Computability
- Introduction to Artificial Intelligence
A lot of these courses were hard and stressful. And what I had found is when a course is difficult, it falls into one of two categories:
- The course content is difficult to comprehend and requires a lot of time in understanding the actual content or recalling what we had learn before
- The course content is fair or easy, but the workload is huge; requiring you to spend a lot of time on tasks that one may consider to be tedious
For instance, theory courses like my algorithms and computational complexity courses are in the first category, while courses like the one on web development are in the second category, since for this course, I had to rapidly learn several languages, and learn some framework and tools needed for the assignments.
Overall for this year I learned pretty much the core of CS. This post is already getting quite long, so I won’t get into too much details on the specific skills I learned. But I will say that the operating systems course, web development course, computational complexity and computability course, and the AI course were the most intriguing courses I found so far in my third year.
As for my fourth year, I decided to focus on the big new thing in computer science: Machine Learning! I took a course a general course on machine learning and went further with deep learning. I also took a course on the specific application of it, which is natural language processing.
And I have to say, machine learning is tough. It required one to know about multivariable calculus, linear algebra, and statistics. I admit I didn’t do the best job compared to the other courses I have taken, since a lot of the concepts were new to me, like recurrent neural nets, convolutional neural nets, autoencoders, Q-Learning, and so on. 😅 But I did learn a lot from this experience. Perhaps someday, I’ll implement some of the concepts I had learned in a side project.
I also took a scalable computing course, which taught me how would one go about making applications scalable for millions of users. I had a chance to play with CUDA, Apache Spark, and AWS on my assignments. A course on parallel programming went hand-in-hand in helping me understanding the different approaches in using multiple threads to accomplish some task. Overall, I’ve learned a lot of advanced concepts in my fourth year.
In my fifth year, I decide to crank it up and take some grad level courses such as the Advanced OS course, and a course on compilers. I also took a course on software testing and verification out of curiosity. What I gained from this experience was that I got further understanding how complex the operating systems, and it made me appreciate all the work that goes behind the scene in macOS, Windows, and Linux. I also learned about the stages that makes up a compiler, and I’m actually using what I’ve learned to make my own compiler from scratch. I also learned that there are actual programs that are designed to verify programs and logic. In class I had to use Dafny, and I had to go about proving to this verifier of the various mathematical theorems and claims in my assignment. It…wasn’t straight forward. 😅 I didn’t have the freedom to just write out my proof; everything had to be coded and be discrete, which wasn’t easy at times. Overall, this was a very interesting experience.
The last course I took at UofT was a course on Algebraic Cryptography. I wanted to learn a bit more about the math behind it, and its interesting application. I already took a course on abstract algebra in preparation for it. All was going well, until COVID-19 hit, and it wrecked the course. 😕 But I did earn my math minor from this. 🙂
I have to say, after looking at what I had written so far…I realized it’s not much of a reflection, but rather just a trip down memory lane, and pretty much telling you guys my journey in computer science. 😅
But I will say that my journey had a lot of ups and downs, and the specific path I choose in my academic life wasn’t an easy one. But what made a lot of my journey tolerable were the friends that I made in my journey. They were very supportive in tough times, and it was awesome talking about tech with them over our coffee breaks.
I will definitely miss the times of being at school. I get this feeling of nostalgia of the times where I took an early morning train ride to Toronto, followed by a subway ride to St. George. Then as I would get out of the station, I would encounter the cold winds, followed by the sludgy snow that I would go through to get to Tim Hortons. After ordering coffee at Tim’s, I would sit down and look out of the window, and examine the winter as I take my warm sip of coffee.
At the end of my five years at UofT, it’s sad that I can’t get an in-person convocation due to the pandemic, but UofT did host a virtual convocation that you can watch here.
After much hard work and dedication, I have finally earned my bachelor degree that I am proud to display. 😄