지난주에 모 회사의 프론트엔드 개발 기술면접에 다녀왔다.
총 2시간 동안 진행되었고 비밀유지 서약서를 썼기 때문에 회사명과 진행 과정을 상세히 밝히기 어렵지만, 공고에 '라이브 코딩테스트와 기술 관련 면접'으로 안내되어 있었고 그대로 진행되었다.
이 회사만 특별히 회고를 적는 이유는 시간도 길었고, 최근에 다녀온 기술면접 중 가장 깊이 있는 질문을 받았기 때문이다.
라이브 코딩테스트라고만 적혀 있어서 기술면접을 준비하면서 알고리즘 테스트일 지, React 컴포넌트 구현과 관련한 테스트가 될 지 알 수 없었다. 인생 첫 라이브 코딩테스트다보니 엄청나게 긴장을 했고, 전 날까지도 기술보다 알고리즘과 React 컴포넌트 구현 연습에 집중했다.
현장에서 코딩테스트용 노트북을 받고 알게 되었는데, 어느 종류 였는지는 말하기 어려우나 주어진 문제 자체는 그리 어렵지 않았다. 면접관께서는 "페어 코딩" 방식으로 진행한다고 안내해주셨는데, 이런 방식에 익숙치 않기도 했고 제가 쓰는 코드를 면접관이 실시간으로 보고 있다는 압박감에 혼자서 경직된 상태로 코드를 써내갔다.
"지원자님, 같이 해요. 걸리는 부분이 어디세요?"
빠르게 움직이던 손이 갑자기 멈춘 나에게 면접관님이 말을 건내면서, 그때부터 커뮤니케이션을 하면서 코드를 써내려가게 되었다. 기본 문제를 마치고 추가 미션이 있었고 내가 욕심을 부린 부분이 있었는데 결국 이 부분을 해결하지 못했다.
면접관님이 '거의 다 왔는데...'라는 말을 해주셨고, 많은 힌트를 주셨지만 끝내 해결을 하지 못했다. 2시간 진행 면접은 1부와 2부로 진행되었었는데 그 사이 쉬는 시간에 확인해보니, 정말 아쉽게 해결하지 못했던게 맞았다.
앞서 말했듯 최근에 기술면접을 갔던 곳 중에서, 가장 깊이 있고 기승전결이 갖춰진 면접이었다.
다른 곳은 이거 뭐에요, 저거 뭐에요,와 같은 백과사전식 질문에 가까웠는데 이 곳은, 크게 3개 주제에 대해 물었는데 이와 관련한 꼬리질문을 길게 물었다.
첫번째는 클로저와 프로토타입 개념에 대한 질문이었다. 클로저에 대한 개념은 은닉화와 결부시켜서 설명했지만 답변이 충분치 못하다고 느꼈는지, 더 자세하게 이야기 해주시거나 가능하다면 수도 코드를 요구하셨다. 수도 코드로 적는게 더 틀릴 것 같아서, 손으로 더 구체적으로 설명하는 것으로 갈음했다.
프로토타입에 대해서는 객체지향 프로그래밍과 관련하여 답변드렸는데, 사실 꼬리 질문에 대해서는 거의 답변하지 못했다. 프로토타입은 보통 코어 레벨을 손대지 않는다면 현업에선 마주할 일이 거의 없는 개념이고, 아예 대비하지 않은 부분이라 공부도 안 되어 있다보니, 딥 다이브에서 본 머나먼 과거의 기억을 끄집어내다가 꼬리질문에서 바로 바닥을 드러냈다.
두번째는 버추얼 DOM에 대한 질문이었다. 개념에 대해서는 무난하게 답변했고, 리렌더링 조건에 대해서도 이야기 했다. 그런데 상태가 100번 바뀌면, 렌더링도 100번 일어나냐고 물어보셨다. React는 상태가 변경되면 리렌더링을 스케줄링만 해두고 배치 처리하여 최종적으로 1번의 리렌더링 사이클에 모두 처리된다. 스케줄링과 배치 처리를 한다는 것은 알고는 있었지만, 파편적으로 공부하다보니 이렇게 렌더링과 결부해서 살짝만 변형된 질문을 받아도 왜 그런지 의도를 바로 파악하지 못했다. 결국 이 부분도 썩 만족스럽지 않게 답변했다.
React 컴포넌트의 key에 대해서도 설명했는데 재조정(Reconciliation)의 개념을 도입해서 깊게 질문하셨다. 이 부분도 부분적으로는 알고는 있었지만, 긴장을 하기도 했고 앞선 답변과 마찬가지로 개념을 외우는 식으로만 알고 있다보니 전체적으로 연결해서 공부하는데 부족했음을 깨달았다.
세번째는 CORS에 대한 질문이었다. 이 부분은 HTTP 통신 메서드 중 OPTIONS에 대해 먼저 물어보셨는데, 솔직히 CORS 개념만 간단하게 답변한 정도이고 전체적으로는 제대로 답변을 하지 못했다. 개발자 도구에서 서버 통신을 하면 꼭 봤던 메서드였는데, 이게 CORS와 관련된 메서드인지 이번에 알게 되었다. 워낙 답변을 못해서 그런지, 추가적으로 GET과 POST 메서드의 차이점에 대해서 질문하시고 1부가 마무리 되었다.
2부에서는 지원 사유나 개발과 협업 경험에 대해 묻는 시간이었다. 1시간이 넘는 1부를 마치고 난 뒤라, 상당히 진이 빠져있었고 긴장도 풀렸다. 그렇다보니 약간은 느슨해진 상태에서 답변을 하게 되었다. (그래서 기억이 잘 안난다...)
지원 사유는 회사를 선택하는 나만의 3가지 기준을 말씀드리고 이 기준에 부합하는 회사라서 지원하게 되었다고 답변 드렸다. 도메인이 좀 독특한 회사인데, 내 과거 경험에 대해 말씀 드렸더니 도메인에 관심을 가진 계기를 납득하신 듯 했다.
다음으론 주니어와 시니어의 차이와 현재 나의 위치는 어디인지에 대해 물었다. 답변을 하면서 '중니어'라는 개념도 괜히 이야기 했다가, 그건 또 어떤 차이가 있는지에 대한 나의 생각을 요구하는 추가 질문을 받게 되었다. 나의 위치는 주니어의 중후반을 달리고 있는 것 같다고 답변드렸다.
디자인 시스템 기반으로 컴포넌트 구현할 때 가장 고려하는 점에 대한 질문도 받았다. 컴포넌트의 인터페이스가 되는 Props를 어떻게 정의할 지, children으로 내려 확장성을 넓히는게 나은지 인터페이스를 좁히는게 좋을 지에 대한 케이스에 대해 말씀 드렸다.
이전 직장에서 개발 문화와 관련하여 기여한 사례에 대한 질문도 받았는데, 사실 여기서부터 뇌가 심하게 느슨해진 상태였다. 기여한 사례가 따로 있었는데 그 부분을 답변 안하고, 컨벤션 이야기만 웅얼거리다가 넘어가게 되었다. (최악1)
그리고 협업할 때 동료들에게 바라는 점에 대해서도 질문을 받았는데, '바라는 점은 없고, 제가 잘하겠습니다'라는 소리를 해버렸다. (최악2) 그래도 있다면 어떤 점이 있을까요라는 재질문을 받고서야 경청과 피드백 관점에서 답변을 하긴 했는데, 와닿는 답변이 아니었을 것 같다.
면접 결과는 1~2주에 나온다고 안내 받았는데 아직까지 결과가 나오지 않았다.
면접은 많이 아쉬웠고 회고를 하면서 부족한 점이 많았다는 생각이 들어서, 낙관적인 결과를 기대하기는 어려울 것 같다.
그동안 React로 수동적으로 컴포넌트를 찍어내는 일을 주로 하다보니, 놓치고 있던 것들이 많았음을 깨달았다. 그래서 지금까지 봤던 기술면접 중 가장 힘들고 긴 면접이었지만, 의미있고 배울 점이 많았던 면접이었어서 그 점에선 만족한다.
개념을 단순히 알고 있는 것도 중요하지만, 그 개념이 나온 이유에 대해서 전체적으로 이해하는 것이 필요할 것 같다.