Companies
Uber Data Engineer Interview Questions & Process (2026)
— docs/Uber Data Engineer Interview Questions & Process (2026).pdf
Uber의 Data Engineer 채용 프로세스는 리크루터 스크린부터 오퍼까지 보통 3~5주가 걸리며, 병목은 파이프라인 자체가 아니라 온사이트 일정 조율이라는 것이 저자의 관찰이다. 가장 큰 차별점은 시스템 설계에 묻어가는 방식이 아니라 데이터 모델링을 45~60분짜리 전용 라운드로 따로 떼어내 grain·fact 테이블·SCD까지 깊게 파고든다는 점이고, 두 번째 차별점은 Uber의 비즈니스 자체가 실시간이라 Kafka·Flink·exactly-once·워터마크·윈도잉에 대한 유창함을 시스템 설계 전반에서 기대한다는 점이다.
| # | 단계 | 형식 | 소요 시간 | 평가 항목 |
|---|---|---|---|---|
| 1 | Recruiter Screen | Phone call | 30 min | Role fit, comp, visa, team mapping |
| 2 | Technical Phone Screen | Video call | 60 min | SQL + Python, medium-hard |
| 3 | Onsite Loop | 4-5 rounds, 45-60 min each | 1~2주 간격 후 진행(보통 가상으로 진행) | SQL, Coding, Data Modeling, System Design, Behavioral |
| 4 | Hiring Manager Round | Video call | 45 min | Team fit, leadership, scope |
| 5 | Debrief & Decision | Internal | 영업일 3~5일 | Cross-interviewer sync, hiring committee |
온사이트 SQL·Python 라운드와 동일한 강도로 준비해야 한다 — 워밍업이라는 착각이 가장 흔한 실수라는 것이 저자의 지적이다.
trip_id, rider_id, driver_id, event_type(requested, accepted, started, completed, cancelled), event_ts를 가진 trip events 테이블이 있다. 각 라이더별로 requested와 accepted 사이 간격이 90초를 넘는 트립을 찾은 뒤, 이를 시간대(hour-of-day)와 도시별로 버킷화하여 지연 수락 트립 수가 가장 많은 버킷을 반환하라.
LeetCode식 SQL만 공부한 지원자를 걸러내는 문제다. 이벤트를 wide 포맷으로 피벗하고, 간격을 계산해 필터링한 뒤, 타이브레이커와 함께 집계해야 한다. 깔끔한 답은 조건부 집계로 피벗하는 CTE, 필터링하는 두 번째 CTE, 버킷 순위를 매기는 세 번째 CTE로 구성된다.
코딩하는 내내 생각의 흐름을 계속 말한다. "먼저 조건부 max로 이벤트를 피벗해서 request_ts와 accept_ts를 한 행에 놓겠습니다. 그다음 간격으로 필터링하고, 그다음 버킷화해서 카운트하겠습니다." 침묵한 채 코딩하면 인터뷰어가 사고 과정을 따라갈 수 없어 no-hire로 이어진다.
"이건 Pandas로 하겠습니다" — 나중에 쓰게 되겠지만 SQL 라운드에서 할 말은 아니다. "저희는 이걸 대신 해주는 BI 툴이 있었습니다"도 피해야 한다 — SQL을 깊이 있게 다루지 못한다는 신호로 읽힌다.
driver_id, lat, lng, ts를 가진 딕셔너리 형태의 드라이버 위치 핑 스트림을 받는다. 일부 핑은 늦게 도착하고 일부는 중복이다. 각 드라이버에 대해, 해당 드라이버의 가장 최근 핑보다 30초 넘게 오래된 핑은 무시하고 가장 최근의 유효한 위치를 반환하는 함수를 작성하라.
이 문제는 키별 상태 관리, 지연 도착 데이터 처리, 워터마크 방식 필터링을 시험하는 Flink 잡의 축소판이다. 스트림 처리 로직을 작성해본 적이 없다면 이 라운드에서 어려움을 겪게 될 것이라고 저자는 지적한다.
코드를 쓰기 전에 먼저 엣지 케이스를 묻는다. "입력이 정확히 어떤 형태인가요? 스트림이 정렬되어 있나요? 로그오프한 드라이버의 lat/lng가 null일 수 있나요? 중복은 타임스탬프 동률로 판단해야 하나요, 아니면 lat/lng도 봐야 하나요?" 이런 질문을 코드를 쓰기 전에 던지는 지원자는 이미 지원자 풀의 70%와 차별화된다는 것이 저자의 관찰이다.
"Uber의 라이드 비즈니스를 위한 데이터 모델을 설계하라. 도시별 매출 대시보드, 드라이버 수익 리포트, 라이더의 주간 코호트 리텐션을 지원해야 한다" / "Uber Eats를 위한 데이터 모델을 설계하라. 가맹점별 성과, 배달원(dasher) 정산, 주문 퍼널 분석을 지원해야 한다"
5단계 프레임워크로 진행한다. (1) 5~7분 명확화 질문 — 어떤 도메인을 모델링하는지, 이 모델이 답해야 할 질문은 무엇인지, 데이터 볼륨은, 지연시간 요구사항은, 웨어하우스 모델인지 서빙 레이어인지. (2) 3분 grain 옵션 나열 — 라이드 데이터라면 요청당 한 행, 라이프사이클 이벤트당 한 행, 완료된 트립당 한 행 중 트레이드오프를 밝히고 메인 fact로 하나를 정해 이유를 설명한다. (3) 10분 fact 테이블 스케치 — 보통 하나의 transactional fact(fact_trip)와 하나의 accumulating snapshot(fact_trip_lifecycle) 또는 periodic snapshot(fact_driver_daily)이 필요한 이유를 설명한다. (4) 10분 차원 스케치 — dim_rider, dim_driver, dim_city, dim_vehicle, dim_payment_method, dim_date, dim_time 중 어느 것에 SCD Type 2가 필요한지(드라이버 전화번호는 Type 1, 드라이버 평점은 일별 스냅샷을 곁들인 Type 2가 대개 더 깔끔함). (5) 10분 모델에 대한 쿼리 2~3개 실행 — "도시별 주간 매출을 보여달라", "당시 평점과 함께 월별 드라이버 수익을 보여달라" — 이 단계에서 인터뷰어가 grain 실수를 캐낸다.
"먼저 이 모델이 어떤 비즈니스 질문에 답해야 하는지 묻겠습니다. 그다음 메인 fact 테이블의 grain을 정의하고, 차원을 스케치한 뒤, 검증을 위해 쿼리 몇 개를 실행해보겠습니다."
"넓은 비정규화 테이블을 쓰겠습니다" — 서빙 레이어라면 실제 프로덕션에서 맞는 선택일 수 있지만, 이 라운드에서는 스타 스키마 설계에 대한 추론 능력을 보고 싶어한다. 비정규화 버전은 마지막에 최적화로 언급하는 정도가 적절하다.
"서지 프라이싱 데이터 파이프라인을 설계하라"(가장 고전적인 문제) / "ETA 예측 데이터 인프라를 엔드투엔드로 설계하라" / "디스패치 팀을 위한 실시간 마켓플레이스 헬스 대시보드를 설계하라" / "드라이버 수익 정산 데이터 플랫폼을 설계하라"
요구사항(5~7분, 기능/비기능 요구사항, 데이터 볼륨, 지연시간, 신선도, 누가 소비하는지, 어떤 의사결정을 지원하는지, 지연 데이터 SLA) → 백오브엔벨로프 추정(3~5분, 실제 숫자에 설계를 고정시킨다 — 예를 들어 "하루 트립 1억 건, 트립 라이프사이클당 이벤트 10개, 이벤트당 1KB라면 하루 1TB"처럼 예시 숫자로 추정해본다) → 상위 아키텍처(10~15분, Ingestion→Processing→Storage→Serving을 도구 이름과 함께 — 인제스천에 Kafka, 처리에 Flink, 서빙에 Pinot, 오프라인 레이어에 Hudi) → 심화(15~20분, 백필·스키마 진화·exactly-once vs at-least-once·워터마크 처리·지연 이벤트 중 인터뷰어가 파고드는 한두 영역) → 트레이드오프(5분, 예: "이벤트 타임 네이티브 윈도잉 때문에 Spark Streaming 대신 Flink를 선택했지만, 팀이 Spark에 더 익숙하다면 텀블링 윈도우에는 유효한 대안이다") 순서로 진행한다. 알아둘 핵심 스택: Kafka(이벤트 인제스천 — 토픽, 파티션, 컨슈머 그룹, exactly-once), Flink(스트림 처리 — 텀블링/슬라이딩/세션 윈도잉, 워터마크, 체크포인트, Uber의 기본 스트리밍 엔진), Apache Pinot(실시간 OLAP — Uber가 공동 개발, 스트리밍 데이터에 대한 서브세컨드 쿼리), Apache Hudi(레이크하우스 레이어 — Uber가 만듦, 증분 인제스천·업서트·타임 트래블), HDFS+Hive(장기 저장소), Spark(배치 ETL), Presto(애드혹 분석).
명확화 질문부터 시작한다. "피크 QPS는 얼마인가요? 신선도 요구사항은 무엇인가요? 이 데이터를 디스패치 서비스가 쓰나요, 대시보드가 쓰나요? 지연 데이터에 대한 SLA는요?"를 5~7분간 물은 뒤 상위 아키텍처를 스케치하고 인터뷰어가 파고드는 곳을 깊게 판다.
"매시간 실행되는 배치 잡을 작성하겠습니다" — 서지 프라이싱에도 ETA에도 맞지 않는다. 인터뷰어는 스트리밍을 기대하며, 스트리밍이 필요한 상황에서 배치를 기본값으로 삼으면 잘못된 직관을 신호하게 된다.
"프로덕션에서 데이터 파이프라인이 고장 났던 경험을 말해달라. 무엇을 했는가?" / "이해관계자에게 나쁜 데이터 품질 소식을 전해야 했던 경험을 말해달라" / "데이터가 준비되지 않았다는 이유로 기능 요청을 반려한 경험을 말해달라" / "불완전한 정보로 기술적 결정을 내려야 했던 경험을 말해달라" (그 외 오너십/스케일/모호함/교차기능/실패/학습 테마별 질문도 준비해야 한다)
STAR 구조를 따른다: Situation(20%, 간단한 맥락), Task(10%, 자신의 구체적 역할 — "그 분기에 결제 파이프라인 온콜 DE였다"처럼 정확하게), Action(50%, 자신이 한 일을 'I'를 적극적으로 쓰며 구체적 기술 결정과 검토했다가 기각한 대안까지), Result(20%, 수치화된 결과 — "파이프라인 실행 시간을 4시간에서 22분으로 줄였다. 연간 비용을 8만 달러 절감했다. 이 패턴이 다른 6개 파이프라인의 팀 기본값이 되었다"). 하이어링 매니저는 후속 질문으로 세부사항을 깊게 파고든다 — "얼마나 걸렸나요? 누가 관여했나요? 처음에 무엇을 시도했다가 안 됐나요? 영향은 수치로 어땠나요?" 이 후속 질문에 구체적으로 답하지 못하면 스토리가 얇다는 뜻이므로 다른 스토리를 골라야 한다.
수치화된 결과가 담긴 구체적 스토리. "동일한 Kafka 토픽 위에서 일별 Spark 배치를 Flink 스트리밍 잡으로 전환해 p95 지연시간을 6시간에서 35분으로 줄였습니다"처럼 답하면 통과다.
"파이프라인을 개선했습니다"처럼 수치 없는 모호한 답변은 실패다. "PM이 요구사항을 잘못 정리했고, 그다음 플랫폼 팀이 API를 망가뜨렸습니다"처럼 남 탓을 하는 것도 오너십 항목에서 실패로 이어진다.
공식 스코어카드는 없지만 하이어링 매니저가 거부권(veto power)을 가지고 있어 문화 불일치 시그널이 보이면 이를 행사한다는 것이 저자의 설명이다.
We Act Like Owners(온콜과 포스트모템을 포함한 파이프라인의 엔드투엔드 오너십), We Are Customer Obsessed(DE 입장에서는 데이터 품질 — 나쁜 데이터가 곧바로 라이더·드라이버 경험에 반영됨), We Build Globally, We Live Locally(70개국 이상에서 운영되므로 타임존·통화·규제·파트너 데이터를 데이터 시스템이 감당해야 함), We Make Big Bold Bets(문제가 요구할 때 익숙한 패턴을 넘어서려는 의지) 네 가지가 DE 롤에서 특히 중요하게 관찰되는 문화 규범이라고 저자는 설명한다.