Jane Street · Software Engineer
Updated · 2026-09-24

Jane Street Software Engineer
Interview Guide

THE 60-SECOND BRIEF

Jane Street is a quantitative trading firm. Its software engineers build trading systems, execution engines, risk management tools, real-time data pipelines and internal tools for traders and researchers. OCaml is the firm's primary programming language. Reports say candidates are judged on problem-solving and computer science fundamentals, not on functional programming experience. The reported questions follow the same mix: practical coding that grows in stages, class design for stateful tools like editors and game boards, probability and combinatorics puzzles, and system design and debugging.

This guide covers the Software Engineer interview as candidates report it. It starts with an online assessment (coding, or data analysis in Excel on some tracks). Next come one or two virtual rounds of live coding and quantitative problem-solving. It ends with an onsite day of technical rounds covering coding, class design, system design and debugging. You get the reported questions grouped by category, worked SQL, coding and design exercises, and a week of preparation built on them. Quantitative researcher and trader interviews are not covered.

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

Fold execution reports idempotently on venue exec idReconcile derived positions against clearing every dayBudget and measure latency at the tail

43 min read

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

Software engineers at Jane Street build the systems a quantitative trading firm runs on: high-frequency trading systems, low-latency execution engines, risk management tools, real-time market data pipelines, and internal tools such as monitoring dashboards and visual editors used by traders and engineers. The work involves close collaboration with quantitative traders, researchers and systems operations teams, often in short feedback loops rather than against fixed requirement documents.

OCaml is the firm's primary language. Reports say candidates may interview in a mainstream language such as Python, C++ or Java, and list prior functional programming experience as a nice-to-have that is taught on the job. The systems have to be correct and fast: a bug or a latency spike in a production trading loop can have direct financial consequences. That is why the reported interview advice keeps returning to readable code, precise data modelling and checking your own work before calling it done.

The reported questions are practical and often multi-part. A bracket validator later has to return exact positions. A run-length encoder later has to decode partial streams. A trade-volume aggregator later has to handle short sales and credit adjustments. Class-design questions model stateful tools: a game board where pieces enter from the bottom, a text editor buffer, a code-folding editor. Probability and combinatorics questions (a three-player dice game, palindromic permutations, conditional probability) sit alongside system design, SQL and debugging questions from the bank. Prepare to extend your own code under new requirements, not only to solve fresh problems.

01

Online Assessment

reported

Candidates report that the process opens with an online assessment or take-home task. It may be a coding assessment or a data analysis task. Some tracks report a data challenge in Excel that tests how quickly you can work with a raw dataset. Ask your recruiter which format you will get, because the preparation differs. A coding assessment rewards a solution tested against inputs the examples do not show. A spreadsheet task rewards formulas that are correct, easy to trace and quick to build.

What to demonstrate

  • In a coding assessment, whether the solution handles cases beyond the worked examples, such as empty input, a single element and repeated values
  • In a data analysis task, whether you can clean, look up and aggregate a raw dataset with formulas you can explain and audit
  • Whether you finish something correct rather than leaving an ambitious approach half-built

How to prepare

  • Before each practice solution, write a small test harness that runs the stated examples plus empty and single-element inputs and prints expected against actual
  • Practise the bank question on computing haircuts with Excel formulas, plus lookups, conditional sums, absolute versus relative references and pivot tables, until you can build them without searching
  • Confirm the format with your recruiter and put your practice into that format
PracHub interview research ↗
02

Virtual Technical Rounds

reported

Reports describe one or two virtual technical rounds of live coding and quantitative problem-solving, held in a shared editor such as CoderPad or over Zoom with a current engineer. The guide's reported coding questions, whichever round they come from, are practical and multi-part: bracket parsing that later returns positions, a run-length encoder that later handles partial streams, and trade aggregation that later handles short sales. The reported quantitative questions cover probability, combinatorics and expected value. Treat the session as pair programming. Say your plan, write readable code, and trace it by hand before calling it finished.

