Plaid · Software Engineer
Updated · 2026-09-24

Plaid Software Engineer
Interview Guide

THE 60-SECOND BRIEF

Plaid sits between consumers, their bank accounts and the fintech applications they use, such as Venmo, Robinhood and Betterment. According to the role description, Software Engineers build and maintain the APIs, data pipelines and developer-facing tools behind that connection. A large part of the work is translation: fragmented bank protocols, legacy financial backends and inconsistent data formats have to become standardized APIs that developers can build on. Bank interfaces can change without notice, so integration work also covers monitoring and handling those failures before they reach end-user applications.

This guide covers the six stages candidates report for the Plaid Software Engineer loop, from the recruiter screen through technical screens, practical coding, system design and behavioral conversations. It includes the reported coding and system design prompts, ledger-focused SQL, coding, design and debugging drills, three worked exercises, and a 7-day plan tied to those rounds. The stages come from candidate reports, not from a process Plaid has published, so confirm the format with your recruiter.

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

Reconcile the ledger against processor settlement filesMake every money-moving endpoint idempotent by keyName the isolation level each invariant requires

41 min read

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

Plaid acts as an intermediary layer connecting consumers, bank accounts and fintech applications such as Venmo, Robinhood and Betterment. According to the role description, Software Engineers create, scale and maintain the APIs, real-time data pipelines and developer-facing tools behind that connection.

Much of the engineering problem is turning fragmented bank protocols, legacy financial backends and inconsistent data formats into standardized developer APIs. The role description mentions infrastructure teams working on high-throughput transaction processing, integrations teams building web scrapers and API connectors, and product teams working on identity verification and fraud prevention. Bank interfaces change without notice, so integration work includes automated monitoring and services that detect and isolate third-party failures.

Day-to-day work described for the role includes production code primarily in TypeScript, Go or Python, end-to-end ownership of features from spec to deployment and monitoring, code reviews, architectural decision records, on-call rotations, and work with product managers, data scientists and designers.

For interview preparation, that comes down to three things: practical coding on messy data with specs that change partway through, system design where external dependencies rate-limit, fail and change format, and stories that show ownership of production systems. This guide's rounds, questions and 7-day plan are built around those three.

01

Recruiter Phone Screen

reported

Candidates describe this as an initial call to align on your background, role expectations and compensation. It is also your best chance to learn the format of what comes next: whether the technical screen runs in your own local IDE or a hosted editor, which languages are accepted, and whether the final round includes a project presentation. Those answers decide how you spend your prep week, so ask for them directly.

What to demonstrate

  • Whether your background maps to the role you applied for, described as systems and scope you owned rather than as titles
  • Whether role expectations and compensation line up early, since compensation is one of the reported topics of this call

How to prepare

  • Write a short summary of the systems you have built that touch APIs, data pipelines or third-party integrations, since those match the work described for this role
  • Ask whether technical rounds use your own IDE or a hosted editor, which languages are accepted, and whether you will present a past project
  • Settle a compensation range beforehand with base, bonus and equity named separately, so the question gets a number rather than a deflection
PracHub interview research ↗
02

Technical Phone Screen

reported

A technical interview on coding and problem-solving. Candidate reports say technical screens are often run with you sharing your screen and coding in your own local IDE, with language documentation and a test setup allowed, and that there may be one or two screens. Reported practical coding questions, not tied to a specific round, include a template substitution engine, a text buffer with undo and redo, and a stateful rate limiter, so they are reasonable practice material for a screen. Treat whatever you get like writing a small pull request. Clarify the spec, build the smallest correct version, test it, then extend it.

What to demonstrate

  • Whether you clarify the spec and edge cases (empty input, missing keys, malformed data) before writing code
  • Whether the code is modular, with names and helper functions that make the next part of the problem cheap to add
  • Whether you verify behavior with tests or printed checks instead of asserting that it works
  • Whether you keep explaining your reasoning while you type rather than going silent

