Google 같은 기술 기업의 소프트웨어 엔지니어 면접을 준비하는 방법에 대한 Steve Yegge의 솔직하고 자세한 조언.
무작위 투덜거림과 이런저런 것들.
Google 면접에 대한 몇 가지 팁을 써야겠다고 오랫동안 생각해 왔다. 그런데 계속 미뤘다. 왜냐하면 이 글이 당신을 화나게 만들 것이기 때문이다. 아마도. “당신”에 대한 어떤 통계적 정의를 쓰든, 꽤 높은 확률로 당신을 불편하게 만들 것이다.
왜냐고? 음... 자, 여기에 관해 짧은 노래를 하나 썼다:
야 친구, 나는 저런 거 몰라
Stevey가 말하고 이써어어어어
내 상사가 그게 중요하다고 생각하면
나 짤리게 되겠지이이이이이
오오 예에에 베이비 바아아아베에에에....
예전에 다른 회사들에 있을 때 면접 이야기를 처음 쓰기 시작했을 무렵에는, 이게 이렇게 전형적인 반응인 줄 몰랐다. 그런데 정말 순식간에 알게 됐다.
보통 이런 식이다:
나: 블라블라블라, 나는 면접에서 질문 X를 하는 걸 좋아해, 블라블라블라...
당신: 질문 X라고? 이런, 나는 X를 대학 이후로 들어본 적도 없어! 내 일에서 한 번도 필요했던 적이 없다고! 그걸 면접에서 묻는다고? 그럼 누군가는 그걸 아는 게 중요하다고 생각한다는 뜻이고, 그리고, 그리고... 나는 그걸 모르잖아! 그들이 내 무지를 눈치채면, 나는 감사하다는 말 한마디도 못 듣고 무능하다고 즉시 잘릴 뿐 아니라, 질문 X를 묻는 사람들에게는 영영 취업도 못 하게 될 거야! 사람들이 Stevey 말을 들으면, 그게 곧 모두가 된다는 뜻이잖아! 나는 집도 없고 빈털터리가 될 거야! 한 번도 필요 없었던 걸 모른다는 이유로! 이건 끔찍해! X 자체를 공격하고 싶지만, 책을 집어 들어 그걸 깎아내릴 만큼 알아보는 수고는 하기 싫어. 분명히 나는 Stevey가 얼마나 멍청한지 큰 소리로 외쳐서 아무도 그의 말을 듣지 않게 만들어야 해!
나: 그래서 결론적으로, 블라블라... 응? 방금 “잘린다”고 했어? “빈털터리?” 무슨 소리야?
당신: 아아아아아우우우으아악!!! 푹 푹 푹
나: 됐다. 나는 다시는 면접 얘기 안 한다.
게다가 X가 무엇인지는 중요하지도 않다. 완전히 임의적이다. 내가 “나는 면접에서 지원자의 (이름) 을 묻는 걸 정말 좋아해”라고 말해도 사람들은 여전히 난리를 칠 것이다. 아마 면접 일반에 대한 불안감 때문이든, 자기 이름에 대한 지식에 대한 불안감 때문이든 그럴 텐데, 바라건대 전자이길 바란다.
하지만 그 다음에는 시간이 흐르고, 면접 지원자들은 오고 가고, 우리는 늘 이렇게 말하게 된다. “음, 저 분명히 똑똑한 사람 조금만 더 준비했으면 좋았을 텐데. 앞으로의 지원자들에게 도움이 될 만한 팁을 줄 방법이 없을까?”
그런데 실제로는 아무도 아무것도 하지 않는다. 다들 X를 모르는 사람들에게 격렬하게 찔릴까 봐 무서워하기 때문이다.
한때는 X에 실제 주제 대신 정말로 변수 이름 X를 넣어서 팁을 주는 걸 고려해 본 적도 있다. 하지만 그렇게 하면 생긴 공백 속에서 모두가 화를 낼 것 같아서 그만뒀다. 가명으로 출판한다면 꽤 괜찮은 접근이었을지도 모르지만.
결국은, 그 과정에서 얼마나 많은 감정이 상하든 사람들은 정말 이런 팁이 필요하다. 그러니 문제를 피해 돌기보다는, X에 대해 몇 가지 필수 치환값과 함께 꽤 많은 일반적인 면접 준비 정보를 주려고 한다.
주의사항 및 면책조항
이 블로그는 Google의 승인을 받은 것이 아니다. Google은 내가 이런 팁을 공개하는지 모른다. 그러니까 이건 그냥 나와 당신 사이의 이야기다, 알겠지? 내가 당신 준비시켜줬다고 그들에게 말하지 마라. 그냥 면접에서 멋지게 해내고, 그러면 우리 사이엔 빚이 없는 거다.
나는 일반적인 소프트웨어 엔지니어링 직무, 그리고 그 직무의 면접에 대해서만 이야기한다.
이 팁들은 사실 꽤 일반적이다. Google이냐 다른 소프트웨어 회사냐에 따라 특별히 달라지는 건 없다. 나는 20년 전 내 첫 번째 소프트웨어 직장에 대해서도 이런 팁을 쓸 수 있었을 것이다. 즉, 적어도 우리 경력의 시간 범위 안에서는 이 팁들이 시대를 타지 않는다는 뜻이다.
물론 이 팁들만으로는 취업할 수 없다. 내가 바라는 것은, 이것들을 따르면 면접에서 당신이 최상의 수행을 할 수 있다는 점이다.
아, 그런데 음, 왜 하필 Google인가?
오호! 왜 Google이냐고? 좋다, 그 대화를 그냥 처음부터 해보자.
당신: 제가 Google에서 일해야 할까요? 사람들이 말하는 만큼 좋고, 그 이상인가요? 거기서 평온하고 행복하게 지낼 수 있을까요? 당장 지원해야 하나요?
나: 응.
당신: 어느 질문에 대ㅎ... 잠깐, “응”이 무슨 뜻이죠? 제가 누군지도 말 안 했는데요!
나: 친구, 답은 응이야. (당신이 여성일 수도 있겠지만 그래도 난 당신을 친구라고 부를 거다.)
당신: 하지만... 하지만... 저는 관성 때문에 꼼짝을 못 하겠어요! 지금 회사에서 어느 정도 편안함을 느끼고 있기도 하고, 적어도 불편함에는 꽤 익숙해졌어요. 여기엔 아는 사람도 있고 Google엔 아무도 없잖아요! Google의 빌드 시스템이랑 기술이랑 이런저런 걸 새로 배워야 하잖아요! 거기서는 제 신뢰도도 평판도 없어요. 사실상 거의 맨바닥부터 다시 시작해야 해요! 너무 늦었어요, 얻을 것도 없어요! 무서워어어어어!
나: 친구. 답은 이미 응이라고, 알겠어? 이건 불변식이야. Google에 온 다른 사람들도 정확히 같은 위치 에 있었어. 물론 Gandalf도 부끄러워할 정도의 수염을 가진 유명인 몇 명은 예외지만, 그런 사람들은 정말 극소수야. 지원한 모든 사람이 당신과 똑같은 이유로 지원하지 않을 핑계를 갖고 있었어. 그런데 여기 있는 모두가 이렇게 말하지. “세상에, 여기 오길 정말 잘했다!” 그러니까 그냥 지원해. 하지만 먼저 준비하고.
당신: 하지만 만약 제가 억울하게 떨어지면요? 제가 똑똑하고 자격도 충분한데, 어떤 무작위 이유로 면접을 못 봐서 오퍼를 못 받을 수도 있잖아요! 그건 제 자존심에 엄청난 타격일 거예요! 차라리 기회 자체를 포기하는 게 낫지, 실패할 가능성을 감수하고 싶진 않아요!
나: 그래, 그건 적어도 부분적으로는 사실이야. 젠장, 나도 첫 번째 시도에서 사실상 못 들어갔었고, 두 번째 면접 기회를 줄 때까지 길거리 개처럼 매달렸어. 그들이 약해진 순간을 잡은 거지. 그리고 두 번째에는 준비했고, 훨씬 더 잘했어.
문제는 Google에는 잘 알려진 false negative 비율이 있다는 점이다. 즉, 자격 있는 사람을 가끔 떨어뜨리더라도 자격 없는 사람을 가끔 뽑는 것보다는 낫다고 여긴다는 뜻이다. 사실 이건 업계 전반의 일이지만, 회사마다 그 다이얼을 어디에 맞추는지가 다르다. Google은 false negative 비율이 꽤 높다. 정확히 얼마나 되는지는 모르지만, 우리 면접을 통과하지 못한 똑똑하고 자격 있는 사람들을 많이 안다는 건 분명하다. 안타까운 일이다.
하지만 정말 중요한 핵심은 이것이다: 오퍼를 받지 못했더라도, 여전히 여기서 일할 자격이 있을 수 있다. 그러니 그게 꼭 자존심에 타격일 필요는 없다!
내가 아는 한, false negative는 완전히 무작위이며, 당신의 실력이나 자격과는 관계가 없다. 이런 일은 여러 요인 때문에 일어날 수 있다. 예를 들면 다음과 같다:
아니, Interview Anti-Loop라니!
그래, 안타깝지만 이건 걱정해야 한다.
그게 뭐냐고? 내가 Amazon에 있던 시절, 우리는 이 정확한 문제에 대해 정말 많은 고민을 했다. 결국 우리는 Amazon의 모든 직원 E에게는 적어도 하나의 “Interview Anti-Loop”가 있다고 결론 내렸다. 즉, E를 채용하지 않을 다른 직원들의 집합 S가 있다는 뜻이다. 이 근본 원인은 면접에 들어가기 전에 반드시 이해해야 하므로, 내가 지난 세월 동안 발견한 것을 조금 이야기해 보겠다.
첫째, 면접관에게 무엇이 중요한지 말해 줄 수는 없다. 어느 회사에서도 그렇다. 그들이 특별히 조언을 구하는 경우가 아니라면. 엔지니어가 대학을 졸업한 뒤 약 1년 정도의 아주 좁은 창이 있는데, 그때까지만 면접의 기술을 주입할 수 있다. 그 창이 닫히고 나면 그들은 자신이 “좋은 면접관”이라고 믿고, 질문도, 질문 방식도, 면접 스타일도, 피드백 방식도 다시는 바꿀 필요가 없다고 믿는다.
문제다. 하지만 나는 충분히 여러 번 손을 물려 봤기 때문에 더는 시도하지 않는다.
두 번째 문제: 모든 “경험 많은” 면접관은 지원자의 능력을 정확히 재는 척도라고 믿는 애착 주제와 때로는 특정 질문 세트를 가지고 있다. 두 면접관의 질문 세트는 매우 다를 수 있고, 아예 겹치지 않을 수도 있다.
어디에서나 볼 수 있는 전형적인 예는 이렇다. 면접관 A는 늘 C++ 잡학, 파일시스템, 네트워크 프로토콜, 이산수학을 묻는다. 면접관 B는 늘 Java 잡학, 디자인 패턴, 단위 테스트, 웹 프레임워크, 소프트웨어 프로젝트 관리를 묻는다. 같은 지원자가 A와 B를 모두 면접 루프에서 만난다면, A와 B는 매우 다른 평가를 줄 가능성이 높다. A와 B는 기회만 있으면 서로를 채용하지도 않을 것이다. 하지만 둘 다 공교롭게도 면접관 C를 거쳤고, C는 둘 다에게 자료구조, unix 유틸리티, 프로세스 대 스레드를 물었으며, A와 B는 둘 다 간신히 통과했다.
기술 회사에서 오퍼를 받는 일은 거의 항상 이런 식이다. 당신은 그저 간신히 통과한 것이다. 면접 과정은 본질적으로 결함이 있기 때문에, 설령 당신이 Alan Turing이라 하더라도 루프 안의 누군가 는 당신에게 깊은 인상을 받지 않을 가능성이 매우 높다. 사실 Alan Turing이라면 특히 더 그렇다. 그건 분명 당신이 C++를 모른다는 뜻이니까.
핵심은 이렇다. 어떤 소프트웨어 회사든 면접을 보러 간다면, 정말 재수가 없어서 당신의 Interview Anti-Loop에 속하는 사람이 면접 루프 안에 한 명 이상 들어올 가능성을 대비해야 한다. 그런 일이 생기면 당신은 고전하고, 그러다 지금 시점에는 적합하지 않다는 말을 듣고, 기분이 나빠질 것이다. 그 다음에 메타 차원으로 더 나빠지지만 않으면 다 괜찮다. 오히려 그런 일이 생긴 뒤 기분이 나빠진다는 사실이 좋은 일이다. 적어도 당신이 인간이라는 뜻이니까.
그리고 6-12개월 기다렸다가 다시 지원하면 된다. false negative 문제에 대해 우리(혹은 내가 아는 누구든)가 생각해 낸 최선의 해결책은 대체로 그것이다. 판을 깨끗이 지우고 처음부터 다시 시작하는 것이다. 두 번째나 세 번째 시도에 들어와서 아주 잘하고 있는 사람들이 여기에도 많다.
당신도 그럴 수 있다.
좋아, 혹시 채용되지 않더라도 좀 마음이 편해졌어
좋다! 그럼 이제 팁으로 넘어가자.
당신이 아주 주의 깊게 읽고 있었다면, 내가 면접관 D라는 걸 눈치챘을 것이다. 내 개인적인 애착 질문과 주제 세트는 그냥 내 것일 뿐이고, 다른 누구의 것보다 더 낫지도 더 나쁘지도 않다는 뜻이다. 그래서 아무리 말해 주고 싶어도 그게 뭔지 말할 수는 없다. A부터 X까지의 다른 면접관들을 다 기분 나쁘게 만들 테니까. 그들도 조금씩 다른 작업 세트를 가지고 있다.
대신, 나는 Google 같은 회사의 기술 면접관 대다수가 공통으로 중요하게 여긴다고 믿는 몇 가지 일반적인 주제에 대해 당신을 준비시키고 싶다. 대략 말하면, 이런 회사는 자체 소프트웨어를 많이 만들고 분산 컴퓨팅도 많이 한다. 기술 회사에도 다른 발자국이 있는데, 그 스펙트럼의 반대편 끝에는 모든 것을 컨설턴트에게 외주 주고 가능한 한 많은 서드파티 소프트웨어를 쓰려는 회사들이 있다. 내 팁은 그 회사가 Google과 닮아 있을 때에만 유용하다.
그러니 그냥 Google로 하자, 그렇지?
먼저 비기술적인 준비부터 이야기하자.
워밍업
아무도 차갑게 식은 채로 복싱 경기에 들어가지 않는다. 교훈: 면접에 복싱 장갑을 가져가야 한다. 아니, 잠깐, 미안. 내 말은 이거다: 미리 몸을 풀어라!
어떻게 워밍업하느냐고? 기본적으로 단기 워밍업과 장기 워밍업이 있고, 둘 다 해야 한다.
장기 워밍업이란 면접 전 1-2주 동안 공부하고 연습하는 것이다. 당신의 머리를 화이트보드 위에서 문제를 푸는 일반적인 “모드”로 맞춰 두고 싶다. 화이트보드에서 할 수 있다면 다른 모든 매체(노트북이든, 공유 네트워크 문서든, 뭐든)는 식은 죽 먹기다. 그러니 화이트보드를 기준으로 계획해라.
단기 워밍업이란 전날 밤 충분히 쉬고, 면접 당일 아침에는 강도 높고 빠른 템포의 워밍업을 하는 것이다.
내가 아는 최고의 장기 워밍업 두 가지는 다음과 같다.
그리고 작동 방식을 기억하고 있다면, 답을 아주 빠르게 끝낼 수도 있다. 그러니 면접 준비 관점에서 최선은, 특정 문제군이 특정 알고리즘과 자료구조로 가장 잘 해결된다는 사실을 알아보는 기술을 연습하는 것이다.
이런 면접 준비에 내가 절대적으로 가장 좋아하는 책은 Steven Skiena의 The Algorithm Design Manual이다. 이 책은 다른 어떤 책보다도 그래프 문제가 얼마나 놀랍도록 흔하고(그리고 중요한지)를 이해하는 데 도움을 줬다. 그래프는 모든 현업 프로그래머의 도구 상자에 있어야 한다. 이 책은 기본 자료구조와 정렬 알고리즘도 다루고 있어서 보너스로 좋다. 하지만 진짜 금광은 책의 후반부인데, 셀 수 없이 많은 유용한 문제들과 그것을 푸는 여러 방법을 과도한 세부사항 없이 1쪽짜리로 정리한 일종의 백과사전이다. 거의 모든 1쪽짜리에는 단순한 그림이 있어서 기억하기 쉽다. 수백 가지 문제 유형을 식별하는 방법을 배우기에 아주 좋은 방식이다.
내가 아는 다른 면접관들은 Introduction to Algorithms을 추천한다. 진정한 고전이자 매우 귀중한 자료지만, 아마 2주 안에 다 보기엔 무리일 것이다. 그래도 면접에 제대로 준비된 상태로 들어가고 싶다면, 그 책을 다 읽을 때까지 지원을 미루는 것도 고려해 봐라.
나는 첫 번째 Google 면접 전에 이런 두 가지 준비를 하지 않았고, 마지막 면접이 7년 전이었는데 그 사이 화이트보드 코딩 실력이 얼마나 형편없어졌는지 알고 정말 충격을 받았다. 어렵다! 그리고 예전에 알았거나 적어도 들어는 봤던 알고리즘과 자료구조도 한 무더기 잊어버렸다.
이 연습들을 1주일 동안 하고 나니 두 번째 Google 면접 라운드 준비가 엄청나게 잘 되었고, 훨씬 훨씬 더 잘했다. 정말 모든 차이를 만들어 냈다.
단기 준비에 관해서는, 사실 할 수 있는 건 가능한 한 정신이 또렷하고 몸이 풀린 상태를 만드는 것뿐이다. 차갑게 들어가지 마라. 문제 몇 개를 풀고 공부한 책을 훑어봐라. 커피도 마셔라. 믿든 말든 실제로 더 빨리 생각하게 해 준다. 면접장에 들어가기 직전 최소 한 시간 은 꼭 연습해라. 스포츠 경기나 음악 발표회, 또는 시험처럼 대하라. 워밍업을 하고 들어가면 최고의 أداء를 할 수 있다.
멘탈 준비
좋아! 당신은 긴 업적 목록을 가진 잘나가는 프로그래머다. 이제 그건 잠시 잊고 면접 생존에 집중할 시간이다.
겸손하고, 열린 마음을 가지고, 집중한 상태로 들어가야 한다.
거만하게 보이면 사람들은 당신과 함께 일하고 싶은지 의문을 갖게 된다. 거만하게 보이는 가장 좋은 방법은 면접관의 질문이 타당한지 의문을 제기하는 것이다. 앞서 말했듯이, 그건 면접관들을 정말 짜증나게 한다. 내가 면접관에게 면접 보는 방법을 가르칠 수 없다고 했던 것 기억나는가? 당신이 지원자일 때는 그게 특히나 더 그렇다.
그러니 “알고리즘이 정말 그렇게 중요한가요? 실제로 그런 게 필요할 때가 있나요? 저는 그런 걸 해볼 일이 없었는데요” 같은 말은 하지 마라. 그냥 탈락하니까 그런 말은 하지 마라. 답을 몰라서 답답하더라도 모든 질문을 정당한 것으로 받아들여라.
막히면 도움이나 힌트를 요청해도 된다. 어떤 면접관은 그걸 감점하지만, 때로는 그게 어떤 장애물을 넘게 해 주고, 그렇지 않았다면 끔찍하고 돌처럼 굳은 30분 침묵이 됐을 시간을 괜찮은 수행으로 바꿔 주기도 한다.
생각할 때 “칙칙폭폭” 같은 소리를 내지 마라.
주제를 바꿔서 다른 질문에 답하려 하지 마라. 전쟁 같은 옛 이야기로 면접관이 질문하지 못하게 돌리려 하지 마라. 면접관을 속이려 하지 마라. 그들이 주는 각 문제에 집중 해서, 그 문제를 완전히 답하려 최선을 다해야 한다.
어떤 면접관은 코드 작성을 직접 요구하지 않을 수도 있지만, 당신의 답변 도중 어느 시점엔가 화이트보드에 코드를 쓰기 시작할 것을 기대 한다. 힌트는 주겠지만 꼭 “이제 보드에 코드를 좀 써 주세요”라고 대놓고 말하지는 않는다. 확실하지 않으면 코드를 보고 싶은지 물어봐라.
면접관마다 코드에 대한 기대는 엄청 다르다. 나는 개인적으로 문법은 별로 신경 쓰지 않는다. (단, 어떤 언어로도 절대 작동할 수 없는 코드를 쓰면 그때는 내가 끼어들어서 당신이 사실 서커스 광대가 아니며 단순한 실수였는지 확인하겠지만.) 하지만 어떤 면접관은 문법에 정말 까다롭고, 어떤 면접관은 세미콜론이나 중괄호 하나 빠진 것만으로도 말도 없이 조용히 감점하기도 한다. 나는 그런 면접관들을 — 음, “bass soles”와 운율이 맞는 기술 용어가 있긴 한데 — 그냥 그렇게 생각한다. 하지만 그들은 스스로를 뛰어난 기술 평가자라고 생각하고, 그걸 바꿔 말릴 방법은 없다.
그러니 물어봐라. 문법을 중요하게 보는지 물어보고, 중요하다면 맞추려고 노력해라. 당신의 코드를 여러 각도와 거리에서 주의 깊게 봐라. 남의 코드라고 생각하고 버그를 찾는 임무를 받은 것처럼 해라. 면접관이 당신의 어깨뼈를 노려보는 가운데 화이트보드 60센티 앞에 서 있으면 얼마나 많은 걸 놓칠 수 있는지 놀랄 것이다.
몇 가지 명확화 질문을 하고, 때때로 면접관에게 자신이 그들이 원하는 방향으로 가고 있는지 확인하는 것은 괜찮다. 아니, 오히려 강력히 권장된다. 어떤 면접관은 당신이 그냥 벌떡 일어나 곧바로 코딩을 시작하면 코드가 맞더라도 감점할 것이다. 그들은 당신이 먼저 신중하게 생각하지 않았고, 설계 같은 건 하지 말자는 식의 카우보이 유형이라고 말할 것이다. 그러니 답을 안다고 생각하더라도, 들어가기 전에 질문 몇 개 하고 접근 방식에 대해 조금 이야기해라.
반대로, 실제로 문제를 풀기 시작하기 전까지 너무 오래 끌면 어떤 면접관은 경기 지연 페널티를 줄 것이다. 대개 면접관은 한 인터뷰 동안 질문을 하나 이상 보고 싶어 하므로, 빠르게 움직이고(그리고 써라) 노력해라. 첫 번째 문제를 너무 느리게 풀면 시간이 다 떨어진다. 그러면 당신의 능력을 충분히 보지 못했다고 생각하고 감점할 것이다. 면접에서는 의심의 이익이 거의 주어지지 않는다.
마지막 비기술 팁 하나: 본인 화이트보드용 드라이 이레이스 마커를 가져가라. 문구점에는 연필처럼 얇은 것들을 파는데, 대부분의 회사(Google 포함)는 대개 뚱뚱한 것들을 비치해 둔다. 얇은 마커는 당신의 화이트보드를 480i 표준 화질 브라운관에서 58인치 1080p HD 플라스마 화면으로 바꿔 준다. 도움이 될 수 있는 건 뭐든 다 필요하고, 화이트보드의 여유 공간은 진짜 축복이다.
또한 화이트보드 공간 관리 기술도 연습해야 한다. 예를 들어 오른쪽에서 시작해서 오른쪽 아래 모서리로 내려가며 초소형 읽기 불가 글씨로 코딩하지 않는 것 같은 기술 말이다. 면접관은 감동하지 않는다. 우습게도, 사람들이 늘 이렇게 하면 짜증나면서도 나 역시 면접 때 그렇게 했다. 그냥 그런 점을 의식만 해 둬라!
아, 그리고 서서 흔들고 있는 동안 마커가 마르지 않게 해라. 진짜다. 면접 중에는 방해 요소를 최소화하고 싶은데, 그건 놀랄 만큼 흔한 방해 요소다.
좋아, 비기술 팁은 이 정도면 충분할 것 같다. 이제 X로 가 보자. 어떤 값의 X든 말이다! 날 찌르지 마!
기술 준비 팁
최고의 팁은 이거다: 컴퓨터 과학 학위를 따러 가라. 컴퓨터 과학을 더 많이 알수록 더 좋다. 꼭 CS 학위가 있어야 하는 건 아니지만, 있으면 도움이 된다. 꼭 고급 학위일 필요도 없지만, 그것도 도움이 된다.
하지만 당신은 아마 지금으로부터 2년에서 8년 후보다 조금 더 빨리 Google에 지원하려 하고 있을 테니, 단기적인 팁을 몇 가지 주겠다.
알고리즘 복잡도: Big-O를 알아야 한다. 필수다. 기본적인 big-O 복잡도 분석에서 버벅거린다면, 채용되지 않을 가능성이 거의 확실하다. 계산 이론 책 맨 앞부분 한 챕터쯤 되는 내용이니까 그냥 읽어라. 할 수 있다.
정렬: 정렬할 줄 알아야 한다. 버블 정렬은 쓰지 마라. 최소한 하나의 정렬 알고리즘, 가능하다면 둘 정도(예: quicksort와 merge sort)의 세부사항을 알아야 한다. merge sort는 quicksort가 비현실적인 상황에서 매우 유용할 수 있으니 한 번 봐 둬라.
제발 면접 중에 연결 리스트를 정렬하려고 하지 마라.
해시테이블: 해시테이블은 인류가 아는 가장 중요한 자료구조 하나라고 해도 과언이 아니다. 어떻게 작동하는지 반드시 알아야 한다. 이것도 마찬가지로 자료구조 책 한 권의 한 챕터 정도니까 그냥 읽어라. 자신이 가장 좋아하는 언어로, 배열만 사용해서 하나를 구현할 수 있어야 한다. 대략 한 번의 면접 시간 안에.
트리: 트리에 대해 알아야 한다. 진짜다. 이건 기본 중의 기본이고, 이런 걸 꺼내는 것도 민망하지만, 여기 있는 몇몇은 기본적인 트리 생성, 순회, 조작 알고리즘을 모른다. 최소한 이진 트리, n-항 트리, trie-tree 정도는 정말 최소한 익숙해야 한다. 트리는 장기 워밍업 연습을 위한 문제를 얻기에 아마 가장 좋은 원천일 것이다.
균형 이진 트리의 한 종류 이상, 예를 들어 red/black tree, splay tree, AVL tree 중 하나 정도는 익숙해야 한다. 그리고 실제로 어떻게 구현되는지도 알아야 한다.
트리 순회 알고리즘도 알아야 한다. BFS와 DFS, 그리고 inorder, postorder, preorder의 차이를 알아야 한다.
평소에 트리를 별로 안 쓸 수도 있다. 하지만 그게 사실이라면, 단지 트리 문제를 피하고 있기 때문일 뿐이다. 어떻게 작동하는지 알게 되면 더는 그럴 필요가 없다. 공부해라!
그래프
그래프는 정말 정말 중요하다. 당신이 생각하는 것보다 더. 이미 중요하다고 생각하고 있더라도, 아마 당신 생각보다 더 중요하다.
메모리에서 그래프를 표현하는 기본적인 방법은 세 가지가 있다(객체와 포인터, 행렬, 인접 리스트). 각 표현과 그 장단점에 익숙해져야 한다.
기본 그래프 순회 알고리즘도 알아야 한다. 너비 우선 탐색과 깊이 우선 탐색이다. 계산 복잡도와 트레이드오프, 실제 코드에서 구현하는 방법도 알아야 한다.
기회가 된다면 Dijkstra와 A* 같은 좀 더 고급 알고리즘도 공부해 봐라. 게임 프로그래밍부터 분산 컴퓨팅까지 거의 무엇에나 정말 훌륭하다. 알아야 한다.
누가 문제를 주면, 그래프를 생각해라. 그래프는 모든 종류의 관계를 표현하는 가장 근본적이고 유연한 방식이다. 그러니 흥미로운 설계 문제라면 대략 반반 확률로 그래프가 관련되어 있다. 다른 종류의 해법으로 넘어가기 전에, 그래프로 푸는 방법이 없는지 반드시 확인해라. 이 팁은 중요하다!
기타 자료구조
당신의 큰 머릿속에 넣을 수 있는 한, 가능한 많은 다른 자료구조와 알고리즘도 공부해라. 특히 traveling salesman이나 knapsack problem처럼 가장 유명한 NP-complete 문제 군은 알아 두고, 면접관이 그것들을 변장시켜 물었을 때 알아볼 수 있어야 한다.
NP-complete가 무엇을 의미하는지도 알아둬라.
기본적으로, 자료구조 책을 세게 파고들고, 가능한 한 많이 머릿속에 남기려고 해라. 그러면 틀릴 일이 없다.
수학
어떤 면접관들은 기본적인 이산수학 질문을 한다. 이건 내가 가 본 다른 곳보다 Google에서 더 흔하고, 나는 이걸 좋은 일이라고 생각한다. 비록 내가 이산수학을 특별히 잘하는 편은 아니지만 말이다. 우리는 수 세기 문제, 확률 문제, 기타 수많은 이산수학 입문 수준 상황들에 둘러싸여 있고, 우리 중 수 감각 없는 사람들은 우리가 무엇을 하는지도 모르고 태연하게 이것저것 짜깁기한다.
면접관이 수학 질문을 한다고 화내지 마라. 최선을 다해라. 그리고 인터뷰 전에 조합론과 확률의 핵심을 복습하거나(혹은 새로 배우거나) 시간을 조금만 써도, 당신의 최선은 훨씬 더 나아질 것이다. n-choose-k 문제와 그 친척들에 익숙해야 한다. 많이 알수록 좋다.
안다, 안다, 시간 부족하겠지. 하지만 이 팁은 “우리는 잘 모르겠어”와 “그녀를 채용하자”의 차이를 만들어 줄 수 있다. 게다가 그렇게까지 나쁘지도 않다. 이산수학은 당신이 고등학교 때 공부했다가 잊어버린 수학을 많이 쓰지 않는다. 초등학교 수준 수학에서 다시 시작해서 거기서 쌓아 올리니, 아마 며칠만 집중해서 공부해도 면접에 필요한 정도는 익힐 수 있을 것이다.
안타깝게도 나는 좋은 이산수학 책 추천은 없다. 혹시 있다면 댓글에 남겨 달라. 고맙다.
운영체제
이건 그냥 내가 덧붙이는 한 마디다. 프로세스, 스레드, 그리고 동시성 문제를 알아라. 많은 면접관이 그것들을 묻고, 아주 근본적인 내용이므로 알아야 한다. lock, mutex, semaphore, monitor가 무엇이고 어떻게 작동하는지 알아라. deadlock과 livelock이 무엇인지, 그리고 어떻게 피하는지 알아라. 프로세스에 어떤 자원이 필요한지, 스레드에는 어떤 자원이 필요한지, context switching이 어떻게 작동하는지, 운영체제와 그 아래 하드웨어가 어떻게 그것을 시작하는지 알아라. 스케줄링도 조금은 알아라. 세상은 빠르게 멀티코어로 움직이고 있고, “현대적” 동시성 구성물의 기초를 이해하지 못하면 순식간에 공룡이 된다. (여기서 “현대적”이란 “좀 망가진”이라는 뜻이다.)
이 주제에 대해 내가 개인적으로 읽은 책 중 가장 좋고 가장 실용적인 책은 Doug Lea의 Concurrent Programming in Java였다. 페이지당 얻는 게 가장 컸다. 물론 동시성 책은 많다. 학술적인 것보다는 실용적인 것에 집중하는 걸 추천한다. 면접에서 나올 가능성이 더 크기 때문이다.
코딩
적어도 하나의 프로그래밍 언어는 정말 잘 알아야 하고, 가능하면 C++나 Java여야 한다. C#도 괜찮다. Java와 꽤 비슷하니까. 면접 중 적어도 몇 번은 코드를 작성할 것이 기대된다. 당신이 가장 좋아하는 프로그래밍 언어에 대해 꽤 많은 세부사항을 알고 있어야 할 것이다.
기타 사항
위에서 설명한 규칙들 때문에, 여전히 면접관 A를 만나고 이 팁으로 공부한 것들이 직접적으로는 아무 소용이 없을 수도 있다. (워밍업이 되어 있다는 점은 제외하고.) 그렇다면 그냥 최선을 다해라. 최악의 경우 6-12개월 후에 다시 올 수 있잖아, 그렇지? 길게 느껴질지 몰라도, 순식간에 지나갈 거라고 장담한다.
내가 다룬 것들은 사실 대부분 red flag다. 당신이 모르면 사람들을 정말 걱정하게 만드는 것들 말이다. 이산수학은 잠재적으로 선택 사항일 수도 있지만, 그 기본도 전혀 모르면 꽤 위험하다. 내가 언급한 나머지는 모두 완전히 익숙해야 한다. 그래야 적어도 기본 면접 수준에는 준비된 것이다. 면접관에 따라 그것보다 훨씬 더 어려울 수도 있고, 쉬울 수도 있다.
결국 얼마나 운이 좋으냐에 달려 있다. 운이 좋다고 느끼는가? 그렇다면 한번 도전해 봐라!
내게 이력서를 보내라
사람들이 내게 보내는 이력서는 아마 모아서 매주 한 번씩 제출할 것 같다. 그동안은 공부해라! 당신은 워밍업을 아주 많이 해야 한다. 실전 업무는 사람을 녹슬게 만든다.
이 글이 도움이 되었기를 바란다. 이제 불꽃이 시작되겠지, 뭐. 하품.
Steve Yegge가 오후 6:16에 게시![]()
Ben 님이 말했습니다...
고마워요, Steve. 아주 도움이 많이 됐어요. 다만 작년 가을에 당신네와 전화 면접을 보고 트리 순회에서 완전히 머리가 하얘진 뒤가 아니라, 그 전에 봤으면 더 도움이 됐겠지만요. 농담이 아니라, 저를 면접하던 사람이 테이블을 손가락으로 초조하게 두드리는 소리가 들릴 정도였어요. 그는 그냥 제가 탈락하게 체크해 버리고 싶어서 근질거리고 있었죠. 저는 제가 멍청하지 않은 척하는 걸 좋아하긴 하지만, 면접을 그렇게 잘 보는 편은 아니거든요.
그래도 자료구조와 알고리즘 공부에 대해서는 완전 동의합니다. 트리 관련 질문 답을 모르고 나서 알고리즘/자료구조 책을 읽으러 나갔고, 그게 정말, 정말 많이 도움이 됐어요. 덕분에 그다음 면접에서는 그걸 써먹을 수도 있었고, 그 면접은 망치지 않았죠.
Silas Snider 님이 말했습니다...
제가 읽어본 최고의 이산수학 책은 Graham, Knuth, Patashnik의 "Concrete Mathematics: A Foundation for Computer Science"입니다.
Greg 님이 말했습니다...
훌륭한 글입니다. 곧 “대학 졸업 후 5년” 문턱을 넘게 되는 프로그래머 입장에서 보면, 저 알고리즘들 중 일부는 일상적인 도구라기보다 옛 친구처럼 느껴지네요. 좋지 않네요, 좋지 않아요. 먼지를 털고 책을 다시 펼칠 때입니다 :)
garret 님이 말했습니다...
MIT OpenCourseWare에는 CS용 이산수학 강의 노트가 정말 좋습니다. 제가 들었던 대학 수업에서는 교재 역할을 했어요.
Shrutarshi Basu 님이 말했습니다...
전 아직 대학 1학년이라, 이걸 최대한 잘 활용해 보려고 합니다.... 어떻게 됐는지는 한.... 5년쯤 뒤에 알려드릴게요.
~kristen 님이 말했습니다...
고마워요 Steve. 졸업을 앞둔 학생에게 정말 좋은 조언이네요. 저는 지난주 첫 오퍼를 받았지만, Google 가능성을 절대 배제하진 않아요!
CS 학위가 있으면 좋지만, 없다고 해서 낙담하진 마세요. 저는 수학 학사와 기본적인 CS 수업 몇 개(그리고 스스로 추가 공부)만으로도 꽤 잘 해나가고 있어요. CS 배경이 없다면, 사람이 무엇을 공부해야 하는지 정말 잘 요약한 글이네요.
조합론 책으로는 "Applied Combinatorics" (Roberts & Tessman)를 추천해요. 예제와 문제가 많습니다. 좋은 책이에요.
Alex Gartrell 님이 말했습니다...
http://www.cs.cmu.edu/~15251/
위키에 있는 이산수학 강의 노트가 아주 좋습니다(무료예요).
Unknown 님이 말했습니다...
훌륭한 면접 팁 모음 고마워요 Steve.
Google에 뛰어들어 지원해 볼까 고민하는 분들을 위해 제안 하나 더 하자면, Valve Software(알죠, 비디오 게임 회사? Half-Life? Counter-Strike? Steam?)에도 같이 지원해 보세요. Google과 비슷한 아주 빡센 면접 과정을 거치게 될 테니, 그 자체로도 Google 면접의 훌륭한 워밍업이 될 겁니다. 최선의 경우엔 멋지게 통과하고, Google조차 Valve보다 더 멋지거나 더 재밌을 순 없다고 우리가 설득할 수도 있고요.
http://www.valvesoftware.com/jobs.html
...
이름:Steve Yegge위치: 미국 워싱턴주 Kirkland
전체 프로필 보기