Anduril · Software Engineer
Updated · 2026-09-24

Anduril Software Engineer
Interview Guide

THE 60-SECOND BRIEF

Anduril builds defense technology. Candidate reports describe its software engineers working on real-time command-and-control, autonomous platforms and edge compute systems such as Lattice OS. Much of that code runs against physical hardware: sensors, autonomous air vehicles and networks of field nodes, often in environments with severe network constraints. Candidates report that standard coding and design questions often come with hardware, latency and connectivity constraints attached.

This guide covers the four rounds candidates report for the Software Engineer role at Anduril: a recruiter call, a technical screen, a final loop of four to five sessions, and a technical presentation for specialized roles. It groups the reported questions by category: graph and data-structure coding, C++ concurrency and debugging, real-time and disconnected system design, and project defense. For each category it explains how to prepare, and it includes a seven-day plan that uses the worked exercises on this page.

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

Scope every query and cache key by tenantEvolve APIs without breaking pinned SDK clientsBuild at-least-once pipelines with explicit deduplication horizons

39 min read

Practice 16 Software Engineer prompts
8Company bank questionsSnapshot · Sep 26, 2026 PT
8Candidate experiences ↗Read their reports
16Practice promptsAcross five skill areas
3With worked solutionsIncluded in the practice prompts

Candidate reports describe the Software Engineer role at Anduril as building software for real-time command-and-control, autonomous platforms and edge compute systems such as Lattice OS. Unlike a typical web-services or internal-tools job, the code often talks directly to sensors, autonomous air vehicles and distributed field nodes. The reported specialisms include vehicle management systems, real-time data ingestion, low-level embedded software and tactical user interfaces. Engineers work alongside electrical, mechanical and systems engineers.

The same reports list C++, Rust, Go, Python and TypeScript as working languages, depending on the team. Engineers own a feature from the first pull request through hardware integration testing and deployment. The work can include testing against hardware simulators, debugging live hardware in test bays, supporting field trials, and presenting software proposals in design reviews.

Candidates report that ordinary questions often come with physical constraints attached. A graph problem becomes a network of field sensors. A pipeline design has to cope with high-frequency drone telemetry. A command-and-control interface has to keep working when the link drops. The loop is also reported to vary by team, for example vehicle management systems versus frontend tactical dashboards. Find out on the recruiter call whether you are preparing for low-level C++ and firmware questions or for React and TypeScript rendering questions, and weight your week accordingly.

01

Recruiter Call

reported

Candidates describe the first stage as a conversational screen with a recruiter. It covers your background, your project experience and your alignment with the mission. You do not write code here, but this call shapes the rest of your preparation. The later rounds are reported to be tailored to the team, for example vehicle management systems versus frontend tactical dashboards, so use this call to find out which technical track you are preparing for. Ask which team you are interviewing for, which languages it works in, whether a technical presentation is part of your loop, and whether the role needs a security clearance.

What to demonstrate

  • Whether you can summarise your background briefly and link specific past projects to software that works with hardware, sensors, real-time data or unreliable networks
  • Whether your reason for wanting this mission-focused role is concrete and personal rather than a generic interest in the company
  • Whether your project experience matches the team's track, either embedded and low-level systems or user-facing platforms

How to prepare

  • Write a short spoken summary of your background that names two projects, what you personally built in each, and one constraint you worked under, such as latency, memory, hardware or schedule. Say it aloud until it comes out the same way every time
  • Prepare a motivation answer that ties your past work to the kind of systems described for the role, instead of repeating the job posting
  • Write down the questions you will ask: team, language, embedded or frontend track, whether the loop includes a project presentation, and clearance requirements
PracHub interview research ↗
02

Technical Screen

reported

