My ThoughtWorks Interview
or “How I stopped worrying
and learnt to love the interview”
Recently I applied to ThoughtWorks as a Technical Lead, with the thought of “I’ll give this a go and see where I get”, without thinking too much about it. Once Natalie, the recruiter got in contact I thought I should research into what the recruitment process actually entails…
Oh dear…
I was confronted with articles on the “The 25 Companies That Give The Most Difficult Job Interviews”, where ThoughtWorks regularly featured in the top 3. I found stories upon stories of people being grilled during interviews or their code was good but failed for other reasons. What have I got myself into?
As I read through the articles and peoples experiences I realised that there was quite a set out recruitment process, consisting of around 8 separate steps. I thought that regardless of my journey through the process, I’d write up my experience. So here goes…
“If at some point you don’t ask yourself,
‘What have I gotten myself into?’
then you’re not doing it right”
- Roland Gau
Step 1 — The HR interview
First of all I was to have a phone call with Natalie to gauge who I am, what my background experience is and what sort of things are important to me as a developer. I was asked things along the lines of “What are the 3 most important qualities of written code?” but also questions relating to their Social Justice pillar such as “If you could help any charity what would it be and how?”.
All the questions are relatively straight forward and appear to mostly be for weeding out the very weak candidates. Natalie was very friendly and explained the next steps. At the end of this session I was told that the next step would be a technical assignment…
Step 2 — The Coding Task
This was what I was quite looking forward to, I’ve done things such as Project Euler in the past and quite enjoy working on abstract technical problems. I was given 3 potential tasks to choose from, however instead of abstract technical problems (à la implement BFS across a tree) they are problems in plain English that need to be interpreted. More akin to what you would be given in a client brief. Each problem explained what my solution should achieve and provided example inputs and outputs.
I’m not going to go into what the problems were — if you look hard enough you will find them — however they are all relatively straightforward at first glance, but require a bit of thinking to fully solve the solution. The first of the problems looked like it was asking for a Dijkstra implementation, the second was based around bin packing and the third appeared to be a parsing problem. None of the questions explicitly stated these solutions, it is up to the candidate to propose these.
I went for the third as I was applying with Scala as my main language and I could see how Scala’s Parser combinators would make the parsing solution quite elegant. My main issue was that the week I was given the task I had very little free time to come up with a solution to the problem. On the Friday evening I dug in to the problem and worked till the early hours to finalise my solution.
I’d say that this task wasn’t as hard as I’d been led to believe. I tackled it as I would in my current job. Write down any issues and assumptions in a document to form the basis of a technical specification. Ensure everything is commented and explain things out of the ordinary. Try to keep your methods small, ensure you are taking a TDD approach etc...
But most of all I tried to show off some of the things that I think are important in good code and to throw a bit of myself in there. For example I took a functional approach using pure stateless methods and higher order functions throughout.
This was a kind of risky approach as I know ThoughtWorks are a very OOP/TDD led company, but I figured I could quite easily defend my choices. Also I felt that this is the way I would want to develop. If this isn’t what they are after then ThoughtWorks isn’t going to be the place for me.
In the end I wrote a Maven build file to package up the application and run the tests and documented how it should be ran and submitted it to the HR system. I was contacted shortly afterwards to be told my code was accepted and I was through to the next round, where I would be having a technical phone interview with a Senior Consultant.
Step 3 — Technical Interview
I’m not going to lie, this interview I was extremely nervous about. I’m used to talking to other senior technical personnel in my current role, often having to defend my technical decisions. However this was different, I wasn’t sure what to expect and it could quite easily go wrong. Others with more experience may have different thoughts on what constitutes a good architecture or solution.
The phone interview was setup between 13:00 and 14:00 to coincide with my lunch break, so I nipped to a nearby hotel and setup ready for the call with a big bottle of water as my throat gets terribly dry when talking at length during these things. 13:00 struck and I received a call from James Lewis, someone who I was already familiar with.
The interview went as you would expect, talking through some of my past experience, going through some of the more exciting projects and larger architectures I’d built. My nervousness showed, as certain points I rambled on about projects I’d worked on without really answering the question. However James was happy with my answers, we talked about the advantages of Push vs Polling systems, CAP theorem, why I architected systems in a particular way and so forth.
By the time 30 minutes had past it became less of an interview grilling and more of a pleasant conversation about different technical approaches. I got the opportunity to ask some questions and James said he’d hope to see me in the office shortly. At the end of the conversation was a mixture of relief and elation. I felt it went well and again I was shortly informed that I was through to the next round, a round of written assessments in the ThoughtWorks Office as well as a day of interviews.
Unfortunately as I am based in Manchester and the only available Scala developers were in the London office it meant I needed to come down to London for the day. Natalie and Adriana (another recruitment contact) had arranged all of my travel on my behalf and everything went very smoothly.
Due to the fact I was traveling down to London and back in the same day, I wouldn’t have enough time for the written assessments as well as the interviews. I would take the written assessments in the Manchester office and then travel down to London for the face to face interviews later in the week.
Step 4 — Logic, Wonderlic & Predictive Index assessment
First of all I was given a Predictive Index test that I could perform in my own time online. It’s simply a 2 checkbox based questions with many answers that indicate how a person might best react in certain situations. I never saw my results to this but it took 10 minutes and didn’t look like an indicator of skill more a psychological test.
I headed over to Piccadilly Tower where the Manchester ThoughtWorks office is on the 26th Floor with some fantastic views over the city. Once I got to the door however, I was somewhat perplexed with how to actually get into the office. There was a doorbell on the right hand side that didn’t appear to do anything but the door itself was locked with no visible key or pass-code… I was checking to ensure that this was the right floor, that I had the right time, or if this was some elaborate part of the logic test. After about 3–4 minutes trying to knock on the door, pressing the non-functioning buzzer, I realised there was an intercom to the left and felt rather stupid. Just want you want before sitting a logic exam…
My first test was the Wonderlic test, having never heard of these before I looked them up prior to coming to the interview. There are a few you can try yourself online. They are basically a mixture of mental arithmetic questions, language questions and logic questions against the clock. You have 12 minutes to get through as many of the 50 questions as possible, and I am terrible at them.
During my practices prior to the interview I regularly got between 14 and 20 correct, which is abysmally low. I’d read somewhere that you require 30 to pass, although I have no idea if this is correct or not. Needless to say I was worried when it came to the actual test. However for what ever reason I found the test I was given to be simpler than the ones I had done online. I managed to get through around 35–40 of the questions, but I have no idea how many of those I actually got correct.
After the Wonderlic test I was then given the Logic test. This appears to be a series of 12 questions based around flow diagrams to test a mixture of your ability to follow simple instructions, ability to intuit and quickly reason about how a system is working and to debug how systems work.
I was actually very impressed with the questions overall. Usually these kind of questions I feel are pointless and don’t actually indicate much about programming skill. However I felt these really did get to the crux of what you do as a developer regardless of what language you are developing in.
My advice here would be to use all the time you are given. It is very easy and simple to miss a single instruction or place the right number in the wrong box and get a totally incorrect solution.
After my Logic test I was shown around the office, the Manchester office is somewhat small and appears to be more of a satellite office as opposed to a main hub like the London office but regardless it looks a lovely place to work.
Step 5 — Pair programming exercise
So later that week I headed down to London for my afternoon of interviews. After finding the office, located pretty much in the very heart of London and a stones throw from Chinatown, I was greeted by Natalie — my Recruitment contact — and taken to a small meeting room off the side of the main office.
Here I met two developers, who I’m ashamed to admit I have forgotten their names (I’m genuinely terrible at remembering such things.) They already had my code up in IntelliJ that I developed in Step 2. After our introductions I walked them through my code, the overarching ideas that drove my design and the way I approached the problem. One of the developers had just come off a Scala based project and the other wasn’t from a Scala background but had extensive Java experience.
I was quizzed on if I would refactor any parts, or take a more OOP approach instead. It was pointed out to me that there was one method that was rather long which would do better for being broken down into several smaller methods. But overall they had no major issues with the codebase itself, they just wanted me to give my understanding and show my reasoning as to why it was developed in this way.
It was interesting to explain my approach, especially to someone who isn’t quite familiar with Scala. It was nice to be challenged to explain why I feel simple immutable Case Classes are “better” than more traditional stateful domain objects.
From there we moved on to adding a new feature to the problem, this was done in a pair programming style where I was driving and the two ThoughtWorkers directing. There were a couple of tasks, however I’d already done the first as part of my implementation. As we were in an interview situation I tried to vocalise what I was doing more than I would normally. There was one issue where the code repeatedly failed its tests but it was essentially down to a silly mistake in the test itself.
Once the feature was implemented and the tests passed I was told a bit more about their day to day work. It was explained that the people performing interviews today were “On The Beach” as they put it. Basically when you are not on site at a client you are back in the office working on various tasks, one of which being performing interviews. I was then given the opportunity to ask them some questions but beyond that the session went well. On to the next interview!
Step 6 — Cultural Interview
The cultural interview is slightly different to your normal interview. Prior to the meeting I was told to prepare some notes on a major news story from the past 3 months and read several news stories on the subject. I choose to take a slightly different angle and took a news story that I thought was important but wasn’t covered by the news hardly at all. It was a somewhat risky move as it wasn’t something black or white but something I thought I could have a real conversation about.
The interview this time was again in the same room but with two different ThoughtWorkers. Unexpectedly this turned out to be one of my favourite parts of the entire process. The opportunity to talk about wider politics was surprisingly refreshing. Especially when your views are being challenged and you are expected to backup your points with knowledge, experience and understanding.
I felt my cultural interview went well and we finished 15 minutes early, I was given the opportunity to grab a drink and wait in the kitchen area. While waiting, my next interviewer came through to grab a drink and struck a conversation with another ThoughtWorker along the lines of “Sorry can’t chat right now, I’ve got to conduct an interview in 5 mins and I’m totally unprepared!” At which point he turns round to realise I’m sat just opposite and we have a laugh about it all.
During my entire time in the office I get the feeling that the atmosphere is generally quite relaxed despite everyone working hard.
Step 7— Technical Whiteboard Interview
And so on to my final interview of the day, the Technical Whiteboard interview. This interview was with Kornelis, a Technical Lead from the Melbourne office but was working from the London office currently. It’s actually quite common for people to move between the offices assuming your skills are applicable.
We jump into the Technical Interview explaining my background and going into detail on some of the projects I’ve worked on. I draw out a top level architecture diagram explaining a few platforms I’ve worked on. From there we talked about some of the challenges as a Technical Lead and how I approach common problems, what I look for in good design and code as well as different methods of dealing with different types of clients. He had just come off a Clojure based project and explained some of the challenges of on–boarding the incumbent technical team.
Again it was a really rewarding interview, getting to talk through some of my work and talk problem solving is the sort of conversations I really relish. However by the end of the day I was exhausted. It was around 18:15 when I got out of the office and I needed to be on a train at 19:00 back up to Manchester. After an afternoon of pretty much non stop talking and having to think on my feet I was exhausted. I’d hoped that this was the last step, that I’d hear back if I’d got the job and that there wouldn’t be anymore interviews. However there was still one final step, the Senior Management interview.
Death will be a great relief.
No more interviews.
- Katharine Hepburn
Step 8— Senior Management Interview
Now the Senior Management interview was somewhat of an unknown to me. I had a good idea of what all the previous steps would involve however I thought this was more of a “box checking exercise” to ensure that Senior Management get to see the new people. However it is far far from that.
I was to have my interview with Jeremy Gordon via remote video as he works over in Chicago. Occasionally you come across someone who you can tell is exceptionally intelligent. Jeremy is exactly that but on an entirely another level.
Our interview opened and I was given the opportunity to ask several questions. After my questions we quite an in depth conversation covering things across the practical, political and philosophical spectrum. To all of his questions there was no strict correct or incorrect answer, it was more to tease out my thought process. To try and get to understand how I think and if my high level ideals are in line with what ThoughtWorks looks for and stands for.
It was an exceptionally tough interview, and I came out of it not knowing if I’d done well or not. By the end of it my head was spinning, and was unsure if I’d got through. I was worried that I floundered on some of the questions, that I’d somehow messed up my final interview.
Step 9— Final feedback
Shortly after the Senior Management interview I received a call from Natalie…
I was informed that I had done fantastically throughout the entire process and they would like to offer me the position of Consultant Technical Lead at their Manchester office.
*sigh*
After what was a 9 week interview process from first sending in my CV and cover letter to receiving an offer I could finally breath a sigh of relief.
In reflection at various parts of the process I was a mixture of worried or nervous. However I always came out of the interviews feeling enthused and excited. Even the final interview was enjoyable despite being as tough as it was.
Throughout the entire process everyone was exceptionally nice and welcoming. People were genuinely interested in getting to know me rather than just grilling me.
The thing I kept reading about the ThoughtWorks interview process is it’s “hard” or “tough”, but I prefer the term challenging. At every point in the process you are challenged in different ways. However it is up to you to rise to that challenge. If you’re up for a challenge and enjoy pushing yourself to do better then get in contact, perhaps you too, will stop worrying and learn to love the interview.
I’ve since accepted the offer and I’ll start at ThoughtWorks in October 2015. I’d like to thank Natalie and Adriana over at ThoughtWorks for their encouragement and helping make the entire process as pain-free as possible.
*Update May 2018*: Looks like the internal hiring process is changing, the above may or may not be the process you go through. YMMV.
*Update Aug 2023*: I’ve since moved on from Thoughtworks and joined Kraken Flex