useCodeusecode logo

내가 구글 인터뷰를 풀 타임으로 8개월 동안 공부한 이유

January 05, 2017

원문: Why I studied full-time for 8 months for a Google interview

Why I studied full-time for 8 months for a Google interview

사실이다. 나는 구글 소프트웨어 엔지니어 인터뷰를 준비하기 위해 수천 시간 동안 책을 읽고, 코드를 작성하고, 강의를 보았다.

당신도 구글 인터뷰를 준비하고 싶다면, 이것이 내가 했던 스터디 플랜이다:

jwasham/google-interview-university google-interview-university - A complete daily plan for studying to become a Google software engineer.github.com

어떻게 여기 왔을까

나는 프로그래밍을 중학생 때 시작했지만, 대학을 졸업할 때는 경제학 학위를 받았다. 취업을 못 한 프로그래머가 너무 많다고 생각했기 때문이다. 아쉽지만, 그때 나는 틀렸다.

나중에, 나는 프로그래머가 되기 위해 군대에 지원했지만, 신병 모집자(recruiter)는 군사 정보(military intelligence) 포지션을 추천했다. 그 후, 2년 동안 한국어를 공부했고, 2년 동안 한국에서 군 복무를 했다.

군 제대 전, 나는 프로그래밍을 다시 시도했지만 너무나 어려웠다. 중학교 때 BASIC을 배웠고 고등학교에 가서도 프로그래밍을 계속하긴 했다. 하지만 C++로 프로그래밍 공부를 다시 시작했는데 너무 어려웠다. 이해가 하나도 되지 않았다.

나는 웹사이트 만드는 것을 좋아했지만, Word같이 유저 인터페이스가 있는 소프트웨어를 사용해서 사이트를 만들었다. 밑바닥부터(from scratch) 웹 사이트를 만드는 방법에 대해선 몰랐다.

군 제대 후 나는 1년 동안 한국에 머물면서 영어를 가르치기로 했다. Perl, HTML, CSS (당시에는 새로운 기능), JavaScript와 SQL을 사용하여 웹 프로그래밍을 공부하기 위해 밤낮 주말을 이용했다.

1년간의 치열한 공부 끝에, 시애틀 지역에 취직했고, 그 이후로 쭉 이곳에 머물고 있다.

Doing some work from the balcony in beautiful Bellevue, WA.

나는 15년 동안 웹 개발자로 일하고 있고, 3개의 회사를 창업 했다. 그중 2개는 지금도 운영 중이며 수익을 내고 있다. 대기업과 중소기업에서 일했고 스타트업의 창업 및 성장을 도우며 팀을 채용하고 관리하는 데 도움을 주는 역할을 했다. 내 직책은 제품 관리자, CEO, 디자이너 및 마케팅 담당자였다.

나는 성공적인 경력을 쌓았고 많은 것을 배웠지만, 끝이라고 생각하진 않았다.

커리어 변경 모색

내가 컴퓨터 공학 학위를 받지 못했다고 한 것을 기억하는가? 그것이 격차를 만들었다.

몇 년 전, 나는 어디든지 채용될 수 있을 거로 생각했다. 내가 핫(hot)하다고 생각했다: 찾기 힘든 풀 스택 웹 개발자. 그러나 2013년에 일자리를 찾는 동안 기술이 부족하다는 것을 깨달았다. 남는 시간에 스타트업을 운영하며 돈을 쫓는 데 많은 시간을 보내서 기술에선 뒤처져 버렸다. 기술을 따라잡지 못했던것이다.

수년간, 나는 그럭저럭 살아갈 수 있을 만큼만 배웠다. 다양한 기술을 가지고 있었지만, 전문가는 아니었다.

오해하진 않았으면 좋겠다. 나는 아직도 채용될 수 있었지만, 내가 일하고 싶었던 기술이나 분야에서는 그렇지 않았다. 나처럼 테크 스택이 다소 구식인 곳에선 채용될 순 있었다. 거기에는 큰돈은 있지만 흥미로운 전망을 보진 못했다.

나의 이런 부족함을 작년 커리어 페어(career fair)에서 뼈저리게 느꼈다. 나는 벤처 캐피탈 회사가 운영하는 스타트업 기업 중 한 곳에서 일하고 싶었다. 하지만 컴퓨터 공학 학위가 없고, 그걸 메울 만큼의 기술과 지식이 부족하다는 사실은 내게 기회가 없다는 것이었다.