Candidates report that a team engineer or the hiring manager runs this screen. It involves live coding, bug fixing or a domain-specific review, depending on the team. The reported coding categories for the role are graph traversal (cycle detection and connected components with DFS or Union-Find), two-pointer and sliding-window problems, building a hash map or tree from scratch, and a spatial-coordinate store with fast lookups. The reported debugging category is a C++ program with data races and logic flaws. Any of these could come up here or later in the loop. Before you write code, ask about data bounds, memory limits and scale. Get a correct version working first, and state its complexity before you optimise.

What to demonstrate

  • Whether your code is correct on edge cases (empty input, a single node, disconnected components) and whether you state time and space complexity without being asked
  • Whether you ask about input bounds, memory constraints and expected scale before choosing an approach
  • Whether you debug by naming shared state and tracing control flow, rather than trying edits until the output looks right

How to prepare

  • Implement cycle detection for both undirected and directed graphs, plus Union-Find with a component count, from a blank file. Test each on an isolated node, a self-loop and a graph with two components
  • Seed a small C++ producer-consumer program with an unsynchronised shared buffer and an off-by-one error. Find both, using ThreadSanitizer to confirm the race, and explain each fix out loud
  • Write a hash map with chaining and resizing. Explain why lookups are O(1) on average, and describe the collision pattern that makes them O(n)
PracHub interview research ↗
03

Final Round Loop

reported

Candidates report that the final stage consists of four to five sessions covering live coding, system design and behavioral assessment, with domain-specific deep dives that depend on the team. The reported design questions include a real-time ingestion pipeline for high-frequency drone telemetry, a command-and-control interface that keeps working through intermittent disconnection, an aerial vehicle tracking system that sends video and telemetry to ground stations, and an API for edge node state updates across thousands of sensors. Candidates report domain deep dives on C++ memory and concurrency for low-level roles, and on rendering and state management in React or TypeScript for frontend roles. Across several sessions, the same project may come up more than once, so your account of it needs to stay consistent.

What to demonstrate

  • Whether a design names bandwidth, memory, CPU and connectivity limits early and handles lost links, reconnection and backpressure explicitly
  • Whether coding answers stay correct and clearly explained across several sessions in a row
  • Whether your behavioral stories and project figures stay the same when a project comes up again in a different session
  • Whether your domain answers go below surface level: object lifetimes, copies versus references and synchronisation primitives, or re-render cost and state synchronisation in a UI

How to prepare

  • Work the reported design categories with the network allowed to fail: bounded local buffers, sequence numbers or versioned state for syncing after reconnection, and an explicit rule for resolving conflicting state
  • Write a one-page fact sheet for each project you might mention, covering scale, team size, timeline, what broke and what you owned. Quote from it and nothing else
  • Run a mock with a coding session, a design session and a behavioral session back to back, then list the places where your explanation lost structure
PracHub interview research ↗
04

Technical Presentation

reported

Candidates report this round for specialized roles. You present a past engineering project to a panel of engineers and then defend your architectural choices under questioning. The reported project-defense questions ask for the most complex system you have built and why you chose its frameworks, databases or languages. They also cover a project that failed or missed its performance targets and the root-cause analysis you did, and trade-offs made under hardware or schedule limits. Expect follow-up questions about the alternatives you rejected, the main bottleneck under stress, and exactly which parts you built yourself.

What to demonstrate

  • Whether each technology choice comes with the alternative you rejected and the constraint that decided it
  • Whether you clearly separate what you designed and wrote from what teammates built
  • Whether a failure is explained through diagnosis, root cause and a permanent fix rather than through blame or luck
  • Whether you respond to a challenge without getting defensive, and say where your knowledge ends instead of bluffing

How to prepare

  • Structure the talk in four parts: context and objective, the architecture and your specific contributions, key trade-offs and failures overcome, and lessons learned
  • For every box on your architecture diagram, write down what else you considered and why you rejected it, and note whether you built that component, reviewed it or inherited it
  • Rehearse with someone who interrupts with questions like 'why not the obvious alternative', 'what was the bottleneck' and 'what would you change to double throughput', and answer each in a few sentences
PracHub interview research ↗

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

Software Engineer

Anduril Software Engineer interview: C++ screen and graph clusters

