We interview a PhD student at the University of Toronto about what Distributed Systems is, what opportunities there are in the field, what his internship experiences are like, and what advice he has for CS students looking to get into the field. The student chose to remain anonymous so we’re just going to refer to him as ‘anonymous’ for this interview.
Hi Anonymous, so you’re a grad student at the University of Toronto in CS, tell us a little bit more about yourself and how you ended up there.
I’m just your typical nerd with a CS/Math degree that likes computers slightly more than math. I ended up at University of Toronto because I only applied to 3 schools coming out of undergrad. The other two schools I applied to didn’t give me very favourable responses :). Also, my family and one of my best friends is living in Toronto, so it worked out pretty nicely.
Why did you choose to go to grad school?
I can cite the cliche reasons that everyone spouts: to study and understand something new or to improve the state of the art of what we know (if only slightly). But, perhaps more honestly, I tried doing a few internships as well, and I thought that working didn’t suit me as much. (TLDR; I didn’t want to work :D)
What’s your specialization and how’d you end up choosing it?
At the moment, I’m working on distributed computing. I do theoretical stuff, like algorithms and lower bounds. To be honest, I semi-randomly got into this. I remember sitting in an algorithms class where the professor said that the most important and interesting problems in theoretical computer science lie in lower bounds. My advisor was the only person that listed lower bounds as a research interest on their web page and it turns out that they were doing distributed computing.
What kind of internships have you worked at?
I did programming internships at three different places. One was on the web side, in a company that was sponsored by a hospital. Another was at, supposedly, a large holder of internet domains. It was also web development, but I was responsible for developing a few internal tools and had a lot of leeway (I chose the programming language, the framework, database, etc.). Finally, the last one was at Blackberry (actually, I’m not sure if they are even still around, when I was there they were still known as RIM). This was pretty much a glorified slave job lol.
How’d you get these internships? Which was the best?
I got the internships the same way everyone else did: through the Waterloo co-op website and the interview system that they do. I think I liked the second job the best because I built stuff from the ground up and I had complete control over every step of the process, from design to implementation to testing, etc. I never got to experience anything like that at the other places I worked (it was more routine, follow-the-directions-type work).
So you went to Waterloo. Do you think the co-op program was worth it?
Definitely. The co-op program is one the best aspects of Waterloo and I highly recommend it. One, it lets you pay off your tuition by yourself. Two, you get valuable work experience (if you are more adventurous, you could theoretically work at 6 different companies by the time you graduate). Three, if you are like me, it could help you figure out what you want to do with your degree (i.e. if you want to continue in academia).
Do you have any advice for students looking for internships? What can they do to prepare and succeed during their internships?
Something I wish I knew when I was doing this stuff was how important algorithms and, more generally, problem solving skills were. I usually didn’t prepare for my interviews beforehand (other than a quick glimpse at what the company did). I was still able to get offers from pretty decent places doing this (like TD, RIM, and some startups that I won’t name), but I definitely blew a shot at Google when I walked in and tried to wing some algorithms stuff. I think stuff like that is helpful to practice and have some experience with. What you learn in class helps, but knowing how to apply it on the spot is usually a bit tricky.
What kind of practice would you recommend, Cracking the Coding interview? Or is there something else?
Yes, a very good friend of mine recommended that I read Cracking the Coding Interview and in my subsequent interview at Google I did manage to pass the technical part (though, I never did get matched with a job). So yeah, read that book and do the exercises and I think you should be able to do fine in most interviews. I think for more practice you could also try to do some problems on sites like TopCoder or UVA Online Judge. (Both sites also recommended by my good friend :D.)
Let’s switch tracks, what are your long term goals? What kind of problems are you work on now, and what are you hoping to do when you finish grad school?
I wish I had more concrete long term goals. I’m pretty divided at the moment. On one hand, because of how much time I invested into this stuff, I think I want to see how far I can get in academia. On the other hand, ** the sunk cost principle, I’m kind of jaded by academia and I wonder if I would be happier working on a start-up or for a company.
In terms of problems, it’s funny how it goes. At the beginning, I was desperately trying to find problems to solve. Nowadays, I have too many problems (that I can’t solve). They are mostly in lower bounds, like proving how much space or time you need to solve some particular problem (I could go into more details, but it’d be technical and not too helpful).
What are the most interesting problems you worked on? Are these the kinds of thing you could potentially work on in industry as well?
I did some work in lower bounds that I think pushed the state of the art forward a bit. I have some ongoing research in this area that I think will be really cool as well. I consider this stuff to be one of the highlights of my PhD and made it worth the time investment, in some sense. Sadly, I think lower bounds is not that big of a deal in the practical world (it’s more interesting to come up with upper bounds). It’s sort of like being a Debbie Downer and saying that “no way guys, we can’t do better than this”. It’s probably a lot more valuable to be able to say “here an algorithm guys”.
But knowing we can’t do better is important too, right? Then people won’t waste time trying to come up with algorithms that don’t exist?
Right, but I suppose you should look for a job in a research lab or academia in that case. Not sure how it works nowadays in industry, but I think your boss would probably get a bit mad at you if you spent a few months proving that you can’t do better for a certain problem instead of working on other stuff.
As a grad student, do you have a lot of duties other than research? Do you have to take classes or do any TA work?
Actually, other than completing the mandatory 8 courses (which typically takes 4 semesters), I don’t really have any other obligations (other than meeting with my advisor once a week). So, in theory, I could even live in another city, provided I can still make it to the once a week meeting with my advisor. Of-course, this defeats the purpose of grad school, where you’re supposed to collaborate with and learn from your peers.
That said, the amount of money you get as a grad student is pretty terrible (roughly 20k a year after you pay off your tuition at UofT). With an NSERC scholarship, it’s slightly better but I think you still end up below the poverty line (roughly 30k after tuition). So, it makes sense to work as a TA (surprisingly, because of student unions and whatnot, the pay is about 40$/hr at UofT). Each TAship lands you an extra 400$ a month, which is pretty substantial.
What is it like working as a TA?
Well, let’s just say that I stopped doing TAships the second I got an NSERC scholarship. The extra$400 per month is nice, but it just didn’t seem worth it to me after a while. Most TAships only involving marking and this can really make you lose your mind (I still somewhat remember my days as an undergrad and I definitely did not try to pull “fast ones” as often as some of these UofT guys). If you can land a TAship that is mostly tutorials though, it’s easy money baby.
Thanks for doing this interview, just one last question, if you could recommend one book to students considering going into distributed systems, what would it be?
The book I used to learn this stuff was “Distributed Computing: Fundamentals, Simulations, and Advanced Topics” by Attiya and Welch. It has a nice mix of theoretical and applied stuff. If you want to get into theoretical stuff, then “Impossibility Results for Distributed Computing” by Attiya and Ellen is definitely the go-to book.
If you have any questions for anonymous, comment below and I’ll forward them on.
If you’d like to learn more from interviews of people in different areas of tech (We’ll be interviewing a PhD in Computer Security, as well as a product manager, UX Designer, and startup founder), sign up for the fizzbuzzed mailing list and we’ll get these interviews to you as they come out.