Hi all!
Disclaimer: this article is a follow-up to my article of 5 months ago, where I shared my experience of getting rejected at Google for the 2nd time. All my preparation and strategy is described there. So I would recommend reading that one first for those inputs.
I also won’t be sharing exact questions and problems, but this article can give an overall idea of what to expect.
Disclaimer #2: initially this post was designed to be a follow-up and I thought it was going to be short. Unfortunately I seem to be incapable of writing small articles, so please be aware it may be quite a long read.
My profile summary:
Interviewing:
So as I mentioned above, I am writing this article 5 months later after my previous one where I shared my Google experience. In the comments, I was asked about what I am going to do now - since I was in good shape, should I maybe try other FAANGs? Or what is the plan? I kept responding that I don’t want to go to FAANG just to be there, I want to actually have some feelings for the company I am applying to, and the only one besides Google was Apple. Before those comments, I never seriously considered it since this would mean moving to London which was not exactly what I wanted. But at some time, I decided - what the hell? I will try applying and go with the flow. So here is how it went.
Disclaimer #3: the recruiting process at Apple may differ a lot from team to team. It is not as in Google / Facebook where there are generic interviews, and later a team match. In Apple, you apply to the exact team / position, and that defines the hiring process. So whatever I write below that happened to me may turn out to be completely irrelevant to a person applying to some other team / department.
Disclaimer #4: I like disclaimers a lot.
December 2020, 1st week: an acquaintance of mine referred me to Apple. I don’t know whether it meant something - the only notification I got was that I had been referred, and that I should still apply on Steve jobs portal. I applied for 5 different vacancies which were more or less matching my experience and programming language (Java).
Mid-December 2020: A recruiter approached me via e-mail and asked if I was open for a 30 minutes chat. Of course I was.
So I’ve joined the 30 minutes chat expecting for it to be a standard recruiter call about my experience/motivation/etc. Suddenly, a guy started asking me technical Java questions. Only at that moment did I realise that this round was already going to be technical. I didn’t prepare at all, as in, completely. Luckily, the questions were not really difficult and mostly open. We spoke about lots of things - starting from Java, continuing to algorithms and touching system design and just programming languages concepts. Later I also realised that he was a manager / team-lead of the team I was applying to.
The only feedback I got from the recruiter was that they are ready to proceed to the next round. Since Christmas holidays were coming, we had the next round only in the beginning of January.
The 2nd round was with the same person, but for 1 hour. This time the question was more specific and closely related to whatever the team was doing at the moment. Basically, I had to suggest and implement an algorithm for solving quite a widely scoped problem. I asked lots of clarifying questions to understand if my assumptions were valid, and basically added several constraints to be able to narrow the problem down to a heap question. Overall, I think I spent about 30 minutes figuring out the exact algorithm to write, 10 minutes on implementation and the rest of the time - to test and discuss the alternative approaches.
Again, the feedback I got was just that we are proceeding further. And so we scheduled the virtual on-sites.
As part of refreshing my algo interview skills for on-sites, I scheduled again a couple of mock interviews on one of mock interviewing websites with Apple employees. It is the same website I used for Google preparation (see previous article for reference). I used it to ask questions about how hard the algo problems usually are, whether to expect graphs (because LeetCode Apple section suggests that graph problems are not popular in Apple interviews) and so on.
The onsites consisted of 3 rounds. I didn’t know in advance if there was going to be system design, or only algos, or maybe some Java-related stuff, and when I tried to clarify this with my recruiter, he said that they are not too restrictive on this since the interviewers go with the flow. So basically I was mentally preparing myself for everything.
Another fun thing to mention here is that all but one of the onsites were in the evenings. There was no option to reschedule them to be in the morning, since most of the team is sitting in Cupertino. I know my brain doesn’t really work that well in the afternoon, so the whole interview process I was not expecting much from myself. Maybe that helped?
This round was again with the team-lead and with another person from the team who was the main interviewer. The problem was an algo one, it is there on LeetCode and it is a BFS one with medium difficulty. Implementing it was pretty easy, even though I hadn’t been practicing graphs - just because it was a typical BFS. There were some follow-ups where the interviewer wanted to hear about bi-directional BFS, but I didn’t need to implement it. I liked the interviewer, it was a pleasure to communicate with him, and I also saw he really wanted for me to feel comfortable.
This round was in the evening, there were 2 interviewers. It also turned out to be a plain algo round. I was asked 2 questions, 1 required topological sorting and another one was more of an “Other” section, but also quite common on LeetCode. It was interesting to implement both and answer the questions. One of the interviewers told me he was impressed with my solution to the second problem, which was very nice to hear. Overall, I again got a good impression from communicating with both of the interviewers.
This round was postponed to the next day, since I didn’t want to take more than 1 interview in a row in the evening. It was a system design problem. When I was preparing for a system design interview at Apple, I had the information that they don’t usually ask “classic” questions like design Twitter, web crawler, etc. What they do ask is either a question based on your experience from the resume, or a real question that the team works on and has experience with. And indeed, it was not a classic problem, but rather one that required more thinking. I quite struggled on this one, trying to utilise all the things I’ve been preparing, and improvising at the same time. Overall, I got the impression that I nearly bombed this one, but maybe there were a couple of good things I said that made the interviewers take the positive decision.
I had to wait for maybe a week and a half for the feedback. I was surprised to hear that there are going to be more interviews - somehow I thought that this is the end, and I would be either hired or rejected. And these are not additional interviews like in Google due to not enough signal, but just another onsites.
Just as with part 1, I had little to no information about what is going to be there, so I was brushing up my knowledge of algo, system design and Java at the same time. Guess what I got? OOP!
This round consisted of 2 questions, each taking approximately 30 minutes.
Problem #1
The first one turned out to be an OOP-design question, which is quite popular on the internet. The day before I had been preparing for system design, since I didn’t know what the interview was going to be about, and I had checked one OOP design question as well to get the basic concepts. Basically, one needs to clarify the scope, define relations and then create basic entities [classes]. Since this is pretty close to real work problems, it doesn’t sound really challenging. However, I struggled a bit when I was asked to implement some custom piece of logic where the classes intersected. The interviewer looked satisfied though since this implementation was required just to check that my model correctly defines all the relations, and that necessary functionality can be achieved using the structure I suggested.
Problem #2
The second problem was a plain algo one. I was asked a question which is there on LeetCode, and I usually solved it using recursion and ignored the alternative iterative implementation justifying it with “well, nobody’s gonna ask me explicitly to implement it iteratively, it doesn’t make much sense”. You guessed it - of course I was asked to implement it iteratively, and my poor attempts to avoid it with “well, recursion is simpler to implement, and I prefer simplicity and readability in production code” were rejected with a polite smile.
And so I started implementing it using a stack, and suddenly I started struggling. I understood that it had been 5 minutes of me saying pretty much the same words and not really writing the working code. Cold sweat started flowing down my back and my face. Since things were going bad, I remembered one hack, which I had used once in some of the mock interviews - this hack is not exactly recommended, but most interviewers are completely fine with it. What I did was I explicitly said: “hey, would you mind giving me just 60 seconds when I won’t talk and just think? I kind of need to concentrate”, and they had no objections. So I covered my face with my hands, ignored the camera and people waiting, and sat thinking as if it was a LeetCode contest when there is nobody around and it’s just me and my coding problem. Suddenly, it hit me - of course, the invariant should be that the leftmost child is in the stack, so when I do a pop, I visit the current node and add the leftmost child of the right child of the current node. So simple. So I removed my hands from my face, thanked the interviewers for waiting, and coded it pretty fast. I had several minutes left, so I tested it on some cases including base ones, and it seemed to work.
Overall, once again I had a nice impression of the guys interviewing me. They both seemed nice and helpful, engaged in the conversation and wanting me to succeed.
This was not exactly an interview, but rather a get-to-know chat with some senior director. He told me some things like the department structure, how the teams collaborate, what I could expect and so on and wanted to know if I was fine with all I was hearing. Sure I was. He also referred very positively about the manager who had been interviewing me (and who was planned to be my manager in the future), so I started being even more excited about potentially getting the job.
Overall, after the 1st round of these 2 I was pretty sure I wouldn’t make it further. I guess after my Google experience when I thought I had quite nice rounds and was eventually sent to have additional interviews, here I was expecting that since I struggled a bit on both of the questions, that was going to be it.
The recruiter contacted me during the week and said that we need to wait a bit since they are interviewing 2 more candidates for this position.
After 2 more weeks, he called me with some updates:
We had a chat with the same director as before. The update was that the manager who had interviewed me thrice decided to leave the management position and become an individual contributor again. So I was going to potentially have a new manager who - unlike the previous London one - would be sitting in Cupertino. This time he referred super nice to the new manager, saying they had known each other for a long time and that he is very technical and proficient in the job. I appreciated a lot that the director took his time to call me to make sure I was fine with these changes and that I was ok to proceed with another manager. This kind of added to the picture I had already been having that this team / department does care about the happiness of their candidates and employees and their feelings. Especially this contradicted the experience I had at Google before - where with several interviewers it was like interacting with a [well-designed] robot.
Still, I was a bit worried regarding my talk with the new manager. I kind of liked the previous one after the 3 interactions we had - he seemed to have nice British humour and to be both technically and empathically developed.
So I had a call with the new manager. He asked me some things slightly resembling a behaviour interview, but not a classic one. E.g. there were no “tell me about a time when…” questions, but rather “tell me, what keeps you motivated after 6+ years of developing software?”. He was also keen to know about how I came to development at all given I started my career in technical support.
Overall, I liked him so much that I couldn’t believe it. He just seemed to be so calm, understanding and confident at the same time, that I couldn’t but enjoy talking to him. And if he was going to be my manager, that was like the perfect combination which I could think of.
Actually, the impression he made on me during this talk and another one we’ve had recently (discussing some details to be settled before I start working) kind of deserves another article, so let that be it here.
So a couple of days passed, and the recruiter called me and asked for compensation numbers. I wasn’t entirely prepared to have this conversation, and I wanted to at least know if they for sure wanted to proceed with me and which career level would that be. However, after getting some numbers from me he only said that he would call back, without confirming anything at all.
Then a couple more days passed. He called once again, and said that they will definitely give an offer, and that it was going to be ICT4 which is apparently a senior role. He said it was a tribute to how well I did in the interviews, which I was so surprised to hear since I didn’t have that impression myself. However, the compensation I asked for was in the bounds of ICT4, not ICT3, so it may have made an effect as well - not sure about that.
The rest of the process story is not really interesting. We negotiated the numbers a bit, it took about 2 weeks more for me to receive a written offer (at the end of March), and that was it.
This time I did so much differently from the time I took the Google interviews:
I’m afraid I don’t have enough data points to draw any meaningful conclusion from these comparisons. I just wanted to share this as a funny observation that things may go completely differently from your plans - e.g. you prepare a lot, have lots of expectations and you don’t achieve your goal vs you don’t put much hope, chill and get a senior role. Let this be a tribute to how life can be unpredictable, and to how I ended up improving my English in London instead of learning some specific German dialect in Zurich.
And as a final word, I wanted to thank the LeetCode community. Thank you so much for all the interview experience articles which kept me motivated and helped me with my self-belief, and a separate thank you for all the comments and warmth I received for my previous Google experience article. This support was super-important and helped me recover and ask myself some necessary questions, and I am pretty sure I decided to apply to Apple due to those comments. Thank you once again, and please believe me - if I could make it, starting as a technical support person with an economy diploma, you can definitely do it as well. Cheers, and I wish you all the possible luck and success on your way!