HR Screen → Technical Screen → Onsite → Other

I went through a familiar sequence: recruiter contact, a technical coding screen, and an on-site. In the Zoom technical round, we briefly covered my background before moving into C++. I had to read basic lines of code and explain pointers, references, lambdas, and move semantics. The second half was a programming challenge using depth-first search to identify node clusters in a graph. The on-site…

Read full experience
Software Engineer

Anduril Software Engineer interview: drone equations and a demanding onsite

After an HR chat, I had a coding screen that was closer to a simulation than a standard textbook prompt. I had to calculate drone-related equations, so pattern matching was not enough to rush through it. Passing that screen led to an in-person onsite with system design, a cultural or motivational discussion, and two coding challenges. It felt difficult because the formats required both technical…

Read full experience
Software Engineer

Anduril Software Engineer interview: cantilever beam questions and a nontechnical thermal screen

The recruiter screens were brief and mostly light. Technical questions did appear, but not consistently. In a screen about mechanical design, I got basic cantilever-beam questions. A separate thermal recruiter screen had no technical questions at all, which made the experience feel somewhat inconsistent from interviewer to interviewer. I did not get an offer from this stage. It felt comparatively…

Read full experience
Software Engineer

Anduril Software Engineer interview: conventional flow and onsite concerns

Technical Screen → Onsite

I went through a conventional recruiter, tech-screen, and onsite flow. The questions covered data structures and algorithms, system design, and why I wanted to work at Anduril. The onsite was the main day, but the atmosphere did not match what I had hoped for. At one point, it felt like everyone was tired and the logistics were chaotic, based on how the interviewers talked about their situation.…

Read full experience
Software Engineer

Anduril Software Engineer Interview Experience: Mock application work and a project presentation

HR Screen → Other

My experience began with easy coordination. Reaching the recruiter and scheduling interviews was smooth. From there, the questions were tightly connected to the actual job and how effective I could be in it. I expected a typical interview structure, but it had a stronger performance element than I was used to. I had to demonstrate my abilities through mock application-style work, not just theory.…

Read full experience

PracHub editorial advice for the preparation topics above.

01

Designing a telemetry or command-and-control system as if the network never drops

The reported design questions include a drone telemetry pipeline, a command-and-control interface that must survive intermittent disconnection, and an API for state updates from thousands of edge nodes. A cloud-default answer, with an always-reachable broker and a central database as the only source of truth, fails all three. State the constraints at the start: link bandwidth and loss, memory and CPU on the field device, and what an operator must still be able to do while offline. Then design for them. Use a bounded local buffer with a stated drop policy. Use sequence numbers or versioned state so a reconnecting node sends a delta instead of its full history. Make updates idempotent so retries are safe, and give an explicit rule for which copy wins when two stale versions of state conflict.

02

Presenting a team project without separating your own contribution from everyone else's

The reported project-defense questions ask why you chose each technology, what the bottleneck was, and what you personally built. Saying 'we' for everything makes it impossible to credit you. Before the round, mark every component as designed and written by you, reviewed by you, or inherited. For each choice, name the rejected alternative and the constraint that decided it. Have one failure ready with its diagnosis, root cause and permanent fix. If a question goes beyond what you know, say where your knowledge ends and reason from first principles instead of guessing.

03

Fixing a C++ data race by guessing, or by wrapping everything in one mutex

The reported debugging question is a C++ program with data races and logic flaws. Start by naming the shared state, every thread that reads or writes it, and the invariant that is being broken. Separate the race from any single-threaded logic bug, because they need different fixes. Confirm the race with ThreadSanitizer or a reproduction rather than asserting it. Then apply the narrowest fix that closes the race: a mutex around the shared buffer, an atomic for a single counter, or handing ownership to one thread. Check lock ordering so the fix does not introduce a deadlock, and say how you would verify that the race is gone.

04

Reusing directed-graph cycle detection on an undirected sensor network

