The moment I realized I needed a CS Degree

A little more than two years ago, I was in London, UK and had just finished a 12-week hacker school. Rather than looking for a dev job during the course’s demo/graduation day (as is the norm at a hacker school), I was getting ready to move across the Atlantic to Vancouver, Canada to begin my Bachelor of Computer Science degree at the University of British Columbia. Here’s the story of when I realized a hacker school really wasn’t enough to get me where I wanted to go.

The story

It must have been something like Week 8 of the hacker school when I started thinking about applying for jobs and what my options would be at the end of it. I remember checking out a bunch of companies that used Rails in London and looking up sample interview questions on the careers section of their websites and Glassdoor. There were quite a few smaller independent firms that seemed open to hiring a hacker school grad, and their questions didn’t seem so bad.

At that point, I had just started to get comfortable with Sinatra and Rails and had probably built my first couple of web apps – a classifieds website for university students and a lowest unique auction site. And, as you do when you’ve just started to get the hang of a new field, I was thinking that I was getting pretty good – they call that the Dunning-Kruger Effect. I remember thinking that if things had worked out, I could have built a Facebook, I mean how hard could it be (building a scalable, secure and efficient system is hard as it turns out, and that’s ignoring the user acquisition and growth side of things).

But being the sensible person I am – I’m trying not to cringe as I write this post – I figured I should probably work there first. You know, get an idea of the finer points. Besides, I’d heard great things about the company from people who worked there. I’d even visited the office once before (the one at Page Mill Road I think) and it was pretty cool (free drinks, open plan office, Herman Miller chairs). So I checked out the careers section of their website and started trying to solve a sample engineering problem – back then Facebook had engineering challenges that you could solve to get contacted by a recruiter.

The sample challenge was to write a solution to the Tower of Hanoi.

Diagram of the Tower of Hanoi

Tower of Hanoi

As per Wikipedia, the objective of the puzzle is to move the entire stack of disks from one rod to another while obeying these rules

  1. Only one disk can be moved at a time.
  2. Each move consists of taking the upper disk from one of the stacks and placing it on top of another stack i.e. a disk can only be moved if it is the uppermost disk on a stack.
  3. No disk may be placed on top of a smaller disk.

If I remember correctly, the aim of the puzzle was to generate a sequence of moves which solved the problem.

Come again?

Yep, I had no idea where to even begin – and this was the sample challenge. The one that was meant to give you an idea of how to handle input and output, rather than being representative of the difficulty of challenges since the real ones are always a lot harder than the illustrative examples.

I remember doing some research on the Tower of Hanoi and discovering that it had to do with something called recursion – I only had a vague idea of what that was at the time. Most importantly though, I found out that this was a well-known problem taught in pretty much all CS degrees as part of their introduction to algorithms and data structures.

The more I read about the topic, the more I realized I didn’t know. My brief moment of (over)confidence in my abilities quickly evaporated and I figured out that knowing how to build a web application in something like Rails is not the same as being a Software Engineer – that building an MVP of a social network site is not the same as engineering one. The former can be done by following Michael Hartl’s famous Rails tutorial, while the latter requires knowledge of computer science and algorithms, hardware, growth, marketing, data science, etc, if the app is to stand any chance of success.

Doing the hacker school was great for figuring out that coding for 8, 9, 10, 11, 12 hours a day was something I really enjoyed, but most importantly, for learning how much more I still had to learn if I wanted to tackle really complex problems with code.

And so I looked around for CS degrees that took students with a previous degree. There were a couple of Master’s programs in the UK which seemed ok but a bit too short; most of them were only one year in duration and I didn’t think that was enough time to get a really thorough understanding of fundamental CS theories, plus they didn’t seem to have the top-tier tech companies recruiting from there.

The top CS schools in the US on the other hand, generally didn’t offer second degree programs. Some, like Stanford, didn’t admit students for second Bachelor’s degrees at all, while others like Waterloo required students to start from scratch and do a 4 year program.

And then I found out about the Bachelor of Computer Science (BCS) program at the University of British Columbia in Vancouver. It checked all the right boxes. It was shorter than a regular CS degree but not that short (advertised as 2 years, but 2.5-3 years in practice) and had good links to American tech companies (Facebook, Google, Amazon and Microsoft recruited its students) and had a decent reputation (something like 30 to 60 in World Rankings if you buy that sort of thing). And before I knew it, I was on a plane to Vancouver, Canada.

And that’s it. That’s how I ended up studying for a CS degree and how I kind of went full-circle this summer interning at Facebook – something I am certain I could not have done with just my experience at a hacker school, not by a long shot. It’s also been a while since I solved the Tower of Hanoi.

Here’s the code I wrote for it during my intro to algorithms class in my first year of my CS program – it’s probably a little rough around the edges but I remember thinking at the time I wrote it and solved the problem, wow, I’m really getting somewhere.

 

#include <iostream>
#include <string>

using namespace std;

void moveDisks(int, string, string, string);

int main(int argc, char* argv[])
{
  if( argc != 2 ) {
    cerr << "Usage: " << argv[0] << " n" << endl;
    return -1;
  }

  int n = atoi(argv[1]);
  moveDisks(n, "A", "B", "C");
  return 0;
}

void moveDisks(int n, string from, string transition, string to)
{
  if(n == 1)
    cout << "Move disk from peg " + from + " to peg " + to << endl;
  else {
    moveDisks(n-1, from, to, transition);
    cout << "Move disk from peg " + from + " to peg " + to << endl;
    moveDisks(n-1, transition, from, to);
  }
}

