개발자 Life

딜리버리히어로 코리아 면접후기 - 백엔드

dextto™ 2020. 3. 19. 21:41

부끄러운 글을 써보려 한다. 딜리버리히어로 코리아(이하 딜코)로 이직을 준비하면서 겪은 일이다.
취업이나 이직을 준비중이신 분들에게 도움이 되었으면 좋겠다.



딜코는 독일계 푸드딜리버리 회사의 국내 자회사다. 최근 국내 음식배달 업계의 1위인 배달의 민족을 만든 우아한 형제들과의 합병건으로 언론의 관심을 모았다. 현재 업계 2, 3위인 요기요와 배달통 서비스를 운영하고 있다.

어느날 딜코 인사담당자가 링크드인으로 백엔드 채용에 관심있으면 지원하라고 연락이 왔다. 처음엔 지원 요구사항인 백엔드 3년 이상에 해당되지도 않는데 왜 연락이 왔을까라는 생각이 들었다. 당시 여기저기 면접을 보러 다니던 차였는데 유명한 서비스를 운영하고 있고, 나름 탄탄한 회사여서 관심이 갔다. 특히 백엔드를 django로 개발하고 있었고 기술블로그를 읽어 보니 파이썬, 장고의 전문가들이 모여 재미있게 일하는 것 같았다. 특히 매일 오전 코드리뷰를 하고 이를 중시한다는 점이 마음에 들었다. 나의 짧은 파이썬 개발 경험과 백엔드 경력에 큰 도움이 될 거라는 판단을 했다. 또한 대규모 트래픽을 경험했던 적이 없었기에 한단계 더 발전할 수 있는 기회가 되리라!



서류 통과 후 https://app.codility.com 을 통해 코딩 테스트를 진행했고, 면접이 잡혔다.
면접은 실무 담당 2분과 1시간 반, 팀장급 2분과 1시간 반 두 번에 걸쳐 진행됐다. 아래는 면접 당시 받았던 질문들이다.
면접을 준비하시는 분들이라면 스스로 답을 찾아보시길 바랍니다.



면접 1

면접관이 일부러 깐깐하게 군다는 느낌이 조금 있었다. 앞으로 같이 일할 사람을 뽑아야 하니까 이해는 간다. 비록 나중에 탈락시키더라도 면접받는 사람이 분위기 때문에 당황하지 않도록 부드럽게 진행해야 한다는 생각을 평소에 가지고 있다.

Q: 이전에 했던 일 설명해 주세요.

Q: 전전 직장에서 클라이언트 개발을 오래 했습니다. 백엔드 경력이 짧은데 왜 백엔드로 지원을 했나요?

Q: 왜 링크드인을 영어로 작성했나요? (그냥 지나가는 말로 물었던 건데, 모기업이 외국계인 회사에서 왜 이런 질문을? 이라는 생각이 들었다. 더군다나 코딩테스트는 외국 사이트 걸 이용해서 문제가 영어로 제출됐다. 프로그래머스 같은 좋은 국내 사이트도 있는데 말이다.)

Q: 데이터가 손실되지 않게 하기 위해 어떤 장치들을 마련해야 하나요? 
    AWS 물리 디스크가 손상된다면?
    아마존이 사업을 접는다면? (이 질문은 좀 과하다고 생각했다. @.@;; 보통 서비스를 접기 전에 공지를 하고 다른 데로 이전할 시간을 준다. 그리고 딜코보다 아마존이 오래 갈 거 같은데??)

Q: (코딩 테스트에서 잘못 구현했다고 생각하는 부분에 대한 질문들)

Q: 간단한 손코딩을 해 봅시다. (이는 위 코딩테스트에서 이어지는 부분이다.  이글 뒷부분에서 다시 자세하게 설명하겠다.)

Q: 실무에서 decorator를 적용한 예를 들어보면?

 

Q: 파이썬 json 라이브러리에 있는 loads, dumps라는 메쏘드가 하는 역할이 무엇인가요?

Q: HTTP method에 대해 나열해 보세요.

Q: HTTP status code를 아는 데로 설명해 보세요.



면접 2

