brunch

You can make anything
by writing

C.S.Lewis

by MrCC Jan 13. 2019

전화 인터뷰 Part 2

Episode 5. Uber, Lyft

(사진: Google Play)

구글과의 온사이트 인터뷰가 폭풍같이 지나갔다. 
좋은 경험으로 하기에는 날려버린 기회가 너무 아쉬웠다. 
그래도 오랜만에 온사이트 인터뷰를 제대로 한번 하니 정신이 번쩍 들었다. 
온사이트 인터뷰를 통해 부족함도 많이 보였고 역시나 전화 인터뷰에 비해 훨씬 까다로웠다. 
이쯤 되니 슬슬 불안해지기 시작했다.

사실 구글 온사이트 인터뷰를 보러 가기 바로 직전에 backup 그룹에 있던 우버 (Uber)와 전화 인터뷰가 있었다. 
원래 우버는 플랜 B를 위한 회사 중 하나였지만 구글과 인터뷰가 먼저 잡히는 바람에 실전 인터뷰 연습을 위해 계획보다 먼저 인터뷰를 보게 되었다. 

(사진: uber.com)

우버는 이제는 모르는 사람이 없을 만큼 유명한 라이드 쉐어링 (ride sharing) 회사이다. 
사실 이제는 라이드 쉐어링 외에도 다양한 사업을 하고 있어서 단순히 라이드 쉐어링만 하는 회사라고 단정 짓기는 힘들겠지만 전 세계적으로 공유 경제의 붐을 일으킨 회사 중의 하나이다. 
미국에선 우버가 없는 시대가 상상하기 싫을 만큼 생활 깊숙이 자리 잡고 있다. 

이렇게 잘 나가는 우버지만 최근 최악의 스캔들로 암울한 시기를 겪고 있고 그와 함께 회사 내의 안 좋은 소문/사실들도 많이 공개되면서 대외적인 이미지가 크게 안 좋아졌다. 
물론 사용자들은 우버 서비스가 좋아서 이런 스캔들에 크게 상관하지 않는 듯 우버 비즈니스 자체는 아직도 승승장구하고 있지만 근본부터가 잘못돼버린 우버는 개인적으론 구미가 크게 당기는 회사는 아니다. 

때마침 우버 리크루터에게 LinkedIn으로 연락이 와서 전화통화를 하게 됐는데 이러한 분위기는 리크루터와의 통화에서도 느껴졌다.
최근 안 좋은 소식들을 의식한 듯 리크루터가 먼저 나한테 그 뉴스들에 대해 어떻게 생각하는지를 물었다.
솔직하게 그것 때문에 지원하는 것도 고민이 됐다고 말을 했다. 
리크루터는 그런 반응이 익숙한 듯 회사에서도 그런 점을 개선하기 위해서 많은 노력 중에 있다고 강하게 어필하였다. 
리크루터와 통화 후 내가 원하는 시간에 맞춰 전화 인터뷰를 볼 수 있었다. 

전화 인터뷰가 잡힌 스케줄에 맞춰 우버 엔지니어에게 전화가 왔다. 
우버에서 맵 관련 팀에 있는 시니어 엔지니어로 있는 인도 엔지니어였다. 
간단한 소개를 마치고 본격적으로 테크니컬 질문으로 들어갔다. 
우버에선 Codepair라는 툴을 써서 코딩 인터뷰를 진행하였다. 

첫 번째 질문:

A message containing letters from A-Z is being encoded to numbers using the following mapping:

'A' -> 1
'B' -> 2
...
'Z' -> 26
Given an encoded message containing digits, determine the total number of ways to decode it.

For example,
Given encoded message "12", it could be decoded as "AB" (1 2) or "L" (12).

The number of ways decoding "12" is 2.


전화 인터뷰치곤 생각보다 엄청 어려운 문제였다. 
사실 나중에 찾아보니 Leetcode에서 있는 그대로 따온 문제였다.
Leecode에서 Medium에 해당하는 문제였지만 사실 Dynamic Programming 문제가 전화 인터뷰에서 나올 거라곤 생각을 못 해서 엄청 힘들게 문제를 풀어나갔다, 
주어진 시간에 겨우겨우 맞춰서 문제를 풀어낼 수 있었지만 이어지는 2nd question... 


Implement wildcard pattern matching with support for '?' and '*'.

'?' Matches any single character.
'*' Matches any sequence of characters (including the empty sequence).

The matching should cover the entire input string (not partial).

The function prototype should be:
bool isMatch(const char *s, const char *p)

Some examples:
isMatch("aa", "a") → false
isMatch("aa", "aa") → true
isMatch("aaa", "aa") → false
isMatch("aa", "*") → true
isMatch("aa", "a*") → true
isMatch("ab", "?*") → true
isMatch("aab", "c*a*b") → false


역시나 Leetcode에서 그대로 따온 문제
거기다 이번엔 Hard 문제였다. 
조금 어이가 없었다. 
전화 인터뷰에서 이 정도 난이도의 문제가 나올 거라곤 생각을 못 했다. 
인터뷰를 준비하면서 Leetcode에 있는 문제들로 많이 연습을 했지만 Hard에 해당하는 문제들은 인터뷰 용으론 난이도가 지나치게 어렵다고 생각했기 때문에 쳐다보지도 않았다. 
두 번째 문제는 제대로 풀어보지도 못 하고 시간 초과가 돼서 인터뷰를 마치게 되었다. 
첫 번째 문제를 어느 정도 풀었기 때문에 그래도 전화 인터뷰 정도는 통과할 거라 예상을 했었지만 결과는 탈락... 
사실 당락 여부를 듣지도 못했다. 
보통 인터뷰 결과에 상관없이 이메일이든 전화든 리크루터로부터 Follow-up이 있기 마련인데 우버는 기대를 저버리지 않고 전화 인터뷰 후 아무런 소식이 없었다... 