In an undirected graph, the edge back to the node you just came from is not a cycle. Track the parent during DFS, or use Union-Find: a cycle exists when an edge connects two nodes that are already in the same set. Directed graphs need a visiting/visited state (the recursion stack) instead. Start a traversal from every unvisited node so that disconnected components are covered. With Union-Find, the component count is the node count minus the number of successful unions. State O(V + E) for DFS, and near-linear time for Union-Find with path compression and union by rank. Before you finish, test on an empty graph, an isolated node and two separate components.

05

Quoting different figures for the same project in different final-loop sessions

With four to five sessions in the final loop, plus a presentation for some roles, the same project often comes up more than once. If the throughput, team size or timeline changes between tellings, the interviewers' notes will disagree. Keep a one-page fact sheet for each project with the figures you will quote and what broke. Rehearse from it until the numbers are identical every time, and give the same answer at the same depth when a question you have already answered comes up again.

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 in-memory data structure for storing and querying dynamic…

medium
data structures and algorithms

Implement an in-memory data structure for storing and querying dynamic spatial coordinates with fast lookups.

Approach
  1. Restate the input: its shape, its size, and what is guaranteed about it.
  2. Walk one small example through your approach before writing the whole thing.
  3. Choose the data structure from the access pattern, not from familiarity.
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?

Debug a broken or buggy C++ program containing data race conditions an…

medium
data structures and algorithms

Debug a broken or buggy C++ program containing data race conditions and logic flaws under time constraints.

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?

Explain the performance differences between passing parameters by valu…

medium
languages, concurrency and fundamentals

Explain the performance differences between passing parameters by value, reference, or pointer in low-latency C++ services.

Approach
  1. Name what is shared across threads and what owns each piece of state.
  2. Distinguish a value from a reference to it, and say which one you handed out.
  3. Reach for the cheapest primitive that closes the race, not the broadest lock.
Follow-up
  • Where could this allocate more than you expect?
  • What happens if two callers reach this at the same time?

Explain how hardware interrupts work and how you would design a thread…

medium
languages, concurrency and fundamentals

Explain how hardware interrupts work and how you would design a thread-safe task scheduler for embedded firmware.

Approach
  1. Say what the runtime actually does before reasoning about the code.
  2. Name what is shared across threads and what owns each piece of state.
  3. Distinguish a value from a reference to it, and say which one you handed out.
Follow-up
  • Where could this allocate more than you expect?
  • How would you prove the race exists rather than suspect it?

Schedule ordered webhook retries with a heap of subscription queues

mediumWorked solution
heapschedulingbackoffhead-of-line-blocking

Design the in-memory scheduler for webhook delivery. Up to 20 million rows sit in status pending or failed_retryable across 200,000 subscriptions, each row carrying next_attempt_at and attempt_count, and each endpoint having a circuit breaker. Deliveries for one subscription must be attempted in order, so at most one attempt per subscription may be in flight. Support due(now), complete(delivery, outcome) and insert(delivery) in O(log S), where S is the subscription count rather than the delivery count. Give the backoff formula you schedule retries with.

Approach
  1. Key the global heap by subscription, not by delivery. Each subscription owns a FIFO of its due deliveries in event order; the heap holds one entry per eligible subscription, keyed by its head's next_attempt_at. That is 200,000 heap entries instead of 20 million, and it makes the one-in-flight rule structural rather than a check somebody can forget.
  2. due(now): peek the minimum. If its key is in the future, sleep until then instead of spinning. Otherwise pop it, move the subscription into an in-flight set, and do not re-push it. A subscription absent from the heap cannot be dispatched twice, which is precisely how ordering is preserved.
  3. complete: on success, drop the head and re-push the subscription keyed by its new head, or leave it out when the queue empties. On a retryable failure, increment attempt_count and set next_attempt_at = now + uniform(0, min(cap, base * 2^attempt)), sampled uniformly across the whole interval. That is full jitter; deterministic backoff re-synchronises the herd you just created.
  4. Circuit breaker: park the subscription in a second heap keyed by its half-open time, so an endpoint dead for six hours costs one heap entry and zero attempts rather than consuming worker slots. Admit exactly one probe at half-open and close the breaker only on its success.
  5. Say the price of the ordering guarantee out loud. One in-flight attempt per subscription means an endpoint answering in 10 seconds drains at 0.1 deliveries/second however many workers you run, and its backlog grows until it recovers. If the customer does not need order, allow k in flight and document delivery as unordered; that is the trade, and it is a product decision.
  6. All three operations are O(log S) with O(S) resident heap memory and the queues themselves backed by the store. The database-backed equivalent is a partial index on (subscription_id, next_attempt_at) where status in ('pending','failed_retryable') claimed with FOR UPDATE SKIP LOCKED, and the write-back must be fenced on lease_token so a worker that stalled and resumed cannot overwrite a newer attempt.