What to demonstrate

  • Whether you restate the problem and name an approach and its cost before typing
  • Whether part one leaves behind state that makes the next requirement cheap to add, rather than forcing a rewrite
  • Whether a probability problem is set up precisely, with the sample space and any tie or reset rule stated, before any calculation
  • Whether you test a hint against a concrete input and act on the result, rather than arguing past it

How to prepare

  • Solve the reported bracket, run-length encoding and trade-processing questions in your most fluent language, in a plain editor, narrating as you go
  • Work three probability questions out loud, including the three-player dice game and the bank's conditional probability with balls, and check each answer with a symmetry, sums-to-one or enumeration test where the rules make that test valid
  • Ask a partner to add a requirement halfway through a problem, and practise extending your code without breaking part one's tests
PracHub interview research ↗
03

Onsite Interview Day

reported

Candidates who pass the virtual rounds report a full-day onsite, called a Superday, or a virtual equivalent, of three to five technical rounds back to back. The rounds cover practical coding, class design, systems concepts and real-time troubleshooting. The risk is fatigue, and carrying one room's mode into the next: over-designing a coding problem, or coding a class-design question before the interface is agreed. Reset your opening in every room: restate the problem, ask for constraints, and say the plan before writing anything.

What to demonstrate

  • Whether your opening habits (restating, clarifying, planning aloud) still hold in the later rounds of the day
  • Whether a class-design answer starts from an agreed interface and representation before any implementation
  • Whether code is checked by tracing a small example before you declare it done

How to prepare

  • Book three to five mocks back to back on one day, mixing coding, class design, probability and debugging, and note where your habits slipped
  • For each reported class-design question, write the public method signatures and one small example state before any implementation
  • Keep a short card with your opening steps for each question type and read it before every mock
PracHub interview research ↗
04

Technical Rounds

reported

Reports say the onsite technical rounds cover coding, system design and deep-dive debugging. For the debugging side, practise tasks such as searching logs on a virtual machine, or working in a terminal with failing service logs to isolate a memory leak or a network timeout. For the design side, practise bank questions such as distributed system design, order book APIs, processing one million quote updates per second, and database design for a market. In both kinds of problem, state your assumptions and your evidence before you act.

What to demonstrate

  • Whether a debugging session moves from observation to one testable hypothesis to a confirming check before anything is changed
  • Whether a design answer settles requirements, throughput and failure cases before choosing components
  • Whether trade-offs such as latency against consistency are explained in terms of the specific problem rather than in general

How to prepare

  • Work the guide's cache-stampede debugging drill and write the ordered checks that separate a genuine demand increase from a retry storm
  • Do the worked design exercise on recovering an order session that dropped mid-fill, and the worked SQL exercise on join fan-out
  • Practise reading a real service log from the command line with grep, tail, sort and uniq, and say what each command rules in or out
PracHub interview research ↗

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

Software Engineer

Jane Street Intern Software Engineer Interview Experience — Exchange Arbitrage and Quote Throughput

Technical Screen

It was a low-level-design problem. Core problem: An Exchange Arbitrage System for stocks. Assume there are multiple exchanges, each with a market feed continuously publishing bid and ask prices for different instruments or stocks. Design and implement an arbitrage strategy. The example gave AAPL on exchange A a bid of \$1.00 and an ask of \$1.10, while exchange B had a bid of \$0.90 and an ask of…

Read full experience
Quantitative Analyst

Jane Street Quantitative Analyst interview experience: probability progression

I went through math-focused interviews that started with easier questions and became harder. The rounds centered on probability. Early questions established the fundamentals, then the difficulty increased. Each round also began with a behavioral check-in, which set expectations before the technical work. In a similar run, I had three phone interviews along the same probability track. The first co…

Read full experience
Quantitative Analyst

Jane Street Quantitative Analyst interview: probability games before superday

Technical ScreenOutcome: rejected

I had several Zoom interviews, with three technical rounds before a superday. The questions were built around games presented by the interviewers and relied heavily on probability and game thinking. The early games were more straightforward and closer to deterministic setups. Later rounds brought more randomness and more game theory. In the more open-ended game rounds, I needed to optimize outcom…

Read full experience
Quantitative Analyst