(사진: wikipedia)

구글 온사이트 후 첫 전화 인터뷰는 우버의 경쟁자인 리프트 (Lyft)와 잡혔다. 
리프트는 아직 미국, 캐나다에서만 서비스를 제공해서 다른 나라에서 잘 알려진 회사는 아니지만 미국에선 우버의 유일한 경쟁자이다. 
사실상 ride sharing만 봤을 땐 우버보다 먼저 시작한 회사인데 우버가 급성장을 하는 바람에 우버에 밀려 많이 가려져 있다. 
그래도 개인적으론 우버보다 훨씬 끌리는 회사였다. 
일단 기본적으로 우버와 같은 근본적인 문제점이 없고 아직 우버만큼 크지 않아서 성장 가능성이 더 있었기 때문이다. 

사실 리프트도 우버와 마찬가지로 backup 그룹에 넣어두었던 회사인데 그동안의 전화 인터뷰 성적이 생각보다 안 좋아서 backup 그룹에 있는 회사들과도 한꺼번에 인터뷰를 진행하기로 계획을 바꿨다. 
일단 생각해놓은 회사들과 전화 인터뷰를 다 한꺼번에 보고 그 결과에 따라 다시 계획을 짜기로 하였다. 

리프트는 평소 연결된 리크루터가 없어서 LinkedIn을 통해서 리크루터를 찾아 직접 연락을 하였다. 
리크루터와 연결이 된 후 거의 바로 전화 인터뷰를 잡을 수 있었다. 

첫 전화 인터뷰는 리프트에서 3년 정도 일을 하고 있는 인도 엔지니어와 하게 되었다. 
리프트도 다른 회사들과 비슷하게 CoderPad라는 코딩 인터뷰 온라인 툴을 이용해서 전화 인터뷰를 하였다. 
첫 5분 정도 간단한 소개를 하고 바로 본격적인 코딩 인터뷰로 들어갔다. 


Given a string, find the longest palindromic substring


Palindrome string 관련 문제가 인터뷰 연습 문제에도 많이 나와서 익숙한 문제였다. (찾아보니 이 문제 역시 Leetcode에 나와 있는 문제)
익숙한 문제이지만 혹여나 실수를 할까 봐 신중히 문제를 풀고 충분한 Test case들을 통해서 테스트까지 마칠 수 있었다. 
내 솔루션에 대한 설명과 인터뷰어의 질문에 대한 답을 하고 주어진 시간보다 조금 일찍 인터뷰를 마칠 수 있었다. 
남는 시간 동안 리프트에 대한 궁금했던 점들을 질문도 하면서 나름 수월하게 인터뷰를 마칠 수 있었다. 
개인적으로 잘했다고 생각을 한 인터뷰여서 인터뷰 후 거의 확실하게 온사이트를 받을 수 있을 거라 생각을 했는데 예상치 못 하게 2nd phone interview를 보자는 리크루터의 이메일이 있었다. 
아마 내가 생각지 못 한 부분에서 부족한 부분이 보여서 또 한 번의 전화 인터뷰를 통해서 더 평가를 하려는 듯하였다. 
조금 당황을 했지만 바로 인터뷰 스케줄을 잡고 2nd phone interview를 진행하게 되었다. 
두 번째 인터뷰도 첫 번째 인터뷰와 거의 같은 방식으로 코딩의 중점을 둔 테크니컬 인터뷰가 진행이 되었다. 
이번엔 Boggle 문제가 나왔다. 


Find all possible words in a board of characters

Input: 
dictionary [] = {"GEEKS", "FOR", "QUIZ", "GO"};
boggle [][] = {{'G', 'I', 'Z'},
{'U', 'E', 'K'},
{'Q', 'S', 'E'}};
isWord(str): returns true if str is present in dictionary
else false.

Output: 
Following words of dictionary are present
GEEKS
QUIZ


(이 문제는 거의 비슷한 문제를 GeeksForGeeks.org에서 찾을 수 있었다)

쉽지 않은 문제였지만 리프트에서의 마지막 기회였기 때문에 주어진 시간 내에 문제 해결을 위해 최선을 다 했다. 
다행히 word search 관련된 문제들을 인터뷰 공부를 하면서 몇 번 풀어본 기억이 나서 쉽지는 않았지만 시간 내로 괜찮은 솔루션을 만들어낼 수 있었고 인터뷰어의 질문들도 문제없이 답할 수 있었다. 
사실 대부분의 전화 인터뷰는 주어진 시간 내에 인터뷰 질문에 대한 optimal 한 솔루션을 찾는 게 주가 되기 때문에 일단 솔루션을 찾아 돌아가는 코딩을 완성했다면 웬만하면 통과를 할 수 있기 때문에 이번 인터뷰는 그런 면에서 꽤 성공적이었다. 
2번째 인터뷰 후 바로 다음날 리크루터로부터 온사이트 인터뷰로 진행을 하자는 연락을 받을 수 있었다. 


지금까지 전화 인터뷰 성적 3:2 (5개 중 3군데 통과)

만족할 만하진 않지만 나쁘지도 않은 성적이다. 
다음은 Airbnb와 본 게임인 메인 그룹에 해당되는 Facebook, Netflix 와의 전화 인터뷰가 남았다.

매거진의 이전글 Onsite Interview - Google
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari