Nuro · Software Engineer
Updated · 2026-09-24

Nuro Software Engineer
Interview Guide

THE 60-SECOND BRIEF

Nuro builds the software behind Level 4 autonomous electric delivery vehicles and personal mobility platforms. Its autonomy stack is called the Nuro Driver. Software Engineers work across three areas: real-time C++ that runs on the vehicle, cloud platforms for large-scale simulation and safety validation, and sensor-processing pipelines. The reported interview questions cover the same range, from thread-safe C++ and custom data structures to designing log pipelines and over-the-air update delivery for a fleet.

This guide covers the general Software Engineer loop at Nuro as candidates report it: an initial screening, one or two technical screens, and an onsite or virtual onsite. It groups the reported questions into algorithmic coding, low-level C++ and concurrency, system design for vehicle and cloud infrastructure, domain knowledge, and behavioural. Its preparation advice assumes you will write complete programs from a blank file in C++ or Python and defend your design choices against real hardware and network constraints.

Nuro candidates report 3 rounds · ≈ 3-5 weeks. The stages below are what candidates describe, not a published process.

Evolve APIs without breaking pinned SDK clientsMake every write idempotent under client retriesBound blast radius with per-tenant concurrency limits

41 min read

Practice 30+ Nuro questions

See the practice prompts

30Company bank questions ↗Snapshot · Nov 9, 2026 PT9Candidate experiences ↗Read their reports
16Practice promptsAcross five skill areas
3With worked solutionsIncluded in the practice prompts

Nuro builds software for Level 4 autonomous electric delivery vehicles and personal mobility platforms. Its autonomy stack is called the Nuro Driver. A Software Engineer there might write onboard C++ that runs in real time on the vehicle, build cloud platforms for simulation and safety validation, or develop sensor-processing pipelines. Teams mentioned for the role include Infrastructure, Autonomy, Behavior Verification and Embedded Systems, and the focus of your loop depends on which team you interview for.

The reported work covers the whole path from vehicle to cloud: low-level vehicle controls and CAN or Ethernet communication modules on board, distributed systems for over-the-air update deployment, and ML-based evaluation infrastructure that processes drive logs. That range explains why the question set mixes pointer ownership and cache locality with log pipelines and fleet-wide updates.

For preparation, expect less emphasis on template algorithm problems and more on runnable, production-shaped code. Candidates report writing full programs from an empty file, answering C++ memory and threading questions, and designing systems that must keep working with intermittent connectivity or a fixed onboard memory budget. The plan below is organised around those categories.

01

Initial Screening

reported

Candidates describe the first stage as a call with a recruiter or an engineering manager. It covers your engineering background, the projects you have delivered, and why Nuro's work interests you. Treat it as the first pass of a resume deep dive, not small talk: the technical screens reportedly open with a short resume deep dive too, so the projects you name here are the ones you will be asked to defend. Use the call to find out which team the loop is for, which language the coding sessions expect, and whether a C++ internals or domain session is part of the process. The reported questions range from cloud pipelines to onboard C++, and your preparation should follow the team.

What to demonstrate

  • How clearly you summarise your background and point to project work you can defend in technical depth
  • Whether your interest is tied to a specific part of the stack, such as onboard software, cloud simulation, sensor processing or verification, and whether you can say why
  • Whether the projects you describe line up with the team and language the loop is for

How to prepare

  • Pick two projects and write one line each for scope, your personal contribution, the hardest technical problem and the result, so the same facts come out in every later round
  • Ask which team the role sits on and whether coding is expected in C++, Python or either
  • Ask whether later sessions include C++ internals, a system design round or a robotics/perception deep dive, and adjust the seven-day plan to match
PracHub interview research ↗
02

Technical Interviews

reported

Candidates report one or two technical screens. Each typically opens with a short resume deep dive and then moves to live coding or low-level systems questions in a collaborative editor. One screen can cover several different areas, such as algorithmic coding, a deep dive into a system you built, and C++ internals, so pace yourself per topic rather than spending everything on the first problem. The environment is reportedly minimal: you may be asked to write a complete, executable program from a blank file in C++ or Python instead of filling in a stub. Practise the reported coding and low-level questions in this guide under those conditions: a trie that supports mkdir and ls, a multi-threaded job scheduler with cancellation, and a query for a vehicle's position at any timestamp in the last 10 seconds.