How to prepare

  • Set up a scratch project in your chosen language with a test runner (Jest, PyTest or equivalent) and run one passing and one failing test, so no setup problem surfaces on the call
  • Practise the reported template substitution question in separate steps: plain variable replacement, then nested references with cycle detection, then an explicit policy for missing keys
  • Record one practice session with narration and check it for silent stretches and for code written before the spec was restated
PracHub interview research ↗
03

Onsite Interview

reported

Candidates describe this as a series of interviews testing technical depth, architectural vision and behavioral alignment. Reports say the final round is made up of practical coding, system design, a project presentation and managerial or cultural discussions. The order is not stated, so prepare each as its own mode: finishing working code, reasoning about third-party failures at scale, defending your own past architecture decisions, and giving behavioral stories someone could check.

What to demonstrate

  • Whether you switch cleanly between modes and do not over-build a coding problem or under-scope a design problem
  • Whether your project presentation separates your own decisions from the team's and names the trade-offs you would revisit
  • Whether facts about your work (team size, timeline, your role) stay consistent across different interviewers

How to prepare

  • Build a project presentation around one architecture diagram, your personal contributions, the key trade-offs, the scaling problem you hit, and what you would design differently; reports say slides or a whiteboard may be requested
  • Run one coding, one design and one behavioral mock back to back and ask each mock interviewer which answer sounded like the previous round
  • Confirm with your recruiter whether final-round coding also happens in your own IDE, and keep that environment ready either way
PracHub interview research ↗
04

Practical Coding Rounds

reported

Interviews on practical coding tasks and real-world engineering problems. Candidate reports describe multi-part prompts where the second and third parts build directly on the abstractions you wrote for the first, so hardcoded logic in part one turns into a rewrite later. Reported topics include object-oriented structure, parsing nested JSON or HTML payloads, string substitution, defensive handling of invalid input, and in-memory components such as caches with eviction and expiry. Aim for clean, modular code that is not over-engineered, and test as you go.

What to demonstrate

  • Whether abstractions from the first part absorb later requirements without a rewrite
  • Whether messy input is handled deliberately: nested payloads, malformed records, missing fields, null values
  • Whether the data structure follows the access pattern, such as a hash map plus doubly linked list for O(1) LRU eviction, or undo and redo stacks for an editor
  • Whether edge cases are covered by tests you actually run

How to prepare

  • Build the text editor question in three passes: insert and delete at a cursor, then undo, then redo; record what each operation needs to store to be reversible and clear the redo stack on any new edit
  • Implement an in-memory cache with LRU eviction and per-entry expiry, then add an LFU policy behind the same interface to check that your first design extends
  • Write a parser that turns nested transaction payloads into normalized records, rejecting malformed ones with a reason and deduplicating repeats
PracHub interview research ↗
05

System Design Interview

reported

Candidates describe a round on architecting systems for significant throughput and compliance. Reported system design questions include a distributed API gateway handling routing, rate limiting, authentication and logging; asynchronous webhook delivery with at-least-once guarantees to developer endpoints; a transaction ingestion service for real-time bank feeds; a link-generation service for authentication tokens; and a resilience layer for rate limits, downtime and structural changes from external banking partners. The common thread is dependencies you do not control, so name those failure modes before you draw components.

What to demonstrate

  • Whether you pin down callers, scale, read-to-write mix and consistency needs before proposing an architecture
  • Whether external bank dependencies are treated as unreliable, with circuit breakers, exponential backoff with jitter, rate limiting and fallback queues
  • Whether delivery guarantees are stated and paid for: at-least-once delivery requires event ids and idempotent consumers
  • Whether storage choices follow the data, relational for transactional consistency versus NoSQL for high-throughput unstructured data

How to prepare

  • Design the webhook system end to end: durable queue, per-endpoint retries with backoff and jitter, a dead-letter path, and an event id consumers can deduplicate on
  • Work the resilience-layer question with one failure at a time (rate limit, outage, changed response format) and state detection, containment and recovery for each
  • Do the idempotency-key worked exercise for payment creation and practise explaining the concurrent-retry race in two sentences
  • For the ingestion question, state the partition key, the per-account ordering guarantee and how a feed is replayed after a crash
