Thinking Machines Lab · Software Engineer
Updated · 2026-09-24

Thinking Machines Lab Software Engineer
Interview Guide

THE 60-SECOND BRIEF

According to the role description candidates report, Thinking Machines Lab builds AI products, open-weights models and open-source machine learning frameworks. Software Engineers are described as working on the systems behind that work, in tracks such as Data Infrastructure (pipelines and catalogs for training data at petabyte scale) and Full Stack (APIs and user interfaces). This guide adds no company facts beyond those reports, so confirm your team and track with your recruiter.

This guide covers the four reported stages for the Software Engineer role. Most of the weight goes on the take-home backend exam and the panel where you present and defend it. It also covers the reported design, data-infrastructure and behavioral questions. The practice set adds original SQL, coding, design and debugging drills, three with worked solutions, that exercise the same skills: deduplication, late-arriving data, idempotent writes under retries, and concurrency bugs.

Thinking Machines Lab 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 tenantMake every write idempotent under client retriesBuild at-least-once pipelines with explicit deduplication horizons

41 min read

Browse Software Engineer questions

See the practice prompts

16Practice promptsAcross five skill areas
3With worked solutionsIncluded in the practice prompts

Candidates report two broad tracks in Thinking Machines Lab's Software Engineer role. Data Infrastructure work centres on large-scale data for model training: distributed compute in Spark or Ray, storage formats such as Parquet and Delta Lake, and orchestration and streaming with Airflow or Kafka. Distributed deduplication and scalable web crawlers are listed as advanced skill areas for this track. The role description also mentions working with machine learning researchers on training data catalogs, traceability and reproducibility. Full Stack work covers APIs and user interfaces, with Python or Rust on the backend and React with TypeScript on the frontend, plus developer tooling, CI/CD and production observability.

Candidates describe four stages. First comes an initial screening, sometimes a recorded video interview with three foundational questions. Next is a take-home backend exam in any programming language, usually with a couple of days to complete, that also includes written technical and behavioral questions and a slide deck on the technical and business sides of your solution. Then comes a panel where you present that deck, defend your architecture and answer deep-dive questions from the engineering team. The last stage is a culture fit interview. Candidates also report anti-cheating mechanisms on the coding assessment.

For preparation, the take-home matters most because the panel questions candidates report are about your own submission: why you chose the stack, how the solution addresses the business problem in the prompt, where it breaks at ten times the traffic, and which metrics would show it meeting its SLAs. Candidate reports do not tie the design and data-infrastructure questions to a specific round. Those cover ingestion pipelines, rate limiting, a fault-tolerant academic paper crawler, Kafka and Airflow orchestration, distributed key-value stores and dataset versioning schemas, so prepare them as a category.

01

Initial Screening

reported

Candidates describe this stage as an initial screen, sometimes a recorded video interview with three foundational questions. A recording has no interviewer to rephrase a question or ask what you meant, so each answer has to stand on its own: give the direct answer first, then one concrete example, then stop. Candidates do not report what the three questions are. Prepare the ground any foundational screen for this role can cover: your background, which track you are aiming at, and one piece of technical work you can explain end to end.

What to demonstrate

  • Check your own recordings: each answer should stand alone, with the direct answer before the context, since a recorded format leaves no room for a follow-up
  • Check that you can name your target track, Data Infrastructure or Full Stack, in one sentence, with evidence from your own work
  • Check that you can explain one project end to end: the problem, your part, the stack and the result

How to prepare

  • Write three foundational questions for this role, record your answers, play them back, and cut any answer that opens with context instead of the answer
  • Write one sentence naming your track and the evidence for it: Spark, Ray and data lake formats for Data Infrastructure; Python or Rust APIs with React and TypeScript for Full Stack
  • Choose the one project you will describe and fix its figures (data size, users, team size, your part) so they match what you later say on the panel
PracHub interview research ↗
02

Take-Home Coding Exam

reported

Candidates report a backend take-home in any programming language, usually with a couple of days to finish. It comes with written technical and behavioral questions and a slide deck explaining the technical and business sides of your solution. The example scenarios candidates report are production-style services. One aggregates several public APIs, caches the results and exposes a REST interface. Another is a containerized service that accepts file uploads, processes them asynchronously and updates a relational database. Candidates also report anti-cheating mechanisms on the assessment. Treat the code, the written answers and the deck as three equally important deliverables, and write every line yourself, because the panel reportedly asks about specific lines.