What to demonstrate

  • Whether you can go from an empty file to a program that compiles and runs, including includes, class structure and a small test entry point
  • Whether you pick data structures deliberately, state time and space complexity, and handle boundary cases without being prompted
  • Whether you can answer C++ follow-ups such as ownership, move semantics or thread safety in the middle of your own code
  • Whether you keep each topic on schedule when one screen covers several areas

How to prepare

  • Write three reported-style problems from a blank file in your interview language with no autocomplete, and include a main that runs your own edge cases
  • Practise stating complexity and the boundary cases you are handling out loud before you start typing
  • Prepare a two-minute walkthrough of one project that covers an architectural choice, a performance bottleneck you resolved and a bug you fixed
  • Rehearse moving on from a stuck subproblem by saying what you would do next and switching to the next topic
PracHub interview research ↗
03

Onsite or Virtual Onsite

reported

Candidates describe the final stage as a full onsite or virtual onsite of back-to-back sessions. These cover algorithmic coding, low-level system design or architecture, a domain deep dive (such as robotics, perception or C++ internals, depending on team), and behavioural conversations with hiring managers or team leads. Because the sessions run back to back, rehearse one session straight after another. Ask your recruiter ahead of time what each session focuses on. Reported design questions deal with vehicle and fleet constraints: streaming sensor logs to cloud storage, an evaluation pipeline over large volumes of drive logs, over-the-air updates with intermittent connectivity, and trajectory logging within onboard memory limits.

What to demonstrate

  • Whether your designs name the physical constraints (bandwidth, intermittent links, fixed onboard memory) and give a fallback for each failure
  • Whether low-level design answers explain memory, threading and determinism rather than only listing components
  • Whether you can reason through a domain question you have not seen, such as sensor fusion trade-offs or actuator fault detection, from first principles
  • Whether your behavioural stories show ownership, disagreement resolved with evidence, and a clear stance on speed versus safety

How to prepare

  • Run a mock of two sessions back to back, one coding and one design, so you practise staying sharp through the second
  • For each reported design question, write the failure modes first (lost connectivity, full disk, partial update) and the fallback state for each
  • Review sensor fusion trade-offs between LiDAR, radar and camera, and how you would test an actuator and detect its faults, so you have a starting point if a domain question comes up
  • Prepare one story each for disagreement, a production bug, speed versus safety, and cross-disciplinary delivery, using the same project facts you gave earlier in the loop
PracHub interview research ↗

9 candidate reports. Individual accounts describe a particular role and hiring cycle.

Software Engineer

Nuro L4 Software Engineer Interview Experience — Weighted Random Pick and a GPU/CPU Job Queue Design

Technical Screen

Interviewed at Nuro for the L4 position. 2 questions, 45 min each. Question 1: Write a random number generation function with weights. The function class must have 4 functions: add (add a weight and letter) generate (generate the random letter from the weights) remove (remove a weight) Similar to this LeetCode problem: 528. Random Pick with Weight. Question 2: System design: design a system to pl…

Read full experience
Software Engineer

Nuro Software Engineer Interview Experience — Rejected on My First C++ Interview, a Merge K Sorted Lists Variant

Technical ScreenOutcome: rejected

Lately I've been trying to adjust how I deal with failure. A yoga teacher told me a while back, "Rejection is redirection." Getting rejected might also be a reminder to change direction. I also read about someone who didn't get into the company they loved the first three times and finally made it on the fourth try. Maybe I'll move on to other opportunities, or maybe I'll try Nuro again after I've…

Read full experience
Software Engineer

Nuro Software Engineer Interview Experience — Unprepared System Design Plus an Easy Coding Round

Technical Screen