PracHub interview research ↗
06

Behavioral Conversations

reported

Candidates describe deep-dive discussions on collaboration and communication. Reported behavioral and project deep-dive questions, not tied to a specific round, cover walking through the architecture of something you built, a production outage you diagnosed and prevented from recurring, a high-impact project under a tight deadline or ambiguous requirements, prioritizing technical debt against features, and disagreeing with a product decision or a teammate's design. Other reported topics include working with product managers, handling ambiguity and learning from failure. Answer with specific decisions, the evidence behind them, and a clear line around your own part.

What to demonstrate

  • Whether your stories separate the decisions you made from the ones the team or others made
  • Whether an outage story covers diagnosis, resolution and the change that prevented a repeat
  • Whether a technical-debt answer names a concrete trade-off and how you got agreement on it
  • Whether you describe a mistake or failure plainly and say what you changed afterwards

How to prepare

  • Map one story to each reported prompt and write the decision, the evidence and the outcome for each in three lines
  • Rewrite each story replacing every plural pronoun with I or a named role, and cut any part you cannot speak to in first person
  • Prepare an external-dependency failure story, since third-party outages recur across this guide's design and behavioral prompts
PracHub interview research ↗

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

Software Engineer

Plaid Software Engineer Interview Experience — Two-Hour Screen Ends on a Syntax Error

Technical ScreenOutcome: rejected

I saw online that the first round is usually one hour, but I applied for a backend role and they required two hours back to back, with a 15-30 minute break in the middle. The first hour's question was a common pipeline question from the forum, and it went smoothly. After I finished, the interviewer was very insistent about how to test it, including wanting asserts in Python rather than print stat…

Read full experience
Customer Success Engineer

Plaid Customer Success Engineer take-home with client-style scenarios

Take-home ProjectOutcome: rejected

My process started with a take-home technical assessment. It wasn’t a complex coding task. Instead, it involved real-life, client-style scenarios where I had to respond to technical issues the way a customer support engineer would. After I submitted it, there was essentially no communication. I received no feedback, had no recruiter contact, and had no real interaction during the process. The onl…

Read full experience
Software Engineer

Plaid Software Engineer interview focused on algorithmic design

My interviews focused mostly on general problem solving, with algorithmic design questions instead of classic LeetCode-style problems. The bar itself wasn't clearly communicated, and the process didn't feel very professional. I also dealt with untimely responses and a sense that nothing was being evaluated consistently as the interviews progressed. By the time the process ended, it felt more like…

Read full experience
Customer Success Engineer

Plaid Customer Success Engineer interview with Quickstart homework and technical questions

Take-home Project → Other

I went through two stages. The first consisted of take-home exercises. I had to run Plaid’s Quickstart setup and write response emails to mock customers dealing with specific problems. I liked this part because it made me research what was happening and think through how to communicate in a calm, supportive way. The second stage was a one-on-one call. I was told it would be a short conversation w…

Read full experience
Software Engineer

Plaid Software Engineer interview: CodeSignal OA and two technical rounds

Online Assessment → Technical Screen → OtherOutcome: offer

My process started with an OA on CodeSignal, which was straightforward enough to complete. After that, I had a technical interview and a final round with a very specific rhythm: two technical interviews back to back, followed by one behavioral segment. The whole experience felt positive. The interviewers were genuinely friendly and engaged with my answers. They seemed interested in understanding…

Read full experience

PracHub editorial advice for the preparation topics above.

01

Losing the start of a local-IDE technical screen to runtime, path or test-runner errors

Candidate reports say technical screens are often run in your own IDE with screen sharing. The day before, open the exact editor, runtime and test runner you will use, create a fresh project, and run one passing and one failing test. Check that screen sharing shows your editor legibly, and keep a way to send your code afterwards (email or a Git repository), since reports say the final code may be requested.