Jane Street Quantitative Analyst interview: probability rounds and nerves

Technical Screen

After applying online, I had a resume screen and a first technical round. It was my first quant interview, and I was nervous enough that I did not answer as smoothly as I wanted. I did not move past that round. I later entered through a program that sent me directly to interviews. There were two 45-minute Zoom technical rounds. The first was clearly easier than the second, and the interviewers we…

Read full experience
Software Engineer

Jane Street Software Engineer interview: final onsite mattered most

Onsite

I started with a virtual round and then moved to an onsite. The questions blended coding with system-design-style work, but they emphasized real-world systems more than academic exercises. By the onsite, it was clear that this was the most important stage and that the bar was highest there. I did not perform well enough in that final stage to move forward. The process was intense, and my main tak…

Read full experience

PracHub editorial advice for the preparation topics above.

01

Treating a reported multi-part coding question as done once part one passes, then having to rewrite it when the extension arrives.

Several reported coding questions grow in stages. Validate brackets, then return exact positions for inline edits. Encode run-length data, then decode partial streams. Aggregate trade volume, then handle short sales and credit adjustments. If part one returns only a boolean, assumes the whole string is in memory, or stores unsigned quantities, part two becomes a rewrite. Before coding, ask what the likely extension is. Keep indices, carry decoder state across chunks, and use signed quantities, and keep part one's tests passing while you extend.

02

Calculating the three-player dice probability before pinning down the tie rules.

The reports differ on tie handling: one version resets the game if all three players tie, another says ties trigger a complete re-roll. Ask how a two-way tie for the highest roll is handled before computing. If the rule always ends with exactly one winner, for example a re-roll on any tie at the top, condition on the game not resetting instead of summing an infinite series by hand, check that the three win probabilities sum to one, and use symmetry as a check: with no advantaged player, each wins with probability 1/3. If a two-way tie means both win or nobody wins, the three probabilities neither equal 1/3 each nor sum to one, so say which rule you are using. For the variant where one player always rolls at least a 4, enumerate that player's three possible rolls explicitly.

03

Starting to code the bottom-insertion game board or the editor buffer before agreeing on the interface and representation.

In the reported board question, pieces enter from the bottom and push existing pieces up, so in a plain row-major grid every insert shifts a whole column. Write the public methods and one example state first. Pick a representation that makes the frequent operation cheap, such as a list per column, and state its cost. When checking for matches, point out that a bottom insert moves every piece in that column. Re-check that column and each row it intersects rather than only the new cell or the whole board.

04

Changing code or config in a debugging problem before a failing case has been reproduced and explained.

Reports list deep-dive debugging among the onsite technical rounds. Practise on tasks such as isolating a memory leak or a network timeout from failing service logs in a terminal. Say what the logs show, state one hypothesis, and name the command or log line that would confirm or rule it out. Only then change something. Use this guide's cache-stampede drill as practice: separate a rise in demand from a retry storm before proposing any fix.

05

Switching to OCaml, or another language you know only passively, to signal interest in the firm.

Reports say candidates may use any mainstream language and are not expected to know OCaml. An unfamiliar language costs you time on syntax and standard-library lookups in live coding, which is time taken away from correctness and testing. Interview in your most fluent language. Drill its calls for maps, sorting with a custom comparator, heaps and string splitting until you no longer need to look them up.

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

11 technical prompts3 include a worked solution

Parentheses tracking & string manipulation: Write a robust parser to v…

medium
data structures and algorithms

Parentheses tracking & string manipulation: Write a robust parser to validate nested brackets, then refactor it to return exact positions for inline string edits.

Approach
  1. Name the brute-force solution and its complexity before improving on it.
  2. Restate the input: its shape, its size, and what is guaranteed about it.
  3. Walk one small example through your approach before writing the whole thing.
Follow-up
  • Which test case would catch an off-by-one here?
  • How does this change if the input no longer fits in memory?

Run-Length Encoding (RLE) utility: Implement a stream encoder and deco…

medium
data structures and algorithms

Run-Length Encoding (RLE) utility: Implement a stream encoder and decoder using run-length encoding principles, building additional features to handle partial streams and data transformations.

