홈으로

[번역] 구글 기술면접, 야 너두 할 수 있어!

2020년 04월 19일

Emma Bostian이 DEV.TO에 작성한 I Passed The Google Technical Interviews; You Can Too. 를 허락을 받고 의역한 글입니다. 오역이 있을 수 있습니다.

모든 일러스트레이션은 UnDraw 에서 가져왔다. 작가님들 감사합니다!

구글의 기술면접을 통과한 후에, 이후 과정을 중단했다. 아마도 “미쳤니? 누가 구글 기술면접 뚫고 접니?”라고 생각할지도 모르겠다.

이 포스팅에선 구글의 면접과정 및 기술면접을 (어느 회사에서든지) 통과할 수 있는 팁들에 대해 말해볼 것이다. 구글은 기술면접이 어렵기로 유명하고, 너무나 일하고 싶은 회사이기 때문에 나는 이 점을 강조할 것이다.

그렇긴 하지만, 구글 말고도 굉장히 좋은 회사들이 많고 (이러한 거대 IT 기업처럼 잘 알려져 있지는 않지만) 충분히 좋다. 성공적인 개발자가 되기 위해서 유명한 회사에서 일할 필요는 없다.

또한, 대기업에서 일하는 것은 장점만큼이나 단점들을 가지고 있다. (여기에서 다룰 것이다.) 직장에서 원하는 것을 결정하고 그러한 핵심 가치들과 작업 환경을 가지고 있는 회사를 찾아보길 권유한다.

내가 말할 수 있는 건 자바스크립트/프론트엔드 면접 과정 뿐이고 내 면접 경험이 당신의 면접 경험을 반영하지 못할 수 있으니 나의 조언과 경험을 적절히 들어주길 바란다.

보안상 구글 면접에서의 질문들 (또는 다른 기술 면접들)을 누설하진 않을 것이다. 구직자로서, 당신은 문제해결 능력을 통해 합격을 하고 싶을 것이기 때문에, 내가 받은 면접 질문들에 대해서 반드시 공부해야 하는 점들을 강조할 것이다.

해결방법들을 암기하지 말고, 성능 좋은 해결책을 생각해낼 수 있도록 문제 해결 능력을 배워라! 성공적인 기술 면접을 하는데 참고하기 위해서 아래쪽에 있는 팁들을 참고할 수 있다.

마지막으로, 나는 구글 팀 전체와 내가 대화한 모든 현/전 직원들에게 고맙다는 말을 하고 싶다. 내 채용 담당자들은 굉장했고 만난 모든 면접관은 대화하기에 매우 훌륭했다. 그들은 결코 나에게 무지함을 느끼도록 하지 않았고 편안하게 해주었다. 내가 받은 질문들은 일상 생활에서 마주할 수 있는 공정하고 평가된 기술들이었다. 그리고 그것에 대해 고맙다고 말하고 싶다.

이제까지의 면접들

구글의 면접을 본 것은 이번이 3번째였다 (면접을 할 때마다 발전했다). 개요는 이렇다.

1번째 : 2016

내가 텍사스, 오스틴에 살던 2016년에 1번째 면접을 봤다. 기술 면접에 대한 준비가 제대로 되어있지는 않았지만, 유선면접을 간신히 통과했고, 떨어지기 전까지 2번의 유선면접이 진행되었다.

2번째 : 2019

2019년 막바지에, 2번째 면접을 봤다. 나는 Material Design 팀의 UX 엔지니어링 역할로 면접을 보는 것으로 생각했지만, 소프트웨어 엔지니어링 면접 과정을 전부 진행하였고 덜 준비된 상태였다.

유선 코딩 면접을 통과하였고 뮌헨 캠퍼스에서 현장면접을 진행하였다. 2번의 프론트엔드 기술면접, 2번의 자료구조 및 알고리즘 면접, 그리고 1번의 개발 프로세스, 의사소통 및 문화적 적합성에 대한 면접을 치뤘다.

