아마존에 개발자로 취업하기까지 #3

logo_amazon

1.

면접을 통과하면 계약에 대한 오퍼를 받는다. 아마존의 오퍼는 기본 연봉, 계약 보너스, 주식 세 가지로 구성되어 있다. 계약 보너스는 입사 1주년과 2주년에 현금으로 지급된다. 주식은  1~2년차에도 지급되긴 하지만, 대부분은 3년차와 4년차에 지급되도록 구성되어 있다. 이 외에도 401k (퇴직 연금과 유사), 교통비 혹은 주차비 지원, 휴가 일수, 이사 비용 지원 등등이 계약 조건으로 제시된다.

자신이 받은 조건이 마음에 들지 않으면 협상을 통해 조건을 조정할 수 있다. 글래스도어에 가면 연봉과 관련된 유용한 자료가 아주 많다.

2.

하지만 이 모든 과정 중 가장 중요한 과정이 남았으니 그것은 바로 취업 비자를 받는 것이다. 한국인이 미국 회사에서 일을 하는 경우, 대부분은 H1B 비자(전문직 비자)가 필요하다. H1B 비자는 나를 채용하려는 회사에서 스폰서를 해줘야 하기 때문에 회사에 합격한 뒤 비자 신청을 하는 것이다. H1B 비자는 4월 1일부터 신청할 수 있으며, 비자를 받은 사람은 10월 첫 주부터 출근을 해야 한다.

H1B 비자는 한 해에 85,000개가 발행된다. 이 중 20,000개는 미국 석사학위 이상 소지자에게 먼저 발행되고, 65,000개가 석사학위 이상 소지자와 학사학위 소지자에게 발행된다. 접수는 4월 1일부터 시작하며, 약 일주일 간 신청한 사람이 정원보다 많으면 접수를 마감하고 추첨을 진행한다. 몇 년 전까지만 해도 신청자가 적어 7~8월까지도 신청할 수 있었다고 하는데, 최근의 추세는 지원자가 점점 많아져 경쟁률이 올라가고 있다. 추첨은 완전 랜덤으로 진행되기 때문에 큰 회사에 지원을 했다고 해서 선택될 확률이 더 올라가거나 하지는 않는다. 다만 미국 석사학위 이상 소지자의 경우는 추첨이 두 번 진행되기 때문에 그나마 가능성이 높은 편이다.

3.

추첨이 시작된 지 약 3개월이 지난 7월 경, 나는 추첨에서 탈락했다는 연락을 받았다. 최종 경쟁률은 2.5:1 정도 됐던 것 같다. 나의 경우 만약 당첨이 되면 일주일 안에 연락이 오게 돼 있었기 때문에, 연락이 없는 것으로 보아 탈락할 것을 예상하고 있었다.

아마존 혹은 구글, 마이크로소프트와 같은 글로벌 기업의 경우는 이런 경우가 자주 있기 때문에 취업 비자를 받지 못한 경우 해외 지사에서 근무할 수 있게 해준다. 나의 경우 아마존의 해외 지사에 내 이력서 및 면접 결과를 전달해 채용 의사가 있다는 영국 지사로부터 연락을 받았다. 아마존 채용 페이지에서 마음에 드는 곳에 지원을 할 수도 있지만, 고려해야 될 것이 너무 많아서 그렇게 하지는 않았다.

4.

영국의 런던 오피스에서는 총  네 군데의 팀에서 나를 채용하겠다는 의사를 보냈다. 별도의 면접은 없었고, 각 팀의 매니저들과 전화 통화를 통해 팀이 하는 일이나 인원 및 기술 구성에 대해 얘기를 나누었다. 나는 아마존 비디오의 iOS 어플리케이션 개발팀에서 일하기로 정하고 연봉 협상을 다시 진행했다. 아마존 비디오는 얼마 전 한국에도 서비스를 시작한 넷플릭스와 유사한 서비스로, 스트리밍으로 영화나 드라마를 시청할 수 있는 서비스다.

5.

이렇게 나는 계획에는 없었던 런던에서 일을 하게 되었다. 글로벌 기업의 해외 지사에서 1년 이상 근무했을 경우 L1 비자(주재원 비자)를 받아 미국에서 일을 할 수도 있지만, 이 경우 이직은 제한된다. 자유로운 이직을 위해서는 H1B 비자가 필요하다. 다만, L1 비자는 H1B 비자에 비해 쉽게 발행이 된다는 장점이 있다.

 


이 뒤에도 이야기할 거리가 좀 더 있기는 하지만, 공유하고자 했던 내용은 어느 정도 된 것 같아 이렇게 마무리하겠습니다. 해외 취업을 계획하거나 준비하시는 분들에게 도움이 되길 바랍니다.