02

Hardcoding part one of a multi-part practical coding prompt so parts two and three need a rewrite

Reported prompts such as the template engine, text editor and rate limiter grow in stages. Keep part one small but put the changeable decision behind a function or class boundary: the lookup for a template variable, the operation record for undo, the window policy for a rate limiter. Before extending, say out loud which piece the new requirement touches. If the answer is everything, fix the boundary first.

03

Designing a bank-integration system as if the external partner always answers correctly and on time

The reported design prompts (resilience layer, transaction ingestion, webhook delivery, API gateway) all hinge on dependencies that rate-limit, go down or change format. For each external call, state the timeout, the retry policy with backoff and jitter, the circuit-breaker condition, and what the caller sees while the partner is down. For at-least-once webhooks, say how consumers deduplicate, because retries without an event id create duplicates.

04

Going silent while coding, so the interviewer cannot follow your choices

Candidate reports describe these rounds as collaborative. Before typing, restate the input contract and your approach; while typing, name each edge case as you handle it; after each part, run a test and say what it proves. If you get stuck, state the hypothesis you are checking instead of editing code at random.

05

Presenting a past project where your own decisions blur into the team's

For the project presentation and the behavioral conversations, mark which components you designed, which you implemented, and which you inherited. Prepare the trade-off you would reverse today and the scaling problem you actually hit, with the numbers you can back up. Walking through an architecture without naming your part leaves nothing to assess, however clean the diagram.

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

Design an in-memory text editor or buffer data structure supporting co…

medium
data structures and algorithms

Design an in-memory text editor or buffer data structure supporting core operations like insert, delete, move cursor, undo, and redo.

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?
  • What is the worst case, and how likely is it on real data?

Implement a stateful rate limiter that tracks API request rates across…

medium
data structures and algorithms

Implement a stateful rate limiter that tracks API request rates across varying customer tiers and time windows.

Approach
  1. Restate the input: its shape, its size, and what is guaranteed about it.
  2. State the target complexity and say which constraint rules the naive version out.
  3. Walk one small example through your approach before writing the whole thing.
Follow-up
  • Which test case would catch an off-by-one here?
  • How does this change if the input no longer fits in memory?

Implement a template substitution engine that takes a text template wi…

medium
data structures and algorithms

Implement a template substitution engine that takes a text template with variables and dynamically replaces them using a provided key-value dictionary, handling nested references and edge cases.

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

Write a function to validate and normalize dirty account number inputs…

medium
data structures and algorithms

Write a function to validate and normalize dirty account number inputs against varying international banking standards.

Approach
  1. Walk one small example through your approach before writing the whole thing.
  2. Name the brute-force solution and its complexity before improving on it.
  3. Choose the data structure from the access pattern, not from familiarity.
Follow-up
  • How does this change if the input no longer fits in memory?
  • Which test case would catch an off-by-one here?

Derive per-account balances and catch unbalanced transactions

easyWorked solution
aggregationdouble-entrystreaming

You are given ledger_entry rows streamed in entry_id order: transaction_id, account_id, direction (debit or credit), amount_minor (a positive int64), currency, business_date. Up to 500 million rows, at most 20 million distinct (account_id, currency) pairs, and the entries of one transaction are contiguous in the stream. In a single pass with no re-reads, return the closing balance per (account_id, currency) and the transaction_id of every transaction whose entries do not sum to zero within each currency. State your time and space bounds.