Approach
  1. State the target complexity and say which constraint rules the naive version out.
  2. Restate the input: its shape, its size, and what is guaranteed about it.
  3. Name the brute-force solution and its complexity before improving on it.
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?

Trade transaction processing: Given a log of execution trades, write a…

medium
data structures and algorithms

Trade transaction processing: Given a log of execution trades, write a function to aggregate trade volume and retrieve the top trades, extending the solution to correctly process short sales and credit adjustments.

Approach
  1. Name the brute-force solution and its complexity before improving on it.
  2. Restate the input: its shape, its size, and what is guaranteed about it.
  3. Choose the data structure from the access pattern, not from familiarity.
Follow-up
  • How does this change if the input no longer fits in memory?
  • Which test case would catch an off-by-one here?

Resolve position identity across a corporate action graph

hardWorked solution
dag traversalcycle detectionexact arithmetic

Corporate actions are edges (from_instrument_id, to_instrument_id, action_type in symbol_change, merger, spinoff, expiry_roll, ratio_num, ratio_den, effective_ts) — up to 2 x 10^6 edges over 10^6 instruments. Given a position in instrument I held at t0, return the set of (instrument_id, exact rational multiplier) that it becomes at t1 > t0, following only edges whose effective_ts lies in (t0, t1]. Mergers give a node in-degree above one; spinoffs give out-degree above one. Detect cycles and report them as data errors rather than breaking them. Give both the per-query and the batch complexity.

Approach
  1. Start from what the shape of the answer has to be. A spinoff makes out-degree greater than one, so a position maps to a set, not to a single successor; a merger makes in-degree greater than one, so the reverse map is not a function. Anything that collapses each instrument to one representative — union-find being the usual reflex — cannot express either, and also destroys the as-of property that makes the query meaningful.
  2. Filter the edge set to effective_ts in (t0, t1] and traverse forward from I with DFS, carrying an exact rational multiplier along each path as a reduced (num, den) pair. Multiply at each hop, run gcd immediately to keep the components small, and use checked 128-bit multiplication so a long chain fails loudly rather than wrapping.
  3. Accumulate at the terminals by summing multipliers across distinct paths that reach the same instrument, because a spinoff that later re-merges into its parent genuinely contributes twice. Summing rationals means a common denominator, then a gcd reduction again.
  4. Run the cycle check before the path-carrying traversal, not after it. The DFS above carries a multiplier down every distinct path and so does not terminate on a cyclic subgraph at all; the traversal's termination is a precondition that Kahn establishes, not a property the traversal has on its own.
  5. Complexity: a single query is O(V + E) in the worst case. For a batch — end-of-day, every position in the book — sort nodes by effective_ts to get a topological order of the filtered subgraph and memoise the resolution per (node, t1), which makes the whole batch O(V + E) once instead of O(positions x (V + E)).
  6. Detect cycles with Kahn's algorithm on the filtered subgraph: after the queue drains, the residual set is exactly the nodes on or downstream of a cycle. Run Tarjan on the residual to name the strongly connected components of size above one, report them with the offending edges and exit non-zero. Time is monotone along real corporate actions, so a cycle is always a vendor or load error; deleting an edge to make the traversal terminate hides the error and leaves positions mapped to the wrong instrument.
  7. Keep ratios rational end to end. A 1/3 hop followed by a 3/1 hop — a consolidation and then a re-split, through distinct instruments — must compose to exactly 1/1, which it does with reduced rationals and does not with binary64, where the round trip lands near 0.9999999999999998 and a position quantity is then off by a share after rounding.