그때 난 사업에 전념하고 있었고, 지금도 마찬가지이다.

2016 년 초에 웹 개발자에서 소프트웨어 엔지니어로 경력을 바꿀 때가 되었다고 결정했다. 컴퓨터 공학 학위를 몇 달 안에 공부하기 위해 열심히 공부해야 했다. 이것을 끝내고 나면, 새로운 경력을 시작할 수 있을 것이라고 생각했다.

웹 개발과 소프트웨어 공학을 다르다고 보지 않을 수도 있다. 둘 다 프로그래밍과 장인 정신이 필요하지만 소프트웨어 공학은 데이터 구조와 알고리즘, 컴파일 언어, 메모리 관리에 대해 잘 알고 있어야 하며, 코딩 및 아키텍처 결정이 시스템에 미치는 영향을 이해해야 한다.

개발자를 채용한 큰 기업은 지원자가 이런 지식을 알고 있기를 바란다.

나는 구글에서 일하는 지인에게 부탁해서 회사에 대한 자신의 경험에 관해 물어봤다. 나는 How Google Works를 읽고 있었으며 구글에 이미 익숙했다.

다른 곳을 통해 구글 코칭 노트 사본을 받았다. 이게 나의 스터디 플랜의 기초가 되었다.

구글은 일하기에 아주 멋진 곳으로 알려져있지만, 그 사실을 알기도 전부터 구글은 나의 목표였다.

왜 구글인가?

구글의 채용 기준은 매우 높다. 그들은 최고만을 채용하고싶어한다. 따라서 내가 눈높이를 높게 설정한다면(구글에 채용되는), 구글에 채용되지 않더라도, 다른 곳에 들어갈 수 있을 거라고 생각했다.

구글에 관해 더 많이 알수록 더욱 그곳에서 일하고 싶었다.

간단히 말해서 구글은 현명하고 창의적인 사람을 채용하고 잘 대우하는 회사다. 구글은 장점을 발휘하고, 큰 아이디어를 장려하며, 직원에게 사용자를 위해 올바른 결정을 내릴 자유를 부여한다.

채용 과정은 똑똑하고 열정적인 사람들을 영입하기 위해 조정된다. 구글은 수년 동안 채용 및 인터뷰 프로세스를 발전 시켜 왔다. brain teaser 질문은 오래전에 사라졌다. 요즘에는 코딩 능력, 기술 지식 및 Googleyness를 기반으로 후보자가 선택된다. 이 한마디에는 많은 것이 포함되어 있다.

On a road trip in 2015, I visited the Mountain View HQ. That planted the seed.

관리자는 세세한 것은 관리하지 않는다. 그들은 엔지니어가 올바른 결정을 내린다고 믿는다. 직원을 신뢰하면 구글 직원의 관리 역할이 대부분의 사람이 관리를 생각할 때 생각하는 것과 달라진다. 또한, 관리자는 일방적으로, 고용, 해고 또는 승진할 수 없다. 사내 정치로 인식될 수 있는 중요한 경영 결정의 대부분은 그 위험을 제거하기 위해 위원회에서 처리한다.

구글의 인력 운영 (HR)은 시간이 지남에 따라 무엇이 효과가 있는지 배웠으며, 평가 시스템, 채용 프로세스, 판촉, 보상, 혜택 등을 개선하기 위해 데이터 및 직원 피드백을 사용한다. 더 자세한 내용은 Laszlo Bock (SVP, People Operations)의 Work Rules를 읽어보자!

그렇다. 그 혜택은 놀랍다. 나는 WA 주 커클랜드에 있는 구글 사무실을 둘러보았다. 내 기대가 높았음에도, 그곳은 내 기대를 뛰어넘었다.

구글 인터뷰 대학

무엇을 공부해야 하는지에 대한 코칭노트를 기억하는가? 목록에 적혀 있는 것에 대해서 아무것도 알지 못했지만, 해볼 만하다고 생각했다.

MIT 및 UC Berkeley의 강의 영상 유튜브로 그 토픽을 채워 나가기 시작했다. 이런 식으로하다 보니 목록이 점차 늘어나기 시작했다.