Approach
  1. Normalise the sign at read time from direction, not from the amount: signed = +amount_minor for debit, -amount_minor for credit (state which convention you picked). The schema constrains amount_minor > 0 precisely so the sign lives in exactly one place.
  2. Hold one hash map keyed (account_id, currency) to an int64 running total. Twenty million keys at 16 bytes of payload plus map overhead is order 1 GB in most runtimes — quote the number, and offer the fallback: partition the stream by hash(account_id) % P and run P passes for 1/P of the memory.
  3. Ride the zero-sum check on the same pass. Because a transaction's entries are contiguous, keep a tiny currency -> int64 map for the current transaction_id only, test it against zero on the boundary and at EOF, then clear it. That is O(currencies in one transaction), typically one or two.
  4. Bound the arithmetic explicitly. Int64 holds about 9.22e18, so overflowing one account across 500 million entries needs an average of 1.8e10 minor units per entry — safe here, but use a checked add so an adversarial file fails loudly rather than wrapping.
  5. Complexity: O(n) time, O(distinct account-currency pairs) space, one sequential pass, no sort. The zero-sum check adds no asymptotic cost, which is the argument for doing it here rather than in a second job.
Worked solution 20 min
  1. Write the sign rule down in one sentence before any code, naming which side debit is positive on, and apply it at read.
  2. Implement with two maps — balances: (account_id, currency) -> int64 and txn: currency -> int64 — plus the current transaction_id.
  3. On a change of transaction_id, assert every currency in txn sums to zero, record the id if not, then clear.
  4. Feed a fixture: one 2-entry transaction that balances; one 4-entry transaction with USD and JPY legs that balances within each currency; one 3-entry transaction off by a single minor unit.
  5. Re-run with the entries shuffled inside each transaction to prove the result is order-independent within a transaction.
EXPECTED RESULTThe balances map is identical under any within-transaction ordering; exactly the third transaction is reported; the mixed-currency transaction is accepted, because zero-sum is required per currency, not across the transaction.
Follow-up
  • Entries of a transaction are no longer contiguous. What does the zero-sum check cost now, and which is cheaper: buffering open transactions or an external sort on transaction_id?
  • How would you produce the same balances as of an arbitrary business_date without a second full scan?
  • The job is restarted after a crash halfway through the file. What makes the second run produce identical output?

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
01Environment and recruiter screen
  • Configure the editor, language runtime, debugger and test runner you will use in a local-IDE technical screen; create a fresh project and run one passing and one failing test
  • Rehearse screen sharing with the editor at a readable font size, and set up a way to send code afterwards by email or a Git repository
  • Write a short background summary focused on APIs, data pipelines or third-party integrations you have owned
  • List the questions for the recruiter: IDE versus hosted editor, accepted languages, whether a project presentation is included, and the expected timeline

Deliverable: A working scratch project with a one-command test run, plus one page of screen notes with your background summary, compensation range and recruiter questions.

Practice prompt ↗Practice prompt ↗Worked solution ↗
02Multi-part practical coding
  • Solve the template substitution question in three timed parts: plain substitution, nested references with cycle detection, then a missing-key policy; add tests after each part
  • Build the text editor buffer in three passes: insert and delete at a cursor, undo, then redo; make sure a new edit clears the redo stack
  • Narrate both sessions out loud and note every point where a later part forced you to change earlier code

Deliverable: Two solutions with passing tests, and a short note on which first-part boundary made each extension easy or hard.

Practice prompt ↗Practice prompt ↗
03Stateful components and messy input
  • Implement a per-tier rate limiter twice, once as a sliding window and once as a token bucket, and write down the memory and accuracy trade-off between them
  • Build an in-memory cache with LRU eviction and per-entry expiry, then add LFU behind the same interface
  • Write an account-number validator and normalizer that strips separators, rejects bad lengths and characters, and returns a reason for each rejection
  • Parse a batch of nested transaction payloads into normalized records, deduplicating repeats in one pass

Deliverable: Four components, each with boundary tests (exact capacity, one past capacity, expired entry, malformed input).

Practice prompt ↗Practice prompt ↗
04Algorithms on transaction data
  • Compute rolling averages with a sliding window and flag anomalies against them, stating the window update cost
  • Return the top spending categories over a sliding time window with a heap, and handle entries expiring from the window
  • Detect circular transfer paths between accounts with DFS and a visiting set, and state the complexity
  • Work the ledger balances coding exercise (derive per-account balances and catch unbalanced transactions) and check your result against its listed checks