HR reached out and I just did the interview casually without much prep. The phone screen was 45 mins system design + 45 mins coding. System Design The question was to design a self driving car simulation job scheduler system. 10K simulation cases every week, each job has multiple phases, and the phases have dependencies on each other. Each case have several phases Weekly run of 10000 cases I hadn…

Read full experience
Software Engineer

Nuro Intern Software Engineer Interview Experience — A Thread-Safe Video Player and a Symmetric-Points LeetCode

Technical Screen

Only 1 round, which consisted of 2 interviews. The first was a coding system design question, and the second was a traditional LeetCode problem. Here is the first question: You're given a Frame class and a VideoPlayer class with the following operations: Read(): reads and returns the next frame of the video, or indicates that the end of the video has been reached. Render(frame): renders a frame o…

Read full experience
Software Engineer

Nuro Software Engineer Interview Experience — Scheduling Rounds and an Onsite Rejection

Technical Screen → OnsiteOutcome: rejected

I had my Nuro onsite last week and received a rejection email yesterday. I'm sharing the experience to give something back to the forum. Phone: Coding: Essentially Course Schedule II, solved with topological sorting. The follow-up asked how to change the code for multiple threads. System design: A question that had appeared on the forum, though I hadn't seen it at the time. A video needs three pr…

Read full experience

PracHub editorial advice for the preparation topics above.

01

Freezing when there is no function stub, harness or starter code

Candidates report being asked to write complete, executable programs from an empty file. Practise that exact setup in C++ or Python: includes, a class or struct, the function, and a main that runs a few inputs, including empty and single-element cases. Build the skeleton quickly so the problem gets most of your attention. If the prompt gives an interface, such as one that returns real-time vehicle position updates, write a minimal version of it yourself so the program actually runs.

02

A job scheduler or thread-safe structure that works on the happy path but has no answer for cancellation, shutdown or contention

The reported low-level questions include a multi-threaded job scheduler with queueing, execution and cancellation, plus thread-safe allocators, hash maps and ring buffers. Before coding, say which state is shared, which lock or atomic protects it, and what the condition variable waits on. Then handle the hard cases explicitly: cancelling a task that is already running, joining workers on shutdown, and spurious wakeups. When given a buggy snippet, name the specific race, deadlock ordering or uninitialised pointer, and say how you would reproduce it.

03

Answering C++ internals as memorised definitions with no performance consequence attached

Reported questions ask about vtables, smart pointers, move semantics and cache locality, and one asks how virtual calls affect a low-latency loop. For each topic, prepare the mechanism, the cost and an alternative: dynamic dispatch versus templates or a variant, a unique_ptr versus shared_ptr ownership decision, allocation inside a real-time loop versus pre-allocated buffers, contiguous layout versus pointer chasing. Link each one to code you actually wrote in the interview.

04

Designing vehicle-to-cloud systems as if the network were always up and memory unlimited

The reported design prompts state their constraints outright: intermittent connectivity for OTA updates, strict onboard memory limits for trajectory logging, and very large volumes of drive logs for evaluation. Start from those limits. Cover resumable, verified downloads with a rollback slot for updates; a bounded ring buffer with a clear policy for what gets dropped or kept when the logger is full; and backpressure plus replay for a sensor-log pub/sub. Name the fallback state for each failure instead of assuming retries will cover it.

05

Being vague on your own projects in the resume deep dive

Candidates report that the technical screens open with a resume deep dive and that interviewers press on architectural choices, performance bottlenecks and bugs you fixed. Pick two projects and fix the numbers, your exact contribution, the design you rejected and why, and one bug you found and prevented from coming back. Say it the same way every time, because the same project can come up again in a behavioural session later in the loop.

Choose a category, try a prompt, then open its approach, worked solution or follow-up when you need it.

13 technical prompts3 include a worked solution

Implement an efficient job scheduler in C++ or Python that uses multi-…

medium
data structures and algorithms

Implement an efficient job scheduler in C++ or Python that uses multi-threading to handle task queueing, execution, and cancellation.

Approach
  1. Name the brute-force solution and its complexity before improving on it.
  2. Walk one small example through your approach before writing the whole thing.
  3. Restate the input: its shape, its size, and what is guaranteed about it.