What to demonstrate

  • Check that your codebase is organised logically, that any design pattern you apply fits the problem as stated, and that names make the code readable without comments
  • Check that your endpoints are clean, that requests are handled asynchronously where the prompt calls for it, and that database connections are managed deliberately
  • Check that the submission includes unit and integration tests, instructions for running the service locally, and a container setup
  • Check that errors are handled explicitly, queries are efficient, and any custom middleware the prompt calls for is in place

How to prepare

  • Build one practice service from a reported example scenario in the language you will use, with tests, a Dockerfile and a README that explains how to run it
  • Write your answers to the written questions in full sentences as soon as the code is finished, while the trade-offs are fresh, and review them as carefully as the code
  • Keep a decisions log while you build: each choice, the alternative you rejected and why. It becomes the backbone of your deck
  • Work this guide's design exercise on making run creation safe when the client retries, to practise retry and failure handling in the service you submit
PracHub interview research ↗
03

Panel Interview

reported

Candidates report presenting their take-home solution from their own slides, defending their architectural choices and answering deep-dive questions from the engineering team. The questions reported for this stage are about your own submission: walk through the architecture and why you chose that stack, explain how the solution addresses the business problem in the prompt, name the bottlenecks at ten times the current traffic and how you would resolve them, and say which monitoring and alerting metrics would show the service meeting its SLAs. Candidates also describe being pointed at specific lines of their submitted code and asked to explain them, optimise them or refactor them for a new requirement. If you wrote the code and the decisions log yourself, none of this should catch you off guard.

What to demonstrate

  • Check that your walkthrough of data flow, component boundaries and technology choices matches the code the panel has read
  • Check that you can link each design choice to the business problem stated in the prompt
  • Check that you can defend why you chose this database, framework or architectural style over the alternatives, and say what would change your mind
  • Check that you can reason about scaling, cost and availability for your own service, not for a generic system

How to prepare

  • Open the deck with the business problem and the requirement each component serves, then cover the architecture, then the trade-offs. Present it aloud to someone who has not seen the code
  • For the ten-times-traffic question, find the first component in your service that saturates, the measurement that would show it, and the change you would make
  • Define a small set of SLA-facing metrics for your service, such as latency percentiles, error rate and queue depth, with an alert condition for each
  • Have a friend pick random lines from your submission and ask why each one is there, how to make it faster, and how to change it for a new constraint
PracHub interview research ↗
04

Culture Fit Interview

reported

Candidates describe a dedicated culture fit interview as the final stage. Candidate reports do not tie specific questions to it. They do report behavioral questions for the role about four situations: resolving an infrastructure bottleneck across team boundaries, weighing technical debt against shipping a prototype quickly, working with a cross-functional partner such as an AI researcher whose priorities differed from yours, and starting a project from scratch with little documentation. Prepare one story for each, told through your own decisions, and keep the project facts consistent with what you said on the panel.

What to demonstrate

  • Check that your cross-team story names the bottleneck, what you did about it and how you brought the other teams along
  • Check that your technical-debt answer says what you deferred, why, and when you paid it back
  • Check that your collaboration story states what the partner needed, where your priorities conflicted and how you resolved it
  • Check that your ambiguity story shows the specific steps you took to create structure when documentation was thin

How to prepare

  • Write one story for each reported behavioral theme, naming the decision you made, the evidence you used and the outcome
  • For the technical-debt question, prepare one case where you shipped with debt and one where you refused to, with the reason for each
  • Rehearse the researcher-collaboration story from the partner's side too: what they needed, what you gave up and what you held firm on
PracHub interview research ↗

PracHub editorial advice for the preparation topics above.

01

Submitting take-home code you cannot explain line by line

Candidates report anti-cheating mechanisms on the coding assessment and panel questions about specific lines of the submission. Write the code yourself and reread every file before you submit. For each non-obvious line, be ready to say why it is there and what you would change under a new constraint. If you copied a library pattern you only half understand, replace it with code you can defend.

02

Treating the take-home's written questions as an afterthought

The take-home reportedly includes written technical and behavioral questions alongside the code. Set aside time for them instead of writing them in the last minutes. Answer each in full, specific sentences with a concrete example, and check that the design approach you describe there matches what your code actually does.

03

A deck that tours the code but never connects it to the business problem

One reported panel question asks how your solution addresses the core business problem in the prompt. Start the deck with that problem, map each component to the requirement it serves, and put your trade-offs on a slide with the cost of each. That way the business case is stated, not left for the panel to work out.

