Role focus: Uber Software Engineer, Software Engineer II, Senior Software Engineer, Staff Software Engineer, Senior Staff Software Engineer, Principal Engineer, Backend Engineer, Full-Stack Engineer, Infrastructure Engineer, Marketplace Engineer, Uber Eats Engineer, Payments Engineer, Ads Engineer, Maps / Mobility Engineer
Uber’s Software Engineer interview is more structured than many candidates realize, but it is not one identical loop for every engineer.
Uber currently publishes dedicated engineering interview guidance and separate domain-specific preparation material for Backend, Frontend, Android, iOS, Data Engineering, Production Engineering, ML & AI Engineering, Security Engineering, and Engineering Management. For backend engineers, the public interview framework explicitly separates Algorithms & Data Structures, Depth in Specialization, Design & Architecture, and Collaboration & Leadership.
That distinction matters.
A candidate who prepares only LeetCode may be ready for one part of the interview but underprepared for machine coding, low-level design, production follow-ups, distributed-system reasoning, or level calibration.
Uber also creates a particularly interesting engineering environment because software state frequently corresponds to something happening in the physical world:
- a rider is waiting;
- a driver is moving;
- a courier has accepted an order;
- a restaurant has closed;
- a payment may already have been sent;
- a vehicle location may be stale;
- an event may arrive twice;
- a marketplace can change faster than cached state.
That changes what strong engineering judgment looks like.
The best mental model is:
Uber SWE = strong algorithmic coder + practical software builder + distributed-systems thinker + production owner + level-appropriate technical leader.
The interview is ultimately asking:
“Can this person take an ambiguous real-world engineering problem, clarify the semantics, build a correct solution, evolve it under production constraints, and own the consequences at Uber scale?”
TL;DR
| Core Signal | What It Means | How It Shows Up | Why It Matters |
|---|---|---|---|
| Algorithms & Data Structures | You can identify efficient structures and produce correct code under time pressure. | BPS, coding screen, Coding 1, possible OA | Uber explicitly treats algorithms and data structures as a core software-engineering competency. |
| Practical Engineering | You can implement stateful services, APIs, classes, caches, and evolving requirements rather than only isolated functions. | Depth in Specialization, machine coding, LLD | Backend candidates increasingly report executable, production-flavored coding rounds. |
| System Design | You understand distributed state, databases, queues, caching, consistency, concurrency, idempotency, and failure recovery. | Design & Architecture, HLD, Senior+ rounds | Uber’s products are inherently real-time, distributed, and tied to physical-world workflows. |
| Production Judgment | You reason correctly when the happy path breaks. | Coding follow-ups, system design, project deep dive | Duplicate payments, stale locations, event loss, retry storms, and partial failures can directly affect real users. |
| Ownership & Leadership | Your technical scope matches the level being considered. | Behavioral, HM, technical deep dive, Staff+ design | Uber’s expectations increase sharply in scope, complexity, impact, leadership, and strategic influence at higher levels. |
Note
The core Uber interview pattern is:
clarify → solve → make it work → add a constraint → expose a bottleneck → evolve the system
In many Uber interviews, the most revealing part begins after the initial problem is already solved.
Interview Process
Uber publishes a general company-wide hiring process, but engineering roles use more specialized interview frameworks.
For Backend Engineering, the current public framework includes level-specific tracks for L3, L4, L5A, L5B, and L6+. The exact sequence can change with role, level, specialization, location, and business need.
A commonly visible backend sequence includes a recruiter or sourcer conversation, a possible HackerRank assessment, a Business Technical Phone Screen, Algorithms & Data Structures, Depth in Specialization, Collaboration & Leadership, and the final decision.
Recent experienced-hire reports also include dedicated system design, machine coding, low-level design, and technical project deep dives. These should be treated as team- and level-dependent rather than universal stages.
| Stage | Likely Format | Main Signal | How to Prepare |
|---|---|---|---|
| Application / Resume Review | Team reviews resume | Technical relevance, ownership, scope | Make your strongest systems and measurable impact obvious. |
| Recruiter / Sourcer | ~30 minutes | Motivation, background, role and level alignment | Prepare concise career narrative and Why Uber. |
| HackerRank / OA | Pipeline-dependent | Timed coding fundamentals | Practice medium DSA under time pressure. |
| BPS / Technical Screen | Often ~60 minutes | Coding plus technical/design reasoning | Be ready to switch from implementation to architecture discussion. |
| Coding 1 — Algorithms & Data Structures | Live coding | Correctness, optimization, CS fundamentals | Graphs, windows, heaps, trees, intervals, arrays. |
| Coding 2 — Depth in Specialization | Specialized live coding | Practical software engineering | Backend: stateful APIs, caches, concurrency, evolving requirements. |
| Machine Coding / LLD | Team/level dependent | OOP, state, APIs, executable design | Practice building small systems rather than only drawing classes. |
| System Design / HLD | Experienced roles | Distributed systems and tradeoffs | Practice Uber-shaped real-time and transactional systems. |
| Technical / Project Deep Dive | More likely Senior+ | Real ownership and technical judgment | Prepare one project in significant technical depth. |
| Collaboration & Leadership | Behavioral conversation | Ownership, influence, conflict, judgment | Use technically detailed STAR stories. |
| Team / Cross-Functional Discussion | Pipeline-dependent | Working style and specialization fit | Understand the team’s product and technical domain. |
| Decision / Offer | Hiring-team calibration | Overall signal + level | Understand whether outcome is L4, L5A, L5B, etc. |
A useful way to think about the backend loop is:
Coding 1 asks whether you understand computer science.
Coding 2 asks whether you can build software.
System Design asks whether you can build software that survives scale and failure.
Behavioral asks whether you can own that work with other people.
Questions to Ask Your Recruiter
| Question | Why It Matters |
|---|---|
| How many total interviews are in my exact loop? | Current loops vary by level and specialization. |
| What level am I being considered for? | L4, L5A, and L5B have materially different expectations. |
| Is there a HackerRank assessment? | It appears in some pipelines but should not be assumed universally. |
| What exactly is tested in BPS? | Coding versus coding + architecture preparation differs. |
| What does Depth in Specialization mean for this opening? | Backend, mobile, frontend, and infrastructure differ dramatically. |
| Is there machine coding or low-level design? | Recent backend candidates report executable-code rounds. |
| Is there a separate HLD/system-design round? | Especially important for Senior+. |
| Will code execution be available? | Runnable-code expectations change preparation style. |
| Which programming languages are allowed? | Use the language in which you can implement cleanly fastest. |
| Is AI tooling permitted in any round? | Do not assume permission. |
| Is the role tied to one specific team? | Domain knowledge can affect technical follow-ups. |
| Is there a project retrospective or technical deep dive? | This deserves substantial preparation for experienced candidates. |
| What preparation material can you share? | Uber currently provides unusually useful engineering-specific material. |
Note
Recruiter guidance for your exact loop should override a Reddit post, Exponent guide, or a friend’s interview from a different Uber organization.
Recruiter Screen
The recruiter is not primarily trying to determine whether you know Java, Go, or Python.
They are trying to understand:
What kind of engineer are you, where could you fit inside Uber, and does your demonstrated scope support the level being considered?
This becomes particularly important because Uber Software Engineers work across very different areas:
- Rides
- Uber Eats
- Grocery
- Payments
- Ads
- Identity
- Core Services
- Search
- Maps
- Infrastructure
- Autonomous Vehicles
- Developer Platforms
A payments engineer and an AV infrastructure engineer may share a level but have very different domain depth.
What the Recruiter Is Really Calibrating
| Category | What They Want to Hear |
|---|---|
| Technical Identity | Backend, infra, distributed systems, full stack, mobile, marketplace, payments, AV, etc. |
| Scope | What size and complexity of problem you independently own. |
| Production Experience | You have operated software rather than only shipped code. |
| Impact | Your work changed a measurable technical or business outcome. |
| Domain Fit | Your background maps to the actual opening. |
| Level Evidence | Your ownership supports L4 vs Senior vs Staff scope. |
| Collaboration | You can execute across organizational boundaries. |
| Motivation | You understand why Uber and why this area. |
Common Recruiter Questions
| Motivation | Experience | Logistics |
|---|---|---|
| Why Uber? | Walk me through your current role. | Location |
| Why this organization? | What is your strongest project? | Work authorization |
| Why are you looking now? | What did you personally own? | Interview timeline |
| What engineering problems interest you? | What scale did your system operate at? | Competing interviews |
| Why this level? | Tell me about a difficult production issue. | Compensation expectations |
Weak vs Strong Positioning
| Weak | Strong |
|---|---|
| “I’m a backend engineer who uses Java and Kafka.” | “I specialize in high-throughput stateful services. I owned an order-state platform handling 85K events per second, including the Kafka contracts, idempotency model, persistence layer, rollout, and production monitoring.” |
| “I worked on payments.” | “I owned a payout workflow where duplicate transfers were unacceptable, designed idempotency and reconciliation, and reduced manual financial reconciliation by more than half.” |
| “I worked on scalable systems.” | “I took a service from 12K to 140K QPS, introduced request coalescing and load shedding, and cut peak p99 latency by 38%.” |
| “Uber has interesting scale.” | “Uber is interesting because software state directly affects physical-world state. A stale location, duplicate payout, or inconsistent delivery transition has immediate consequences for a real user.” |
| “I’m targeting Staff because I have ten years of experience.” | “My recent scope moved from owning one service to defining architecture used across five teams and creating shared primitives that other senior engineers independently adopted.” |
Note
The biggest recruiter-screen mistake is positioning yourself as a generic Big Tech SWE.
Strong positioning answers:
What class of systems are you unusually good at, what scale have you owned, and why does that matter for this Uber team?
Technical / Coding Screen
Uber coding should be treated as a serious interview signal even for experienced engineers.
Recent candidate reports continue to include recognizable algorithm problems involving graphs, monotonic data structures, heaps, intervals, matrices, caches, trees, and dynamic connectivity.
But algorithm recognition is only part of the bar.
Strong candidates also:
- clarify ambiguous semantics;
- communicate the baseline;
- identify why it is inefficient;
- produce correct code;
- analyze complexity;
- test deliberately;
- adapt to follow-up constraints.
Coding Topic Map
| Core Algorithms / Fundamentals | Production-Flavored Patterns | Uber-Specific Practice Patterns |
|---|---|---|
| Arrays / strings | Stateful classes | Rolling counters |
| Hash maps / sets | LRU / TTL caches | Restaurant availability |
| Sliding window | Rate limiting | Delivery zones |
| Graphs | Expiration | Ride state |
| BFS / DFS | API design | Driver availability |
| Union-Find | Event processing | Location updates |
| Heaps | Concurrency | Matching / scheduling |
| Intervals | Testing | Pricing windows |
| Trees | Idempotency | Payment state |
| Monotonic deque | Failure handling | High-write systems |
| Binary search | In-memory services | Real-time alerts |
| Complexity analysis | Extensibility | Streaming updates |
Representative Practice Prompts
| Prompt | Main Signal |
|---|---|
| Find the longest subarray whose max/min difference stays within a limit. | Sliding window + monotonic queues |
| Infer character ordering from sorted words. | Graph + topological sort |
| Implement an LRU cache. | Hash map + linked structure |
| Build a rolling request counter optimized for very high write volume. | Workload-driven data structure |
| Track restaurants opening and closing and answer aggregate queries. | Stateful service design |
| Extend restaurant availability with delivery zones. | Evolvability + indexing |
| Implement a rate limiter. | Time semantics + state |
| Build core rider/driver/trip state transitions. | OOP + invariants |
| Maintain connectivity as regions become active dynamically. | Union-Find |
| Assign incoming tasks to available resources efficiently. | Heap / scheduling |
What Good Looks Like
| Signal | What Good Looks Like |
|---|---|
| Clarification | You identify semantics that materially affect the algorithm. |
| Baseline | You can explain the simplest correct solution quickly. |
| Optimization | You know why the baseline becomes expensive. |
| Complexity | You analyze both runtime and memory. |
| Implementation | Code is clean enough to evolve under follow-ups. |
| Testing | You test important boundaries rather than random inputs. |
| Adaptability | The next requirement does not force a complete rewrite. |
| Collaboration | You explain decisions and use interviewer feedback productively. |
Strong Answer Structure
- Restate the problem.
- Clarify input, output, constraints, ordering, and boundary semantics.
- Explain the simplest correct approach.
- Identify its bottleneck.
- Propose an optimized approach.
- State time and space complexity.
- Write clean code.
- Dry-run one representative input.
- Test edge cases.
- Handle follow-ups while preserving existing invariants.
Strong Answer Example
Prompt:
Maintain the number of requests received during the previous 300 seconds. Writes are extremely high volume.
Weak opening:
“I’ll use a queue.”
Stronger opening:
“I want to clarify whether timestamps arrive in non-decreasing order and whether an event exactly 300 seconds old is still included.
A queue gives a straightforward solution: append each timestamp and remove expired timestamps as time advances. That is amortized O(1), but at very high write QPS, storing one object per request may become the larger problem.
Since the window is fixed, if second-level granularity is acceptable I can aggregate requests into timestamp buckets. Each write becomes one increment instead of one queue entry.
If reads are infrequent, I can aggregate active buckets when reading. If reads also become high volume, I’d maintain a rolling count and update it as buckets expire.”
Notice what makes this answer stronger:
It optimizes for the workload—not merely for asymptotic complexity.
Common Coding Mistakes
| Mistake | Why It Hurts | Better Move |
|---|---|---|
| Starting to code immediately | You may implement the wrong semantics. | Clarify first. |
| Preparing only Easy/Medium questions | Some recent rounds contain stronger algorithmic follow-ups. | Master common Medium patterns and selected Hard patterns. |
| Preparing only LeetCode | Coding 2 may look more like software construction. | Add machine coding and stateful APIs. |
| Skipping complexity | Efficiency is part of the signal. | State per-operation complexity. |
| Writing only pseudocode | Some practical rounds expect runnable code. | Practice executable solutions. |
| Ignoring concurrency | Shared mutable state can become a follow-up. | Explicitly identify race conditions. |
| No tests | Stateful code often fails at transitions. | Test incrementally. |
| Overengineering the initial version | You lose time needed for follow-ups. | Build the minimum complete solution first. |
Practical / Production Coding
The second coding dimension at Uber deserves separate preparation.
Uber’s backend framework calls it Depth in Specialization, which is a useful way to think about the round.
For backend candidates, this may test whether you can take a small real-world domain and create software around it:
entities + state + operations + complexity + tests + changing requirements
This is different from solving another independent algorithm puzzle.
Standard Algorithm Coding vs Practical Coding
| Standard Algorithm Coding | Practical Coding |
|---|---|
| One function | Multiple operations/classes |
| Fixed requirement | Requirements evolve |
| Input/output focused | State and invariants matter |
| Usually stateless | Stateful behavior |
| Algorithm dominates | Software decomposition matters |
| Usually single-threaded | Concurrency may appear |
| Correct output ends problem | Follow-ups test extension |
| Global Big-O | Per-operation cost |
Typical Task Styles
| Task Style | Example |
|---|---|
| Stateful Service | Restaurant availability |
| API Implementation | Open, close, query entities |
| Machine Coding | Ride-hailing core |
| Counter / Limiter | Rolling events or rate limiting |
| Cache | LRU / TTL |
| Code Extension | Add delivery regions |
| Concurrency | Prevent conflicting assignments |
| Events | Persist state and publish change |
| Reliability | What if publishing fails? |
| Testing | Validate all state transitions |
| Production Evolution | Move an in-memory system to distributed deployment |
What They Are Testing
| Signal | Strong Behavior |
|---|---|
| Modeling | Identify only the entities actually needed. |
| State Ownership | Know which component is authoritative. |
| Invariants | Define what must always remain true. |
| API Design | Keep operations simple and understandable. |
| Data Structures | Optimize the workload rather than inventing complexity. |
| Concurrency | Identify unsafe shared mutations. |
| Testing | Exercise transitions and invalid states. |
| Extensibility | New requirements fit without a total rewrite. |
| Production Judgment | Understand what the interview-scale implementation omits. |
Strong Practical Coding Behavior
- Clarify required operations.
- Define important invariants.
- Choose the simplest state representation.
- Implement one complete version.
- Test it.
- Accept the next requirement.
- Refactor only the boundary that must change.
- Preserve previous behavior.
- Add a test for the follow-up.
- Discuss production hardening after the interview-scale solution works.
Strong Response Example
Initial requirements:
openRestaurant(id)closeRestaurant(id)countOpenRestaurants()
Follow-up:
Restaurants now serve one or more delivery zones. Return the number of open restaurants serving a given zone.
A strong response:
“For the initial requirements, a set of open restaurant IDs is sufficient.
The new requirement introduces a second lookup dimension. I would keep restaurant state separate from geographic membership rather than coupling everything inside one object.
I’d maintain
restaurant → zonesand eitherzone → open restaurant IDsorzone → open count, depending on whether future APIs require identities or only counts.Opening or closing a restaurant then updates its relevant zone indexes.
Before implementing, I’d clarify whether a restaurant can change zones while it is open, because that introduces another state transition.”
That response shows:
state modeling → requirements analysis → operation complexity → extensibility
Note
The best practical-coding candidates keep the interviewer aligned on:
assumptions → state → invariants → tests → follow-up → production hardening
Low-Level Design / Machine Coding
Some Uber backend loops separate this more explicitly.
Treat LLD as:
Can you convert a domain into executable, maintainable software?
Do not prepare it as a vocabulary test for design patterns.
LLD Topic Map
| Modeling | Implementation | Follow-Up |
|---|---|---|
| Entities | Interfaces | Thread safety |
| Relationships | Classes | Persistence |
| State machines | Data structures | Event publishing |
| Invariants | Validation | Distributed version |
| Ownership | Tests | Failure recovery |
| Extensibility | Error handling | Scaling |
High-Yield Practice Problems
| Problem | Core Concerns |
|---|---|
| Ride-Hailing Core | Rider, driver, trip, state transitions |
| Parking Lot | Allocation, capacity, lookup |
| Restaurant Availability | State + indexing |
| Reservation System | Capacity + races |
| Rate Limiter | Strategies + time semantics |
| Elevator | State + scheduling |
| Notification Preferences | Extensibility |
| In-Memory File System | Hierarchy + APIs |
LLD vs HLD
| Low-Level Design | High-Level Design |
|---|---|
| Classes | Services |
| Objects | Distributed components |
| In-memory state | Durable/distributed state |
| Method contracts | Network APIs |
| Thread safety | Distributed coordination |
| Unit tests | SLOs and monitoring |
| Local failure | Partial distributed failure |
| Executable code | Architecture discussion |
Note
Use Strategy, Observer, Factory, or other patterns because a requirement creates a useful abstraction—not because you want to demonstrate that you memorized them.
System Design
System design matters heavily for experienced Uber engineers because Uber’s systems often combine three difficult properties:
- high scale;
- rapidly changing state;
- real-world consequences when the system is wrong.
A generic web architecture answer is usually insufficient.
A strong Uber design answer should understand:
What state is authoritative?
What may be stale?
What can safely retry?
What can happen twice?
What happens when components disagree?