내 깃헙(Github) 계정이 꽤 비어있는 상태였기 때문에, 깃헙에 이 리스트를 게시했다. 비즈니스와 일을 위해 작성한 코드는 모두 비공개였기 때문에 깃헙 계정을 보면 코딩을 전혀 하지 않은 것처럼 보였다. 나는 포트폴리오가 필요했다. 처음엔 이 프로젝트를 “Project 9894”라고 불렀다. 구글은 1998년 9월 4일에 출시되었기 때문이다. 나중에 ”Google Interview University“로 이름을 변경했다.

시간이 지나고 몇 가지 항목을 추가했다.

My summer reading list. A little over the top.

나는 CPU가 프로그램을 어떻게 처리하는지, 메모리가 어떻게 작동하는지, 그 외의 것들을 어떻게 처리하는지 알지 못한 채 지금까지 경력을 쌓았다는 데 놀라지 않을 수 없었다. 나는 그저 “적당한 정도(just enough)“만 알고 있었다.

이 작은 깃헙 프로젝트는 몇 개의 별을 얻기 시작했고 20개의 별을 축하하기 위해 블로그에 글을 게시했다.

어느 날 아침, 이 프로젝트가 120개의 별을 받은 것을 확인했다. 유명한 어떤 사람이 밤에 이것을 트위터를 썼고, 깃헙 일일 트렌딩에 올라갔다. 며칠 동안 깃헙에서 #1 인기 급상승을 했다.

많은 사람으로부터 감사와 격려 메시지를 받았다. 구글에서 일하는 것뿐만 아니라 소프트웨어 엔지니어로서 일하고 싶어 하는 수천 명의 사람들이 있다는 것을 알았다. 이 리스트는 그런 사람들에게 꼭 필요한 리스트가 되었다.

현재는 21,000개의 별이 넘는다.

아직도 믿을 수 없는 결과다.

내가 일자리를 갖지 못하면 어떻게 될까?

그런다고 세상이 끝나는 것은 아닐 것이다.

나는 많은 시간과 헌신적인 노력을 통해 구글 소프트웨어 엔지니어로서의 채용 목표를 달성했지만, 실패하더라도 여전히 어떠한 회사에서도 소프트웨어 엔지니어로 일하기 위해 필요한 기술과 지식을 갖추고 있을 것이다.

결국 나는 엔트리 레벨(entry-level) 소프트웨어 엔지니어로 일하게 될 것이다. 소프트웨어 엔지니어링 경험이 없으니, CS 졸업생과 다를게 없다.

그러나 나는 졸업생만큼의 열정도 가지고 있다. 이것은 나에게 새로운 세상이다. 이제 막 시작이다. 나는 실수하는 것을 두려워하지 않는다. 나는 해낼 수 있다. 나는 또한 할 수 있는 모든 것을 배우고, 어떤 팀에서라도 잘 해낼 수 있다.

나만큼 공부할 필요는 없다

맞다, 난 8개월이 걸렸다. 짧은 과정을 밟을 수도 있었다. 큰 목표를 가진 모든 스타트업과 마찬가지로, 실수를 저지르며 시간 낭비를 하곤 한다. 나 역시 그때로 돌아간다면 다르게 시도하고 싶은 것들이 있다.

불필요한 주제들을 공부했다. 인터뷰를 위해 필요하다고 생각했고, 일을 시작할 때 관련 지식을 갖고 싶었기 때문이다. 내가 배정된 팀에 대한 부담이 되고 싶지 않았다. 지나치게 준비한 것이다.

나는 1,000페이지짜리 C++ 책을 읽는 데 3주를 보냈다. 1,000 페이지 모두를 기억하진 못하지만, C++에 대해 조금 기억하고 있다. 결론만 말하자면, C++이 아니라 인터뷰를 위해 Python을 사용하고 있다. 나는 C++, C, Java가 필요하다고 생각했지만 아니었다. 추측보단 물어보는 것이 좋다.

필요한 것보다 너무 많은 책을 읽었다. 읽어야 할 책은 3~4권 밖에 없다.