Worked solution 30 min
  1. Define the four structures explicitly: queues: subscription_id -> deque[delivery], ready: min-heap of (next_attempt_at, subscription_id), inflight: set[subscription_id], breaker: min-heap of (half_open_at, subscription_id).
  2. Write down the invariant you will assert after every operation: a subscription appears in at most one of ready, inflight and breaker, never in two.
  3. Implement due, complete and insert, then simulate 200,000 subscriptions with Zipf-distributed queue depths totalling 20 million deliveries.
  4. Add one endpoint that always times out after 10 seconds and one that always answers in 20 ms, then measure the fast endpoint's throughput with and without the per-endpoint breaker.
  5. Instrument heap size across the run.
EXPECTED RESULTHeap size stays at or below 200,000 regardless of the 20 million deliveries. The fast endpoint's throughput is unaffected by the dead one once the breaker trips. The dead endpoint's deliveries accumulate in their own deque and cost exactly one heap entry.
Follow-up
  • One subscription has 4 million queued deliveries. What stops it from starving the other 199,999, and what does your heap look like under that load?
  • A customer requests redelivery of last Tuesday's events. Where do those rows enter your structure, and what keeps them from reordering live traffic?
  • The process restarts. How much state do you rebuild, and what stops every subscription from being attempted in the same second?

Roughly ninety minutes on weeknights with one longer weekend block. The plan cuts scope rather than compressing everything, on the assumption that one thing finished per night beats four half-started.

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
01Recruiter call preparation and a cold baseline
  • Write and say aloud a short background summary that links two past projects to real-time, hardware-adjacent or network-constrained work, with your own contribution named in each
  • Write your recruiter questions: team, language, embedded or frontend track, whether a technical presentation is in your loop, and clearance requirements
  • Attempt one reported coding question cold, detecting cycles and disconnected components in a network of field sensors, and write one sentence on what slowed you down
  • Attempt one reported design question cold, a command-and-control interface that survives intermittent disconnection, and write one sentence on where the design ran out

Deliverable: A background summary, a list of recruiter questions, and two cold attempts with a note on what blocked each.

Practice prompt ↗Practice prompt ↗Practice prompt ↗Worked solution ↗
02Graphs: cycles, components and reachability
  • From a blank file, implement undirected cycle detection with parent-tracking DFS, directed cycle detection with three states, and Union-Find with union by rank, path compression and a component count
  • Test all three on an empty graph, an isolated node, a self-loop and two disconnected components, predicting each result before running
  • Work the reachability pattern from the bank questions on unreachable heap objects: mark everything reachable from the roots, then report what was never marked
  • State each solution's time and space complexity aloud before you run it

Deliverable: Three graph implementations with a shared edge-case test file and a written complexity line for each.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
03Data structures from scratch, intervals and heaps
  • Build a hash map with chaining and resizing, then explain collisions, load factor, and why average O(1) can become O(n)
  • Sketch a store for moving spatial coordinates with fast lookups. Compare grid bucketing with a quadtree for update-heavy data, and say which queries each makes expensive
  • Solve merging intervals and the min-heap channel-assignment pattern from the bank, then choose a fixed-size sliding-window problem and state its extra-space cost
  • Work this page's heap-scheduler exercise and check your answer against its invariant and expected heap size