Follow-up
  • What is the worst case, and how likely is it on real data?
  • How does this change if the input no longer fits in memory?

Implement a custom trie data structure that supports basic file system…

medium
data structures and algorithms

Implement a custom trie data structure that supports basic file system commands such as mkdir and ls.

Approach
  1. Name the brute-force solution and its complexity before improving on it.
  2. State the target complexity and say which constraint rules the naive version out.
  3. Walk one small example through your approach before writing the whole thing.
Follow-up
  • How does this change if the input no longer fits in memory?
  • What is the worst case, and how likely is it on real data?

Solve array and string manipulation challenges, such as sorting charac…

medium
data structures and algorithms

Solve array and string manipulation challenges, such as sorting characters by frequency or traversing multi-dimensional grid matrices under constrained time complexity.

Approach
  1. State the target complexity and say which constraint rules the naive version out.
  2. Name the brute-force solution and its complexity before improving on it.
  3. Choose the data structure from the access pattern, not from familiarity.
Follow-up
  • Which test case would catch an off-by-one here?
  • What is the worst case, and how likely is it on real data?

Debug a live multi-threaded C++ snippet suffering from race conditions…

medium
languages, concurrency and fundamentals

Debug a live multi-threaded C++ snippet suffering from race conditions, deadlocks, or uninitialized pointer access.

Approach
  1. Identify the window where an invariant is briefly untrue.
  2. Distinguish a value from a reference to it, and say which one you handed out.
  3. Name what is shared across threads and what owns each piece of state.
Follow-up
  • How would you prove the race exists rather than suspect it?
  • Where could this allocate more than you expect?

Implement a thread-safe, custom vector memory allocator or hash map fr…

medium
languages, concurrency and fundamentals

Implement a thread-safe, custom vector memory allocator or hash map from scratch without relying on standard library containers.

Approach
  1. Distinguish a value from a reference to it, and say which one you handed out.
  2. Name what is shared across threads and what owns each piece of state.
  3. Say what the runtime actually does before reasoning about the code.
Follow-up
  • What happens if two callers reach this at the same time?
  • Where could this allocate more than you expect?

Hold a tenant to a trailing sixty-second request limit

mediumWorked solution
sliding-windowtwo-pointerrate-limitingtenant-skew

The gateway must hold each tenant to R requests in any trailing 60 seconds, in aggregate across three regions and every pod, within a budget of under 10 ms added p99. Peak is 30,000 requests/second across 200,000 active tenants, and traffic is heavily skewed toward a handful of them. Give an exact single-process algorithm with its amortised per-request cost and its memory per tenant, then a bounded-memory approximation and the worst-case overshoot it actually admits. Say what the distributed version does when the counter store is unreachable.

Approach
  1. Exact, single process: a per-tenant deque of request timestamps. On arrival, pop from the front while front <= now - 60s, then admit if the remaining length is below R and push. Each timestamp is pushed once and popped once, so the cost is O(1) amortised. The O(R) version is the one that re-filters the whole deque on every request.
  2. Quote the memory. R = 1,000 across 200,000 active tenants is up to 2 x 10^8 timestamps at 8 bytes, about 1.6 GB, and that is the worst case rather than the mean, because the long tail of small tenants holds almost nothing. Skew helps you here and hurts you in the sharding decision.
  3. Bounded alternative, with its real bound stated: a fixed 60-second counter is O(1) memory but admits close to 2R across a 60-second span straddling a boundary. The weighted two-bucket estimate, prev * (60 - elapsed)/60 + cur, is better on smooth traffic but assumes the previous window's arrivals were uniform; an adversary packing them at the end of that window is undercounted and can still approach 2R. Say that rather than calling it exact.
  4. Token bucket is the usual gateway answer and a different contract: O(1) state per tenant (tokens, last_refill), a sustained rate, and a deliberate burst allowance equal to the bucket size. Choose it when a burst is acceptable and the log when the limit is contractual.
  5. Distributed: the limit is per tenant in aggregate, so a local bucket of R/N per pod is wrong in both directions under skew. A tenant landing on one pod is throttled at R/N, and a tenant spread evenly across pods exceeds R. The shared check must be a single atomic round trip, one script or one increment-and-compare, never read-then-write, and it must fit inside the 10 ms p99 budget.
  6. Decide the unavailable case in advance and write it down. Failing open keeps the product up and lets a tenant exceed its limit for the duration; failing closed converts a counter-store outage into a full outage. Most gateways fail open on rate limits and closed on authorisation, and those are two separate decisions made separately.