Deliverable: Four solutions with stated time and space complexity, and the worked coding exercise passing every check.

Practice prompt ↗Practice prompt ↗Worked solution ↗
05SQL and data modeling
  • Work the multi-currency ledger SQL exercise end to end and run the query rather than reading it
  • Solve the capture-and-refund double-counting question and name both sources of multiplication before writing the fix
  • Write a one-page SQL versus NoSQL comparison for the transaction ingestion question: consistency, query flexibility, scaling and schema changes

Deliverable: Two executed SQL solutions with test data, and a storage-choice note you can say in under a minute in a design round.

Practice prompt ↗Practice prompt ↗
06System design around unreliable partners
  • Design the resilience layer for external banking partners, handling rate limits, outages and format changes one at a time with detection, containment and recovery
  • Design asynchronous webhook delivery with at-least-once guarantees: queue, retries with backoff and jitter, dead-letter path, and event ids for consumer deduplication
  • Sketch the transaction ingestion service with a partition key, per-account ordering and a replay path
  • Work the idempotency-key design exercise for payment creation and explain the concurrent-retry race without notes

Deliverable: Three written designs, each opening with scope and failure modes, plus the idempotency exercise checked against its listed checks.

Practice prompt ↗Practice prompt ↗
07Project presentation, behavioral stories and a full mock
  • Build the project presentation: one architecture diagram, your own contributions, trade-offs, the hardest problem, and what you would change
  • Prepare one story each for the reported behavioral prompts: architecture walkthrough, outage, deadline or ambiguity, technical debt versus features, and a design disagreement
  • Talk through the latency debugging drill (p99 rising with p50 flat) out loud, stating each hypothesis before each check
  • Run a mock sequence of practical coding in your local IDE, one design question and the presentation, and note where you slipped between modes

Deliverable: A presentation you can deliver with a diagram, five written stories with your own part marked, and notes from the mock sequence.

Practice prompt ↗Practice prompt ↗Worked solution ↗

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

The reported behavioral prompts for this role are about ownership of real systems: outages, deadlines, technical debt and design disagreements. For each, prepare one story that separates your part from the team's, names the evidence you used, and says what you would do differently. The drill prompts in this guide's question list (arguing against a dual write, reversing a sharding decision, a review dispute over isolation level) are good practice for the deeper follow-ups.

Argue against a dual write you were assigned to build

hard
dual writeoutboxdesign reviewdisagreement

A senior engineer specifies that the orchestration service should update payment_intent.status and publish the merchant event in the same code path, wrapping the publish in a retry. You believe it is wrong and you have been told to build it. Describe a time you argued against a design you were assigned. State the failure you predicted, the evidence you brought, how long the disagreement ran, what you did once the decision went against you, and what production eventually showed. Include the version of your argument that did not persuade anyone, and why it did not.

Approach
  1. The probe is whether you can disagree with a technical authority using evidence rather than taste, and still execute. Establish the failure precisely first: no transaction spans the database and the broker, so a crash between them leaves one side done, and it fails asymmetrically in both orderings. Publish-then-commit invents events for state that never existed; commit-then-publish loses events for state that does.
  2. Kill the retry argument explicitly, because it is the one that keeps the design alive: the retry loop lives in the same process that can die, so it narrows the window and never closes it. Quantify the window if you can (deploy restarts per week times request rate times the in-flight fraction) rather than asserting it is rare.
  3. Bring evidence in the form the decision-maker can check in a day: a count of merchant events with no corresponding intent version, or intent versions with no event, over a window you can query now. An argument that costs the other person nothing to verify is the one that moves.
  4. Say what you proposed instead in one sentence with its cost owned honestly: an outbox row written in the same transaction with UNIQUE (aggregate_type, aggregate_id, aggregate_version), a partial index on published_at IS NULL, and a relay that delivers at least once. The cost is that every consumer now has to be idempotent, and that is a real tax you are asking others to pay.
  5. Describe the disagree-and-commit mechanics concretely: what you built, what you instrumented so the prediction could be checked, and what threshold would have proved you wrong. A strong answer is falsifiable; a generic one says 'I raised concerns and moved on'.
  6. Report the outcome including the possibility that you were partly wrong about severity or timing, and separate 'I was right' from 'the disagreement was handled well'.