아마존에 개발자로 취업하기까지 #2

logo_amazon

1.

코딩 시험을 통과했으면 이제 면접이다. 마지막 면접을 본 것은 2008년이었다. ‘준비 해 온 자기 소개’ 부터 시작하는 한국 회사 면접이었다. 외국 회사들의 면접은 어떤지 전혀 알 수가 없었다. 구글링을 통해 이런 저런 면접 후기들을 찾아보고, 예상되는 질문들에 대한 답변을 준비했다. 하지만 무엇보다 가장 큰 문제는 영어였다. 영어가 벼락치기로 준비한다고 실력이 늘진 않을테니 별다른 방법은 없었다. 미드라도 열심히 보는 수밖에.

2.

담당 리크루터가 해준 조언은 아주 큰 도움이 되었다. 대학 시절 배운 자료 구조, 알고리즘, 객체 지향 프로그래밍 등에 대한 질문을 할 것이라는 것과, 화이트보드 코딩에 준비를 하라는 것. 화이트보드 코딩은 단순히 수도 코드가 아니라 컴파일 에러, 버그가 없는 프로덕션 레벨의 코드를 요구할 것이라는 내용이었다. 나는 화이트보드 코딩에 대비해 주요 알고리즘(예를 들면 그래프 탐색 알고리즘 등)을 펜으로 노트에 작성해보며 면접을 준비했다.

3.

면접은 남산에 있는 하얏트 호텔에서 진행되었다. 면접은 1:1로 네 명의 면접관과 진행되는데, 한 명당 한 시간 정도다. 나는 인터뷰룸에서 기다리고 있고, 면접관이 돌아가며 내 인터뷰룸에 들어 온다. 면접관은 들어 와서 자기 소개를 하고, 내게 질문을 한다. 질의 응답 시간 후에는 화이트보드 코딩 문제를 낸다. 화이트보드 코딩이 끝나면 다른 질문이 있는지 묻고 인터뷰가 끝난다. 질의 응답과 화이트보드 코딩 시간의 비율은 6:4 정도 된다. 예상한 것보다는 화이트보드 코딩 시간이 길었다. 물론 면접은 모두 영어로 진행된다. 내가 한국인이어서 그런지 말은 비교적 천천히, 발음도 꽤 명확하게 해주어 질문을 이해하는 데는 크게 어려움이 없었다. 물론 답변을 하는 것은 정말 힘들었다. 영어 공부좀 많이 해둘껄.

4.

질문은 주로 기술적인 것이나 내 경험과 관련한 것이었다.

기술적인 질문들은 주로 scalability, caching, distributed system 등 웹서비스에 관련한 질문들을 많이 한다. 또한 객체지향에 대한 개념을 묻는 질문도 있다.

경험에 관련된 질문은 최근에 진행했던 프로젝트, 대규모 웹서비스를 개발해 본 경험, 일반 대중을 상대로 하는 시스템을 개발해 본 경험, 자신의 보스와 의견 충돌이 있었던 경험, 기술적으로 가장 큰 도전이 필요했던 경험 등이다. 성공담이냐 실패담이냐는 중요하지 않은 것 같다. 하지만 실패담일 경우 그것으로 부터 무엇을 배우는지에 대해서는 중요하게 생각하는 것 같다.

이 외에도 간단한 수도 코드로 작성할 수 있는 알고리즘을 말로 설명하라는 질문도 있다. 예를 들면 고유한 id를 갖는 상품이 100만 개 있을 때 특정 id가 캐싱되어 있는지 여부를 가장 빠르게 알 수 있는 방법은 무엇일까 하는 것과 같은 질문들이다.

5.

화이트보드 코딩 문제는 알고리즘 작성부터 클래스 추출, 아키텍쳐 설계까지 다양한 레벨에 걸쳐 있다.

문제 중 하나는 n개의 레코드를 저장할 수 있는 LRU 기반의 캐싱 담당 클래스를 구현해 보라는 것이었는데, 나는 2-레벨의 해쉬맵을 통해 구현을 했더니 면접관이 해쉬맵과 링크드리스트를 같이 사용하면 더 좋지 않겠냐고 커멘트를 하면서 잠시 동안 토론을 한 기억이 있다.

다른 질문은 요구 사항을 읽어 주고 필요한 클래스와 인터페이스를 추출해 보라는 질문이 있었고,