Deliverable: A working hash map, a written spatial-index comparison, and three solved heap, interval or window problems with time and space complexities stated.

Practice prompt ↗Practice prompt ↗
04C++ memory, concurrency and debugging (or the frontend track)
  • Explain passing by value, by reference and by pointer in C++: the cost of copying, aliasing and null risks, when a const reference or a move is right, and how each affects a hot path
  • Seed a small multithreaded C++ program with an unsynchronised shared telemetry buffer and a logic bug, then find both, confirming the race with ThreadSanitizer
  • Explain how hardware interrupts reach a handler, and design a thread-safe task scheduler in which the interrupt handler does minimal work and passes the rest to a task through a queue
  • Frontend track instead: build a search-and-filter component over thousands of map objects, and measure how debouncing, memoisation and list virtualisation or canvas rendering change re-render cost

Deliverable: A written pass-by-value/reference/pointer comparison, a fixed race with the sanitizer output, and a scheduler sketch (or a measured UI component for the frontend track).

Practice prompt ↗Practice prompt ↗Worked solution ↗
05Real-time and disconnected system design
  • Design a real-time sensor telemetry pipeline for several drones: ingestion, buffering, transformation and delivery to a UI, with rough message rates and the bottleneck named
  • Design edge node state updates across thousands of sensors: versioned state, delta sync after reconnection, idempotent updates and a conflict rule
  • Extend the command-and-control design from day 1 with what operators can do offline and how commands are ordered and acknowledged when the link returns
  • Work this page's rate-limit contract exercise to practise stating failure behaviour and a numeric bound in a design

Deliverable: Two designs, each naming its hardware and network constraints up front, one reconnection protocol, and one trade-off you would reverse under a stated condition.

Practice prompt ↗Practice prompt ↗
06Technical presentation and project defense
  • Build the presentation in four parts: context and objective, the architecture and your contributions, trade-offs and failures, and lessons learned
  • For every component, write the rejected alternative, the deciding constraint, and whether you built it, reviewed it or inherited it
  • Rehearse with someone who interrupts with 'why not X', 'what was the bottleneck under stress' and 'what would you change to double throughput'
  • Prepare the reported behavioral stories: a trade-off under hardware or schedule limits, a project that missed its targets and the root cause, and how you balance speed of delivery against maintainability

Deliverable: A rehearsed presentation, an alternatives table for its architecture, and three behavioral stories built from one project fact sheet.

Practice prompt ↗Practice prompt ↗
07Final-loop rehearsal and fact sheet
  • Run a back-to-back mock of a coding session (a graph problem), a design session (the telemetry pipeline) and a behavioral session, with no break between them
  • Straight after the mock, write down the three moments you lost structure, and redo only those
  • Finalise a one-page fact sheet per project with the figures you will quote, and check that they match what you said in the presentation rehearsal
  • Do not open any new material. Re-read your own notes and list the questions you still need answered about logistics

Deliverable: Notes from the mock naming three failure points with a fix for each, and a final fact sheet for every project you will mention.

Practice prompt ↗Practice prompt ↗Worked solution ↗

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

The reported behavioral and project-defense questions for this role focus on decisions made under constraint: hardware limits, schedule pressure, systems that failed, and the tension between shipping fast and keeping software maintainable. Build each story from one project fact sheet so the numbers match wherever the project comes up. Name what you decided yourself, the alternative you rejected, and how you knew afterwards whether the decision held.

Describe a time you had to make a critical technical trade-off under s…

medium
behavioural and engineering judgement

Describe a time you had to make a critical technical trade-off under strict hardware or schedule limitations.

Approach
  1. Name the disagreement and how you resolved it with evidence.
  2. Pick a story where you made the decision, not one where you watched it.
  3. Give the blast radius: what could have broken, and what you measured.