프론트엔드 면접 중 1번은 크롬북을 통해 구글 행아웃에서 진행되었는데, 불행히도 기술적인 문제가 있었고 (크롬북이 시작되지 않았고, 행아웃의 화면이 공유되지 않았다), 문제를 해결하는데 면접시간의 반을 썼다. 또한 자바스크립트 스킬에 개선이 필요하다는 피드백을 받았다.

그 결과, 면접은 중단되었고 구글 팀은 내가 뮌헨에서 1~2달 후에 다시 면접보기를 원했다. 그 당시 생활이 좀 혼란스러웠고 나는 재면접을 거절했다.

3번째 : 2020

2020년 초, UX 엔지니어링 역할로 재면접을 봤고 면접과정이 이루어지기 불과 몇 달전에 면접을 진행하였기 때문에 유선 코딩 면접이나 자료구조 및 알고리즘의 현장 면접 또는 프로세스/문화적 적합성 면접을 볼 필요가 없었다.

대신 UX 엔지니어링 프로젝트를 집에서 진행하였는데 사용자 흐름(User flows) 및 정보 구조(Information Architecture, IA)를 설계하였고 Sketch를 사용해서 열심히 목업을 만들었으며 이를 토대로 앱을 완성했다. 그 후, 개발 과정과 툴 선택을 간결하게 문서화하였다.

집에서 하는 과제가 끝나자 3번의 현장 면접들이 진행되었는데 코로나19로 인해 구글 행아웃을 통해서 화상 면접이 이루어졌다. 2번의 프론트엔드 기술(코딩) 면접과 내 과제에 대해 UX 관점에서 어떻게 개선을 할 수 있을지를 얘기해보는 1번의 UX 면접이 진행되었다. 현장 면접이 끝난 뒤, 채용 담당자로부터 (이틀 뒤) 면접을 통과해 채용위원회와 팀 매칭 단계로 넘어가겠다는 통보를 받았다.

내 역할에 대해 논의하기 위해서 잠재적 채용 담당자를 만났다. 아이러니하게도, 담당자는 내가 뮌헨에서의 2번째 면접 때 만났던 사람이었기 때문에 다시 만난 것이 반가웠다.

담당자와 만난 후에 몇주를 기다렸고, 그 동안 다른 회사들과의 면접을 진행하였다. 불행히도, 코로나19 때문에 내부적인 채용 과정이 약간 혼란스러웠고 결국 다른 회사로부터 오퍼를 받게 되었다.

내가 구글로부터 오퍼를 받았을지는 모르겠지만, 기술 면접을 통과했다는 사실만으로 충분히 자랑스럽다. 아직 부족하다고 듣고, 나 스스로 이 업계에서 부족하다고 느꼈던 사람으로서, 현장 면접까지 했다는 것이 자랑스러웠다.

채용되기 위해 필요한 것들

구글에 채용되기 위해선 다음과 같은 특성들을 보여주어야 한다.

  • 친절한 사람이 되기
  • 배우려는 의지를 갖기
  • 좋은 의사소통 능력을 갖기
  • 좋은 문제 해결자가 되기
  • 훌륭한 협업을 보여주기
  • 공감능력을 가지기

내 경험으로 비추어 봤을 때 그들은 천재를 찾는 것이 아니라, 훌륭한 의사소통 능력과 협업 기술을 가지며 친절한 마음씨를 갖고 열심히 일하는 사람들을 찾는다. 그리고 이건 다른 회사도 마찬가지이다.

일반적인 면접 과정

일반적인 구글의 면접 과정은 5~6가지 단계로 이루어진다.

  • 면접관 유선 면접
  • 기술 유선 면접 / 코딩 챌린지
  • 집에서 하는 과제*
  • 현장 면접
  • 팀 매칭 단계
  • 채용 위원회

*이 과정은 UX 엔지니어링 역할에 필수적인 것이지 소프트웨어 엔지니어링 역할은 아니다.

각 단계를 조금 파보도록 하자.

면접관 유선 면접

유선면접동안, 면접관은 지원한 역할과 면접 과정에 대해 더 말해준다. 그러나 면접 과정의 각 단계가 중요하고 전반적인 성과에 영향을 미치므로 이 면접을 가볍게 여겨서는 안된다.