Follow-up
  • You lost the argument. What instrumentation do you add so the question gets settled by data in a month rather than by another meeting?
  • The stream processor's documentation says exactly-once. Why does that not settle the question for a card charge?
  • What would have made you drop the objection entirely?

Reverse a sharding decision after production contradicted it

medium
shardinglock contentionreversibility

To raise throughput past a single row's lock ceiling, you shard a hot settlement account balance into 16 sub-rows. Two weeks later the floor check has to sum all 16 under a stronger isolation level, contention has moved rather than gone, and operations cannot explain the balance to an auditor. Describe a decision you reversed. State what you believed when you made it, the measurement that changed your mind, how you unwound it without causing a second incident, and how long you waited before concluding the data was real rather than noise.

Approach
  1. The probe is whether you can hold a belief loosely and unwind your own work without ego. Begin with the reasoning that was correct at the time: a single balance row commits at roughly one write per lock hold, so at a 4 ms hold you get about 250 writes per second regardless of core count, and sharding is the standard answer to that ceiling.
  2. Name what the original reasoning missed rather than calling it a mistake in general. The floor predicate was a single-row CHECK before sharding and became a cross-row predicate after it, so every write now either sums the shards under SERIALIZABLE with a bounded retry on 40001 or locks them in a fixed order to avoid 40P01. The throughput gain is real but smaller than 16x, and the auditability cost was never priced.
  3. Give the measurement that decided it, with a before and an after: committed writes per second, p99 write latency, retry rate on 40001, and the time an analyst needs to reconstruct one balance. A reversal justified by feel is the generic answer.
  4. Describe the unwind as a migration, not a revert: shadow the consolidated balance, reconcile it against the sum of shards over a full business day including the cutoff, cut reads over first, then writes, keeping the shards readable until one full reconciliation cycle has passed clean.
  5. State the waiting rule you used before acting. Two weeks of a moving p99 can be a deploy or a traffic shift; a strong answer names the signal that separated a trend from noise, such as the retry rate persisting across a low-traffic weekend.
  6. Close with what you would keep. Some of the work is usually salvageable (the instrumentation, the lock ordering, the measured ceiling), and saying which parts survived shows the reversal was analysed rather than abandoned.
Follow-up
  • You still need the throughput. What is the next thing you try, and what does it cost the floor check?
  • How do you reconcile the sharded balance against the consolidated one during the migration without double counting entries posted mid-cut?
  • What would you have measured before the original change that would have made the answer obvious?

Resolve a review disagreement over isolation level

easy
code reviewisolation levelslost update

A colleague's pull request reads a balance, compares it to a floor in application code, then issues an UPDATE with the computed value, all under PostgreSQL's default READ COMMITTED. You comment; they reply that staging has never produced a negative balance. Describe a code review disagreement where you were confident and the author was not convinced. State how you made the failure concrete rather than theoretical, how many rounds it took, at what point you would have escalated or approved anyway, and what you conceded to the author.

Approach
  1. The probe is whether you can convert a correctness objection into something reproducible instead of a stalemate of opinions. Name the anomaly by its mechanism: under READ COMMITTED each statement takes a fresh snapshot, so two sessions can both read balance 100, both compute 100 minus 80, and both write 20.
  2. Address the staging evidence directly rather than dismissing it. Staging concurrency on one account row is effectively one, so the absence of the anomaly there is expected under both the broken and the correct implementation. That is the sentence that usually ends the argument.
  3. Reproduce it in two psql sessions and paste the interleaving into the review. A twelve-line transcript settles in one round what three paragraphs of theory will not settle in four.
  4. Offer the fix as a choice with its trade-off, not as a verdict: an atomic UPDATE ... SET balance = balance - $1 WHERE account_id = $2 AND balance - $1 >= $3 with a rowcount check keeps it single statement and needs no retry; SELECT ... FOR UPDATE serialises the row and lets you compute in application code; SERIALIZABLE covers the multi-row version of the predicate but requires a bounded retry on SQLSTATE 40001 that someone has to actually write.
  5. Say where your bar is. Correctness on money is a blocking comment, style is not, and a strong answer states that boundary before the disagreement rather than discovering it during one.
  6. Name what you conceded. The author was usually right about something (scope, naming, the follow-up being separable), and saying so is what makes the blocking comment land next time.
