As a Software Engineer at Walmart, you build and optimize systems that operate at a global scale. Walmart Global Tech powers the technology infrastructure for the world's largest retailer, supporting over 240 million customers weekly across physical stores, Sam's Club locations, and digital e-commerce platforms. Software engineering teams directly drive revenue, supply chain accuracy, inventory availability, and customer checkout experiences across both domestic and international markets.
You will contribute to critical enterprise technology domains such as Catalog Engineering, FinTech Data Solutions, Enterprise Business Services (EBS), and International Store Operations. Engineers in these spaces design high-throughput microservices, maintain event-driven streaming architectures, and implement intelligent data pipelines that connect disparate supply chain data sources. The technical challenges you face at Walmart require balancing extreme throughput, low latency, and rock-solid availability.
Whether you are developing next-generation seller integration APIs, optimizing high-traffic catalog databases, or building distributed key-value caches, your work directly touches millions of lives daily. offers an environment where complex distributed systems challenges meet real-world operational scale, making this role both technically demanding and deeply impactful.
Recruiter Call
reportedBefore anything technical happens, someone has to decide which rung of the ladder your loop is calibrated to, and that decision sets the bar for every round after it. It comes from how you describe scope, not from your title, because titles do not convert cleanly between companies. The weak version of the answer is team size and years. The strong version names the largest change you shipped where nobody reviewed the design, what would have broken if you had been wrong, and what you were paged for. Get the level said out loud on this call, because the range and the loop both follow from it.
What to demonstrate
- Whether the scope in your own account maps onto a level the team actually has an opening at, so a mismatch ends the process cheaply rather than after four interviewers have spent a day
- Whether your title needs re-mapping: the same word describes very different amounts of independent decision-making at a twenty-person company and a ten-thousand-person one
- Whether your compensation expectation can be filled at that level in the structure the role pays in, which is why the number gets asked for before any engineer is scheduled
How to prepare
- Write down two changes from the last two years: the largest one you designed with nobody reviewing the design, and the largest one where someone more senior did. Lead with the first when scope comes up, and be ready to say which parts of the second were yours
- Ask which level the loop is calibrated to and what changes at the level above it, then plan your weeks from that answer rather than from the posting
- Settle a total-compensation range beforehand with the split named, base against bonus against equity and its vesting period, so a question about numbers gets a number instead of the word market
Technical Screening
reportedThe same problem is scored by two different mechanisms depending on the format, and preparing for one does not cover the other. With a person watching, partial progress is visible and a hint is a correction you can absorb; silence is the expensive failure, because nobody can read a half-written function. With an automated grader there is no partial credit for what you were about to do, nobody to ask, and the worked examples in the prompt are the entire specification. Read them as a contract, down to whether an empty result should be an empty list or no output at all.
What to demonstrate
- In a live session, whether your commentary tracks what your hands are doing, and whether a hint redirects you or gets defended against
- In an automated one, whether you cover the cases the examples do not show, since the hidden cases are where the score moves
- Whether you manage the clock on purpose: abandoning an approach that is not converging while there is still time to write something simpler that finishes
How to prepare
- Have someone hand you a problem and feed you one deliberately wrong hint. Practise testing it against a concrete case instead of accepting or rejecting it on authority.
- Do one timed run a week in a plain browser editor with autocomplete, linting and your own snippets switched off, which is closer to what these environments give you
- For the automated format, write the harness before the solution: a main that feeds the worked examples plus an empty and a single-element case and prints expected against actual, so a wrong submission is caught by you first
Virtual Loop
reportedNobody in the room with you decides this. Interviewers typically write their rounds up separately, often before seeing anyone else's, and the outcome is settled later from those write-ups. A split panel gets resolved by whichever note carries specific evidence, so what you want out of each room is one concrete thing that person could write down: a bug you caught yourself, a trade-off you named, a decision you owned. The rest is arithmetic. The project you describe in a behavioural conversation is often the same system you sketched an hour earlier, and the two accounts have to agree.
What to demonstrate
- Whether the scale, team size and timeline you attach to a project hold steady when that project resurfaces in a different round
- Whether each interviewer leaves with a specific thing to cite rather than a general impression of competence
- Whether a trade-off you defended in one round survives a challenge in another, instead of being quietly swapped for the answer the new interviewer seemed to want
- Whether a question you have already answered earlier in the day gets the same answer at the same depth, without visible impatience
How to prepare
- Write a one-page sheet per project fixing the figures you will quote — request volume, data size, team size, elapsed time, what broke — and say them aloud from the sheet until they come out identical every time
- For each round on the schedule, decide in advance the one sentence you want in that person's notes, then check in a mock that you said it outright instead of leaving it to be inferred
- Have someone ask you the same project question twice, an hour apart, and diff the two answers for numbers that moved or a trade-off that reversed
PracHub editorial advice for the preparation topics above.
Applying order state changes as blind writes when events arrive at-least-once and out of order
A cancel request and a 'picked' event travel different paths with no shared ordering, and a message bus that guarantees at-least-once delivery will redeliver either one after a consumer crash. Read-modify-write handlers then let the later writer win arbitrarily, so you ship a cancelled order or refuse to cancel one still sitting on a shelf, and both outcomes are expensive. Every transition needs to be a compare-and-set on the expected current state with an explicit branch for zero affected rows, plus a processed-event table keyed on the producer's event id so that a redelivery is a no-op rather than a second application. Exactly-once delivery is not available over an unreliable network; at-least-once delivery combined with idempotent effects is, and conflating the two is what produces handlers that are correct only on the first run.
Representing money as floating point, or rounding tax at a different grain than the total is computed at
Binary floating point cannot represent most decimal fractions exactly, so sums over thousands of lines drift and two services computing the same total from the same inputs disagree in the last place. Rounding grain is the subtler half: rounding tax per line and summing gives a different total than computing tax on the order subtotal and rounding once, and the difference is a cent or two per order — small enough to pass every test and large enough to make the payment provider's amount, the invoice and the finance ledger disagree at month end. Store minor units as integers, and treat the rounding rule as a specification that is applied at exactly one point, propagated everywhere else, and pinned by a CHECK constraint on the order total; which rule is required is jurisdiction-specific, so the engineering obligation is consistency and explicitness rather than a single universal choice.
Optimising an axis nobody named
Ask which resource is actually scarce here: wall-clock latency, throughput, memory footprint, cost per request, or engineering time. Shaving a constant factor off an in-memory step is wasted effort when the same function makes a blocking remote call inside the loop.
Choosing a schema before the access patterns are known
Write the queries first, with their filters, sort orders, cardinalities and which ones sit on the latency-critical path, then design tables and indexes to serve them. An index nothing queries still costs write throughput and storage, and a hot query with no supporting index becomes a full scan that only hurts once the table is big.
Choose a category, try a prompt, then open its approach, worked solution or follow-up when you need it.
Solve a grid-based breadth-first search (BFS) problem to calculate sho…
Solve a grid-based breadth-first search (BFS) problem to calculate shortest distances or propagation times (similar to grid traversal or matrix infection patterns).
Approach
- State the target complexity and say which constraint rules the naive version out.
- Name the brute-force solution and its complexity before improving on it.
- 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?
- Which test case would catch an off-by-one here?
Given an array of integers and a target sum, identify unique combinati…
Given an array of integers and a target sum, identify unique combinations that sum to the target using dynamic programming.
Approach
- State the target complexity and say which constraint rules the naive version out.
- Walk one small example through your approach before writing the whole thing.
- Name the brute-force solution and its complexity before improving on it.
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?
Given daily temperature recordings, find the number of days until a wa…
Given daily temperature recordings, find the number of days until a warmer temperature occurs using a monotonic stack.
Approach
- Name the brute-force solution and its complexity before improving on it.
- Walk one small example through your approach before writing the whole thing.
- State the target complexity and say which constraint rules the naive version out.
Follow-up
- What is the worst case, and how likely is it on real data?
- Which test case would catch an off-by-one here?
Given two sorted arrays, calculate the median of the merged array in l…
Given two sorted arrays, calculate the median of the merged array in logarithmic time.
Approach
- Choose the data structure from the access pattern, not from familiarity.
- Name the brute-force solution and its complexity before improving on it.
- 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?
Compute peak attempt rate per variant over a sliding window
Given one day of reservation attempts as (timestamp_ms, variant_id) — up to 300 million events across two million variants, arriving in timestamp order — compute for each variant the maximum number of attempts falling inside any 60-second sliding window, plus the start of the earliest window achieving it. The window is continuous, not a tumbling bucket. Give an algorithm linear in the number of events after grouping, with bounded memory per variant, and say precisely what that memory is bounded by.
Approach
- Group by
variant_id, then run two pointers over each group's timestamps: advance the right pointer one event at a time and advance the left whilet[right] - t[left] >= 60000, with the count beingright - left + 1. Neither pointer moves backwards, so each group costs O(n_v) and the whole job is O(n) after grouping — the partition or sort is the only superlinear step in the pipeline. - Justify examining only n windows: the maximum can always be attained by a window whose left edge sits on an event, because sliding a window without crossing an event cannot change its count. That is the step candidates skip and then cannot defend when asked why n windows suffice over continuous time.
- For the streaming form, hold a deque of timestamps per active variant and pop from the front while the front is older than 60 seconds. Memory per variant is bounded by the peak window count rather than by the day's event count — a variant at 1,000 attempts per second holds at most 60,000 timestamps, about 480 KB at 8 bytes each, and that is the number to quote when asked whether the job fits.
- Say why tumbling buckets are not a substitute, with the concrete case: 100 attempts at t = 59.9s and 100 at t = 60.1s give a tumbling maximum of 100 against a true sliding maximum of 200. The understatement can reach a factor of two, which is the difference between tripping an admission-control threshold and sailing past it.
- Complexity: O(n) after grouping, O(peak window count) space per active variant. Evict variants with no event in the last 60 seconds so the live map stays proportional to concurrently active variants rather than to the two-million-variant catalogue.
Worked solution 20 min
- Construct one variant's timestamps by hand with a burst deliberately straddling a bucket boundary, and compute both the tumbling and sliding answers on paper.
- Implement the two-pointer sweep and confirm it reproduces the paper sliding figure.
- Implement the tumbling version, confirm it reports the smaller number, and keep that gap as a regression test.
- Run over 10 million events across 100,000 variants, then halve the input and compare wall times to confirm linearity.
Follow-up
- Events can arrive up to five seconds late. What do you buffer, what do you emit, and what happens to an event that is twenty seconds late?
- You need peaks over both 60-second and 5-minute windows. Do you pay twice?
- This result feeds a token bucket that throttles the variant. Describe the feedback loop you have just created.
Model variant attributes without a wide table or EAV
product_variant holds variant_id, product_id, sku_code, status, attributes JSONB, list_price_minor, currency_code, and nullable weight_grams, length_mm, width_mm, height_mm. One table must carry apparel (size, colour), an appliance (voltage, capacity_litres) and a consumable sold by weight. Give the DDL: which attributes you promote to real columns, which stay in attributes, and every index you create. Then write the facet query for active charcoal size-M variants priced between two bounds, and say which index serves which predicate and which predicate no index helps.
Approach
- Fix the grain before the storage. Description, category and reviews hang off product; anything reserved, picked, weighed or rated by a carrier hangs off the variant. Promote to real columns exactly the attributes with cross-category meaning or a non-containment access pattern: list_price_minor because it is range-filtered and sorted, and the four dimension columns because the sellable check tests them for NULL and carrier rating reads them. Category-specific facets stay in attributes.
- Reject the two extremes with their costs stated rather than by taste. A wide table needs a migration and an index per category; PostgreSQL caps a table near 1600 columns and mostly-NULL rows are cheap because of the null bitmap, so the real price is schema coupling, not bytes. EAV turns a k-facet filter into k self-joins or a GROUP BY with k FILTER clauses and HAVING, drops type checking, and leaves the planner estimating cardinality it cannot see.
- Index the document for the operator you actually issue. GIN with jsonb_path_ops serves containment (@>) and is smaller than the default jsonb_ops, but it does not serve key existence (?), ordering, or any range. That limitation is what decides which attributes had to become columns.
- Add a B-tree expression index for every attribute filtered by range, for example ((attributes->>'capacity_litres')::int). Two preconditions: the query must repeat the identical expression or the index is ignored, and the cast must be immutable — text to int is, text to timestamptz is not and PostgreSQL will refuse the index.
- Make the indexes partial on status = 'active', since only active is sellable, and expect the plan to be a BitmapAnd: PostgreSQL bitmap-scans the GIN for containment and the B-tree for the price range and intersects them. That is why two indexes beat the single composite index that cannot exist across a JSONB operator class and a scalar column.
Worked solution 30 min
- Create the table with attributes JSONB, load 200,000 rows spread across the three categories, and populate capacity_litres on the appliance subset only.
- Create three indexes: GIN (attributes jsonb_path_ops) WHERE status = 'active', B-tree (list_price_minor) WHERE status = 'active', and a B-tree expression index on ((attributes->>'capacity_litres')::int).
- Run EXPLAIN (ANALYZE, BUFFERS) on the containment-plus-price-range facet query and record which indexes appear in the plan.
- Rewrite the range as attributes->>'capacity_litres' BETWEEN '100' AND '130' — text comparison, no cast — and re-run to watch the expression index drop out.
- Drop the jsonb_path_ops index, recreate it with default jsonb_ops, and compare pg_relation_size on both.
Follow-up
- Facet counts have to come back with the result set. How do you compute the count per colour without scanning the filtered set twice, and what does an out-of-stock filter do to those counts?
- A supplier feed rewrites 500,000 attribute values in one run. What does that do to the GIN index and its pending list, and what would you change about the load?
- Someone wants ORDER BY capacity_litres DESC LIMIT 24. Which of your indexes serves that, and what happens on the rows where the key is absent?
Stop the order, line and payment join inflating captured revenue
A daily report must show, per placed date and currency: captured, refunded, net, units shipped, and how many payment attempts are unresolved. The draft joins customer_order to order_line and to payment_transaction, then sums order_line.quantity and payment_transaction.amount_minor. Orders with three lines and two partial captures come out badly wrong. payment_transaction holds order_id, kind in authorization, capture, refund, void, state in pending, succeeded, failed, unknown, and amount_minor. Name every multiplication precisely, say what SELECT DISTINCT would do here, and write the correct query.
Approach
- Name the fan-out as cardinality, not as a feeling. Order to lines is one-to-N and order to payment rows is one-to-M, so joining both in one FROM produces N times M rows per order: every line quantity is counted M times and every payment amount N times, by different factors. That is why the totals look plausible rather than obviously broken.
- Name the second multiplication, which survives any join fix. payment_transaction stores the authorization and each capture as separate rows, so summing amount_minor without filtering kind adds an authorized 4,000 to the 4,000 captured against it. Filter kind = 'capture', and subtract kind = 'refund' as its own aggregate rather than by sign.
- Filter state and refuse to collapse it. Only state = 'succeeded' is money. 'unknown' is not zero — it is an attempt whose outcome nobody has established — so it gets its own count column that a person looks at, and summing it as zero is how an unreconciled capture disappears from a report for a month.
- Reject SELECT DISTINCT and SUM(DISTINCT ...) explicitly: they de-duplicate values, not rows, so two genuine captures of the same amount on one order collapse into one and the report is quietly short by that amount. It is wrong in the opposite direction and it looks tidier, which is worse.
- Aggregate each side to order grain in its own CTE, then LEFT JOIN the two one-to-one: money from payment_transaction using SUM(amount_minor) FILTER (WHERE kind = 'capture' AND state = 'succeeded') and the matching refund filter, units from order_line using SUM(quantity) FILTER (WHERE state = 'shipped'). One pass per table, no cross product, and adding chargebacks later is another FILTER rather than another join.
- Get the date and the currency right. Cast as (placed_at_utc AT TIME ZONE 'UTC')::date so the bucket does not move with the session TimeZone, keep currency_code in the GROUP BY because summing minor units across currencies is meaningless without conversion, and range-scan the raw column with a half-open >= and < predicate rather than filtering on the cast, which is not sargable.
Follow-up
- Add fulfilment: the report should also show units shipped per node. Where does shipment join, and what does it do to your grain?
- One order shows a capture of 3,000 and a refund of 3,500 arriving from a chargeback. What does net report, and is that a bug in the query or in the data?
- The report takes four minutes. Which of the two aggregates is the expensive one, and what index would you add before reaching for a materialised view?
Architect a real-time inventory management service capable of maintain…
Architect a real-time inventory management service capable of maintaining accurate stock levels across thousands of physical stores during peak retail events.
Approach
- Name the read and write paths separately; they rarely have the same bottleneck.
- Name the failure you are designing for, then the recovery path.
- State the consistency you need, and where you are willing to be stale.
Follow-up
- How does this behave when that dependency is down for an hour?
- What breaks first when traffic grows ten times?
Demonstrate deep conceptual knowledge of core Java, including concurre…
Demonstrate deep conceptual knowledge of core Java, including concurrent data structures, thread pools, garbage collection, and key Spring Boot annotations.
Approach
- Name the failure you are designing for, then the recovery path.
- State the consistency you need, and where you are willing to be stale.
- Choose a partition key and say what query it makes expensive.
Follow-up
- How does this behave when that dependency is down for an hour?
- What would you drop to keep the system up under load?
Specify the price quote contract checkout revalidates before capture
Cart and pricing mints a price quote; customer_order stores price_quote_id and quote_expires_at_utc, and order orchestration re-evaluates pricing before capture. The caller is the storefront: it renders the quoted totals, submits checkout, and on disagreement must show the customer something specific rather than a generic failure. Specify the quote resource, its fields, its TTL, how the server establishes that it minted the quote, and the exact response when re-evaluation disagrees, including the status code, the machine-readable code, what the body carries, and whether the storefront may retry.
Approach
- Make the quote an immutable, addressable resource: quote_id, currency_code, per-line unit_price_minor, discount_minor, shipping_minor, tax_minor, grand_total_minor, issued_at, expires_at, and the identifier plus version of every input it was derived from (variant versions, the promotion rule ids that fired, the tax table version). Those input versions are what turn a later disagreement into a diagnosis instead of a mystery.
- Decide storage versus signing, and get the nuance right. Server-side storage is simpler and strictly stronger. If you sign a token instead, sign canonical bytes with quote_id and expires_at inside the signature, and remember that a signature proves authorship, not freshness: expiry must still be checked server-side against the stored or embedded timestamp, because a client holding a valid signature will present it indefinitely.
- Set a TTL in minutes and justify it from what moves underneath: promotion start and end boundaries, markdowns, tax table updates, FX. A long TTL is an open-ended discount that anyone who scripts checkout can hold open; a short one bounces customers who paused. Ten to fifteen minutes with one silent re-quote is defensible, but name the number rather than saying 'short'.
- Define the disagreement response precisely: 409 with application/problem+json, code quote_price_changed, carrying the old total, the new total, the per-line deltas and a replacement quote_id. It is not 400, because the client did nothing wrong, and it is not a silent re-price in either direction. Retrying the identical request with the same quote must keep failing.
- Keep expiry as a separate code from disagreement, because the remedies differ: quote_expired means re-quote and, if the total is unchanged, proceed after re-render; quote_price_changed means the customer must see the delta and consent. Collapsing them makes every ordinary expiry look to the customer like a price rise.
- Place the re-evaluation immediately before capture rather than at order creation, since the window that matters is the one that ends at the irreversible step.
Worked solution 25 min
- Enumerate every pricing input that can move between page render and capture, and attach a version identifier to each one.
- Write the quote JSON with those versions embedded and all money as minor-unit integers.
- Write the three capture-time outcomes as three concrete responses: match, changed, expired, each with status, code and body.
- Decide the lower-total branch explicitly and write the rule into the contract rather than leaving it to the implementation.
- Trace a scripted attacker who holds a quote until the promotion ends and then submits, and point at the specific check that stops it.
Follow-up
- Re-evaluation finds the new total is lower than the quote. Do you still fail the checkout, and what is the rule?
- Two devices hold live quotes for the same cart. What stops the customer submitting the older one?
- Where does the tax table version live so a finance dispute three months later can be answered from the order alone?
Duplicate authorizations after a payment provider slowdown
A payment provider's p99 went from 400 ms to 9 s for forty minutes; the client timeout is 5 s. Afterwards payment_transaction holds 1,900 rows in state 'unknown', several orders carry two rows of kind 'authorization' with different idempotency_key values, and later captures fail as expired or not found. Customers report two pending amounts. Using the schema's idempotency_key, request_fingerprint, psp_reference and auth_expires_at_utc, find the defect, give the ordered recovery for the existing rows, and the change that prevents a repeat.
Approach
- Quantify before theorising, then compare the keys. Group payment_transaction by (order_id, kind) within the incident window keeping counts above one, and separately group by state, which distinguishes 'we issued duplicates' from 'we have unresolved attempts'. Then compare idempotency_key and request_fingerprint across the sibling rows: identical fingerprints with different keys is the whole diagnosis, because the retry presented itself to the provider as a new operation and the provider did exactly what it was asked.
- Locate where the key is minted and when it is persisted. Minted per HTTP attempt rather than per logical checkout is the first half; written after the call rather than before is the second, because a crash before the write loses the key and the next attempt cannot reuse it even if the code wanted to.
- Inspect the return type of the client, because a disciplined caller cannot rescue a lossy signature. If authorize returns a boolean or raises on timeout, 'unknown' has nowhere to live and collapses into failure, which makes the retry not just likely but correct-looking. The outcome type needs three values and the timeout branch must be distinguishable at the call site.
- Recover by resolving, never by re-issuing. For each 'unknown' row, query the provider by the stored idempotency key or psp_reference and set the row to succeeded or failed with the returned reference. Issuing any new call to discover the outcome is how one duplicate becomes two.
- Remediate the duplicates in cost order, because the compensations are wildly asymmetric. Void the redundant authorization while it is still valid — a void is free and releases the customer's held funds immediately; after auth_expires_at_utc it lapses on its own but the hold is visible to the customer until then; if the duplicate was captured the only remaining compensation is a refund, which carries fees and takes days.
- Prevent the repeat with four specific changes — retry with the same key, replace synchronous fan-out with a bounded queue and backoff so a slow provider produces queue depth rather than timeouts, add a circuit breaker that sheds instead of piling up, and run the reconciliation sweeper off the partial index on (state, requested_at_utc) where state is 'pending' or 'unknown', which is safe beside the original caller because it resolves by query and writes with a compare-and-set on state. Handle the capture failures as a separate consequence rather than folding them in: authorization validity is finite and varies by scheme, method and acquirer, so authorizations that lapsed during the forty minutes need re-authorization, and retrying a capture against a lapsed authorization fails every time however often it runs.
Follow-up
- A split shipment captures twice against one authorization. What is the key scoped to, and how does the sum stay within the authorized amount?
- A replay arrives with the same idempotency key but a different request_fingerprint. What is the correct response, and what breaks for the customer if you return the original result instead?
- The sweeper and the original caller resolve the same 'unknown' row concurrently. Show why the outcome is still one definite state.
For someone who has spent the last few years shipping features and reading other people's code, and who has not solved a timed problem from a blank file in a long time. Five days rebuild the primitives and the patterns that sit on them, working from invariants rather than remembered solutions, and the last two attach that back to the rest of the loop.
Prepare, practise & reflect
One practical outcome each day. Spend longer where you need it.
0 / 7 done01Rebuild the primitives by implementing them
- Implement a dynamic array with doubling growth and an operation counter, then change the growth rule to add a fixed sixteen slots instead, and time both for n of ten thousand, a hundred thousand and a million. The fixed-increment version resizes n/16 times at O(n) each, so its total work is quadratic; doubling is what makes append amortised constant.
- Implement a hash map with separate chaining and a load-factor resize, then insert ten thousand keys engineered to land in one bucket and record what happens to lookup time, so that average-case O(1) becomes a claim with a stated precondition rather than a reflex.
- For dynamic-array append and hash-map insert, write down which cost is amortised rather than worst-case, which single operation pays the whole bill, and what a system with a hard per-operation deadline would have to do instead.
Deliverable: Two working implementations plus a timing table showing the input at which each structure's advertised complexity stops holding.
Practice prompt ↗Practice prompt ↗Worked solution ↗02Arrays under an invariant: two pointers, sliding window, binary search
- Solve longest-subarray-with-sum-at-most-K using a sliding window, then run it on an input containing negative numbers and watch it return the wrong answer: extending the window only moves the sum monotonically when every element is non-negative, and that precondition is the whole reason the technique works.
- Write the binary search that finds the first index satisfying a predicate rather than an exact value, put the loop invariant above the loop in a comment, and verify termination on the two inputs that break careless versions: the empty range, and a range where every element satisfies the predicate.
- Compute the midpoint as lo + (hi - lo) / 2 and write one line on why the obvious (lo + hi) / 2 is a genuine defect in a fixed-width integer type and a non-issue in a language with arbitrary-precision integers.
Deliverable: Three solved problems, each with its invariant written above the loop, plus one recorded input on which the sliding window is provably wrong.
Practice prompt ↗Practice prompt ↗03Sorting, heaps, and the greedy argument that has to be proved
- Solve one top-k problem three ways, by full sort, by a size-k heap, and by quickselect, then write the values of n and k at which each becomes the right choice, along with quickselect's quadratic worst case and why a randomised pivot makes that unlikely rather than impossible.
- Implement bottom-up heapify and count sift-down steps to confirm it does linear work rather than n log n, because most nodes sit near the bottom of the tree and therefore move only a short distance.
- Take interval scheduling by earliest finishing time and write the exchange argument out in full: given any optimal schedule, swapping in the earliest-finishing interval keeps it feasible and no smaller. Then construct the weighted variant where that same greedy fails and name what has to replace it.
Deliverable: A three-way top-k comparison with measured crossover points, one written exchange argument, and one counterexample to a greedy rule that looks almost identical.
Practice prompt ↗Practice prompt ↗04Recursion, memoisation, and the step to a table
- Take one problem with overlapping subproblems, such as edit distance or coin change, instrument the plain recursion with a call counter to show the blow-up, then add memoisation and re-count.
- Convert the memoised version to a bottom-up table and state the two properties you relied on: each subproblem's result depends only on its arguments, and the dependencies form a DAG you can enumerate in order.
- Rewrite one deep recursion with an explicit stack, then find the input length at which the original hits the interpreter's frame limit, which defaults to about a thousand frames in CPython, so you know when the rewrite is required rather than decorative.
Deliverable: One problem in three forms, naive, memoised and tabulated, with call counts for each and the input length at which recursion depth becomes the binding constraint.
Practice prompt ↗Practice prompt ↗Worked solution ↗05Graphs, where most of the work is choosing the traversal
- Implement BFS and DFS over one adjacency list, then answer for each which finds a shortest path in an unweighted graph and which you would use to detect a cycle in a directed graph, including why the in-progress versus finished distinction matters for the second.
- Implement topological sort by in-degree, feed it a graph containing a cycle, and confirm the failure signature is that fewer than V nodes come out rather than an exception, then note that the order it produces is one of several valid ones.
- Run a shortest-path search on a graph with a single negative edge weight and show the wrong answer, then write the precondition Dijkstra actually needs, non-negative weights, because it finalises a node's distance the first time that node is popped, and name the algorithm you would switch to and its own limit.
Deliverable: A small graph library with BFS, DFS and topological sort, plus two inputs that produce documented wrong answers under the wrong algorithm choice.
Practice prompt ↗Practice prompt ↗06One day for everything that is not an algorithm
- Sketch one system only to the depth a coding-heavy loop tends to reach: the endpoints, what the service stores, and the single query pattern that decides the schema. Stop at twenty-five minutes.
- Prepare the project answer for an interviewer who codes, which means rehearsing the two levels they push to: the specific thing you built, and why you chose that approach over the alternative they will name. Open with a number and be ready to say what it excludes.
- Prepare the answer to what you would do differently, choosing a real technical mistake with a specific fix rather than a complaint about process or staffing.
Deliverable: One design sketch at endpoint-and-schema depth, plus a project answer rehearsed to two levels of follow-up.
Practice prompt ↗Practice prompt ↗07Solve out loud, under time
- Do three timed problems at twenty-five minutes each in a plain editor with no autocomplete and no execution until the end, then tally separately the failures that were syntax and the ones that were approach, because those two numbers call for different fixes.
- Narrate one solution from the first sentence, stating the approach and its complexity before writing any code, and rehearse the sentence you will use when you realise mid-solution that the approach is wrong.
- Re-solve from blank the two problems you were slowest on this week and compare the times against the day they first appeared.
Deliverable: A recording of one fully narrated solution and a tally that separates syntax failures from approach failures.
Practice prompt ↗Practice prompt ↗Worked solution ↗Expand any day for tasks and deliverables. Your progress is saved on this device.
Every story you tell gets read for blast radius and judgement: what could have broken, who else it touched, what you knew at the moment you decided. Nobody can audit your code in an hour, so they audit your reasoning instead. Pick work where the call was genuinely yours and the consequences were real enough to remember.
How do you collaborate with cross-functional partners and newly integr…
How do you collaborate with cross-functional partners and newly integrated team members during major architectural transitions?
Approach
- State the situation in two sentences and spend the rest on the reasoning.
- Close with what you would do differently, concretely.
- Pick a story where you made the decision, not one where you watched it.
Follow-up
- What would you do differently if you ran that again?
- How did you know your change caused the improvement?
Describe a challenging incident in a past engineering role and detail …
Describe a challenging incident in a past engineering role and detail your step-by-step approach to root-cause analysis and resolution.
Approach
- State the situation in two sentences and spend the rest on the reasoning.
- Name the disagreement and how you resolved it with evidence.
- Pick a story where you made the decision, not one where you watched it.
Follow-up
- What did you decide not to do, and why?
- What would you do differently if you ran that again?
Reverse a sharded inventory counter after production contradicts it
You proposed sharding the hot variants' inventory row into sixteen sub-rows to survive drops, and it shipped. Two weeks later support reports items showing as unavailable while units sit on the shelf, and the remaining-count figure disagrees with the warehouse. Describe a decision you reversed after production contradicted it: the signal that changed your mind, what you measured before acting, how you unwound it without causing a second incident, what you kept from the original change, and how you told the people who had backed the original proposal.
Approach
- Name the failure mode of your own design rather than treating the reports as mysterious. With random shard selection, units strand in shards nobody selects, so a request can fail while the total is non-zero, and the false-negative rate rises as the tail drains. Separately, the remaining count is now a SUM over sixteen rows that is never a consistent snapshot, which is why it disagrees with the warehouse.
- Measure before reversing, because the reversal is itself a change with risk. Two numbers decide it: the distribution of units across shards for hot variants over time, and the count of reserve failures where the SUM across shards was greater than the requested quantity. The second number is the bug, quantified.
- Consider repair before reversal honestly. A miss that falls through to other shards removes the stranding but reintroduces contention exactly on the variants you sharded for, which is a real cost, so say which one you chose and why rather than presenting reversal as obvious.
- Narrow the blast radius instead of choosing globally. Sharding is only needed for a few hundred variants for a few hours a quarter, so the defensible landing is a per-variant flag that shards on the way into a drop and consolidates on the way out, which keeps the mitigation and deletes the permanent cost.
- Unwind carefully: consolidate the shards back into one row inside a single transaction, assert that the sum before equals the value after, do it behind the flag one variant at a time, and keep the CHECK constraint in place throughout so a mistake becomes a failed statement rather than an oversell.
- Say what you kept — usually the parts that were load mitigation rather than correctness changes, such as request coalescing on the availability read and admission control in front of checkout — and describe how you told the people who had supported the proposal, because a reversal handled badly costs you the next proposal.
Follow-up
- How do you consolidate shards while traffic is live without freezing sales on that variant?
- The next drop is in six days. Do you ship the per-variant flag or go unsharded and risk the contention? Argue it with numbers.
- What would you have measured before the original rollout that would have caught stranding in staging?
- 01
How do you collaborate with cross-functional partners and newly integrated team members during major architectural transitions?
- 02
Describe a challenging incident in a past engineering role and detail your step-by-step approach to root-cause analysis and resolution.
- 03
You proposed sharding the hot variants' inventory row into sixteen sub-rows to survive drops, and it shipped. Two weeks later support reports items showing as unavailable while units sit on the shelf, and the remaining-count figure disagrees with the warehouse. Describe a decision you reversed after production contradicted it: the signal that changed your mind, what you measured before acting, how you unwound it without causing a second incident, what you kept from the original change, and how you told the people who had backed the original proposal.
Is this an official Walmart interview guide?
No. It is PracHub's own research and practice material for the Software Engineer role at Walmart. Rounds and questions reflect what candidates have reported, not a process Walmart has published, and they change over time. Confirm the current format and scope with your recruiter.
PracHub interview research ↗How difficult are the coding rounds compared to other major tech companies?
The coding questions at Walmart generally range from medium to hard complexity. Interviewers place a heavy emphasis on clean code structure, correctness, and your ability to explain time and space trade-offs clearly during live coding sessions.
PracHub interview research ↗What programming languages am I allowed to use during the interview?
For algorithmic coding rounds, you can typically choose any language you are comfortable with, including Java, Python, C++, or JavaScript. However, for backend-specific LLD rounds, using Java is strongly encouraged due to the heavy enterprise focus on Java and Spring Boot.
PracHub interview research ↗What is the structure of the Karat technical screening?
The Karat interview is a 60-minute session comprising 10 minutes of technical knowledge questions (covering language fundamentals, multithreading, and system concepts) followed by 50 minutes devoted to solving two algorithmic coding problems with a live interviewer.
PracHub interview research ↗How long does it take to hear back after completing interview rounds?
Feedback timelines vary by region and recruitment volume. While candidates often receive technical screening feedback within a few days, post-onsite decisions can take anywhere from a few business days to two weeks depending on team match requirements.
PracHub interview research ↗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.
- 01PracHub interview research ↗
PracHub editorial research into this company and role, maintained with this guide. Candidate-reported, not an employer publication.
PracHub page · Accessed 2026-09-24 - 02PracHub Software Engineer practice ↗
Cross-company practice questions for this role.
PracHub page · Accessed 2026-09-24 - 03PracHub interview preparation framework ↗
The framework the preparation plan follows.
PracHub page · Accessed 2026-09-24