Follow-up
  • How did you know your change caused the improvement?
  • What did you decide not to do, and why?

Resolve a review disagreement over a quota check

easy
code reviewisolation levelswrite skewdisagreement

A colleague's pull request enforces a per-tenant quota by selecting the current count and then inserting when it is under the limit. You flag it as a race. They reply that the transaction already runs at repeatable read, so the snapshot makes it safe, and the tests pass. Walk through taking that disagreement to a resolution: what you write in the review, what you demonstrate rather than assert, which fix you propose and why, and what you do if they still disagree after all of it.

Approach
  1. Answer the claim precisely instead of restating your objection, because they have made a specific technical argument. In PostgreSQL, repeatable read is snapshot isolation; this is write skew, which snapshot isolation permits by design. Both transactions read a count that is stable within their own snapshot, insert disjoint rows that the other cannot see, and both commit, so the limit is exceeded by exactly the concurrency.
  2. Demonstrate rather than cite. Two psql sessions, both BEGIN ISOLATION LEVEL REPEATABLE READ, both select the count, both insert, both commit: it succeeds. Repeat at SERIALIZABLE and the second commit fails with serialization_failure, SQLSTATE 40001. That takes two minutes, ends the argument without anyone conceding a position, and leaves an artefact for the next reviewer.
  3. Offer the options with their costs rather than a verdict. Serialisable plus a retry loop on 40001 is correct but obliges every caller to retry and degrades under contention. An increment-and-compare on a counter row — update tenant_quota set used = used + 1 where tenant_id = $1 and used < limit returning used — is safe even at read committed, because a blocked updater re-evaluates the WHERE clause against the row version it finally locks, and zero rows returned means full. A unique or exclusion constraint that makes the surplus write fail is the third.
  4. Name the plausible non-fix explicitly, since it is what usually gets merged instead: folding the count into the insert as insert ... select ... where (select count(*) ...) < limit is still racy under read committed, because the subquery cannot see the other transaction's uncommitted rows. It looks atomic and is not.
  5. Say what you do if they still disagree: escalate the decision rather than the disagreement. Attach the reproduction, hand it to the service owner or a third reviewer, and state that you will not block the merge if the owner accepts the risk knowingly — and that you want that acceptance written down.
  6. Close with the general lesson worth leaving in the review thread: a passing suite is weak evidence for a concurrency claim because it runs one request at a time. Ask for a test that runs two.
Follow-up
  • Write the counter-row version. Does your answer change if the quota counts child rows rather than a column?
  • Under serialisable, who performs the retry, and what does the API client see if the retry also fails?
  • This is the third disagreement with the same reviewer this month. What changes in how you review?

Reverse a webhook ordering decision after measuring its cost

medium
reversing decisionshead-of-line blockingat-least-onceapi contracts

You argued for strict per-subscription ordering in webhook-delivery, which means one in-flight attempt per subscription. It shipped. Three months later a single unresponsive endpoint holds one subscription's queue at a six-hour backlog, and two customers report events arriving out of order anyway once their own retries are counted. Describe a decision you reversed: what you originally optimised for, the measurement that changed your mind, what the reversal cost in engineering time and customer change, and how you told the people who had already built on the original guarantee.