Q: 이전에 했던 일 설명해 주세요.

Q: 대용량 트래픽이 발생해서 서버가 느려지고 있다. 대응 방법은?

Q: 마찬가지 이유로 DB read/write 경합이 발생하여 속도가 느려지고 있다. 이를 미리 대처할 수 있는 방법은?

Q: pub/sub에 대해 대략적인 아키텍처를 설명해 보세요.

Q: REST API로 개발했나요? 간단하게 설명해 보세요.

 

Q: 요기요/배달통 서비스에 대해 아는 데로 말해 보세요.

Q: 이 서비스를 개선/발전시켰으면 하는 부분이 있다면?

Q: 경력상 다른 파트로 지원하는 게 맞을 거 같다. 아니면 주니어로 입사해야 하는 데, 괜찮은지?

Q: 일하면서 같이 일하기 힘든 동료가 있다면? 어떤 타입의 사람이 그런가요?

Q: 그 외 가벼운 질문들..

Q: 회사에 대해 궁금한 점이 있다면?



이제 멘붕에 빠졌던 손코딩에 대해 이야기 해 보겠다. 2가지를 질문했는데 사실 파이썬 개발자를 뽑을 때 질문했을 법한 유명한(?) 내용이었다. 전 직장에 들어가기전 준비했던 자료들을 한 번 읽어보고 갔어야 했는데, 현재 쓰는 주 언어라고 깝치고 공부를 미리 안했던게 화가 되었다. 여기서 교훈은 면접은 항상 초심으로 준비하라는 것.

질문1.

Q: 코딩테스트 2번에서 global 변수를 썼다. global 변수를 쓰지 않고 decorator를 써서 구현하는 방법이 있다.
다른 예를 들어보자. 먼저 피보나치 수열을 구하는 함수를 만들어 보라.

첫번째 코드: 메모이제이션(res)을 이용해서 반복계산을 줄이는 코드를 작성했다. 문제는 여기에서도 global 변수를 사용하고 있다!@#

res = {}
def fibo(n):
  if n < 3:
    return 1
  if res.get(n):
    return res.get(n) 

  return fibo(n - 1) + fibo(n - 2)


Q: 이를 데코레이터로 구현을 하면 res 변수를 데코레이터 안으로 넣을 수 있고, 가독성을 증가시킬수 있다. 같이 만들어 보자.

두번째 코드:

def fibo_deco(func):
    res = {}

    def inner(*args):
        n = args[0]
        if res.get(n):
            return res.get(n)
        r = func(n)
        res[n] = r
        return r

    return inner


@fibo_deco
def fibo(n):
    if n < 3:
        return 1

    return fibo(n - 1) + fibo(n - 2)

면접 당시에는 inner함수에 인자를 받는 부분을 빼먹었다. 아마 컴파일 에러로 실행이 안됐을 것이다. ㅠㅠ

제대로 대답했다면 아마 데코레이터에 대해 좀 더 깊은 질답이 있었을 것 같다.


질문2:

다음 코드의 결과를 적어보라.

def f(x, l=[]):
    for i in range(x):
        l.append(i)
    print(l)


f(2)
f(3, [1, 2, 3])
f(2)

위 코드의 실행결과는 다음과 같다. 

[0, 1]
[1, 2, 3, 0, 1, 2]
[0, 1, 0, 1]

이렇게 되는 이유는 인자 l이 mutable하다는 데 있다. 면접관이 칠판에 l=[]이라고 쓸 때 엄청난 거부감이 들긴 했다. 저런 코드를 본적이 없었으니까. 실무에서는 이런 코드를 작성하면 IDE가 체크를 해 줘서 고칠 수 있는데, 면접에서는 올바로 대답하지 못해서... 망했다.

위 코드는 다음처럼 작성하는 게 정석이다.

def f(x, l=None):
    if l is None:
        l = []
    for i in range(x):
        l.append(i)
    print(l)

 

여러 모로 아쉬운 면접이었다. 면접을 통해 내 현재 위치를 알게 된다더니 몸소 겪었다. 좋은 경험으로 생각하고 살아야지 별 수 있나.

반응형