04

No numbers for your own service when asked about ten-times traffic or SLA monitoring

Both are reported questions about the service you built. Before the panel, load-test or reason through where your service saturates first: database connections, a synchronous external call, or a single worker. List the metrics and alert thresholds tied to the SLA you would promise. A generic answer about adding caches and replicas does not show that you understand your own system.

05

Answering data-infrastructure design questions with boxes and no failure path

Reported design questions include a multimodal ingestion pipeline for LLM training, deduplication over petabytes of text, a fault-tolerant academic paper crawler, and batch orchestration with Kafka and Airflow. For each, state the delivery guarantee, where deduplication happens and over what window, how a failed task retries without writing twice, and how you would re-run one partition. This guide's SQL rollup and late-data coding exercises drill exactly these points.

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

Seal an hour under late data with bounded memory

hardWorked solution
watermarkslate-dataquantile-sketchconditional-write

Metering ingest reads 256 partitions at 10,000 to 40,000 events/second. Events carry occurred_at and ingested_at, and during a producer replay the gap between them is hours. Seal each UTC hour once no more than 50 parts per million of that hour's eventual quantity can still arrive, using memory that does not grow with the size of the replay. Define the watermark, the lateness parameter and how you measure it, the structure holding open hours, and the write that performs the seal. State what an idle partition does to your watermark.

Approach
  1. Two clocks, two jobs. Bucket by occurred_at, because that is the hour the customer is billed for, and advance the watermark on ingested_at, because that is what the fold has consumed and what source_max_ingested_at records. Conflating them is what makes late data invisible.
  2. The global watermark is the min over partitions of each partition's committed ingested_at, not the max: the fold is trustworthy only as far as the slowest partition. The consequence is that one idle partition pins the watermark forever and nothing seals, so an idle partition must promote its watermark to wall clock after a stated idle timeout, and that timeout becomes a correctness parameter, because a partition that is slow rather than idle gets sealed past.
  3. Choose the lateness L from the measured distribution of ingested_at - occurred_at, weighted by quantity rather than by event count. The target is 50 ppm of the hour's quantity, and a replay is rare in events while carrying disproportionate mass, so an event-weighted quantile picks an L that is comfortably wrong at exactly the moment it matters.
  4. Measure that quantile in bounded memory. A Greenwald-Khanna summary gives epsilon-approximate quantiles in O((1/epsilon) log(epsilon n)) space; a t-digest costs more per merge but has relative error that tightens at the tails, which is the half of the distribution you are reading at p99.99. Keep a separate summary per tenant class, because one tenant's batch importer is not the population.
  5. Hold open hours in a min-heap keyed by hour_start. When the watermark advances, pop every hour with hour_end + L < W and seal it: O(log H_open) per advance and O(1) amortised per event to touch its bucket. Memory is open hours multiplied by distinct (tenant, workspace, sku) keys, so cap the number of simultaneously open hours and spill the oldest into usage_rollup_hourly as status='open' with a revision bump. While an hour is open the row is upsertable, so the store is your overflow.
  6. The seal itself is a conditional write: update ... set status='sealed', sealed_at=now() where status='open' returning .... Two sealers race on every restart, and the loser must see zero rows and stop rather than write a second value. After the seal, an event for that hour is not an upsert but an adjustment, and source_max_ingested_at is what proves it arrived afterwards.
Worked solution 40 min
  1. Replay a day of events with a synthetic lateness distribution: 99.9% under two minutes, plus a 0.05% tail at four to six hours that carries 3% of total quantity.
  2. Compute the p99.99 lateness two ways, event-weighted and quantity-weighted, and put the two numbers side by side.
  3. Implement the min-heap of open hours with the watermark as the min over 256 partitions, then stall one partition for 20 minutes and observe what seals.
  4. Set the idle-partition timeout to 60 seconds, repeat the stall, and measure how much quantity arrives after the seal.
  5. Attempt the seal from two workers at once and confirm the conditional update lets exactly one through.