Follow-up
  • The author switches the service to MySQL. Which of the three fixes still behaves the same, and which changes silently?
  • The same endpoint later transfers between two accounts. What do you now require in the review?
  • How do you keep this from being relitigated in every future pull request?
  • 01

    Walk through the architecture of a complex feature or service you built in a prior role, highlighting the key trade-offs and technical decisions.

  • 02

    Describe a major outage or production bug in your system. How did you diagnose it, resolve it, and prevent it from recurring?

  • 03

    Tell me about a high-impact engineering project you delivered under a tight deadline or with ambiguous requirements.

  • 04

    How do you prioritize technical debt against new product feature requests when planning engineering sprints?

  • 05

    Describe a time you disagreed with a product decision or a teammate's technical design. How did you resolve it?

  • 06

    Tell me about a time an external dependency failed unexpectedly. How did you manage the impact on users and the technical resolution?

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

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

PracHub interview research ↗
Should I prepare for standard LeetCode style questions or practical coding?

Both, weighted toward practical coding. Candidate reports describe multi-step implementation questions such as a text editor with undo and redo, a template substitution engine or a stateful rate limiter, where clean structure and data structure choice matter. Algorithmic prompts are also reported, including sliding-window rolling averages, heap-based top categories over a time window, and graph traversal to detect circular transfers, so keep core patterns fresh as well.

PracHub interview research ↗
What programming language should I use during the technical interviews?

Candidates report being able to choose a mainstream language such as TypeScript, Python, Go, Java or C++. Reports note that TypeScript is used widely in Plaid's stack and that TypeScript or Python make JSON handling in a local setup quick. Pick the language whose standard library, test runner and debugger you can use without looking things up, and confirm the options with your recruiter.

PracHub interview research ↗
How does the local environment setup work for technical interviews?

Candidate reports say the interviewer typically shares a prompt and starter code over chat or email, you share your screen and write and run code in your own IDE, verify it with unit tests or printed checks, and send the final source afterwards by email or a Git repository. Have your editor, runtime and test runner working before the call.

PracHub interview research ↗
How long does the interview loop take from start to finish?

Reports differ. The round summary cites roughly 4-6 weeks, while other candidate notes cite 3 to 5 weeks from first screen to decision, with feedback typically within 3 to 5 business days after each major round. The length depends on scheduling availability, so ask your recruiter for the expected timeline and mention any competing deadline early.

PracHub interview research ↗
What should I prepare for the project presentation?

Reports say the final round includes a project presentation, and that you may be asked to present slides or whiteboard the architecture of a major system you built. Prepare one clear architecture diagram, the parts you personally designed and wrote, the key trade-offs, the hardest scaling or reliability problem and how you handled it, and what you would build differently now. Expect follow-up questions that test each trade-off.

PracHub Software Engineer practice ↗
What system design topics come up for this role?

Reported design prompts include a distributed API gateway with routing, rate limiting, authentication and logging; asynchronous webhook delivery with at-least-once guarantees; a transaction ingestion service for real-time bank feeds; a link-generation service for authentication tokens; and a resilience layer for rate limits, downtime and format changes from external banking partners. Prepare circuit breakers, backoff with jitter, message queues, caching, idempotency keys and relational versus NoSQL storage choices.

PracHub Software Engineer practice ↗
Sources & methodology 3 sources ↗

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