이직하면서 인터뷰를 많이 떨어졌다. 그래서 인터뷰를 잘 보는 노하우는 없지만, 잘 보지 못하는 노하우는 생겼다. 그 노하우를 적어본다.
소프트웨어 개발자 인터뷰는 4가지 종류가 있다. 전화 스크리닝 인터뷰, 코딩 인터뷰, 시스템 디자인 인터뷰, 행동주의적 인터뷰다.
- 전화 스크리닝 인터뷰
- 집중할 수 없는 장소에서 전화를 받는다. 나는 도서관에서 전화를 받았는데, 내 목소리가 크다고 해서 도서관에서 쫒겨났다. 도서관 사서와 얘기하느라 제대로 대답을 하지 못했고, 계단을 내려가느라 숨이 차기도 했고, 도서관 밖에 하필 바람이 많이 불어서 알아듣기 어려웠다. 결국 떨어졌다.
- 전화 음질이 좋지 않다. 내가 썼던 소니 엑스페리아 Z Ultra의 스피커와 마이크가 음질이 나빴는데, 그래서 나도 잘 못 알아들었고, 상대방도 잘 못 알아들었다. 이어폰을 쓰면 좀 나았지만, 이어폰 꼽는 부분이 오래되서 목소리가 뚝뚝 끊어졌다. 결국 떨어졌다. 나의 대학원 동기는 이것 때문에 폰을 새로 샀다. 돈을 아끼면 안된다.
- 대기업이 아니라 스타트업 같은 경우, Job Description (JD)에 적힌 기술의 상세 스펙을 물어본다. 예를 들어 Javascript 같은 경우, 펑션 안의 펑션을 넣는 것은 Closure라고 답해야 한다. CSS 같은 경우, 여러 목록의 첫번째를 가져오는 건 first-child 라고 답해야 한다. LinkedIn Skill Quiz 와 같다. 이런 단답형 퀴즈 3개 중에 하나라도 틀리면 떨어진다.
- 코딩 인터뷰
- 스타트업 같은 경우, 알고리듬보다는 일상적인 업무 코딩을 물어본다. 예를 들어 파이썬으로 간단한 REST API를 만들거나, React로 간단한 화면을 만든다. 이것도 Job Description (JD)에 기술한 것에서 나온다. 맨날 Leetcode만 풀면 떨어진다.
- 대기업은 알다시피 Leetcode 형식인데, 이걸 평소 업무하듯이 코딩하면 떨어진다. 예를들어 Java에서 try catch를 많이 쓰거나, null 값을 이용해서 예외 처리를 많이 하거나, 클래스를 자잘하게 많이 만들거나 하면 떨어진다. 물론 이런걸 쓰고도 10분 안에 풀고, 가독성이 좋고, 알고리듬도 정확하면 붙겠지만, 솔직히 이렇게 업무하듯이 코딩하면 코드가 길어지고 시간이 많이 걸려서 정작 알고리듬을 물어볼 시간이 없다.
- Leetcode, interviewing.io 등에 돈을 너무 아끼면 안된다. 나는 대학원 동기와 인터뷰 준비를 했는데, 그 친구가 유료 결제를 하고 나는 그 유료 문제를 복사해서 풀었다. 이게 무슨 에너지 낭비인가.
- 문제를 모호하게 낸다고 해서 너무 디테일하게 물어보면 안된다. 온갖 특이한 예외 케이스를 10개 넘게 물어보다가 시간이 다 가면 떨어진다.
- 도저히 못 풀겠는데 억지로 풀면 떨어진다. 아무리 준비를 많이 해도 정말 막막한 경우가 생긴다. 그래도 일단 풀기 시작하면 어떻게든 되겠지, 객기를 부리다가 떨어진다.
- 세부 로직에 너무 집착하면 떨어진다. 예를 들어 AVL 트리나 Multiset 같은 거를 직접 구현하다보면 시간이 다 가버린다.
- 너무 monolithic 하게 짜면 떨어진다. 한 곳에 모든 로직을 다 때려넣으면 읽기가 어렵다. 스타트업과 달리 대기업은 코드를 실행해보지 않기 때문에, 인터뷰어가 코드를 직접 눈으로 읽어서 확인해야 한다. 그걸 한 30줄 넘게 다닥다닥 붙여서 짜면, 인터뷰어도 사람인지라 짜증이 난다.
- 인터뷰어가 가끔 인터뷰에 집중하지 못하고 적당히 넘어갈 때가 있다. 그렇다고 나도 적당히 코딩하고 적당히 설명하면 떨어진다. 인터뷰가 다 끝날때 쯤 되서야 겨우 정신을 차렸는데 인터뷰 리포트가 하얗게 빈 칸이면, 에라 모르겠다, 적당히 적어서 떨어트린다.
- 너무 천천히 풀면 떨어진다. 디테일 하나하나에 신경쓰다가 시간이 다 가버리면 떨어진다.
- 처음에 풀기로 했던 방법과 다르게 풀면 떨어진다. 풀다보니 막혔는데, 갑자기 좋은 아이디어가 떠올라서 다시 처음부터 풀면 안된다.
- 시스템 디자인 인터뷰
- 내가 시니어 경력인데 주니어처럼 풀면 떨어진다. 내 경력이 11년차면, 내가 희망연봉을 낮게 말해서 하향지원을 해도 나를 주니어급으로 뽑지 않는다. 인터넷에 있는 자료들은 주니어급이다. 그걸로는 부족한다.
- 코딩 인터뷰와 마찬가지로, 문제가 모호하다고 해서 너무 디테일을 많이 물어보면 떨어진다. 너무 인터뷰어의 동의를 자주 구하면 안된다. 그렇게 자잘한 걸 하나하나 신경쓰다가 큰 그림을 그리지 못하면 떨어진다.
- 인터뷰어가 내 설계의 결함을 지적했는데, 그걸 너무 방어하면 떨어진다. 코딩 인터뷰처럼 처음 생각했던 걸 끝까지 완성하려고 버티면 안된다. 설계는 코딩과 다르다. 지적을 받아들여서 고쳐야 한다.
- 코딩 인터뷰처럼 빨리 푸는 것만 생각하면 떨어진다. 마음이 급해져서 말이 너무 빨라졌는데, 인터뷰어가 잘 못 알아듣는데도 너무 밀어붙이면 안된다.
- 너무 글로 적으면 떨어진다. 계속 적다보면 글이 많아져서 낙서처럼 된다. 그래서 맨 마지막에 인터뷰어가 화면을 캡처하면, 깜지처럼 빼곡한 그림이 된다.
- Grokking the system design interview 같은 유료 컨텐츠에 돈을 아끼면 안된다. 인터넷에 많은 무료 자료들이 너무 옛날 것이라 오히려 해롭다. 한 3년만 지나도 옛날 거다.
- 행동주의적 인터뷰
- 솔직하지 못하면 떨어진다. 나의 단점이나 실패했던 경험을 꼭 물어보는데, 신기하게도 내가 회피하고 싶은 부분들을 집요하게 물어본다. 이걸 너무 회피하면 안된다.
- 그 회사의 핵심 가치를 빠트리면 떨어진다. 여러 회사의 인터뷰를 보다보면 다들 비슷해서 헷갈리는데, 가치는 비슷해도 키워드가 조금씩 다르다. 인터뷰어가 듣고 싶어하는 키워드들을 단답형처럼 포함해야 한다.
- 행동주의적 인터뷰도 결국 기술 인터뷰이기 때문에, 가끔 가다가 몇 개를 찝어서 깊에 물어보는데, 이때 상세한 기술 스펙까지 얘기하지 못하면 떨어진다.
- 시니어인데 주니어처럼 답하면 떨어진다. 시스템 디자인 인터뷰와 마찬가지로, 시니어 급의 질문들은 인터넷에서 거의 찾을 수 없다. 주니어들과 달리 시니어들은 인터넷에 공유를 안 하는 것 같다. 질문을 알아야 준비를 할텐데, 질문을 모르니 준비할 수 없다.
- 내가 했던 일을 잘 설명하지 못하면 떨어진다. 행동주의적 인터뷰는 내가 지금 일을 잘 하고 있어야 잘 답변할 수 있다. 이런 질문은 다른 인터뷰와 다르게, 나의 답변이 인터뷰어에게 유익해야 한다. 내가 오히려 인터뷰어를 가르쳐야 한다. 1분짜리 기술 세미나 같다. 그래서 이직할때도 일을 쉬면 안된다.
인터뷰가 계속 떨어지면 정말 좌절스럽다. 내가 이렇게 무능한가 싶은 생각이 든다. 실제로 능력이 부족한건 맞으니까, 현실을 받아들이고 내가 할 수 있는 일을 하는 수밖에 없다. 그래서 잘되면 다행이고 아니면 마는 거다. 그 이상으로 심각하게 생각하면 끝이 없다.
그리고 인터넷에 많은 성공 사례들에 너무 집착하면 안된다. 그 사람이 사실은 잘못한 부분도 있을 수 있고, 그 사람은 잘 되지만 내가 잘 안되는 게 있을 수 있다. 그 사람은 그 성공을 재현할 수 있어도 나는 재현하지 못할 수 있다. 그러니까 적당히 참고하고 넘겨야지, 거기에 매몰되면 끝이 없다.