EXPECTED RESULTThe quantity-weighted p99.99 is hours larger than the event-weighted one. Choosing L from the event-weighted number lets roughly the tail's 3% of quantity land after the seal, 600 times the 50 ppm target. With the min watermark and no idle timeout, the stalled partition blocks all sealing; with a 60-second timeout, the stall is sealed past and its events arrive late.
Follow-up
  • A replay starts during the sealing window for a period you are about to close. What do you do, and what is the customer-visible consequence of each option?
  • Your measured quantity-weighted p99.99 lateness is six hours and the invoice must be issued at 02:00 UTC on the first. How do you reconcile those two numbers?
  • How would you detect that L has drifted before it costs you an hour's quantity?

Locate a billing reconciliation gap without rescanning ninety million events

hard
reconciliationdimensional-bisectionwatermarkshypothesis-testing

A tenant's sealed invoice total is 0.4% below the sum of its raw usage_event rows for the period. That tenant has 90 million events over 30 days in a table partitioned daily on ingested_at, and its rollups carry source_max_ingested_at, revision and sealed_at. Recomputing all 30 days from raw is correct, and you are not going to do it. Give the procedure that locates the divergent (workspace, sku, hour) cell, the cost of each probe, and the one query you run before any of it.

Approach
  1. Run the free query first. Sum raw quantity for the period restricted to ingested_at <= source_max_ingested_at of the sealed rollups, and compare that against the unrestricted sum. The rollup stores the watermark precisely so this can be answered without a scan. If the whole 0.4% sits above the watermark, nothing is broken: it is late data, it becomes an adjustment line, and the investigation ends in one query.
  2. Only if the gap survives that test do you bisect, and you bisect by dimension rather than by rows. Compare 30 per-day totals, then inside the offending day compare the 6 SKUs, then the workspaces, then the 24 hours. That is roughly 30 + 6 + W + 24 grouped probes, each an indexed range scan over one daily partition for one tenant, against O(N) per attempt for the naive re-fold.
  3. Quantify why naive is not merely slow but unusable mid-incident: at a generous 200,000 rows/second sequential, 90 million rows is about 7.5 minutes per attempt, you will want ten attempts, and every one competes for I/O on the same partitions live ingest is writing. The diagnostic worsens the backlog it is diagnosing.
  4. Before fetching each comparison, state what it would look like under each hypothesis. Two adjacent hours off by equal and opposite amounts is occurred_at versus ingested_at bucketing. A whole day offset by exactly N hours is a timezone applied at the wrong layer. A gap confined to one SKU in one workspace is an environment filter. The same (tenant_id, idempotency_key) present in two ingested_day partitions is the dedup horizon losing a retry that crossed midnight.
  5. Make the next bisection cheap by storing the aggregate you keep recomputing. A per-(tenant_id, ingested_day) count and quantity checksum turns step two from thirty probes into one read, and it is the same number the reconciliation job already produces.
  6. Whatever you find, the sealed period does not change value. The correction is an adjustment line pointing at the line it reverses, carrying its own source_rollup_watermark, because the original invoice is the evidence of what the customer was charged.
Follow-up
  • The gap is 0.4% in one direction on one day and 0.4% the other way the next day. What does that shape rule in, and what does it rule out?
  • How do you distinguish a duplicate from a restatement, given revision and recomputed_at on the rollup?
  • Ingest is still running while you investigate. What makes your two numbers comparable at all?

Parse and verify a timestamped multi-signature webhook header

easy
parsinghmacconstant-time-comparereplay-protection

An inbound webhook carries a signature header of at most 1 KiB shaped t=<unix seconds>,v1=<64 hex chars>, with up to five v1 values during secret rotation and possibly unknown scheme keys. You hold the raw request body bytes and the currently active signing secrets. Write the parser and the verifier: accept when any active secret reproduces a signature and the timestamp is within a five-minute tolerance in either direction, reject otherwise. Single left-to-right pass over the header, no regular expression. State what is inside the MAC and why.

Approach
  1. Parse in one scan: split on ,, then on the first = only, since a value may itself contain = under a future scheme. Accept t exactly once and treat a second t as a reject rather than last-wins. Push every v1 onto a short list and ignore any other key, so a v2 can be introduced later without breaking this verifier.
  2. Say what is signed: HMAC-SHA256 over the exact byte string <t>.<raw body bytes>, yielding 32 bytes or 64 hex characters. The timestamp sits inside the MAC because otherwise an attacker replays yesterday's body with its still-valid signature and only has to edit the header timestamp.
  3. Hash the bytes as received. Verifying against a re-serialised JSON body is the usual defect: key order, whitespace and number formatting all change the bytes while the parsed objects compare equal, so signatures fail for honest senders and the popular 'fix' is to stop checking.
  4. Compare in constant time over fixed-length digests. Decode the hex to 32 bytes, accumulate acc |= a[i] ^ b[i] across the whole length, and test acc == 0 at the end. Evaluate every candidate without an early exit; at five candidates that is five HMACs over the body, linear in body size and negligible beside the network.
  5. Apply the tolerance as a two-sided bound, rejecting when |now - t| > 300 seconds. A sender whose clock runs ahead of yours is an ordinary case, and an unbounded future timestamp is a free replay window.
  6. Complexity: O(L) over the header producing k candidates, plus k HMACs at O(|body|) each. Space is O(k) beyond the body itself. Do the cheap rejections, including the tolerance check, before any cryptography runs.
