면접은 설계 기술을 시연하는 자리이고 설계 과정에서 내린 결정들에 대한 방어 능력을 보이는 자리이며, 면접관의 피드백을 건설적인 방식으로 처리할 자질이 있음을 보이는 자리이다.
설계의 순수성에 집착한 나머지 타협적 결정(trade-off)을 도외시하고 과도한 엔지니어링을 하는 엔지니어들이 많다. 면접에서는 이러한 경향이 있다는 것을 보이지 않는 것이 좋다. 이 외의 부정적 신호로는 완고함, 편협함 같은 것이 있다.
효과적 면접을 위한 4단계 접근법
1단계. 문제 이해 및 설계 범위 확정
시스템 설계 면접을 볼 때는 여구사항을 완전히 이해하지 않고 답을 내놓는 행위는 엄청난 부정적 신호를 주는 것이다. 정답은 없다는 걸 상기시키며 답부터 들이밀지 말고 깊이 생각하고 질문하여 요구사항과 가정들을 분명히 하라!!
엔지니어가 가져야 할 가장 중요한 기술 중 하나는 올바른 질문을 하는 것, 적절한 가정을 하는 것, 그리고 시스템 구축에 필요한 정보를 모으는 것이다.
이 단계에서 가장 중요한 것은 요구사항을 이해하고 모호함을 없애는 게 가장 중요하다!!
필요한 정보를 모으는 질문은 아래와 같은 질문들이 있다.
- 구체적으로 어떤 기능들을 만들어야 하나?
- 제품 사용자 수는 얼마나 되나?
- 회사 규모는 얼마나 빨리 커지리라 예상하나?
- 회사가 주로 사용하는 기술 스텍은 무엇인가?
- 설계를 단순화하기 위해 활용할 수 있는 기존 서비스로는 어떤 것들이 있는가?
2단계. 계략적인 설계안 제시 및 동의 구하기
해당 단게에서는 개략적인 설계안을 제시하고 면접관의 동의를 얻는 것이 중요하다. 이 과정에서는 면접관과 협력하며 진행하면 좋다.
- 설계안에 대한 최초 청사진을 제시하고 의견을 구하라. 면접관을 마치 팀원인 것처럼 대하라. 훌륭한 면접관들은 지원자들과 대화하고 설계 과정에서 개입하기를 즐긴다.
- 화이트보드나 종이에 핵심 컴포넌트를 포함하는 다이어그램을 그려라. 클라이언트(모바일/웹), API, 웹 서버, 데이터 저장소, 캐시, CDN, 메시지 큐 같은 것들이 포함될 수 있을 것이다.
- 이 최초 설계안이 시스템 규모에 관계된 제약사항들을 만족하지는지를 개략적으로 계산해 보라. 계산 과정은 소리내어 설명하라. 아울러, 이런 계략적 추정이 필요한지는 면접관에게 미리 물어보도록 하자.
설계안을 제시하고 대화를 하다보면 미처 고려하지 못한 엣지 케이스(edge case)를 발견하는 데도 도움이 될 것이다.
3단계. 상세 설계
어떨 때는 시스템의 성능 특성에 대한 질문을 던질 것이고, 그 경우 질문 내용은 시스템의 병목 구간이나 자원 요구량 추정치에 초점이 맞춰져 있을 것이다. 하지만 대부분의 경우 면접관은 특정 시스템 컴포넌트들의 세부사항을 깊이 있게 설명하는 것을 보기를 원한다.
문제 예시
- URL 생성기 → 면접관은 해시 함수의 설계를 구체적으로 설명하는 것을 듣고싶어 할 것이다.
- 채팅 시스템 → 지연시간을 어떻게 줄이고, 사용자의 온/오프라인 상태를 표시할 것인지 듣고자 할 것이다.
면접에서는 시간 관리도 주의를 기울여야 한다. 불필요한 세부사항에 시간을 쓰지 않는 것이 중요하다.
4단계. 마무리
면접관은 마지막 단계에서 설계 결과물에 관련된 몇 가지 후속 질문을 던질 수도 있고 스스로 추가 논의를 진행하도록 할 수도 있다.
활용하면 좋을 지침
- 면접관이 시스템의 병목구간, 혹은 더 개선 가능한 지점을 찾아내라 주문할 수 있다. 이때 내 설계는 개선할 부분이 없다는 답은 하면 안된다! 이런 질문은 비판적 사고 능력을 보이고 마지막으로 좋은 인상을 남길 수 있는 기회이다.
- 내가 만든 설계를 다시 한번 요약해주는 것도 도움될 수 있다. 여러 해결책을 제시한 경우에는 특히 중요하다.
- 오류가 발생하면 무슨 일이 생기는지(서버 오류, 네트워크 장애 등)를 따져보면 흥미로울 것이다.
- 운영 이슈도 논의할 가치가 충분하다. 메트릭은 어떻게 수집하고 모니터링할 것인가? 로그는? 시스템은 어떻게 배포해 나갈 것인가?
- 미래에 닥칠 규모 확장 요구에 어떻게 대처할 것인지도 흥미로운 주제이다. (e.g. 지금 100만 사용자는 감당할 수 있는데 1000만 사용자를 감당하려면 어떻게 해야할까?)
- 시간이 남았다면 필요하지만 다루지 못했던 세부적인 개선사항을 제안할 수 있다.
면접에서 해야할 것
- 질문을 통해 확인하고 스스로 내린 가정이 옳다 믿고 진행하면 안된다.
- 문제의 요구사항을 이해하라
- 정답이나 최손의 답안 같은 것은 없다는 것을 명심하라. 스타트업을 위한 설계안과 수백만 사용자를 지원하는 중견 기업을 위한 설계안이 같을리 없다. 요구사항을 정확하게 이해했는지 다시 확인하라.
- 면접관이 여러분의 사고 흐름을 이해할 수 있도록 하라. 면접관과 소통하라
- 가능하면 여러 해법을 함께 제시하라
- 개략적 설계에 면접관이 동의하면, 가장 중요한 컴포넌트부터 각 컴포넌트의 세부사항을 설명하기 시작하라
- 면접관의 아이디어를 이끌어 내라. 좋은 면접관은 같은 팀원처럼 협력한다.
- 포기하지 말라.
면접에서 하지 말아야 할 것
- 전형적인 면접 문제들에도 대비하지 않은 상태에서 면접장에 가지말라
- 요구사항이나 가정들을 분명히 하지 않은 상태에서 설계를 제시하지 말라.
- 처음부터 특정 컴포넌트의 세부사항을 너무 깊이 설명하지 말라. 개략적 설계를 마친 뒤에 세부사항으로 나아가라.
- 진행 중에 막혔다면, 힌트를 청하기를 주저하지 말라.
- 다시 말하지만, 소통을 주저하지 말라. 침묵 속에 설계를 진행하지 말라.
- 설계안을 다시 내놓는 순간 면접이 끝난다고 생각하지 말라. 면접관이 끝났다고 말하기 전까지는 끝난게 아니다. 의견을 일찍, 그리고 자주 구하라.