유선 면접의 팁들이다:

  • 미리 회사와 지원한 역할에 대해 알아두기
  • 시간약속 지키기
  • 면접관에게 질문할 2~3가지 질문 준비하기
  • 시간 내줘서 감사하다고 말하기

면접관이 당신이 오퍼를 받게끔 열심히 하니, 친절하게 대하자!

기술 유선 면접

면접관 유선 면접을 통과했다면, 기술 유선 면접으로 이어진다. 이 면접 동안, 코딩 챌린지 문제를 줄 1명의 구글러와 짝지어지게 된다.

나는 1개의 질문을 받았고 주로 다음과 같은 스킬들을 테스트하는 것이었다:

  • DOM 조작 (DOM 노드에 접근, 여러가지 작업 수행, 동적으로 새로운 DOM 노드 생성)
  • CSS

구글 문서에 해답을 코딩했다. 문제를 해결하기 위해 내가 사용한 접근법이다.

  • 문제를 명확하게 하기 위해 질문하기: 면접관이 당신이 어떻게 생각하는지를 알아보기 위해서 어딘가 부족한 상태로 문제가 주어진다.
  • 의사-코드 작성하기: 의사-코드를 작성하는 것은 실제 코딩을 하기 전 생각들을 정리해준다.
  • 완전탐색 해결법으로 코딩하기: 처음부터 최적화된 해결법으로 코딩해서는 안된다. 완전탐색으로 코딩한 후에 최적화시키는 것이 성능에 대한 당신의 태도를 보여줄 수 있다.
  • 해답을 최적화하기: 완전탐색으로 해결했다면, 어디를 최적화시킬 수 있을까? 중첩된 반복문을 2개의 반복문으로 리팩토링 할 수 있는가?
  • 예외 케이스 테스트하기: 해답이 작동하고 최적화되면, 테스트 케이스를 만들자. 이는 놓친 예외 케이스들을 보여준다.

코딩 프로젝트

기술 유선 면접을 통과하면, 집에서 하는 코딩 프로젝트가 주어진다. 소프트웨어 엔지니어링 면접에선 못 받았지만, UX 엔지니어링 면접에선 프로젝트 1개를 완성하라는 요청을 받았다.

몇가지 이유로, 코딩 프로젝트를 완성하기를 즐겼다:

  • 다른 기술들을 보여주는 2가지 프로젝트 중에서 선택할 수 있었다.
  • (몇 시간밖에 안 걸린다는 통보를 받았지만) 프로젝트를 완성하는데 1주일이라는 시간이 걸렸는데, 이 때문에 코딩 면접이라는 “현장” 압박이 줄어들었다.
  • 철저한 문서화, 사용자 흐름, 또는 정보 구조와 같은 내가 잘하는 기술들 중 몇 가지를 보여줄 수 있었다.
  • 내가 기술 스택을 고를 수 있었다.

바로 작업하기 전에, 면접관과 함께 프로젝트 요구조건을 명확하게 해야 한다. 예를 들어, 자바스크립트 프레임워크를 사용하고 싶다면, 가능한지 물어봐야 한다. 코딩 프로젝트를 위한 몇가지 팁이 있다:

  • 서드-파티 라이브러리에 너무 의존하지 마라. 나는 구글의 디자인 시스템인 Material UI를 선택했는데, 이는 디자인 시스템에 대한 나의 지식을 보여주고 UI를 일관되게 해주기 때문이었지만, UI 프레임워크를 사용하는 것은 성능이슈가 있을 수 있다.
  • 개선하고 싶은 부분에 대해 정직해져라. 과제를 제출할 때마다 내가 항상 포함시킨 것이 바로 “개선시키고 싶은 부분” 이다. 몇 시간이나 몇 주가 더 있었다면, 어떤 것을 다르게 했을 것인가?
  • 어플리케이션에 대해 접근성 검사를 하자. 나는 접근성을 테스트하기 위해 Google Lighthouse에서 앱을 실행시켜보았다.
  • 온 힘을 다해 프로젝트를 하지 말자. 면접관이 프로젝트에 2-3시간이 걸린다고 했다면, 1주일을 쓰지 말자. 이 단계 이후에 떨어지면 번아웃이 일어날 거고 이용당했다고 느낄 것이다. (내 경험이다…)
  • 코드를 깔끔하게 짜라. 주석을 지우고 코드 포맷팅을 적절하게 하라.
  • 프로젝트 구조에 대해 생각하라. 파일 구조가 깔끔해야되고 구조화되어 있어야 한다.