Follow-up
  • The body is 40 MB. What changes about where you verify, and what can you do before the whole body has arrived?
  • A customer reports that signatures fail for exactly the requests whose body contains a non-ASCII character. What is your first hypothesis?
  • How do you rotate the signing secret with no failed deliveries, and how long do both secrets stay live?

For someone fluent in a dynamic language who has shipped real work but has never had to say what the runtime is doing underneath. The week is built on measuring and deliberately breaking things, because the questions that expose this background are the ones where the interviewer asks why a second time.

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

Prepare, practise & reflect

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

0 / 7 done
01Screening answers and your track
  • Choose your track, Data Infrastructure or Full Stack, and list evidence from your own work for the stack that track reportedly uses.
  • Write three foundational questions for this role (your background, why this track, one project end to end), record your answers, play them back, and cut any opening that is not the answer.
  • Fix the figures for the one project you will cite throughout the loop: data size, users, team size and your part.

Deliverable: Three recorded screening answers and a one-page project sheet with fixed figures.

Practice prompt ↗Practice prompt ↗Practice prompt ↗Worked solution ↗
02Take-home rehearsal: build the service
  • Build a small service from a reported example scenario, such as one that aggregates two public APIs, caches the results and exposes a REST interface, in the language you plan to use.
  • Add unit and integration tests, a Dockerfile and a README with run instructions, and handle upstream failures and timeouts explicitly.
  • Keep a decisions log: every choice, the alternative you rejected and the reason.

Deliverable: A runnable, tested, containerized service and its decisions log.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
03Failure handling and the written questions
  • Work this guide's design exercise on making run creation safe when the client retries, then apply its idempotency-key and outbox ideas to your Day 2 service where they fit.
  • Answer two technical and two behavioral questions as if they were the take-home's written section, in full sentences, and review them as carefully as code.
  • Reread every line of your service, mark any line you could not explain without looking something up, and rewrite those lines.

Deliverable: Written answers, plus a service with no line you cannot explain.

Practice prompt ↗Practice prompt ↗
04Panel deck and defense
  • Build a deck that opens with the business problem, maps components to requirements, then covers the architecture, stack choice and trade-offs.
  • Prepare answers for your own service to the reported panel questions: why this stack, how it fits the business problem, the first bottleneck at ten times the traffic, and SLA metrics with alerts.
  • Have a friend point at random lines of your code and ask you to explain them, optimise them or change them for a new constraint.

Deliverable: A recorded run-through of the deck, plus the questions you stumbled on with improved answers.

Practice prompt ↗Practice prompt ↗Worked solution ↗
05Design and data-infrastructure questions
  • Sketch the reported design questions: the multimodal ingestion pipeline for LLM training, the fault-tolerant academic paper crawler, Kafka plus Airflow batch orchestration, the Python rate-limiting middleware, and the distributed key-value store with your choice of consensus algorithm.
  • For each design, state the delivery guarantee, the retry path and the first bottleneck.
  • Work the SQL exercise on the deduplicated hourly rollup, then prepare short explanations of Parquet versus Delta Lake, Spark or Ray memory bottlenecks, and a schema for dataset versioning and reproducibility.

Deliverable: One page per design question naming its guarantees, failure paths and first bottleneck.

Practice prompt ↗Practice prompt ↗
06Coding and debugging
  • Work the coding exercise on sealing an hour under late data, then attempt the webhook signature parser drill without reading its approach.
  • Do the job-run overwrite debugging drill as an ordered checklist and write the fenced update that fixes it.
  • Warm up on fundamentals from the question bank for this role, such as the first unique character in a string, the lowest common ancestor in a binary tree and a small OOP class design, stating complexity aloud.

Deliverable: Solutions with their complexity stated, and a written debugging checklist.