The Best Laid Plans Gang Aft Agley (often go astray)

I started the year with best intentions for this blog and then let it slide completely – my bad. When I left you last, it was the new year and I had a couple of big goals – the most important of which was landing an internship for the summer at a top-tier company.

And wow, that was an adventure to say the least.

Applying for a summer internship

Being based outside of the USA but interested in internships there made the application process hard. It wasn’t always easy to figure out who would sponsor a J1 visa for the internship and who wouldn’t (apart from the really big companies – they all do) and so there was a lot of wasted time with applications.

Even before that though, and the reason for why I took a break from writing this blog, is that I had an offer fall through after putting all my eggs in one basket so to speak. At the end of December last year, I found a really exciting top-incubator-backed startup that I was interested in and so I pulled out all the stops to get an internship there. When they asked for an answer to a screening coding problem, I gave them answers in three different programming languages. So yeah, I really went all in – even working on the take-home project on a sunny beach during winter break and fully-testing everything in a new language and framework which I knew fit the task, but which I hadn’t previously used.

Don’t count your chickens

And so… I was super stoked to hear that I received an offer from them in early January and was pleased that my internship search had finished. But on the same day I received a congratulatory fruit basket, the company withdrew the offer because they didn’t want to sponsor my J1 intern visa. And that sucked. Mostly because I heard back via email rather than a phone call, also because I was eating a chocolate covered strawberry (from the aforementioned fruit basket) when I got the message. And above all, because I’d been given lots of reassurance throughout the interview process that getting a visa for the internship wouldn’t be a problem.

But hey, I get it. It’s a startup and things change. You’ve got to go with the flow. And so the real search began.

Starting the internship search again

At this stage, I had a couple of interviews with top-tier companies lined up which I totally bombed because I’d spent so much time focusing on getting the job at the startup. Not great for morale by any means. Desperate times call for desperate measures and so I stopped going to a lot of my classes so I could focus entirely on interview prep (more on that in another post) and applications. I knew I had a really good GPA and could afford to let classes slide a bit.

I sent out a bunch of applications to companies I was interested in. Got replies from lots of them saying they weren’t hiring students from Canada just yet, and also a few interview invitations and a couple of rejections. It was really interesting to see companies taking very different approaches to resume screening – a few of them were really open to non-American schools that weren’t Waterloo (a top-tier CS school that is based in Ontario, Canada); UBC is a good school, maybe like 30 or 40 in the world (whatever that means) but not yet a great one. Equally, there were a few well-known companies who used keyword scanning and had automated rejections sent out – there is no way anyone can screen a resume at 11pm in an hour! The same thing happened to all of my classmates, some more qualified than me I’m sure, and that’s just lame.

And so I kept plugging away. I got pretty far with a well-known consumer review company but since it was late in the application process, they ended up adding extra rounds of interviews to the loop (without telling me!) and it ended up being a question of headcount – I think. It felt like they started screening people out not based on whether they passed the interviews or not, but on who was perceived as the “best” of the people remaining. My resume is interesting, I’ve been to a top-tier school, Cambridge, but not in CS and it’s hard for a UBC CS student to go head-to-head on paper with one from a CS school like Carnegie Mellon. And that kind of sucked because it felt like even being objectively good enough to be an intern at the company wasn’t sufficient, you had to be better than the other candidates (or at least perceived that way). But their loss perhaps, in any event my interest got a little killed by the acqui-hire who interviewed me in the penultimate round who really didn’t sound interested in working for the tech company at all! Not exactly a good sign.

But just when things started to look a little bleak, I received three offers in the matter of a week and a bit. Yep. I had offers from a pre-IPO Canadian company, a real estate tech company, and…Facebook.

The big two year bet

It’s funny. I set out on this Bachelor of Computer Science program at UBC two years ago with the sole aim of being able to get a job at Facebook, an internship being a great route into this, and I almost didn’t even apply there. I wasn’t sure if a big company would be a good fit since I’d really enjoyed working at Axiom Zen for my first internship and wasn’t a huge fan of the bureaucracy of the big company I’d worked at before going into tech.

Facebook was the last internship offer I received, and it was actually the first offer I got with the Canadian company that motivated me(?) or maybe gave me the confidence, to just go for it. I mean, what better way to see what a company is like than do an internship there, and well, it’s Facebook. And if you fail, so what, you have options. Nothing to fear here. Move along.

The resolution

I’ll save the application details for another post perhaps, but once I received the Facebook internship offer, I accepted it pretty much immediately. Truth be told, I was leaning towards the real estate tech company until the very end because of the small-team vibe it offered and I could see real value in their product –  but when you’ve got the chance to see what software engineering is like at a tech giant, one whose products you use day-in-day-out, and which you set out to work for two years ago and is the reason you realized you needed a CS degree in the first place (the Tower of Hanoi question I reference in this post was one I tried and failed to solve at the end of Makers Academy and was a sample interview question on Facebook’s career page), you’ve got to take it.

What now? Well, I have a bunch of unpublished posts that I wrote over the last few months which I’d like to clean up and publish. A couple on how the rest of the academic term panned out, why a CS degree was necessary to getting an internship at Facebook (a bootcamp is DEFINITELY not enough, don’t believe what they tell you), and some things I’ve learned over the last 8 months or so about how to get an internship and then make the most of it.

I’d better get moving. My last term (at least for fulfilling my program requirements) starts at UBC in a few days.