[Uber - L5A] SSE interview experience
Summary
I interviewed for a Senior Software Engineer (L5A) position at Uber. Despite an initial 'NO-HIRE' feedback in one of the technical rounds, the hiring manager and bar-raiser managed to flip the decision, leading to a successful offer.
Full Experience
I appeared for the Uber hiring drive around mid-May. The interview process consisted of five rounds, covering data structures & algorithms, machine coding, system design, and behavioral aspects.
Round 1: Screening (DSA)
This round felt like a proper DSA assessment where a working solution was expected. The question was: Given an n*m 2-D matrix with arrows in different directions, find the minimum cost to travel from the top-left grid to the bottom-right grid. Traveling in the direction of a grid arrow costs nothing, but moving in any other direction costs 1 quantity.
I initially suggested a DFS approach, mentioning it was brute force, and we discussed its time complexity. I then proposed a graph-based approach, explaining that I would construct a weighted (0,1 edge) graph and apply Dijkstra's algorithm. I managed to code this within 60 minutes.
Round 2: DSA
In this round, I was asked to find the next greater palindrome number for a given number. I had encountered a similar problem before, which allowed me to write a working solution within the hour using a 'Mirror and Carry Propagation' approach.
Round 3: Machine Coding
This round asked me to implement an expiry counter. I needed to create a class with methods like put_element(k), get_element_count(k), and get_total_elements(), initialized with an expiry time 't' seconds. I initially suggested a priority queue and hashmap-based approach, but the interviewer wasn't convinced. I then proposed a binary search based approach, maintaining a mapping of elements to a list of timestamps (e.g., 'k': [t1, t2, ...]). For reads, valid timestamps would be found in O(log n). I coded this in Python, and it worked, but the interviewer questioned why I wasn't discarding stale timestamps more efficiently, which I believe led to an initial 'NO-HIRE' feedback for this round.
Round 4: System Design
This round, taken by a Staff Software Engineer who was also the bar-raiser, focused on designing a heatmap of Uber drivers in a city for an internal analytics dashboard. I needed to cover two scenarios: a near real-time heatmap for the past 20 minutes and a dashboard showing hourly buckets after 24 hours. I had some prior exposure to this problem. My approach for the real-time use case involved consuming location events from Kafka, using a geo-hashing library, pushing to a Kafka stream partitioned by geohashId, and using an Apache Flink cluster to count over a 1-minute tumbling window, persisting to Redis. For the 24-hour use case, another Flink processor would flush hourly aggregates to PostgreSQL. The interviewer had minor questions on scalability and fault-tolerance, but overall, the feedback was 'good'.
Round 5: Behavioral/Leadership (TLM)
The final round was with a Tech Lead Manager. After discussing my current and previous roles, I was asked to detail a complex or impactful project I had worked on, focusing on both technical and non-technical challenges. This was a 45-minute monologue with minimal interruptions. We also discussed the type of work to expect at Uber and my career aspirations.
A week later, I received a call from the recruiter informing me that despite the initial 'NO-HIRE' in one round, the HM and BR had overturned it in the final debrief, and I would be receiving an offer!
Interview Questions (5)
Given an n*m 2-D matrix with arrows in different directions, find out the minimum cost to travel from the top-left grid to the bottom-right grid. If the cost to travel in the direction of the grid arrow costs you nothing, but if you want to travel in any other direction, it would cost you 1 quantity.
Find the next greater palindrome number of the given number. This is a standard interview problem often referred to as 'next greater palindrome'.
Implement a custom counter class with methods put_element(k), get_element_count(k), and get_total_elements(). The class should be initialized with an expiry time of 't' seconds, meaning elements should automatically expire after 't' seconds.
Design a system to build a heatmap of Uber drivers in a city and display this data in an internal dashboard for an analytics team. The system needs to cover two scenarios:
- Near real-time display of the heatmap for the past 20 minutes.
- Display of the heatmap after 24 hours, bucketized by the hour.
Discuss a complex or impactful project I had worked on or led. The interviewer emphasized going over the details of every challenge faced, both technical and non-technical.
Preparation Tips
I started preparing from mid-March, solving over 200 questions on LeetCode and reading through another 20-30. I worked through roughly 70% of a popular 'top 150' problem list while tackling the LeetCode questions. For machine coding, I practiced 7-8 of the most frequently asked problems at Uber. For system design prep, I utilized a paid practice platform that sequentially walks through Functional Requirements (FRs), Non-Functional Requirements (NFRs), API contracts, and design steps. I also referred to a system design interview book for specific topics.