Practice prompt ↗Practice prompt ↗
07Culture fit stories and a full mock
  • Write one story for each reported behavioral theme: a bottleneck resolved across teams, technical debt against a prototype, a researcher with different priorities, and ambiguity with minimal documentation.
  • Use the code-review drill on isolation levels to practise telling a story about resolving a technical disagreement with evidence.
  • Run a full mock: present the deck, answer line-level code questions, then answer behavioral questions, and check that your project figures match across all of them.

Deliverable: Four behavioral stories and notes from a full mock panel.

Practice prompt ↗Practice prompt ↗Worked solution ↗

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

The behavioral questions reported for this role cover taking initiative across team boundaries, balancing technical debt against delivery speed, working with researchers whose priorities differ from yours, and handling ambiguity at the start of a project. For each, pick a story where you made the call. Describe the situation briefly, then spend most of the answer on your reasoning and what changed as a result. Keep project facts identical to what you said on the panel.

Tell me about a time when you had to collaborate with a cross-function…

medium
behavioural and engineering judgement

Tell me about a time when you had to collaborate with a cross-functional partner (such as an AI researcher) who had different priorities than you.

Approach
  1. Give the blast radius: what could have broken, and what you measured.
  2. Name the disagreement and how you resolved it with evidence.
  3. 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?

How do you handle ambiguity when starting a project from scratch with …

medium
behavioural and engineering judgement

How do you handle ambiguity when starting a project from scratch with minimal documentation?

Approach
  1. Pick a story where you made the decision, not one where you watched it.
  2. State the situation in two sentences and spend the rest on the reasoning.
  3. Name the disagreement and how you resolved it with evidence.
Follow-up
  • What would you do differently if you ran that again?
  • How did you know your change caused the improvement?

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?
  • 01

    Describe a time when you identified an infrastructure bottleneck and took the initiative to resolve it across multiple team boundaries.

  • 02

    How do you prioritize technical debt against the need to ship a prototype quickly?

  • 03

    Tell me about a time when you had to collaborate with a cross-functional partner (such as an AI researcher) who had different priorities than you.

  • 04

    How do you handle ambiguity when starting a project from scratch with minimal documentation?

  • 05

    A colleague insists a select-then-insert quota check is safe at repeatable read. How do you take that disagreement to a resolution?

PracHub interview preparation framework ↗
Is this an official Thinking Machines Lab interview guide?

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

PracHub interview research ↗
How difficult is the technical interview process?

Candidates describe the coding work as practical rather than competitive programming: class-level data structures and clean backend design. The hard part is that the panel has you present and defend your own take-home, so your communication and architectural reasoning are tested on code the interviewers have already read. Prepare for depth on your own submission rather than for puzzle difficulty.

PracHub interview research ↗
Can I complete the coding exam in any language?

Candidates report that the take-home can be written in any programming language. The role description mentions Python and Rust on the backend, but what matters more is that you can defend every line on the panel. Use the language you write fastest and most idiomatically, unless you are equally fluent in one of those two.

PracHub interview research ↗
What happens in the panel interview?

Candidates report presenting their take-home solution from their own slides, defending their architectural choices and answering deep-dive questions from the engineering team, including questions about specific lines of code. The reported questions cover why you chose your stack, how the solution addresses the business problem, the bottlenecks at ten times the traffic, and the monitoring and alerting you would use to meet SLAs.

PracHub interview research ↗
How long does the process take?

Candidates report four rounds over roughly 3-5 weeks, from the initial screening to the culture fit interview. Timing varies, so ask the recruiter for the take-home deadline and the panel scheduling window as soon as you are invited.

PracHub interview research ↗
Is the coding assessment monitored?

Candidates report active anti-cheating mechanisms on the coding assessment. Write your solution from scratch, understand every line, and expect to explain or modify specific lines during the panel.

PracHub Software Engineer practice ↗
Which technical topics should I prepare?

Reported topics include Python, distributed systems, LLM infrastructure, Rust and scalable fault-tolerant infrastructure. For the Data Infrastructure track, prepare Spark or Ray memory tuning, Parquet versus Delta Lake, deduplication and quality checks, crawlers, and orchestration with Kafka or Airflow. For the Full Stack track, add API design in Python or Rust and frontend work in React with TypeScript. Confirm your track with the recruiter.

PracHub Software Engineer practice ↗
Sources & methodology 3 sources ↗

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