Worked solution 25 min
  1. Implement the deque version and instrument the per-request pop count, then confirm total pops equal total pushes over a run.
  2. Generate a burst that places R requests in the last 100 ms of one minute and R more in the first 100 ms of the next.
  3. Run that burst through the exact deque, a fixed 60-second counter, and the weighted two-bucket estimate, recording admissions in the trailing 60 seconds at every instant.
  4. Size the memory as R x active tenants x 8 bytes at R = 1,000 and 200,000 tenants, and compare it against what a token bucket would need.
EXPECTED RESULTThe exact deque never admits more than R in any trailing 60-second window. The fixed counter admits close to 2R across the boundary. The weighted estimate lands between the two on this burst and approaches 2R once the previous window's requests are packed at its end.
Follow-up
  • One tenant sends 40% of all traffic. What does that do to a single counter key, and what do you shard on instead?
  • Quotas rather than rate limits: the check is select used; if used < limit then insert. Name the isolation level that still permits the overshoot, and the two fixes.
  • How do you return an accurate Retry-After from the exact algorithm without a second scan?

For a candidate senior enough that the loop turns on design and judgement rather than on whether the coding round gets finished. Five days build one system properly and then stress it; coding gets a single maintenance day, on the assumption that the risk at this level is an unexamined tradeoff rather than a missed algorithm.

Small steps. Visible outcomes.0 / 7 completed
ONE WEEK · YOUR PACE

Prepare, practise & reflect

One practical outcome each day. Spend longer where you need it.

0 / 7 done
01Screening prep and a blank-file baseline
  • Write the one-page project sheet for two projects: scope, your contribution, the hardest problem, the result, and one bug you fixed. This covers the screening call and the resume deep dive in the technical screens.
  • List the questions to ask your recruiter: team, coding language, whether C++ internals or a domain deep dive is included, and the focus of each onsite session.
  • In an empty file with no autocomplete, solve a graph traversal (BFS and DFS) and a palindrome check. Include a main that runs empty, single-element and normal cases.

Deliverable: Two project sheets, a recruiter question list, and two complete runnable programs written from blank files.

Practice prompt ↗Practice prompt ↗Practice prompt ↗Worked solution ↗
02Reported coding patterns
  • Implement a trie that supports mkdir and ls on slash-separated paths, returning ls results in sorted order. State the cost of each operation in terms of path length.
  • Solve an interval problem (minimum meeting rooms with a min-heap, or gaps and intersections between interval lists), then a grid traversal such as revealing a Minesweeper region.
  • Sort characters by frequency and group points within a distance threshold using union-find. State the complexity of each before coding.
  • Try the worked exercise 'Hold a tenant to a trailing sixty-second request limit' to practise sliding-window reasoning under a stated memory bound.

Deliverable: Four or more runnable solutions, each with its complexity and the edge cases it handles written above the code.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
03Concurrency: schedulers and buffers
  • Build a multi-threaded job scheduler in your interview language with a task queue, a worker pool, cancellation of queued and running tasks, and a clean shutdown that joins every worker.
  • Extend it into a periodic scheduler that re-queues recurring jobs. Explain what happens when a job runs longer than its period.
  • Implement a thread-safe ring buffer between a producer and a consumer. Use it to answer the reported question about a vehicle's position at any timestamp in the last 10 seconds: evict old entries, binary search by time, and interpolate between neighbouring samples.

Deliverable: A working scheduler and ring buffer, each with a written note on which state is shared, what protects it, and how shutdown works.