Worked solution 40 min
  1. Build the fixture inside the query window (t0, t1]: A -> B symbol_change 1/1 at ta; A -> D spinoff 1/4 at ta; B -> C merger 2/5 at tb, with t0 < ta < tb <= t1.
  2. Resolve a position of 1000 units of A by hand along both paths, multiplying reduced rationals rather than decimals.
  3. Run the traversal and compare its (instrument, multiplier) set against the hand computation.
  4. Extend the fixture with a chain through distinct nodes rather than a round trip: A -> E symbol_change 1/3 at ta and E -> F symbol_change 3/1 at tb, both inside the window, and confirm the multiplier carried to F composes to exactly 1/1. Pointing the second leg back at A instead would close a cycle, which is the next step's fixture and not a test of rational arithmetic.
  5. Add an edge C -> A at a timestamp inside the window, rerun, and confirm Kahn leaves a residual and Tarjan names the cycle before any path-carrying traversal starts.
  6. Remove the C -> A edge, delete the spinoff edge, and rerun to confirm the result set shrinks without disturbing C's or F's multiplier.
EXPECTED RESULTOn the three-edge fixture, 1000 units of A resolve to {C: 400, D: 250} — C via 1/1 then 2/5, D via 1/4 — with multipliers held as 2/5 and 1/4 rather than 0.4 and 0.25. Adding the A -> E -> F chain makes the set {C: 400, D: 250, F: 1000}, since 1/3 then 3/1 composes to exactly 1/1. With the C -> A edge present, Kahn's residual is {A, B, C, D, E, F} — the cycle plus everything reachable from it — and Tarjan names the one strongly connected component of size above one, {A, B, C}; the job reports it with the offending edges and exits non-zero rather than looping.
Follow-up
  • A vendor correction arrives at 18:00 changing yesterday's merger ratio. What do you recompute, and what does that do to already-published positions?
  • A cash-in-lieu component means the mapping is not purely quantity-to-quantity. Where does that land in the model?
  • How do you make this resolution replayable, so a backtest run in six months resolves the same identity the live session did?

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
01Online assessment: test harness and spreadsheet
  • Solve the reported bracket-validation and run-length encoding questions in a plain editor under a timer. Write a small test main first that feeds the stated examples plus an empty input and a single element.
  • Some tracks report an Excel data analysis task. Practise the bank question on computing haircuts with Excel formulas, then rehearse lookups, conditional sums, absolute versus relative references and a pivot table on a raw dataset.
  • After each problem, list the inputs your harness did not cover, add them, and rerun.

Deliverable: Two solved problems with their test harnesses, and one spreadsheet that cleans and aggregates a raw dataset with formulas you can explain line by line.

Practice prompt ↗Practice prompt ↗Worked solution ↗
02Coding questions that grow in stages
  • Parentheses: write the validator with a stack, then extend it to return the matching index for each bracket and the position of the first unmatched one, keeping the part-one tests passing.
  • Run-length encoding: write the encoder and decoder, then a stateful stream decoder that accepts chunks split mid-run and mid-count. Test a chunk boundary that falls inside a multi-digit count.
  • Do the bank's Collapsible Code Editor: Brace Matching and Toggle, and say aloud which data structure part one should leave behind for part two.

Deliverable: Three solutions, each with part-one and part-two tests in one file, and a one-line note per problem on what you would have built differently had you known the extension.

Practice prompt ↗Practice prompt ↗
03Trade data, ordering and exact results
  • Reported trade processing: aggregate volume per symbol and return the top trades with a size-k heap (O(n log k)), then extend it to short sales and credit adjustments using signed quantities.
  • Work the bank's Top Trades From Event Sequence and Sort Trade Executions Into a Canonical Order, writing the comparator and its tie-break rule explicitly.
  • Do the worked coding exercise on resolving positions across a corporate action graph (drill-coding-3). Compute the {C: 400, D: 250} fixture by hand before reading the solution.

Deliverable: Trade aggregation with short-sale handling and tests, a canonical-order comparator with its tie-break written out, and your hand computation of the corporate-action fixture.

