What I've learned while job hunting
Disclaimer: Opinions are my own. Company names have been omitted. The goal of this article is to meditate on the current tech world interview process based on my recent experience.
Hi, I'm "bigo" and I've been building software for the past 17 years. It all started when I figured it was possible to write scripts that change the behaviour of mIRC 4.72 (the most popular chat client for windows at that time) allowing one to automatically kick users who were flooding a channel, run quiz games, serve files and manage pretty much anything that would act based on the input from other users connected to the same chat network channels (sounds familiar?). I was 13 and would spend as much time as needed to learn how to do all of that. I ended up creating a fairly popular script and hanging out (virtually, of course) with many other hobbyist programmers.
It did not take long for me to get interested in creating dynamic web pages with this thing called PHP3 that all the cool kids were using to create polls and banner exchange networks. Fun times.
I became a very proficient PHP developer. I knew the language inside out, fell in love with open source and was involved in the early days of Joomla! (back then it was still called Mambo). Fun fact: one of my old projects is still shown in “who’s using Joomla!” in their front page (and this was 10 years ago). Too bad the challenges weren't so great and I started to realize how broken PHP was mostly due to my contact with static typed languages — mainly C++ and Java.
I used to work full-time as a Java developer in a software factory customizing oracle products to fit the needs of multinationals. Everything was very hacky and poorly written since quality wasn't necessarily the main focus of that company. We would also charge hour customers on a per hour basis, so we were expected to deliver a lot and management did not want us to waste time with tests or refactoring (nice!). That's when I started to hate Java and Oracle. And anything "enterprise".
After my graduation, I moved to the beach and joined as engineer #1 in a very cool startup with no real clients that got some money to create recommendation systems. First time working in something really challenging, spending most of my day converting decrypting scientific papers and turning them into real prototypes. (Fun fact: This company has been recently sold for US$20 million and I got $0.00 because I was too naïve to talk about equity and I was doing all of that because I wanted to work with machine learning. Money was (and still is) just a side effect of my hobby).
I still remember their interview process: one skype interview with the CEO and a very technical three hour session with the CTO where I had to take "certification-like" java tests and implement quicksort and other classic algos in python. I will never forget that it also included an IQ test made in flash. I also recall doing really bad in the Java test but apparently I did well with my algorithms and IQ test and I got the job.
That's where I've met TDD, Agile and Python. I couldn't be happier with my life. It felt like I was finally becoming a better developer.
One year later [and 6 years from now], we were about to close our first huge deal and I came across a tweet from one of my agile/scrum heros mentioning he was building a cross functional team at "Y" (company names will be omitted since the goal is not to point fingers) in São Paulo and was in need of "ninja developers" (currently people prefer to call them "fullstack engineers") that could work with Python, PHP and JS.
I've quit before the on-sites (please don't do that, kids) and flew to São Paulo feeling that I would get that job. Luckily, I did. I had plenty of open source contributions and was working with machine learning optimizing KNN+SVD predictions to run in 4 hours instead of 2 weeks by making more data fit in 16gb of RAM. I felt my on-site interviews were more to see if I could communicate in English and if I wasn't a jerk to work with. Later that day, before flying back home, I had an offer. And that was it.
At that moment I was out of the market. From then on, my role in interviews would be the interviewer. I also stopped writing my pet projects and my rare contributions to open source projects were to the ones under the "Y" umbrella; partially due to legal reasons and partially because I felt it was a waste of energy that could be used to improve my company's product and tech. Big mistake. Pet projects. Never quit, kids. Seriously.
Our interview process
Well, I’ve always bragged about how cool our interview process was and how it worked. I helped hire some of the most amazing developers one could ask to work with: great problem solving skills and amazing team players. Our process consisted in a very strict resumé analisys (no code/github? you better have a PhD) followed by a one hour tech talk over the phone (no coding, only making sure people know how HTTP works, how database indexes work and what happens when you type a url in your browser, things that everyone that develops software should know). The next steps would depend on the role and level: sometimes the candidate would be given a homework and sometimes another 1-hour phone interview focused only on coding (classic easy problems to make sure the candidate did not lie on his resume, since we already checked their code online). We would bring the survivors on site and they would code for 2 to 3 hours to create a "production-ready" software with some simple yet tricky specs; alone, in a room with internet and free snacks. We would checkin every 40 minutes to check if he/she had questions, wanted to pee or was stuck compiling nodejs from source. They would then have a panel with 3 or 4 engineers in our team to present his solution and take questions. We would expect senior developers to have a much more elegant solution than new college grads and would not grill new college grads expecting to see acceptance tests since chances are they've only seen the theory of it.
If the candidate cannot elaborate on his answers, if he seems to be a jerk to the guy that is playing the role of a noob, if he did not write quality code in 3 hours, we send him home. If not, we have two or three 40 minute sessions with key engineers from the team and finally a 10 to 15 minute meeting with everyone involved to decide on wether we make an offer or not.
The type of problem varied according to the role. It could be an in memory filesystem that supports certain commands, a static file web server, a dynamic responsive CSS animation, something with infinite scroll.. etc.
<<Cut-scene to current days>>
I was happy at "Y" for the majority of the previous 6 years. I've met great people, made a few friends that I would actually invite to my birthday parties outside of work, was also making more money than I think I deserve. But I was also slowly loosing my interest in the products of the company and feeling demotivated by the amount of politics preventing us from having fun by shipping stuff. And then it happened.
In the beginning of the past year I got "drafted" to a secret project that was different than everything else the company has done and we would be working in a small team, no legacy code and we could use whatever we wanted. It would be rough and I should expect to work long hours in a "war room" and could not tell anyone about it. Including my former teammates. It felt like a great challenge and I could not wait to start.
Since this article is not about company "Y" thus I am just going to say that I burned out, had a few panic attacks and went to see a doctor who "prescribed" me vacations. I immediately took them (and still had a lot of remaining days to take). 10 days of stay-cation to put my life back on track, get new glasses, take my car to the shop and run all errands that I wasn't being able to run. I also restarted to study python after a few years just to check what was happening in the community. I was back playing with pet projects!
After this period, I realised that I've been happier writing a silly acceptance test tool for APIs than with my current project which would impact millions of lives and generate billions in revenue and would be the next great thing and bla, bla, bla. It was time to move on.
Once you complete your 5 year anniversary at "Y" they give you a two month unpaid-leave where you can keep your health insurance and all other perks except the money. Hence I would take this unpaid leave and go job hunting. I thought it would be more ethical to do this way than sending e-mails with random excuses to take the phone interviews. It would also be a good time to move back to San Francisco (and moving takes a lot of time!).
With everything planned on my mind, I spoke to my manager (one of the friends I would invite to my birthday) who understood and supported me. He mentioned how far the company could go to keep me, asked if there was anything he could do and said nothing would change if I decided to get back to work at "Y" after the sabbatical. His only ask was for me to stay until the launch of the first version. No problems. We've set the date within a couple months
I also told my team, one by one and unofficially, that I would be leaving after my sabbatical (BTW, this was a big mistake. If I did not get a job, I would be feeling like a pile of shit once I got back to the team). They are great and I wanted them to hear my reasons and let them know how much I learned and admired working with them.
It is San Francisco; there is a gazillion startups doing amazing stuff and desperately looking for engineers. It should be a piece of cake, right?
I went to Glassdoor and applied for a dozen of Senior Software Engineering positions. I also responded the latest 6 or 7 recruiters that mailed me through LinkedIn and created a profile on Hired.com. I've also worked on my resume since it was pretty dated but I've never been good with ego-massaging resumés, so I asked a friend to review it. I also started playing with AngularJS and Tornado for fun since I would have to wait until I got replies from my applications.
All of a sudden I was spending my days talking to recruiters and scheduling phone screens. During the intervals I would go to Ross to buy furniture for $15 to fill the new house.
My first phonescreen (which in the majority of the cases were a phone call and a codepad screen where they can see you coding) was with this startup I've never heard of. The interviewer went through my past experiences, took a bunch of notes and asked me to flatten an array recursively and interactively. Ok, no problem. Problem solved, talk over. Bye.
The next day I got a phone screen with "U". Fairly standard phone screen where I've been asked to implement a string rotation algorithm. Problem solved, talk over. Bye.
In both cases, I wasn't asked anything other than "Introduce yourself. Here is your code problem."
I've got an invite for the onsite at "U" the same week. I was super excited: my first onsite interview in 6 years.
When arrived to their HQ I saw a bunch of engineers touching elbows and pilling up in very expensive chairs. It was very loud and most of them wear headsets. The place was the definition of chaos and they couldn't find a room for my interview and when finally found, the recruiter stood at the door redirecting people that had booked that room to somewhere else. My first interviewer was great! We were discussing how to solve real problems they had in the past, how to optimize this and how to approach that domain specific issue… It was a very pleasant one hour conversation after all. He then lends me to a second pair of interviewers and that's when I started to feel like I was being raped.
They asked me to implement a balanced tree algo in the whiteboard. In one hour. Last time I had to balance a tree was 15 years ago in college. I remember I had at least a week to implement it. I struggled the rest of the hour trying to get as close as possible to a balanced tree. They left the room with a smile on their faces and I was introduced to another duet, they would cover the live coding. I could choose between a URL shortening system or something else that had interface design.. Of course I did choose the URL shortening. I was told I could not use the internet and struggled a lot trying to get my tests to run. It was clear for everyone that my Python wasn't fresh as it should. Once I got things running I was able to complete their task in a reasonably on time (with a not so great architecture design, tho because I spent 20 minutes trying to guess how to run all the tests, a 10 seconds search would have saved me from this).
My third interviewer did not read my resumé and wasn't much interested in what I had to say. He wanted to go straight to the problem. "I wan't you to solve this, that has been solved in the early sixties…" basically he wanted me to implement CUT, COPY and PASTE in a tape-based-text-editor where I can only move and store the position of the head and could print from any arbitrary point a certain number of chars but could not modify the contents of the tape. He spent most of the time trying to get me to understand what should I do and what I could/could not use. And I still don't know, up to this day.
Lastly I had a chat with one of their directors. It was a good talk but it does not matter since I knew I had failed. I just wanted to go home and take a shower.
I learned a few things that day: (a) If I wanted to get a new job, I should be better at puzzles and data structure implementations. (b) Expect close to zero high level architecture, OO, protocols, security, database, unix, tests, etc. questions. (c) All of my experience is worthless during the interview, even for a senior position.* (not really, as you'll see).
I realised things wouldn't be so easy and I was way underprepared for what they were expecting from me. It was time to work on my weaknesses and figure a new strategy. I had a little over one and a half month to find a new job and I still wanted to take my girlfriend to Brazil somewhen before the sabbatical was over.
I few days later I had a phone screen with "Z", one of the most hyped startups in SF. After a 5 minute conversation about the company and another 5 about me, my interviewer asked me to implement a game that is a graph where each player, during his turn, picks an unvisited node that is connected to a previous node that he owns (unless it is the first move, of course). I should write the game, the best strategy for player A and player B. In one hour. Over the phone. I was very good at explaining my pseudo code butI could barely write code to plot the board and the turn management by the time my interview was over. I failed big time.
I needed a new plan.
I dropped all my work with pet projects since having working software wouldn't matter if I could not solve brain teasers and you-will-never-have-to-solve-this-in-real-life-problem, bought the infamous CTCI book and decided that I would dance according to the song.
I also decided to organize my calendar so that I would have a bunch of companies that I knew I wouldn't accept offers [if they came] and would use they as a training for the cool ones, which I would leave at the end. I would also save some time to interview at big companies "G", "F" and "S" least. Not because they are cooler or easier but if I get to that point I would knew I don't have what startups are looking for and I should remain working in companies that would feel like a different type of "Y".
All of a sudden, interviews became easier as I learnt what type of questions would be asked. And I mastered the 5–10 minutes where I actually had my interviewer's attention to talk about me.
I got my first offer from a startup "C" with <50 employees. They asked me, for instance, to write a sudoku solver and calculate all permutation of a string. I had it fresh on my mind because of the book and puzzle sites I've been studying. I did not take the offer but it was a signal that I finally became a hireable guy. It was time to move to the companies I actually wanted to work on.
My next onsite was at another startup. Thy've a pretty cool office close to the whole foods, they're 250+ employees big, dog and art friendly environment. I got kinda nervous after visiting their HQ because after seeing it and talking to people there, it actually made me want to work with them and I could not screw it up this time.
The first three interviews were a 20 minute talk + 20 minute board puzzle. I screwed up big time by solving the wrong problem in the first interview (and my interviewer was mute 95% of the time, probably happy because I was going to fail) but apparently I nailed everything else. Their director of engg was the first guy among all of the people I've spoken so far that seemed legitimately interested in my work history. It went well but not so well…
Because of that first interview screw up, I was invited for a second day of onsites to talk to another engineer so that they could have a position regarding offer or no-offer. I was juggling at Yerba Buena when I got the call asking if I would be able to do it at that same day. I can say that I would not impress them by my clothing or perfume that day but I went anyways, I just wanted to finish and move on. It was a good interview, simple puzzle (moving median where he gave me the fancy probability function), and then just straight real life problem solving talk and I got an offer the next day, after a chat with the CEO and the CTO (yes, even after 250+ ppl, they still chat with new hires which I though was pretty amazing). It was 30K less than their technical sourcer mentioned on hired.com but the same has happened with my previous offer: they'll announce a huge amount of money just to get you to reply. Real life is not as exciting. I decided to say yes despite of that because I believe in their philosophy, values and potential. I also don't think I should use the mercenary hat as I am not switching jobs because of the money anyways. Hopefully this will be a long lasting relationship where I'll learn and grow with the company. I am officially not working for them yet, as I am writing this.
And that is how I've got a brand new job in 2016.
Here is what I've learned a lot during the whole process:
- I learned that I became over specialized in proprietary technology that is useless outside of my current company; that there is a lot of opportunity but companies prefer to discard a good hire than to hire a bad candidate (I am not suggesting that I am neither of these); that it is easier to go from startup to enterprise than the other way around.
- Looking back in the process I don't feel I improved too much technically. All I did was studying a book and a few websites that teach you what to expect from interviews and shortcuts to pass.
- A surprisingly number of interviewers wanted me to fail. Which does not make any sense other than ego satisfaction.
- I am very proud of our interview process at "Y". I feel that the process my team opted to use is better than the vast majority because it feels real and it assets candidates on a variety of day-to-day skills. The fact the we don't care if they use internet to solve the problem is a huge win IMHO, because that's what they'll have available on their day-to-day and all I care is someone who understand WHY he opted for using this or that.
- If I was a brilliant jerk, a sociopath or a go-horse developer that has no sense of OO design or best practices, I would pass 100% of my interviews.
- I also learned that applying on company websites is the least effective way to get hired. If you want to get an interview anywhere it must be through network-recommendation (being a friend of someone there) or recruiters (I heard those on-campus events also work.. but I am a dinosaur and don't attend to these anymore :P).
Good! You made until the end. Now I wanna hear your thoughts because life is not a one-way street.