reflections on recursion
december 26th, 2021
This piece was inspired by Tanya Marcela Llanas’s creative writing thesis, which I found on her Twitter. It was so cathartic for me to read the beautiful way that she translated my complicated feelings about STEM into words — this reflection on my time so far at the University of Waterloo is my first attempt to do the same for someone else.
Recursion is a bitch. At Waterloo, the math faculty’s first-year CS course is intentionally taught in Racket, a language with no “for” or “while” or “do while” loops at all. At least the Dean of Computer Science understood that first years would never properly learn recursion if there was any chance that they could use a simple for-loop instead.
In the engineering faculty? No such compassion. First-year software engineers are plunged headfirst into CS 137 in C. Here, recursion quickly becomes secondary to the bigger problem of how the fuck do I know how much space to malloc for this array? This is how I learned my first lesson at the University of Waterloo: you’re supposed to just ~understand~ recursion in your first term of SE, okay?
So maybe this is why I hated recursion, really. Maybe it’s because on my fourth day of software engineering, on the fourth floor of MC in the help session for CS 137, my TA said to me, “if you don’t understand recursion, what are you doing in software engineering in the first place?” Thus was born (or possibly reaffirmed) my existential question — yes, what am I doing in software engineering in the first place?
I shared this experience of recursion and rejection in SE because it reflects the mentality of Areena in 1A, showing just how revolutionary it is that today, I can finally call myself a software engineer.
My first two terms in software engineering at Waterloo were both brutal and deeply humbling. I failed CS 137 by two percent at the end of my 1A term, a painful experience of realizing that the professor doesn’t remember your face enough to harbour remorse to pass you with two more percent. In my 1B term, I (and the rest of SE 2024) was battered by my digital circuits course; after a brutal one hour midterm that deserved four hours, our entire cohort stood completely still, as if we were terrified of crying or laughing, or both.
Whatever, who needs to know nor gates or the five different solutions to one sorting problem, right? Fuck this shit. I had loved a lot about coding before my first year in this program — I’d written a web application in Flask that made REST calls to Microsoft Azure, I’d coded a game in Visual Basic! I thought I was qualified to be here, but did I even like it anymore?
Imposter syndrome is a fundamental problem with first year software engineering at Waterloo — how can you learn (or feel successful at anything) if you’re taught with the assumption that you know everything in the first place?
I think I’m only entering my 3A term today because of an angel who came into my life at the end of my first, hellish term. Janelle was a linear algebra professor and is the kindest and smartest mathematician I’ve ever met. She taught me that math is a language to be learned one axiom and theory at a time, until you can construct proofs that wind together tales to describe the world around us. She helped me connect the dots and understand that computer science is logic, an abstraction of mathematical theory that enables us to compute answers to tangible problems.
There were other angels: my program director, one of the only people who told me I belonged in this program, and my computer science tutor, who taught me to transfer my essay writing skills to plan well-structured, beautiful code. A female logic professor who never made me feel small in her office hours. Over time, I became confident enough that I was writing state machines for my internships and implementing search algorithms for a student club. By the end of my 1B term, on my Quest profile for no one, not even my first-ever CS TA, to dispute, there it was: an 88 on CS 138, my second-ever coding course. I could’ve framed that shit, I was so proud. I would’ve, except my transcript from that term also had my grades from ECE 106: Electromagnetism on it.
This is the story of engineering at the University of Waterloo, one where we are trying and failing and trying until one day we succeed. And then we fail again.
My first two years here have been character-building, as in, they’ve broken me down and built me back up. They’ve made me contemplate my career, how to pitch myself, how to get past one failure after another. I’ve tried so, so hard to see myself as a software engineer, seeking out female role models and attending career fairs and joining the Women in Computer Science committee. I moved to Boston by myself at 19 years old to build user interfaces in C++ (the language of CS 138… it all comes full circle.) I’ve learned to look at an object, an entity, and define its “interface” — what are its functions, and how would I code them? This university has empowered me to see behind technologies and understand how they work. Coding is magic, but real: finally, I see what it means to be in software engineering.
I’m starting the second half of my degree with hope for the future. This semester I take CS 497, Discrimination In Computing. It’s taught by a Georgetown law professor and the openly-gay former CS Faculty Director, and I hope that they’ll help me define my goals of pursuing AI ethics and social justice in computing. Finally, I’ve made it to my first ever 400-level CS class, written under my class schedule in Quest in computer ink for all to see. Oh, what support and humility and love and determination it took to get me here.
But while I’m proud and excited of my growth, I also feel a bit like I’m mourning. So many of my peers haven’t had the support I’ve been lucky to find here (with the help of my mom). So many of my peers are no longer my peers at all. This program beat the passion out of them, as it did for me at first. Although there are great professors who make funny weed jokes in class (“joint” distributions), there are also ones who take 30% off every minute you’re late to upload your 13 page midterm to Learn. Teachers and peers who warn that if you can’t pass the gruelling midterm, you could never, ever, possibly pass the course, meet the six-courses-a-term ‘academic standards’ of SE. TAs who leave you to cry in the fourth floor washroom of MC because they’re sorry but you don’t understand recursion and you never will. Maybe this is just not meant for you.
We came here to learn engineering, and we want to, I swear. But we need support and sponsorship early in our degrees, because it’s highly likely that we can succeed, it’s just a question of who will tell us how to do so. We need an equal playing field and compassionate instructors and communities that don’t make us feel small, not when we’ve already become small fish drowning in the ocean of university. This is also why representation matters. Can we see people who look like/sound like/live like us succeeding? Not yet. Without this, many of us will leave university hounded for the rest of our careers by the nagging feeling that if we can’t understand fill-in-the-blank, we must not deserve to be here in the first place.
Recursion is actually very beautiful. After eight coding courses, I’ve learned that most problems can be broken down into atomic statements, which we can apply a definitive rule to. I can now trace out a ten-line tree-traversal solution to an abstract problem like, what is the shortest path from A to B? I can visualize the stack trace for a binary search algorithm, stack frames moving on and off my mental memory heap with a quiet pop! Most importantly, I can see the beauty of solving a very large problem by finding its base truths first. For someone with such an expansive and complicated perception of the world, I’ve found comfort in the repeatability of algorithms.
I imagine this is the concept taught in CS 135 to first year CS students, the one that my SE TA believed I should have already known, of course. Silly me. If only there was a program where I could learn this, amongst the other skills required to one day become a software engineer.
If you’re reading this, you made it to the end of my first long piece in an even longer time! Thank you so much for landing in my digital garden and sticking around long enough to read my thoughts (thanks to Mathurah Ravigulan for introducing this concept to me.) This reflection was very personal and vulnerable, but I hope it helped at least one person feel a little bit less alone. Feel free to have a longer chat with me on on Twitter or LinkedIn.