Practice prompt ↗Practice prompt ↗
04Class design for stateful tools
  • Reported game board with bottom insertion: write insert(column, piece) and winner() signatures first, choose a per-column representation, and state which rows a bottom insert changes. Then do the bank's Bottom-Insertion Connect Game: Detect the First k-in-a-Row Winner.
  • Reported text editor buffer: support insertion, line-by-line navigation and selection expand/shrink. Compare a list of lines with a gap buffer for these operations and state the cost of each in your choice.
  • Reported visual editor state tracking: build parenthesis matching, then store per-pair metadata such as depth and matching index so a renderer can highlight or fold blocks (see the bank's Visual Code Editor Folding).
  • Reported class interface wrap: given a provided interface, write a wrapper that meets a target API, with explicit data mapping and error checks.

Deliverable: Four class designs, each with its public interface, its chosen representation, the cost of every operation, and one test per method.

Practice prompt ↗Practice prompt ↗Worked solution ↗
05Probability and combinatorics out loud
  • Reported three-player dice game: ask how two-way ties at the top are handled. Under a rule that always ends with one winner (such as re-rolling any top tie), condition on the game not resetting and check that the results sum to one; then redo it with one player rolling at least a 4.
  • Reported palindromic permutations: a palindrome exists only if at most one character count is odd, and then the count is floor(n/2)! divided by the product of floor(c_i/2)! over the characters. Verify on a small string by listing the permutations.
  • Work the bank's Conditional Probability With Balls, Optimal Stopping With Square-Number Ruin and Optimize a Two-Box Place-or-Take Game, stating the sample space before any arithmetic.

Deliverable: Five worked probability or counting answers, each with a stated sample space and one sanity check (symmetry, sums to one, or brute-force enumeration) whose conditions you have confirmed hold.

Practice prompt ↗Practice prompt ↗
06System design, SQL and debugging
  • Do the worked design exercise on recovering an order session that dropped mid-fill (drill-design-4) and check that your answer never resends the ambiguous submit.
  • Do the worked SQL exercise on join fan-out (drill-sql-2): reproduce the inflated 3000 on the fixture, then 200 after the rewrite. Then attempt the position-limit race drill (drill-sql-1).
  • Work the cache-stampede debugging drill (drill-debugging-5) and write the ordered checks before writing any fix.
  • Sketch one bank design question, such as Process One Million Quote Updates per Second or Design Jane Street Orderbook APIs, starting from requirements, throughput and failure cases before any component.

Deliverable: Checked answers to the design and SQL worked exercises, an ordered debugging checklist, and one design sketch with its requirements and trade-offs written down.

Practice prompt ↗Practice prompt ↗
07Onsite rehearsal
  • Run three to five mocks back to back to match the reported onsite day: one coding, one class design, one probability, and one design or debugging. Ask each partner to add a requirement midway.
  • Prepare two short answers from the bank: why Jane Street, tied to the engineering work this role describes, and a walkthrough of one project with your part, one trade-off and what you would change.
  • Go back over the misses from days 1-6 and redo the two problems you got most wrong, without notes.

Deliverable: Mock notes recording where your opening habits slipped in the later sessions, two rehearsed spoken answers, and the two redone problems passing their tests.

Practice prompt ↗Practice prompt ↗Worked solution ↗

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

Candidates describe this process as mostly technical, with no standard behavioural screen. Two bank questions still ask about you directly: why Jane Street, and explaining a project you worked on. Answer both with specifics you can defend under follow-up: what you built, the decision you made, what it cost, and how you knew it worked.

Estimate a kernel-bypass migration you have never attempted

hard
estimationkernel bypasslatency budget

Leadership asks how long it would take to move the order path off the conventional kernel networking stack, where it sits in the tens of microseconds, onto a kernel-bypass stack targeting single-digit microseconds. You have never done this migration. Give an estimate you are prepared to defend: the decomposition, the range and what drives its width, the spike that would narrow it most, and the conditions under which you would recommend not doing it at all. State what you would refuse to put a number on until the spike is finished.

Approach
  1. Refuse the single number first and say what you are giving instead: a range with the driver of its width named. The width is the information the requester actually needs, and handing over a point estimate destroys it.
  2. Decompose by uncertainty, not by component. The transport swap is well-bounded. What is not is everything currently leaning on kernel facilities: packet capture feeding the recording, session recovery on reconnect, failover between redundant lines, the timestamping source, and core pinning and isolation. Mark each item done-before or never-done and estimate only the first group directly.
  3. Attack the premise before estimating the work. Profile where the tens of microseconds actually sit; if a meaningful share is allocation, a lock, a synchronous log write or a page fault, the migration buys much less than the headline and the cheaper work comes first. State that as a decision gate with a threshold, not as a caveat at the end.
  4. Specify the spike as the narrowest experiment that collapses the widest uncertainty: one instrument, one venue session, send and receive only, tick-to-trade p99.9 measured against the current path on the same open-loop harness, with a fixed time box and a written question it must answer.
  5. State the costs that persist after delivery, because that is the part usually missing. Taking the network out of the kernel also takes it out of the kernel's tooling, so capture, counters and the existing packet recording need replacements, and a core is now permanently dedicated. Those are recurring costs against a one-time latency gain.
  6. Name the conditions for not doing it and what you will not estimate yet: if the strategies are not latency-sensitive at the margin, or the venue queue rather than your stack is the binding constraint, the answer is no — and the recovery and capture rework stays unestimated until the spike says what the new stack actually provides.
Follow-up
  • Give me one number anyway, with the probability you attach to it.
  • The spike shows 4 microseconds where you projected 9. What do you do with the estimate?
  • What would you cut to get half the benefit in a quarter of the time?

Retract a latency result you had already published

medium
measurementcoordinated omissionretraction

You reported that a change cut p99 tick-to-trade by 40 percent, and the figure is now in a deck. A colleague shows that your harness sent the next request only after the previous reply arrived, so it stopped issuing load whenever the system stalled. Describe a time you retracted a result. State how you confirmed the error, who you told and in what order, what the corrected number was and how it was measured, and what you changed about how results get published so the next one is checkable by someone else.

Approach
  1. Confirm before announcing, but time-box the confirmation. Re-run under an open-loop generator that holds the intended send schedule and records latency from intended send time rather than actual send time, then compare it against the closed-loop run on the same build.
  2. Explain the mechanism precisely enough that the retraction is credible: a closed-loop harness never issues the requests that would have arrived during a stall, so the stall is sampled once instead of at the rate it would really have faced. That is coordinated omission, and it can understate the tail by an order of magnitude — so the correction is usually not a small adjustment to the same conclusion.
  3. Tell the people acting on the number before the people judging you, and say which decisions were made on it. If work was scheduled or descoped because of the figure, that belongs in the first sentence of the retraction, not the last.
  4. Give the corrected figure with its method attached: percentiles from a high-dynamic-range histogram, the load pattern, and the utilisation it was taken at. A tail number without a utilisation is not a number, because waiting time rises sharply as utilisation approaches one and real market data bursts harder than the queueing models that describe it.
  5. Separate what still holds from what does not. The change may remain a genuine improvement of smaller size, and saying so is part of being accurate — over-retracting is a failure of accuracy in the other direction.
  6. Change the process rather than only the number: require the harness type and the utilisation on every reported latency result, and publish percentiles rather than means by default. Say whether that was adopted or quietly ignored.
Follow-up
  • At what utilisation were both numbers taken, and why does that matter more than the change you made?
  • Your open-loop generator cannot keep up at the target rate. How do you tell that apart from the system being slow?
  • What would you need to see before trusting a latency claim from someone else?

Ship an order gateway with named, scheduled reconciliation debt

medium
technical debtreconciliationrelease scoping

A venue connection must be live for a session start in three weeks. The order state machine, idempotent application on (venue_mic, venue_exec_id) and the pre-trade check are done. Drop-copy reconciliation and trade_correct / trade_cancel handling are not. Describe a time you shipped with known debt. State exactly what you cut, the detector you put in its place, the date the debt was scheduled for, who agreed to it, and what the debt actually cost before it was paid. Include the item you cut that you should not have.

Approach
  1. Split the cut list into two piles out loud: things that make the system slower to operate, and things that make it silently wrong. Only the first pile is negotiable, and saying so is the whole judgement being tested.
  2. Place trade corrections in the right pile. A fold that only adds quantities cannot represent a negating entry referencing an earlier execution at all, so cutting trade_correct is not an unhandled edge case — it is a position that is wrong with nothing raised. If you cut it, the compensating control is a break report that blocks the next session, not a log line.
  3. Attach a detector, a threshold and an owner to every item in the silently-wrong pile. Without drop-copy reconciliation the control is an end-of-day diff of derived against clearing positions, paging a named person on break_qty != 0, with a stated maximum position size until the real thing lands.
  4. Make the schedule concrete. The debt lands in a named release with a ticket, and the interim risk limit is what gets relaxed when it lands — which gives the desk a reason to care about the date instead of treating it as engineering's problem.
  5. Report what it actually cost: how many breaks per day, how much manual work, whether any of it reached a position, and which cut you would take back. The signal is your calibration, not your willingness to ship.
Follow-up
  • A trade correction arrives for a fill booked three sessions ago. What does your compensating control actually do with it?
  • The debt slipped twice. What changes on the second slip?
  • How would you scope this if the date were immovable and the desk wanted twice the size?
  • 01

    Why Jane Street? Tie your answer to the engineering work the role involves, such as trading systems, data pipelines or internal tools, rather than to the firm's reputation.

  • 02

    Explain a project you worked on: the problem, your specific part, one trade-off you chose and why, and what you would change now.

  • 03

    Take code you wrote to solve an interview-style problem and describe how you would turn it into a reusable library or API: the interface, the error handling and the tests.

  • 04

    Describe a time you retracted a result you had already shared: how you confirmed the error, who you told first, and what you changed so the next result could be checked.

  • 05

    Describe a time you shipped with known debt: what you cut, the check you put in its place, and which cut you would take back.

  • 06

    Tell me about a time a reviewer's or colleague's question changed your approach midway, and how you tested their point before acting on it.

PracHub interview preparation framework ↗
Is this an official Jane Street interview guide?

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

PracHub interview research ↗
Do I need prior experience in finance or quantitative trading to apply?

Reports say no finance background is required and that domain concepts are taught on the job. Some reported questions do use trading vocabulary, such as trade logs with short sales, order matching and order books. Learn what an order book, a fill and a short sale are well enough that the wording of a prompt does not slow you down.

PracHub interview research ↗
Do I need to code in OCaml during the interview?

No. Reports say candidates can use a mainstream language they are comfortable with, such as Python, C++ or Java, even though OCaml is the firm's primary language. Use the language you know best. One you know only passively costs you time on syntax and library lookups during live coding.

PracHub interview research ↗
How difficult are the interviews compared to standard FAANG coding screens?

The reported questions lean less on memorised algorithm tricks and more on practical, multi-part problems where each requirement builds on the last. Examples include a bracket parser that later returns positions and a run-length encoder that later handles partial streams. Prepare by extending your own solutions under new requirements, not only by solving new problems.

PracHub interview research ↗
What is on the online assessment?

Candidates report an online assessment or take-home task that may be a coding assessment or a data analysis task, with some tracks reporting a data challenge in Excel. Ask your recruiter which format applies. For coding, test against inputs the examples do not show. For Excel, practise lookups, conditional aggregation and pivot tables until you can build them without searching.

PracHub Software Engineer practice ↗
Is there a behavioral round?

Candidates describe the process as mostly technical, without a standard behavioural screen. Still prepare two answers that appear in the bank: why Jane Street, and a walkthrough of a project you worked on, covering your part, a trade-off you made and what you would change.

PracHub Software Engineer practice ↗
What should I do if I get stuck during live coding?

Say out loud what you are trying to achieve and where the approach breaks, then try a small concrete input. If the interviewer offers a hint, test it against that input rather than defending your first approach. Reports describe these sessions as collaborative, so a hint you apply well is better than a stall.

PracHub Software Engineer practice ↗
How much probability and math should I prepare?

Reported questions include a three-player dice game, counting palindromic permutations, and speed, rate and expected-value puzzles. The bank adds conditional probability and optimal stopping. Be fluent with conditioning, expected value and basic counting. Practise stating the sample space and any tie or reset rule out loud before calculating, and check answers with symmetry, a sums-to-one test or brute-force enumeration once you have confirmed the rule makes that check valid.

PracHub Software Engineer practice ↗
Sources & methodology 3 sources ↗

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