Practice prompt ↗Practice prompt ↗
04C++ internals and debugging threaded code
  • For vtables, smart pointers, move semantics and cache locality, write the mechanism, the runtime cost and an alternative. Include how virtual calls affect a low-latency loop.
  • Implement a fixed-capacity open-addressing hash map or a simple pool allocator without standard containers, then make it thread-safe and explain the cost of contention.
  • Take three short multi-threaded snippets with a data race, a lock-order deadlock and an uninitialised pointer. Fix each one and say how you would confirm the bug with a sanitizer or a stress test.
  • Work through the debugging drill 'Regional error rate explodes after a dependency merely slows' to practise separating the trigger from the amplifier.

Deliverable: A C++ internals cheat sheet written in your own words, one from-scratch container, and three diagnosed and fixed snippets.

Practice prompt ↗Practice prompt ↗Worked solution ↗
05Cloud-side design: logs, pipelines, pub/sub
  • Design a pub/sub system that streams sensor logs from vehicles to cloud storage. Cover partitioning, delivery guarantees, backpressure, and replay after an outage.
  • Design an evaluation pipeline that runs parallel simulation tests over very large volumes of drive logs. Cover how jobs are split, how failed shards are retried, and how results are compared between software builds.
  • Sketch fast search over raw AV logs or a bounded-memory search over vehicle records, and say which index you would build and why.
  • Review the worked design exercise 'Per-tenant rate limiting that holds across one hundred pods' for how to keep shared state atomic across many workers.

Deliverable: Two designs, each starting from its constraints and failure modes, with the fallback state written next to every component.

Practice prompt ↗Practice prompt ↗
06Onboard design and domain questions
  • Design OTA update delivery for a fleet with intermittent connectivity: resumable chunked downloads, integrity checks, staged rollout, an A/B slot with rollback, and what the vehicle does if an update fails partway.
  • Design a real-time trajectory logging system within a fixed onboard memory limit. Cover the buffer layout, what gets dropped or downsampled when it fills, and what gets flushed first when connectivity returns.
  • Write short answers on sensor fusion trade-offs between LiDAR, radar and camera in bad weather, and on how you would test an actuator and detect its faults.

Deliverable: Two onboard designs with explicit memory and connectivity budgets, plus one page of domain notes you can reason from.

Practice prompt ↗Practice prompt ↗
07Behavioural stories and a back-to-back mock
  • Write one story each for disagreeing with a senior engineer, a production bug and its prevention, speed versus safety, and cross-disciplinary delivery. Check that the facts match your project sheets.
  • Run a back-to-back mock: one blank-file coding problem from days 2-3, then one design question from days 5-6. Ask the interviewer to change a constraint halfway through.
  • After the mock, write down where you lost time and which follow-up you could not answer, then redo that part.

Deliverable: Four behavioural stories and mock notes that record where the design changed and which gaps you closed.

Practice prompt ↗Practice prompt ↗Worked solution ↗

Expand any day for tasks and deliverables. Your progress is saved on this device.

The reported behavioural questions cover four themes: disagreeing with a senior engineer's design, diagnosing a hard production bug, balancing fast iteration against safety and validation, and delivering across hardware, software and operations teams. Prepare one specific story for each. Name the decision you made, the evidence you used, and what you changed afterwards. Keep the project facts the same as in your resume deep dive, since the same work may come up again.

Describe a project where you had to collaborate across multi-disciplin…

medium
behavioural and engineering judgement

Describe a project where you had to collaborate across multi-disciplinary teams (e.g., hardware, software, operations) to deliver a critical feature.

Approach
  1. Pick a story where you made the decision, not one where you watched it.
  2. Name the disagreement and how you resolved it with evidence.
  3. Close with what you would do differently, concretely.
Follow-up
  • What would you do differently if you ran that again?
  • How did you know your change caused the improvement?

Disclose a cross-tenant webhook delivery to affected customers

medium
cross-tenant leakdisclosureblast radiusauthorisation checks