Approach
  1. State the original decision as a trade you made knowingly. Ordering across a network requires a single in-flight attempt per subscription, and its price is head-of-line blocking whenever one endpoint is slow. 'We priced it wrong' is a much stronger opening than 'we did not realise', and it is usually the true one.
  2. Bring the measurement that flipped it, not the anecdote: backlog age at the ninety-ninth percentile per subscription, the share of subscriptions where one slow endpoint gated an otherwise healthy queue, and the delivery throughput lost to serialisation. A reversal justified by complaints is indistinguishable from a reversal justified by fatigue.
  3. Name what you learned about the guarantee itself, which is the engineering content of this story. At-least-once delivery means a retried event already arrives after newer ones and the consumer already must be idempotent, so a guarantee the customer has to defend against anyway was never worth what it cost to provide.
  4. Describe the migration, because reversing a published contract is the hard half and the part candidates skip. Parallel attempts behind a per-subscription flag, a monotonically increasing sequence number added to the envelope so order-sensitive consumers can sort or discard, documentation that states at-least-once and unordered in those words, and a deprecation measured in quarters because the client is a pinned SDK inside a build pipeline you cannot see or redeploy.
  5. Give the cost in the two currencies that matter: engineer-weeks, and how many customers had to change code. Then say who you told before it shipped rather than in a changelog afterwards, and which large customer you left on the old behaviour and for how long.
  6. Close with the signal you now weight differently, stated as something you would do earlier next time: measuring the blocking cost on the slowest decile of endpoints before committing to the guarantee, rather than after a customer noticed.
Follow-up
  • A customer insists they need ordering. What do you offer them that is not global serialisation?
  • How did you choose the deprecation window given that you cannot see or redeploy the clients?
  • What would have to be true for you to reverse back?
  • 01

    Describe a time you had to make a critical technical trade-off under strict hardware or schedule limitations.

  • 02

    Describe a situation where a technical project failed or missed performance metrics. What root-cause analysis did you perform, and how did you resolve it?

  • 03

    How do you balance rapid delivery ("Anduril speed") with long-term software maintainability and safety critical constraints?

  • 04

    Walk through the most complex software system you have architected, explaining why you chose specific frameworks, databases, or languages.

  • 05

    Connect your career, your motivation for this role, and the project experience that prepares you for it.

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

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

PracHub interview research ↗
How difficult are the coding questions?

Candidate reports put the algorithm questions at medium to hard, comparable to large technology companies. They also say there is more weight on practical execution, low-level fundamentals and defending past decisions. The reported topics include graph traversal and cycle detection, Union-Find, two-pointer and sliding-window problems, building a hash map or tree from scratch, and spatial lookups. Aim to produce correct code that handles edge cases and to state its complexity without being asked, rather than to memorise many problems.

PracHub interview research ↗
Do I need prior defense or aerospace experience?

Reports say no for most software engineering roles. Candidates come from commercial tech, consumer hardware, finance and startups. What helps is showing how your experience carries over: talk about the latency, memory, reliability or connectivity constraints you have worked under, and explain the trade-offs you made because of them.

PracHub interview research ↗
Is an active security clearance required before applying?

Not always, according to candidate reports. Many software teams work on unclassified systems where a clearance is not needed up front. Where a role does require one, the reported path is going through the clearance process after hire. An active clearance appears in the reports as a nice-to-have rather than a must-have. Ask on the recruiter call whether your target team requires one.

PracHub interview research ↗
How long does the process take?

Candidates report four rounds over roughly three to five weeks: a recruiter call, a technical screen, a final loop and, for specialized roles, a technical presentation. Candidates also report that final decisions can depend on team matching after the technical rounds. Plan your preparation so the presentation and your project stories are ready before the final loop is scheduled.

PracHub interview research ↗
Will I have to give a technical presentation?

Candidates report it for specialized roles. You present a past engineering project to a panel of engineers and then answer detailed questions about your choices. Structure it as context and objective, the architecture and your specific contributions, key trade-offs and failures, and lessons learned. Prepare the rejected alternative for every major choice, and be clear about what you built yourself versus what teammates built.

PracHub Software Engineer practice ↗
Does the loop differ between embedded and frontend teams?

Candidates report that specific rounds are tailored to the team. Low-level and firmware teams go deeper into C++ memory management, pointers and references, mutexes, interrupts and debugging races. Frontend teams focus on React or TypeScript rendering performance, state synchronisation across display modules, and components that handle thousands of map objects. Graph coding and real-time design are reported question categories for the role; prepare them whichever track you are on.

PracHub Software Engineer practice ↗
Sources & methodology 3 sources ↗

Official role evidence, timestamped platform data and clearly labeled preparation advice.