About 6 weeks ago, I applied for a Research Scientist role at Google Boston. Eventually I was interviewing for a Software Engineer role, given the way google work internally, I found this sort of role was definitely what I wanted, titles aside. I had 1 non-technical interview, 3 technical interviews and eventually was rejected for the role. The interview process made me revisit some basics of computer science and the preparation has helped me make some key decisions like: “the fuck do I actually want to do”.
Overall I’d say the experience was incredibly useful, the preparation for the non technical questions provoked some real soul searching and both preparation for and answering the technical questions was fun and engaging. Unfortunately the conclusion to the experience has left me confused as very little information is given as to what actually went wrong. Indeed nothing may have gone wrong… But I get ahead of myself, let us start at the beginning
I had already gone through the act of applying to a job at google through their online form once before. It isn’t a very good system. Firstly there are separate job search engines per country with no method of saying “yes anywhere really, just show me the cool jobs”. The google UK jobs site was in a completely different location to the US jobs site and there was no way to combine the results. Also their job search results “felt bad”. This isn’t as wishy washy as it sounds, there are reasonable metrics available as to why search results sometimes feel bad, but I’ll save you the over-analysis, just go try it yourself: think of a job you want to do at google, search for it, and see what happens. Also the act of applying to a given job is pretty awful. There is no way to save your details against your google account or anything like that. Every time you apply you are filling out the whole application again. The whole process is very manual, very old web, frankly very not google. It was by far the worst part of an otherwise well managed and thoughtful interview process.
My previous application fell on deaf ears, this one got through! Not entirely sure why, but I was contacted by a nice lady (we’ll call her H) and I started the first step of the process, proving to google I “has one of them there educations”. This seemed to be an issue as H was asking me things like “give me the list of courses you did on your PhD.” Now this doesn’t really make sense as during a PhD, (in an English PhD anyway) one does not do courses, well, not enforced and certainly not graded, I got the impression that they do in the states. Anyway, after some dancing around I got her my Masters grades and a photocopy (read: webcam) of my PhD certificate. Woo. She threw me to the main HR person I was talking to, let’s call her C. C organised a non-technical interview with me 5 days after her first contact. Right. Preparation.
At this point I started to read and prepare. Thanks to Paul I had a heads about about this book called “Programming Interviews Exposed : secrets to landing your next job”. I acquired a copy of this book and went about reading chapter 15, Non-technical questions. I had seen such questions before, I have had interviews before after all and they all use the same ones. But this time around, I actually gave them real thought. I felt like I’ve reached a point in my life where some real decisions need to be made, I’ve finished my PhD, I’m as qualified as I can be (academically) and apparently I’m an “expert in my field”, whatever one of those is. So usually bullshit questions like “What do you want to do?” sounded a lot more like “What do you think is important?”. How DO I like to work?
Why change careers? Now that was a big one. Is academia that important to me? Does it matter as much as it used to. It is still a current question, even now after the interviews I’m still thinking about it. Though I have to say my current decision is “yes, academia is very important to me”. I want to be an academic, I believe I would be willing to leave academia, but I am not going to leave it for arbitrary company or random startup. But google… seeing the work they do, seeing the things they create, reading the papers they write… yes, I’d be willing to leave for google.
So anyway, after all this soul searching… the non-technical interview didn’t really need any of it! Mainly C was trying to figure out what I wanted to do at google, but not in philosophical way, but more in a “no seriously what do you want here because then I can throw you to the right people for the next interview.” We talked about the boston office, we talked about what they do, I realised they do a lot of work on google images there and that confirmed I’d made the right choice in terms of office. So yeah, that went by pretty quickly and a technical interview was booked for 2 weeks after the non-technical interview
...shit…
What the fuck is a data structure?
I kid, my day job though research is actually quite programming heavy. I have to think about data structures and efficient algorithms for “shit tones” of data all the time. But I decided to just hardcore it. I treated the technical interview as an exam, I treated the programming interview book + google interview blogs as the answers. I went through the book 3 or 4 times programming each question in Java, C and python. Though no question was impossibly hard, I’d be lying if I said I found them all trivial. I had to think about some of the recursion stuff, The concurrency stuff though something I deal with daily was quite difficult to do from scratch. In short I’d recommend the procedure, I feel like I’m really on top of my basics now and it has made me much more confident in some of the programming I’ve been doing recently.
I also googled around for google style “puzzle” questions, four light bulbs in a prison on a rickety bridge that needs a candle to cross while looking at a clock with 10 numbers instead of 12. That sort of shit. While revising those I felt a little resentful. I couldn’t help but think that: if a tricksy bullshit weird thinking puzzle question is going to be the thing that decides whether I get a job or not, frankly, I don’t want the job. I appreciate the link between “thinking strangely” and engineering problems. But let us please be honest for one second, solving a puzzle and solving an engineering problem are NOTHING alike. The interview book’s strategy was a good indicator of how different the two kinds of thinking are. “The obvious solution is almost never the right one”. What? Well I’m sorry but a well implemented obvious solution often is EXACTLY the right one, so please fuck off with your puzzles. Revised them anyway of course, lots of good websites for this so just look around. It turned out google’s technical interviews don’t involve any of this horse shit… but I get ahead of myself.
Finally during this two weeks I tried to get a feeling for other people’s experiences. What had other’s been asked was a hard question to answer? Finding this out laid one of my main exam revision techniques dead on arrival, google don’t like you telling other people EXACTLY what you were asked, so yeah, it isn’t really out there. But regardless, how people felt about their application process really made me feel better. Also I gathered together some key correlations of people who failed/succeeded, and why they failed/succeeded (rather, why they THOUGHT they failed/succeeded.) and from this I tried to get a little strategy together. Some points on the strategy included: “windows only” programmers seem to fail royally; asking questions of your own and starting a conversation is good; think out loud while answering questions (well I could try THIS but that might break so I’d give this a go, but if that happened then this then that then RARARAA) is good. So yeah,
Two weeks passed, every evening and weekend was spent doing the above. I have to say that since my PhD started nothing has been as prescribed, as obvious, as formulaic as this. It was hard work, it was perhaps a little tedious at times, but there was a goal, there were clear tasks and I was bashing through them, notably improving at the tasks as I did so. I’m not sure I can explain exactly to what degree a PhD is NOTHING like this, so in a sick way this felt really good.
Anyways, the technical interviews happened next. I had been booked with 2 technical interviews in a row by C’s receptionist (she was called R). On paper this would take 2 hours chatting over google talk, 45 minutes + a gap * 2. Fine. It all kicked off at 19:00 (mid afternoon boston time). My first technical interview went very smoothly. His name was P, and he worked on youtube. We had a really interesting discussion about streaming content and he asked me about my PhD. Then the technical questions themselves. I’m not supposed to give specific details, but I’ll just say one thing: The questions were fair. All of them, not just P’s. They were things I feel that someone who calls themselves a programmer should know, and know to a high enough degree that they can have a little chat about solutions, alternatives, possibilities for extension etc. P’s questions were about arrays… how best to do a thing to them when the arrays were small, large etc. The complexity, the run time costs, the constant time costs. All this sort of stuff. Then he threw one at me about trees, same sort of deal. I should make it clear that this wasn’t just verbal. There was talking over google talk while writing the code to solve the questions in a google docs document. Google. Docs. Writing code in Word. Can you fucking imagine? Slowest coding EVER. Practise this, practise the balls off it. You will be about 1/2 your speed as compared to your favourite editor and it will stress you out. This I promise. So the general flow of this and all the programming questions were that I was asked something, I explained my tactic, I started coding all the while telling them exactly what I was thinking as I went.
Anyway, that went well… the second interview was less smooth on all counts. His name was D. Firstly D’s mic was broken. To address this I ran around the lab trying to find the land line number for the phone in the room I was in. Eventually he found a webcam with a built in mic. This whole faff meant the 20:00 interview started at 20:30. His question was also much more involved than P’s. A problem which felt similar to some computer vision algorithms I have addressed in the past, but also his style was very different from P. He didn’t ask me to code right away, instead we sat down and dissected the problem, literally as though he didn’t have an answer and we were just bashing through a problem on a white board. I was trying to keep the conversation going the whole time but solution took me a while to come up with. I was getting a little bit flustered but all in all I think it went well because of how I explained myself. My final solution was correct and NEAR optimal (I checked after the interview) but was not optimal (the optimal solution was actually very tidy, it was quite pleasing to figure it out later). D asked me to stop coding after I had most of the structure for my solution there and asked me some questions about what I liked and what I could do. I asked him bits and bobs about google boston, about google images specifically and what the guys in boston did towards that. Though not as good as it could have gone, I still felt good about the outcome. Basically: though my solution wasn’t the best it could have been, I felt I held my own in terms of how I worked with him to solve it and how I explained the solutions I was trying at each stage. I got the feeling D thought it went well also. The interview ended at 22:00. So after 3 hours of telephone interviewing and programming I was done, and in all honesty feeling a little spaced out.
Now, according to my research, google telephone interviews (of which there are usually 2) are often proceeded by an on site interview at which point many, many people fail. Like we’re talking 90% get 2 technical phone interviews and get an on site interview, then 90% of those are told nicely to go away. For me it was different, C contacted me 2 days after the interview and said she needed another technical interview. Now my only thoughts were over how I tackled the D’s question… did I bullshit too much? don’t think so but I think I… (insert 40 minutes of introspective jibber jabber, analysing every WORD I said to him that eventually gets to the conclusion that)... so I don’t think it went ALL that badly
But anyway, tech interview 3. It was 5 days later. I gave myself another weekend of preparation, but finding any more time was quite difficult as the interview turned out to be the last week before I went on holiday which was ALSO the week of a 3 day group activity where we worked on an awesome project, which ALSO involved me giving a hadoop workshop which… left me rather busy. I mean I was working like 12 hour days followed by 3 hours of prep. As you can imagine it was an interestingly stressed time.
But the interview happened. It was at 19:00 on a wednesday. My interviewer was Q. This one started very very strangely. Firstly my interview insisted we talk briefly on the phone instead of google talk. The phone in the room I was in was very crackley and quiet. I heard his questions well enough though, turned out he worked on the search engine algorithm itself and we had a really interesting conversation about search result freshness. I thought some good points were stated and he seemed satisfied. On with the tech interview.
What? You want me to put the phone down? I should communicate with you while I write the document? So I’m coding in the same place that I’m telling you what im thinking?
Fuck. Had not prepared for this, but ok lets go. This was fucking hard. Not his question, his question boiled down to understanding how a particular sort algorithm works, I thought I tackled it correctly. But the format. He asked the question and I wrote a paragraph explaining what I would do to solve this. No feed back… tick tick tick… “yes this is correct, implement this.” I mean wow, I had no idea how much I was relying on the conversation format of the other two interviews. It was so hard to gauge whether he even thought I understood the problem, let alone whether I was approaching it correctly. But I persevered. I started to code, and realised I should be telling him what I’m doing as I go. I tried to do this in the format of comments, but this was SO HARD. Try it yourself: Sit down and start coding, then every second line before writing the code write a comment. But not a normal coding comment “This does this, this does that”. But a “ok now I’m going to try this, but I understand this and this might be a limitation, but let us see where it goes”. The process was breaking my flow CONSTANTLY. What I was totally happy saying out loud, I found near impossible to stitch into the very code I was writing. About half way through my implementation I had had enough, I pleaded with Q to let me talk to him on google talk, I couldn’t give him the best answer under these conditions. He said ok and we got on google talk. We had the rest of the interview and I finished my implementation, allowing for some fringe cases to boot. It was easy once I could talk!
Those were the interviews! Done! This time C did not reply for a week or so. I then got a very polite and positive email which basically said, thanks, but no. Try again later. At this point I was in the middle of my holiday in Germany and on the road our driver and myself had picked up a little stomach bug. No big deal, felt better after 1 night, but still… stomach bug + bad news made for an interesting bout of nightmare filled sleep. I emailed C back thanking her for the opportunity and asking whether there were any specific things she thought I needed to address to be successful in my next application. She said she couldn’t, but said that many candidates have better chances with a second shot as they get more coding experience, more industrial experience. She also said a reasonable grace period for the next try was like… 6 months… 12 months.
This final paragraph was the reason it has taken me so long to write up this experience. I realise the competition is hard, and that rejection could be as much luck of the draw (as compared to other candidates) as anything else. But I still don’t have a good conclusion, I’m not sure how to end this write up. I have reasonable programming experience, and to augment it I have a reasonable portfolio as a junior academic. I worked hard for the interviews, the technical interviews went well, and the parts that went worse I felt I handled effectively. So yeah, basically… I’m not sure what actually went wrong, and I know that is going to bite at me for a while. Friends who are now interviewers for tech companies themselves tell me not to read too much into it, and that getting new people especially in a place like google is pretty competitive. It is a shame though.
On a brighter note, I count this interview process as a really valuable use of my time. I feel my basic technical knowledge has gotten a proper refresh. Also, I feel like I’ve seen a glimpse the hardest a tech interview can get, and I found it quite fun actually! But perhaps most importantly I feel the time spent thinking about what I want has given me enough confidence to make some key decisions about the direction I want to go in the future.
Firstly, yes, I still want to work at google. They do the most exciting applications of what I feel is the most genuinely important technology research in the world. But I feel this experience has lead me to draw the line here in terms of academia vs industry. So secondly, I will not be leaving academia for any other reason but joining Google (or MAYBE Yahoo or Microsoft research, those guys are doing pretty hot stuff too). I’ve applied to some other industry guys, a startup here, a company there… and I might even follow through with the interviews just for completeness. But I will not leave academia for them… I just don’t think it is worth it.
More industrial experience? Why? My research is very application driven, I am a lead developer on an open source computer vision library which I really care about, that will have to do. I code like 60% of time, the other time is spent reading or writing; researchy things that I’d want the company I was with to care about anyway!
I refuse to spend my time doing anything but what I am passionate about. I know I can bring myself to care deeply about a lot of kinds of research, both in my field as well as in related fields. I know, however, that I cannot become passionate about coding for revenue’s own sake. Indeed, this application driven approach to tasks I feel are important was an attitude I made abundantly clear in the interviews, so perhaps that was an issue it itself?
Meh… enough of that. The bottom line: Important research lead work first, money will follow in its wake. I feel Google has this attitude, I don’t feel many other companies do. So post docs and other academic roles for now, and I’ll roll the google dice again in a year or so.
Anyway, back to the research mines :-)