내가 리뷰한 수십 가지 알고리즘의 코드 카탈로그를 가지고 있는데, 그중 대부분은 인터뷰에서 필요하지 않다. 당신도 그렇게 할 필요가 없다.

A stack of algorithms, printed out for review

유튜브(YouTube) 영상을 많이 시청했지만, 시간이 지남에 따라 시간을 줄여나갔다.

그때로 다시 돌아간다면, 책 읽는 것을 멈추고 비디오를 일찍 보고 코딩 문제를 더 일찍 시작해야 했다. 내가 배운 주제를 적용하는 데 더 많은 시간을 할애했을 것이다.

간격을 둔 반복은 암기의 키다. 일단 뭔가를 배우고 나면 나중에 다시보고, 나중에 다시 리뷰하자. 반복 할 때마다 학습을 강화하자. 한 번에 많은 시간을 할애 한다고 전문가가 되진 않는다. 반복해서 다시 리뷰하고 리뷰 함으로써 전문가가 된다. 그렇게하면 디테일을 까먹지 않는 시점에 도달하게 된다.

리뷰를 효과적으로 하기 위해, 1,792개의 플래시 카드 (디지털 플래시 카드)를 만들었다. 사실 지나치다. 남는 시간 (예 : 크리스마스 쇼핑 도중)이 있을 때마다 휴대 전화나 태블릿에서 리뷰한다. 플래시 카드와 간격을 둔 반복은 밀접한 관계가 있다. 일단 플래시 카드에 대한 답을 얻은 후에는 이것을 안다고(known) 표시하지 않는다. 나는 그것을 덱(deck)에 두고 일단 그것을 본 다음 올바르게 여러 번 답변 했다면 그것을 안 것(known)으로 표시한다.

두려움 때문에(“Red-black tree에 관한 질문을 한다면?“) 내가 필요로하는 것보다 훨씬 더 많은 주제를 공부할 수밖에 없었다.

인터뷰 준비만 하고 싶지는 않았기 때문에 구글에서 커리어를 준비하면서 큰 문제(large-scale problems)를 해결하려고 했다. 이것은 시간, 공간 및 I/O의 컴퓨팅 리소스를 절약할 알고리즘에 대해 아는 것이다.

최대 흐름 알고리즘 (Ford-Fulkerson)을 알 필요는 없을 수도 있지만, 상황에 따라 (구현을 암기하지 않고) 해당 도구를 사용할 수 있고, 애플리케이션의 문제를 인식 할 수 있다.

결론

처음에 이런 모든 학습을 건너뛰고 서둘러 입사해서 내가 참여한 팀의 언어와 도구를 배우는 데 시간을 할애 할 수 있기를 바랐다. 그러나 그 과정에서 나는 이 지식이 얼마나 중요한지 깨달았다. 대부분 이런 것들이 일상적으로 적용될 수는 없다는 걸 알지만 노력을 기울일 수 있어서 기쁘다. 나는 컴퓨팅의 역사, 실무에 뛰어난 인물, 데이터 구조 및 알고리즘 (그리고 이들이 서로를 보완하는 방법), 그리고 컴퓨터 시스템이 저수준에서 어떻게 작동하는지에 대해 새로운 인식을 습득했다.

나는 곧 이력서를 제출할 것이다. 여기까지 오기까지 오랜 시간이 지났다. 거의 1년이 지났으니 말이다. 1월에 시작했지만, 4월까지는 풀 타임으로 공부할 수는 없었다.

나에겐 밝은 미래가 있다.

이 글을 읽어 주셔서 감사합니다.

Arabic, Vietnamese, 그리고 Korean으로 번역된 글이 있습니다.

업데이트: 2017년 1월 10일

채용되지 않았다. 관련 글. 지원해 주신 모든 분께 감사하다.

업데이트: 2017년 3월 6일

결국 해피 엔딩으로 끝났다! 아마존 웹서비스(Amazon Web Service)에 소프트웨어 개발 엔지니어로서 아마존(Amazon)에 입사했다.

나를 찾을 수 있는 곳

Startup Next Door에서 글을 쓴다.

Google Interview University 깃헙:

jwasham/google-interview-university google-interview-university - A complete daily plan for studying to become a Google software engineer.github.com

이 글은 Why I studied full-time for 8 months for a Google interview를 번역한 글 입니다.