An enqueue path took the subscription from one lookup and the payload from another. For nineteen minutes, webhook_delivery rows were created whose tenant_id did not match the subscription's tenant, and eleven payloads were signed and sent to four endpoints belonging to other customers. You hold payload_digest, delivery timestamps and response codes. Describe how you handle a disclosure of this kind: what the records prove, what they cannot prove, what you say before you know everything, the one code change that closes it, and which parts you personally drove.

Approach
  1. Bound the population before saying anything externally. The affected set is deliveries in the window where the event's tenant and the subscription's tenant differ; the ones that actually left are those with delivered_at set and a 2xx in last_response_code. Attempted and delivered are two different counts and a disclosure has to use the right one in the right sentence.
  2. Separate what the records prove from what they do not, and say both halves rather than the flattering one. They prove which payloads were signed, where they went, and — through payload_digest — exactly which bytes. They do not prove what the receiving system did with them, and they do not bound the window more precisely than your deploy timestamps do.
  3. Communicate on the facts you hold, with the scope stated as an upper bound: 'at most eleven payloads, four recipient endpoints, these fields, this window' is more useful and more honest than waiting a day for certainty. The field list matters more than the event count, because a customer cannot assess exposure from 'an event'.
  4. Name the code change precisely, because this class never originates in the delivery worker. Compare the event's tenant against the subscription's tenant at enqueue and again immediately before the payload is signed, and make the second comparison drop the delivery rather than log a warning. Say why one check is insufficient: the enqueue check protects against the bug you know about, the pre-signing check protects the boundary itself.
  5. Run the history question in parallel and say so: a query over historical deliveries for the same mismatch tells you whether this was nineteen minutes or a year, and you would rather find the second case yourself than have a customer find it after your disclosure.
  6. Split the response into workstreams with owners — recipients asked to delete, affected customers notified, the check landed with a test, history swept — and say which you personally drove and which you handed off. Claiming all four is not credible and claiming none is not ownership.
Follow-up
  • The historical sweep finds two more instances from last year. What changes in what you have already told people?
  • Who approves the wording, and what do you do when you are asked to soften the scope?
  • A customer asks you to prove a redelivery contained the same bytes as the original. What do you show them?

Unblock an engineer on a job run that finished twice

easy
mentoringfencing tokenslease expirydebugging method

An engineer two weeks into the team brings you a job_run row showing status succeeded with an exit_code written by a worker declared dead ten minutes earlier; the retry attempt also shows succeeded. They have spent a day adding logging and are no closer. You have twenty minutes and you do not want to take the keyboard. Describe how you unblock someone: the question you ask first, what you let them find themselves, the concept you name and when, and how you check the next day that they own the fix rather than having watched you produce it.

Approach
  1. Ask what they expect rather than what they see: which statement set status to succeeded, and what did it check before writing? That question points directly at the update's WHERE clause, which is where the answer lives, and it costs them nothing to answer, so it does not read as a test.
  2. Let them build the timeline themselves from the row: queued_at, started_at, leased_until, finished_at and worker_id, on both the original run and the retry. Two different worker_ids with a lease expiry between them tells the whole story, and they will see it before you say it.
  3. Name the concept once the evidence has earned it. A lease bounds time; it does not prevent a write. The store has to reject a stale writer, which means the update carries a fencing token the row compares — update job_run set status = 'succeeded' where run_id = $1 and lease_token = $2 and status = 'running' — and a long garbage-collection pause or a brief partition is enough to produce what they are looking at.
  4. Point at the second, less obvious half and let them decide it: 'lost' exists in the status enum precisely so a run whose worker vanished is not recorded as failed, because failed asserts an outcome nobody observed and the system then bills and retries on that assertion. Ask them what these two rows should have said.
  5. Leave them with the next step rather than the patch — a test that kills the first worker after the sandbox exits and before the row is written — and say when you are available again, so the offer is real rather than polite.
  6. Check ownership the next day by what they produced, not by asking if it went well: a test that reproduces the window proves they understood it; a test that only asserts the new WHERE clause proves they copied it. Ask them to explain it to a third person and listen for whether the explanation is theirs.