현장 면접

현장 면접에 온 당신, 축하한다! 이건 엄청난 단계이며 당신 스스로 자랑스러워 해야 한다!

구글과의 2번째 면접에서 나는 뮌헨 캠퍼스에 방문할 수 있었고 사무실을 구경했지만 (굉장히 아름다웠다!), 마지막 면접에선 코로나 19때문에 모두 행아웃으로 진행되었다.

현장 면접은 5개의 단계로 이루어진다:

  • 2번의 프론트엔드 면접 (코딩)
  • 2번의 자료구조 및 알고리즘 면접 (코딩)
  • 1번의 프로세스/협업/문화적 적합성 면접

프론트엔드 면접은 HTML, CSS 및 자바스크립트와 같은 프론트엔드 기술들에 중점이 맞춰져 있지만, 성능과 비동기 자바스크립트와 같은 다른 영역들에 대해 건드릴 수도 있다.

프론트엔드 면접

프론트엔드 면접을 위해서 공부하길 추천하는 기술들이다:

gist로 보고싶다면 여기 를 참조하라.

자료구조 및 알고리즘 면접

자료구조 및 알고리즘 면접을 위해서 공부하길 추천하는 기술들이다:

gist로 보고싶다면 여기 를 참조하라.

팀워크, 프로세스 및 문화적 적합성 면접

팀워크/프로세스/문화적 적합성 면접은 애자일 방법론 또는 워크플로우, 팀워크와 협업 및 갈등 해결 등을 아우르는 다양한 주제들이 혼합되어 나온다.

이 면접을 통과하기 위한 2가지 팁이다:

  • 얘기할 수 있는 2~3가지의 프로젝트를 진행하기
  • 팀의 갈등을 해결했던 1~2가지의 사례들을 준비하기

팀 매칭 단계

현장 면접을 완료하면, 가장 어려운 부분을 통과한것이다! 몇몇 면접자들은 바로 채용 위원회로 가지만 그 외 면접자들은 팀 매칭 단계를 거쳐야 한다.

이 단계에서 예비 매니저들을 만나 당신이 합류할 팀과 어떤 일을 할 것인지에 대해 말할 것이다.

한 팀이 당신을 원한다면, 그들은 당신의 채용 담당자에게 말할 것이고 이 사실이 포트폴리에 추가되어 채용 위원회에 제출될 것이다.

채용 위원회

채용 위원회는 면접 과정의 마지막 단계이다. 내가 이해한 바로, 채용 위원회는 전체 면접과정에서 면접자들의 성과를 평가하는 몇몇 구글러들로 구성된다.

채용 위원회 회의까지 1~2일 동안, 심사위원들은 면접자들 명부를 읽고 채용 여부를 권고한다. 회의에서, 심사위원들은 피드백들을 논의하고 모든 멤버가 동의한다면 오퍼가 이루어진다.

채용 위원회로부터 피드백을 듣기 전에 그만두었기 때문에, 채용 위원회를 진행한 후에 오퍼를 받는 통계치에 대해서 말할 수는 없다.

공부 팁

면접을 볼 때, 당신의 능력을 최상으로 보여주기 위한 일반적인 팁들은 다음과 같다.

매일 조금씩 하자

비록 엄청난 발전을 하고 있다고 느끼진 않겠지만, 놀라운 결과를 얻기 위한 작은 것들을 이뤄가고 있는 것이다. 나는 이 아이디어를 더 깊게 파고든 James Clear의 책, “Atomic Habits” 를 좋아한다.

매일 집중적으로 공부할 때, 번아웃 될 가능성이 적고 뇌가 배운 것들을 처리할 시간이 많아진다.

“배우기”와 “하기”를 섞자

