<aside> 💡
"널리 알려진 제품 X를 설계해 보라" 라는 식의 막연한 시스템 설계 질문은 모호하고, 범위도 지나치게 넓다. 이러한 시스템 설계 면접의 경우, 최종적으로 도출된 설계안이 중요하기보다는, 면접을 통해 설계 과정에서 내린 결정들에 대한 방어 능력을 보이는 자리이며, 면접관의 피드백을 건설적인 방식으로 처리할 자질이 있음을 보이는 것이 중요하다.
시스템 설계 면접은 지원자의 설계 능력의 기술적 측면과 더불어 지원자가 협력에 적합한 사람인지, 압박이 심한 상황도 잘 헤쳐 나갈 자질이 있는지, 모호한 문제를 건설적으로 해결할 능력이 있는지 등을 살펴보는 면접이다. 좋은 질문을 던질 능력이 있는지도 중요하다.
훌륭한 면접관은 부정적 신호(red flag)도 놓치지 않는다. 설계의 순수성에 집학한 나머지 타협적 결정(tradeoff)를 도외시하고 과도한 엔지니어링(over-engineering)을 하고 마는 엔지니어들이 현업에도 많고, 오버엔지니어링의 결과로 시스템 전반의 비용이 올라간다는 사실을 알아채지 못하는 일이 많다. 오버엔지니어링 외에도 완고함, 편협함 등이 부정적 신호의 또다른 예이다.
</aside>
- 시스템 설계 면접은 전부 제각각이며, 훌륭한 설계 면접에는 정해진 결말도 정답도 없음.
시스템 설계 면접을 볼 때 생각 없이 바로 답을 내서는 좋은 점수를 받기 어렵다.
엔지니어가 지녀야 할 가장 중요한 기술 중 하나는 올바른 질문을 하는 것, 적절한 가정을 하는 것, 그리고 시스템 구축에 필요한 정보를 모으는 것이다.
요구사항을 정확히 이해하기 위해서는 적절히 질문을 해야 할 필요가 있는데, 아래와 같은 질문들을 생각해 볼 수 있다.
구체적으로 어떤 기능들을 만들어야 하나?
뉴스 피드 시스템을 설계하라는 요구를 받았다고 가정하였을 때, 질문할 수 있는 것들은 다음과 같을 것이다.
모바일 앱과 웹 앱 가운데 어느 쪽을 지원해야 하나요? 혹은 둘다인가요?
⇒ 이렇게 면접관에게 던질 수 있는 질문 사례를 살펴 보았고, 요구 사항을 정확히 이해하고 모호함을 없애는 것이 이 단계를 통해 얻고자 하는 핵심이다.