Follow-up
  • They propose a longer lease instead of a token. What do you say, and what breaks when legitimate runs last thirty minutes?
  • How can you tell whether your explanation landed or they simply deferred to you?
  • The same engineer hits a variant of this next month. What did you fail to teach the first time?
  • 01

    Describe a time you disagreed with a technical design choice made by a senior team member. How did you resolve it, and what evidence did you use?

  • 02

    Tell me about a complex bug you encountered in production: how you diagnosed it and what long-term prevention you put in place.

  • 03

    How do you prioritise between rapid iteration and strict safety or validation requirements? Walk through one specific decision.

  • 04

    Describe a project where you collaborated across hardware, software and operations teams to deliver a critical feature.

  • 05

    Explain the scope of a project you owned, which parts were yours, and the hardest technical challenge you solved in it.

  • 06

    Tell me about a time you had to prioritise testing or QA work with incomplete information when a safety-relevant outcome depended on it.

PracHub interview preparation framework ↗
Is this an official Nuro interview guide?

No. It is PracHub's own research and practice material for the Software Engineer role at Nuro. Rounds and questions reflect what candidates have reported, not a process Nuro has published, and they change over time. Confirm the current format and scope with your recruiter.

PracHub interview research ↗
What makes the Nuro coding questions different from standard algorithm practice?

Many of the reported questions add systems concerns to the algorithm. Examples include a trie that supports mkdir and ls, a multi-threaded job scheduler with cancellation, a query for a vehicle's position over the last 10 seconds, and thread-safe containers built without the standard library. Candidates also report starting from a blank file. Prepare by writing complete, runnable programs and by being ready to discuss memory and threading in the code you just wrote.

PracHub interview research ↗
Which programming language should I use in the coding rounds?

The reported prompts mention C++ or Python, for example the job scheduler is described as C++ or Python. Use the language you can write fluently from an empty file. If the team works on onboard or low-level systems, prepare for C++-specific follow-ups, since the reported low-level questions cover vtables, smart pointers, move semantics and cache locality. Confirm the expected language with your recruiter before the technical screens.

PracHub interview research ↗
How long does the process take, and what are the stages?

Candidates report three stages: an initial screening, one or two technical screens, and an onsite or virtual onsite. Reported timelines run about three to five weeks, and up to six depending on the team. Ask your recruiter about scheduling and the focus of each onsite session rather than planning around a fixed timeline.

PracHub interview research ↗
Do I need robotics or autonomous-driving experience?

The reported questions are a mix. Most are general coding, C++ and distributed-systems questions. A smaller set covers domain topics such as sensor fusion trade-offs between LiDAR, radar and camera, behaviour verification metrics, actuator testing and fault detection, and the structure of a multi-layer perceptron. Ask your recruiter whether your loop includes a domain deep dive. If it does and you lack the background, prepare to reason from first principles about failure modes and testing instead of reciting terms.

PracHub interview research ↗
How should I prepare for the low-level C++ and concurrency questions?

Build a few things from scratch: a thread-safe ring buffer for producer and consumer threads, a simple fixed-size allocator or open-addressing hash map, and a worker-pool scheduler with cancellation. For each one, be able to explain the locking strategy, the cost of contention, and what happens on shutdown. Also practise finding bugs in short multi-threaded snippets (races, lock-order deadlocks, uninitialised pointers) and explaining how you would confirm the bug with a sanitizer or a targeted test.

PracHub Software Engineer practice ↗
What kind of system design questions come up?

The reported design questions deal with vehicle and fleet data: a pub/sub system that streams sensor logs from vehicles to cloud storage, an evaluation pipeline that runs parallel simulation tests over very large volumes of drive logs, OTA update delivery with intermittent connectivity, and onboard trajectory logging within strict memory limits. The practice bank also includes designing an autonomous-vehicle simulator and fast search over AV raw logs. Start each answer with the constraint and the failure you are designing for.

PracHub Software Engineer practice ↗
Sources & methodology 3 sources ↗

No official company page is cited. Rounds and questions come from candidate reports and PracHub editorial material; each source shows the date it was read.