전세계의 모든 기술들을 배울 수 있지만, 다양한 프로젝트에 이를 적용해보지 않는다면 면접에서 사용하기는 굉장히 힘들것이다. 따라서, 1~2가지의 기술을 배운 뒤에 그것들을 활용해볼 예제 어플리케이션을 찾아보길 추천한다.

다른 사람들의 해답을 읽자

당신의 해답이 작동도 하고 최적화도 되어있을 수 있지만, 다른 사람들의 해답을 읽고 그들이 어떻게 생각하는지를 이해하는 것은 훌륭한 아이디어이다. 이를 통해 작업을 완성하는데 더 나은 방법을 찾을 수도 있지만, 일반적으로 코드를 읽는 것은 놀라운 기술이고 반드시 가져야 할 것 중에 하나이다.

면접 팁

현장 면접까지 오면 몇가지 팁들이 있다.

물을 마시자

물을 마시는 것은 긴장을 풀어주고 약간의 쉼을 준다. 면접관이 물을 제공하겠지만, 안한다면 기꺼이 요청하자.

문제를 명확하게 하도록 질문하자

화이트 보드로 해결하는 문제들은 어딘가 설명이 부족하도록 만들어졌는데, 면접관이 당신이 이런 문제를 어떻게 해결하는지 보길 원하기 때문이다. 어떤 부분이 명확하지 않다면, 아마도 그럴것이다! 일단 아는 것을 쓴다음, 모르는 것을 추론하자.

완전 탐색하고, 막히면 최적화하자

어디서부터 시작해야 할지 모르겠다면, 덜 최적화된 방법으로 시작하자. 나중에 최적화할 수 있다.

예를 들어, 숫자 1개를 정렬된 배열에서 찾았을 때 참을 반환하는 문제를 받았다면, 반복문을 돌려서 각 인덱스마다 확인한다음 숫자를 찾으면 참을 반환하는 방법을 쓸 수 있다. 최악의 경우에, 배열의 모든 원소를 보기 때문에 n이 배열의 길이라고 하면 O(n) 의 복잡도를 가진다.

면접이 진행되면서 아마 깨달을 것이다 “어머, 배열이 정렬되어있구나! 이분탐색 돌리면 끝나네!“. 이분탐색은 계속 배열의 크기를 줄여나가면서 타겟 원소를 찾아내는 훌륭한 분할정복 알고리즘이다. 이것이 성능적으로 훨씬 더 좋은 해답일 것이다.

생각의 과정을 말하자

면접의 핵심은 당신이 어떻게 생각하는지를 보는 것이기 때문에, 반드시 생각을 입 밖으로 말해야 한다! 면접관은 당신의 생각을 읽을 수 없다.

2개의 해답을 고려하고 있다면, 면접관에게 말해서 2가지 모두에 대해 설명하자. 그들이 당신을 더 나은 방향으로 인도해 줄 것이다.

테스트하자

문제를 해결했고 최적화까지 했으면, 테스트할 시간이다. 많은 면접자들이 테스트를 까먹지만 코딩 챌린지에서 아주 중요한 부분이다. 해답이 테스트 케이스의 75%를 통과한다고 해도 나머지 25%의 예외 케이스를 놓칠 수 있다.

따라서, 해답을 테스트하는 것은 면접에서 필수요소이다.

툴에 의존하지 말자

구글은 보통 워드 문서나 기본 텍스트 편집기를 코딩 챌린지에 사용하기 때문에 코드를 포맷팅하기 위해 린터나 Prettier에 의존하지 말자. 툴 없는 환경에서 코드 작성하는 것을 연습하자.

마무리하며…

구글은 “그 어떤 것보다 좋은” 회사가 아니다. 대기업에 일하는 것이 즐겁지 않을수도 있다!

면접할 때 가장 중요한 것은 양방향 면접이라는 것이다. 그들이 당신을 평가하는 것과 마찬가지로 당신은 회사를 평가하는 것이다.

당신이 가진 기술들은 귀중하며 떨어진다 해도 그것이 당신이 부족하다는 것을 의미하지 않는다.

우리 모두 오퍼보다는 탈락을 많이했으니 조금만 참자.

Loading script...