가장 기억에 남는 질문은 책 판매 사이트의 아키텍쳐를 설계해 보라는 것이었다. 웹페이지 로딩 속도를 더 높이기 위해서는 어떻게 하는 게 좋을지, 대량의 트래픽을 처리하기 위해서는 어떻게 해야 할지, 특정 몇 권의 책에 대한 트래픽이 전체의 대부분을 차지할 경우 캐싱 알고리즘은 어떻게 할 것인가에 대한 추가 질문이 이어지는 등 가장 까다로웠던 질문이었다.

6.

면접일로부터 2주일 후 메일이 왔다. 오퍼에 대해 얘기해야 하니 연락처를 알려달란다. 이번에도 합격했다 떨어졌다 이런 말은 없다. 얘네는 이런 식인가보다. 어쨌든 면접은 통과한 모양이다.

 

면접 이후의 이야기는 3편에서 진행하겠습니다.

아마존에 개발자로 취업하기까지 #1

logo_amazon

1.

2014년 10월 말, 링크드인(Linkedin)을 통해 자신을 아마존의 킨들&디지털프로덕트 그룹의 리크루터라고 소개하는 사람으로부터 메시지를 받았다. 12월에 서울에서 채용 행사를 개최하는데, 심사를 거쳐 초대를 받은 사람만 참여할 수 있으니 관심이 있으면 이력서를 보내 달라는 내용이었다.

2.

채용 행사를 통해 합격이 되면 시애틀에 있는 아마존 본사에서 일하게 된다는 조건에 마음이 끌려 이력서를 이메일로 보냈다. 말이 이력서지 사실은 링크드인 프로필을 그대로 복사해서 붙여 넣은 것이었다. 만약 내가 적극적으로 구직을 하던 시기였다면 신경 써서 이력서를 작성했을 테지만, 그렇지 않은 상태였기 때문에 크게 신경은 쓰지 않았다. 되면 좋고 아님 말고 식이었다. 돌이켜 보면 정말 무모한 행동이었다.

3.

이력서를 통해 기본 자격을 갖춘 것이 확인되면 다음 순서는 코딩 시험이다. 코딩 시험을 준비하는 데 있어 코딩 인터뷰 완전 분석이라는 책이 정말 많은 도움이 되었다. 코딩 시험을 준비하는 분들께 정말 강추한다. 이 책은 코딩 시험 뿐만 아니라 회사 별 면접 전략, 면접 후의 전략까지 아주 유용한 내용들로 가득하다.

코딩 시험은 Interview Zen이라는 사이트를 통해 진행되었다. 아무 때나 내가 편한 때에 시작하면 되지만, 내게 할당된 문제를 확인하는 순간부터 결과를 제출하기까지의 시간이 측정된다. 코드는 Java ,C++ 혹은 C#으로 작성해야 하며, 별도의 편집기로 작성을 하고 붙여 넣으면 된다. 작성한 함수의 Worst/Average 시간 및 공간 복잡도를 분석해야 하며, 테스트 코드 또한 함께 작성해야 한다. 담당자 얘기로는 대부분 1.5 ~ 2 시간 정도 걸린다고 하는데, 나는 완성 코드를 제출하기 까지 네시간 삼십분이 걸렸다.

4.

11월 중순에 코딩 시험을 봤다. 문제는 주차장 시스템을 구현하라는 것이었다. 주차장에 n개의 주차 공간이 있고, 입구로부터의 거리가 주어져 있다. 주차장에 차가 들어오면 입구에서 가장 가까운 빈 공간을 알려 주면 된다. 차량이 주차장을 빠져나가면 해당 차량이 주차했던 자리는 빈 공간으로 할당된다. 주요 클래스(Car, Space)의 멤버 변수 및 인터페이스는 예시로 제공되어 있다. 핵심은 어떤 자료구조 및 알고리즘으로 주차 공간을 할당/반납하는가이다.

5.

코딩 시험의 결과가 나오기 전에 전화 통화를 통해 코딩 시험에 대한 피드백을 받고, 내 백그라운드 체크를 진행한다. 백그라운드 체크는 주로 최근에 대한 내용이다. 최근에 진행한 가장 큰 프로젝트는 무엇인지, 주로 사용하는 라이브러리는 무엇인지,  하루에  몇 시간을 코딩을 하는지 등등이다. 이게 코딩 시험의 합격 여부에 영향을 미치는지는 모르겠다. 이력서 만으로는 부족한 부분을 보완하기 위한 작업이 아니었을까 생각한다.

6.

12월 초, 코딩 인터뷰 결과가 발표되었다. 담당자가 보낸 메일은 코딩 시험을 통과했다는 내용이 아니라 서울에서의 면접 일정이 잡혔다는 내용이었지만, 어쨌든 코딩 시험은 합격한 것이었다.

 

면접 관련 내용은 다음 편에서 진행하겠습니다.