cswork / libraryOpen practice workspace

Interview guides · Berkshire Grey

Berkshire Grey Software Engineer Interview Guide

Berkshire Grey Software Engineer interview guide: the three reported rounds, coding, system design and behavioral questions, and a seven-day plan.

The 60-second brief

Berkshire Grey applies robotics to supply chain operations. Candidates describe the Software Engineer role as building and maintaining the software behind automation in warehouses and distribution centers, from algorithms that steer robot motion to interfaces where people and robots work together. The same descriptions list day-to-day work such as code reviews, continuous integration and deployment, and troubleshooting existing systems to improve performance and reliability, and they describe teams that combine robotics, AI and software.

This guide is for engineers preparing for a Berkshire Grey Software Engineer interview. The requirements candidates describe list Java, Python or C++, Agile and Scrum experience, and data structures and algorithms, with robotics, AWS or Azure and machine learning concepts as extras, plus a computer science background and roughly two to five years of professional development. The guide covers the three reported rounds, every reported question (coding, system design, troubleshooting, process and behavioral) and a seven-day plan.

Candidates report three stages over roughly 3-5 weeks: a recruiter phone screen, one or more technical interviews with coding exercises and system design, and an onsite made up of several interviews with team members.

Focus areas

  • Robotics Software
  • System Design
  • Robotics Simulation

Overview

Sort the reported questions into five groups and prepare each one. Technical and domain questions cover the software development lifecycle, a challenging problem you solved, code quality and maintainability, Git, and the languages you know best. System design covers real-time data processing, microservices, database trade-offs, API design, and reliability and availability. Problem-solving covers a failing system, estimating timelines and a change of strategy. Coding covers reversing a string, searching a sorted array, discussing time complexity and a live data-structure challenge. Behavioral prompts cover collaboration, conflict, motivation, taking the lead and prioritising under deadlines.

The topic mix candidates report also names robotics software, robotics simulation, modeling and simulation, SRE and embedded Linux. No reported question is specifically about those areas, so treat them as context for your examples. If you have written simulators, control or embedded code, or run services in production, use that work in your design and troubleshooting answers. If you have not, pick the closest system you built and be ready to explain how you tested it, released it and monitored it.

Candidate tips recommend practising code on a whiteboard because coding happens in real time, so rehearse by hand in the language you know best (the listed requirements name Java, Python and C++) and say the complexity out loud. For the behavioral side, build a small bank of projects rather than rehearsing each prompt in isolation. One well-chosen project can answer the collaboration, leadership and deadline prompts from different angles.

The Berkshire Grey interview process

Candidates describe three stages, shown below in the order they report. The number of technical interviews and the onsite format vary by team and level.

Recruiter Phone Screen

Candidates describe a first conversation with a recruiter about basic qualifications and your interests. Treat it as a short pitch plus logistics: show that your background matches the languages and experience the role lists, and use it to learn the shape of the rest of the loop.

What to demonstrate

  • Your basic qualifications as read against the listed requirements (Java, Python or C++, Agile and Scrum, data structures and algorithms)
  • Your interest in the role and in software for robotics and warehouse automation

How to prepare

  • Write a CV walk-through that names the language and the system you built in each role, so the recruiter can match your experience to the listed requirements.
  • Prepare an honest reason for wanting robotics and warehouse automation work. If your background is elsewhere, name what transfers: real-time services, simulation, embedded Linux or production operations.
  • Ask what the technical interviews will contain, whether coding is on a whiteboard or a laptop, and who you will meet onsite. One candidate review calls the location a bit out of the way from Boston, so confirm travel details early.

Technical Interviews

Candidates report one or more technical interviews built from coding exercises and system design questions. This is the stage where the coding, design and troubleshooting question types in this guide are practised. Candidate tips say coding happens in real time and recommend whiteboard practice, so rehearse writing correct code by hand and explaining each choice as you go.

What to demonstrate

  • Working code written live in a language you choose, including the edge cases
  • Time and space complexity of the solution you wrote
  • A design you can explain end to end: components, data flow and what happens when a part fails

How to prepare

  • Solve string reversal, a sorted-array search and one hash-map or stack problem by hand in Java, Python or C++. State the complexity out loud and test empty and single-element inputs.
  • Practise a design for real-time data processing from ingestion through processing to consumers. Name the delivery guarantee, how you handle a slow consumer, and what you monitor.
  • Write a one-page note on microservice boundaries, the trade-offs between two databases you have used, and an API design with versioning, idempotent retries and error codes.
  • Prepare a troubleshooting sequence for a failing system: what changed, what the signals show, how to narrow it down, how to mitigate first, and how to find the root cause.

Onsite Interview

Candidates describe the final stage as an onsite made up of several interviews with different team members, covering technical skills and team fit. Prepare as though any earlier topic can return in a different conversation, and keep a behavioral story bank ready alongside your coding and design practice.

What to demonstrate

  • Technical skills across several separate conversations
  • Team fit: how you collaborate, handle conflict and take the lead
  • How clearly you explain your reasoning to different engineers

How to prepare

  • Build a story bank of four or five projects mapped to the behavioral prompts: collaboration, conflict, taking the lead, motivation, prioritising under deadlines and a project that did not go as planned.
  • Prepare a deep dive on your strongest project: the architecture, the decisions you made, what broke, how you tested and released it, and how code review and Git worked on that team.
  • Rehearse one coding problem, one design problem and one behavioral story back to back without notes, so switching topics does not cost you structure.
  • Write questions about the team's work, such as how code moves from review to deployment, or how simulation fits into testing.

Where candidates lose points

Reciting software development lifecycle phases and Git commands from a textbook with no project behind them

Anchor both answers in one real project: the cadence you worked in, how review and CI gated merges, and one Git recovery story such as a bisect, a revert on a shared branch or a reflog rescue.

Treating the string-reversal and sorted-array search questions as trivial and skipping edge cases

State the approach, then test empty, single-element and absent-target inputs. In Java or C++ compute the binary-search midpoint as lo + (hi - lo) / 2 and say whether your string reversal is in place or builds a new string.

Answering the microservices or real-time data processing design with buzzwords and no trade-offs or failure behavior

Fix one concrete scenario, draw the data flow, name the delivery guarantee and the consistency you accept, and say what happens when a service or consumer goes down.

Telling behavioral stories in the plural "we" with no decision of your own, or a conflict story with no resolution

Use "I" for your actions, name the decision you made and its cost, and finish with the outcome and what you would change. Prepare one story that did not go to plan.

Claiming enthusiasm for robotics and warehouse automation with nothing behind it

Back the interest with work you have done: simulation, embedded Linux, control logic or production operations. If you have none, say what you are learning and which parts of your experience transfer.

Questions & practice

Write a function to reverse a string.

Medium · Coding / Algorithms

Approach

  1. Clarify the contract: in place on a mutable buffer (char array, C++ std::string) or return a new string (Python and Java strings are immutable), and whether input is ASCII or arbitrary Unicode.
  2. Two-pointer swap: i at 0, j at n-1, swap and move inward while i < j. O(n) time and O(1) extra space in place; idiomatic versions are s[::-1] in Python, new StringBuilder(s).reverse() in Java, std::reverse in C++.
  3. Avoid quadratic building: repeated String += in a Java loop copies the string each time and can be O(n^2); use a StringBuilder or a list and join. A recursive version uses O(n) stack and can overflow on long input.
  4. Cover edge cases: empty string, single character, odd and even lengths, null in Java or C++ pointer APIs.
  5. Mention Unicode: swapping bytes breaks multi-byte UTF-8 in std::string, swapping UTF-16 chars breaks surrogate pairs (StringBuilder.reverse keeps them together), and reversing code points still splits combining marks and emoji sequences, which need grapheme-cluster handling.

Follow-up

  • Reverse the order of words in a sentence in place.
  • How would you reverse a string with emoji and accented characters correctly?
  • What does the recursive version cost in space, and when does it fail?

How would you implement a search algorithm for a sorted array?

Medium · Coding / Algorithms

Approach

  1. Binary search: keep lo and hi bounds, compute mid as lo + (hi - lo) / 2 to avoid integer overflow in Java and C++, compare and discard half each step. O(log n) time, O(1) space iteratively.
  2. State the loop invariant and pick one convention: closed [lo, hi] with while lo <= hi, or half-open [lo, hi) with while lo < hi returning the insertion point. Mixing them causes infinite loops or skipped elements.
  3. Handle duplicates with lower and upper bounds: std::lower_bound and std::upper_bound, Python bisect_left and bisect_right. Java Arrays.binarySearch returns -(insertion point) - 1 when absent and does not promise which duplicate it finds.
  4. Test edge cases: empty array, one element, target below the minimum or above the maximum, all elements equal, and the two-element case that exposes a mid or bound update bug.
  5. Know the variants: rotated sorted array, unknown length (exponential search, O(log i) for position i), binary search on an answer space, and interpolation search (about O(log log n) on uniformly distributed keys, O(n) worst case).

Follow-up

  • Return the first and last positions of a target that appears many times.
  • Search a sorted array that has been rotated at an unknown pivot.
  • How would you search sorted data too large to fit in memory?

Discuss the time complexity of your solution for a particular coding problem.

Medium · Coding / Algorithms

Approach

  1. Define the variables first (n, and any others such as m edges or k results) and give time and extra space separately, saying whether the bound is worst-case, average or amortized.
  2. Derive the bound from the code's structure: sequential steps add, nested loops multiply, halving gives log n, and recursions follow a recurrence such as T(n) = 2T(n/2) + O(n), which solves to O(n log n).
  3. Count the hidden costs of library calls: Python list.pop(0) and insert(0, x) are O(n) while deque ends are O(1); hash maps are O(1) average but O(n) worst case; C++ std::map is O(log n) per operation; sorting is O(n log n); dynamic-array append is amortized O(1) because capacity grows geometrically.
  4. Tie the bound to the input size: with n around 10^5, an O(n^2) solution means about 10^10 steps and is too slow, while O(n log n) is comfortable. Know lower bounds such as Omega(n log n) for comparison sorting.
  5. Include recursion depth and auxiliary structures in the space figure, and say what trade of space for time is available.

Follow-up

  • Your solution uses a hash map. What is its worst case, and what input triggers it?
  • Could you lower the memory use, and what would it cost in time?
  • Is this bound tight, or could a better algorithm exist?

Solve a coding challenge involving data structures live during the interview.

Medium · Coding / Algorithms

Approach

  1. Restate the problem, confirm input sizes and constraints, and work two or three examples by hand, including an edge case, before writing code.
  2. Pick the structure from the operations needed: hash map for O(1) average lookup and counting, heap for repeated min or max (O(log n) push and pop, top-k in O(n log k)), stack for nesting and monotonic problems, deque for sliding windows, union-find for connectivity.
  3. For grid or graph problems, which suit the robotics software topics candidates report, know BFS for shortest paths on unweighted grids, Dijkstra with a binary heap at O((V + E) log V) for non-negative weights, and A* with an admissible heuristic.
  4. State the brute-force approach and its complexity, then optimise, and write clean code in my strongest of C++, Java or Python while narrating each decision.
  5. Trace the code on an example, test the edge cases (empty input, duplicates, a single element, unreachable target) and finish with time and space complexity.

Follow-up

  • How does your solution change if the input arrives as a stream?
  • The edges now have weights. What changes in your algorithm and its complexity?
  • Can you cut the memory use, and at what cost?

Replace offset paging on the resource feed with keyset

Easy · keyset pagination · composite index · sort order

resource holds resource_id, tenant_id, owner_user_id, title, body_ref, version, status ('draft','active','archived','deleted'), created_at, updated_at, deleted_at, with an index on (tenant_id, status, updated_at DESC, resource_id DESC). The listing endpoint returns active resources for one tenant, newest update first, 50 per page, today with LIMIT 50 OFFSET n. Tenants reach page 400 and rows are created while they read. Write the keyset query, define what the cursor carries and how it is encoded, and say which part of the index each predicate uses. Assume PostgreSQL 16.

Approach

  1. Name the two failures separately. OFFSET 20000 makes the server produce and discard 20,000 rows, so page cost grows with depth rather than with page size. Independently, any write that changes how many rows sort above the offset moves the window between two fetches, and the direction decides which anomaly you get: an insert lands at the head of updated_at DESC and pushes already-returned rows down past the boundary, so they are returned a second time; a delete above the offset, or a row whose updated_at is bumped above the cursor, pulls rows up and one is never returned at all. Nothing in the response reveals either.
  2. Write the seek: WHERE tenant_id = $1 AND status = 'active' AND (updated_at, resource_id) < ($2, $3) ORDER BY updated_at DESC, resource_id DESC LIMIT 50. The row-value comparison is one index range rather than a disjunction, and both columns are NOT NULL, which is what makes that comparison well defined.
  3. Map each predicate onto the index: tenant_id and status are equality on the leading columns, (updated_at, resource_id) is the range, and the ORDER BY matches the index order so no Sort node appears and the scan stops after 50 rows. The DESC in the definition only matters for mixed directions — a plain ascending btree on the same columns is read backwards for this query.
  4. Put both sort columns in the cursor and nothing the client can tamper with into another tenant: base64 of (updated_at, resource_id), validated server-side, with tenant_id taken from the principal.

Follow-up

  • The client asks for 'jump to page 400'. What do you offer instead, and what does the honest version cost?
  • Sort order becomes user-selectable across four columns. How many indexes is that, and which would you refuse to add?

Find version gaps and relay lag with window functions

Medium · window functions · event tables · frame semantics

outbox_event holds event_id, aggregate_type, aggregate_id, aggregate_version, event_type, payload, status ('pending','published','dead'), attempts, created_at, published_at. A projection is missing rows and you must decide whether the relay skipped events or the consumer dropped them. Write three queries over the last seven days: one listing every aggregate_id whose published aggregate_version sequence has a hole, one giving per-day counts with a running total, and one returning the newest published event per aggregate. For each, say where the window function is evaluated relative to WHERE and LIMIT. PostgreSQL 16.

Approach

  1. Gaps: compute lead(aggregate_version) OVER (PARTITION BY aggregate_id ORDER BY aggregate_version) in a subquery, then filter next_version <> aggregate_version + 1 in the outer query. Window functions are evaluated after WHERE, GROUP BY and HAVING and before the outer ORDER BY and LIMIT, so the predicate cannot sit in the same WHERE clause and PostgreSQL 16 has no QUALIFY.
  2. Say what the seven-day filter does to the answer: it truncates every partition, so the first row per aggregate has no predecessor inside the window and a hole spanning the boundary is invisible. Widen the window, or join to resource.version as the authority for the true maximum.
  3. Running total: SELECT date_trunc('day', created_at) AS d, count() AS n, sum(count()) OVER (ORDER BY date_trunc('day', created_at) ROWS UNBOUNDED PRECEDING). An aggregate inside a window call is legal because grouping runs before windowing. The grouping key is unique per row here so ROWS and RANGE agree, but write the frame anyway — over ungrouped rows with tied timestamps the default RANGE frame pulls in every peer row and the total jumps.
  4. Newest per aggregate: DISTINCT ON (aggregate_id) ... ORDER BY aggregate_id, aggregate_version DESC is the cheap PostgreSQL-only form when an index matches that order; row_number() OVER (PARTITION BY aggregate_id ORDER BY aggregate_version DESC) = 1 is the portable form and needs a subquery for the same evaluation-order reason as the gap query.

Follow-up

  • Relay failover redelivers events. Does a duplicate break the gap query, and how would you detect one from this table alone?
  • Turn the gap check into a continuous monitor rather than a query someone runs after an incident. What does it watch?

Describe a challenging technical problem you’ve solved in a past project.

Medium · Technical / Domain Questions

Approach

  1. Pick a problem with a measurable symptom (latency, crash rate, memory growth, throughput) and a constraint that ruled out the obvious fix, and give the numbers before and after.
  2. Spend most of the answer on diagnosis: how I reproduced it, what I measured (profiler, logs, load test, git bisect) and which hypotheses I eliminated before finding the cause.
  3. Lay out the options I weighed, why I rejected each, and the trade-off I accepted with the chosen fix (added complexity, cost, a narrower feature).
  4. If the system drove hardware or ran in real time, say how I tested the fix without risking the physical system, for example with simulation or replayed logs.
  5. Keep ownership clear with "I" for my decisions and close with how I confirmed the fix held after release and what monitoring I added.

Follow-up

  • Which alternative came closest to being chosen, and what would have changed your mind?
  • How did you prove the fix addressed the root cause rather than masking the symptom?
  • What would you do differently if the same problem appeared today?

How do you ensure code quality and maintainability in your work?

Medium · Technical / Domain Questions

Approach

  1. Describe the layers: unit tests for pure logic, integration tests at boundaries (database, network, hardware interfaces), a small set of end-to-end tests, all run in CI on every pull request with merges blocked on failures.
  2. Automate the mechanical checks so review time goes to design: formatters, linters and type checks (clang-tidy and sanitizers such as ASan/UBSan for C++, mypy or a linter for Python, static analysis for Java).
  3. Keep changes reviewable: small pull requests, review for correctness, error handling, naming and missing edge-case tests; give one example where a review comment changed a design.
  4. Design for change: clear module boundaries and injected dependencies so hardware or remote services can be replaced by fakes in tests; avoid abstractions before a second use case exists.
  5. Track whether it works: flaky-test count, defects that escape to production, how long a typical change takes; tie refactors to feature work so debt gets paid down.

Follow-up

  • How do you handle a test that fails intermittently in CI?
  • A pull request works but is hard to follow. How do you push back without blocking delivery?
  • When would you accept lower test coverage, and how would you limit the risk?

What programming languages are you most comfortable with, and why?

Medium · Technical / Domain Questions

Approach

  1. Name one or two languages with evidence: what I built in each, its size, and a bug I fixed that required knowing the language well. Candidates report Java, Python or C++ among the role's requirements, so lead with whichever of those I know best.
  2. Explain the why through properties: C++ for control over memory and latency (RAII, no garbage-collector pauses), Python for tooling, scripting, test harnesses and data analysis, Java for long-running services with mature concurrency libraries.
  3. State the costs honestly: manual lifetimes and undefined behaviour in C++, GC pauses in Java, and the GIL limiting CPU-bound threads in standard CPython builds (multiprocessing or native extensions work around it).
  4. Prepare depth questions for the language I claim: C++ move semantics and unique_ptr vs shared_ptr; Python mutable default arguments, generators and the GIL; Java equals/hashCode contract and the memory model.

Follow-up

  • For a component with a strict latency budget, which language would you pick and why?
  • How does memory management differ between your two strongest languages, and when did that difference cause a bug?
  • What does shared_ptr cost compared with unique_ptr?

How would you design a system for real-time data processing?

Medium · System Design / Architecture

Approach

  1. Clarify first: event sources and rates, payload size, latency target (milliseconds vs seconds), per-key ordering, delivery guarantee and retention. Say whether this is an on-device control loop or soft real-time stream processing, because the designs differ.
  2. Outline the pipeline: producers write to a durable partitioned log (Kafka or Kinesis), stream processors (Flink, Kafka Streams or consumer services) transform and aggregate, and sinks feed a time-series store, a cache for live views and cold storage. Partition by a key such as device id to keep per-key order.
  3. Handle correctness: at-least-once delivery with idempotent consumers that deduplicate by event id, or Kafka transactions for exactly-once within Kafka; use event time with watermarks and windows so late events land in the right window.
  4. Plan for load: consumer lag is the main health signal, consumer parallelism is capped by partition count, queues are bounded, and telemetry may be sampled under pressure while commands are never dropped.
  5. Plan for failure: checkpoints and offset replay, a dead-letter queue for poison messages, and alerts on p99 end-to-end latency and lag.

Follow-up

  • How do you handle events that arrive out of order or after their window has closed?
  • One device or key produces most of the traffic. What happens to its partition, and how do you fix it?
  • How would you guarantee a command sent to a machine is applied exactly once?

Discuss the considerations you would take into account when designing a microservices architecture.

Medium · System Design / Architecture

Approach

  1. Draw boundaries by business capability, with each service owning its own data store; say when a modular monolith is the better start (small team, unclear domain boundaries).
  2. Choose communication per interaction: synchronous REST or gRPC when the caller needs an answer now, asynchronous events when it does not. Every remote call gets a timeout, retries with exponential backoff and jitter, and a circuit breaker; writes carry idempotency keys.
  3. Handle consistency without distributed transactions: sagas with compensating actions for multi-service workflows, and the transactional outbox pattern so a database write and its event publish cannot diverge.
  4. Cover operability: service discovery, an API gateway, distributed tracing (for example OpenTelemetry), central logs, per-service SLOs, independent CI/CD pipelines and versioned contracts with consumer tests.
  5. Name the costs: network latency, partial failures, harder local testing and debugging, more infrastructure. Splitting only pays off when teams and deploy cadences need independence.

Follow-up

  • A workflow writes to two services and the second write fails. How do you keep the data consistent?
  • How do you change a service's API without breaking the services that call it?
  • What signals would make you merge two services back together?

What are the trade-offs between different database systems you have used?

Medium · System Design / Architecture

Approach

  1. Frame each database by access pattern: relational (PostgreSQL, MySQL) for transactions, joins and constraints; key-value (Redis, DynamoDB) for low-latency lookups by key; document stores (MongoDB) for self-contained aggregates; wide-column (Cassandra) for heavy write throughput; time-series stores for telemetry.
  2. Only discuss systems I have used, and for each give the case: why it was chosen, what it did well, and what hurt (a query it could not serve, a migration, an operational burden).
  3. Cover consistency: relational ACID transactions and isolation levels; DynamoDB reads are eventually consistent by default with a strongly consistent option; Cassandra consistency is tunable per query (ONE, QUORUM, ALL).
  4. Cover scaling and indexing: indexes speed reads and slow writes; a single relational primary scales with vertical growth, read replicas and partitioning, while DynamoDB and Cassandra partition natively but force tables designed around known queries.

Follow-up

  • Tell me about a database choice that turned out wrong. How did you migrate off it?
  • How would you store high-rate sensor telemetry and query the last hour for one device?
  • Which isolation level did you run at, and which anomaly does it still allow?

How would you approach designing an API for a new feature?

Medium · System Design / Architecture

Approach

  1. Start from the consumers: who calls it (a UI, another service, a device), which operations they need, and what they do on failure. Choose REST for broad clients, gRPC for typed internal calls or streaming, events when the caller does not wait for a result.
  2. Define the contract: resources and operations, request and response schemas, validation, a stable error model (4xx for client errors, 5xx for server errors, machine-readable codes) and cursor-based pagination for lists that change.
  3. Make retries safe: GET, PUT and DELETE are idempotent by HTTP semantics, POST is not, so creates accept an idempotency key; long-running work returns 202 Accepted with a status resource to poll.
  4. Plan for change: additive-only changes within a version, an explicit version in the path or a header, a deprecation window; add authentication, authorization and rate limits.
  5. Write the spec first (OpenAPI or protobuf), review it with the consumers, then add contract tests so the implementation cannot drift from it.

Follow-up

  • A client times out on a create and retries. What stops a duplicate record?
  • How do you add a new required field without breaking existing clients?
  • Why cursor pagination instead of offset pagination for this endpoint?

Explain how you would ensure system reliability and availability.

Medium · System Design / Architecture

Approach

  1. Define the targets first: SLIs such as success rate and p99 latency, SLOs and an error budget. Know the arithmetic: 99.9% allows about 8.76 hours of downtime a year, and two 99.9% dependencies in series give roughly 99.8%.
  2. Remove single points of failure: multiple stateless instances behind health-checked load balancers, replicas across zones, replicated databases with tested failover, and backups that are actually restored in drills.
  3. Contain failures: timeouts on every call, retries with backoff and jitter, circuit breakers, bulkheads, load shedding and graceful degradation. For software that drives hardware, define the safe state the machine falls back to.
  4. Make change safe, since many outages follow a change: CI tests, canary or staged rollouts, feature flags and fast rollback.
  5. Detect and learn: alert on SLO burn rather than raw CPU, keep runbooks and on-call, run blameless postmortems, and use failure injection to check that the redundancy works.

Follow-up

  • How do you compute the availability of a request that crosses three services?
  • How do you stop retries from turning a partial outage into a full one?
  • What would you alert on for this system, and why not CPU usage?

Describe your method for estimating project timelines and deliverables.

Medium · Problem-Solving / Case Studies

Approach

  1. Break the work into tasks small enough to name their steps, and include the non-coding work: design review, testing, integration, deployment, documentation and review cycles.
  2. Estimate in ranges rather than single numbers, for example three-point estimates combined as (optimistic + 4 x most likely + pessimistic) / 6, and anchor them against how long similar past work actually took.
  3. List unknowns and dependencies explicitly, run a short spike on the riskiest one first, and hold separate buffer for integration and cross-team dependencies, where estimates usually slip.
  4. Communicate the estimate as a range with a confidence level and milestones, re-estimate when scope changes, raise slippage as soon as it appears, and offer scope cuts as an alternative to moving the date.
  5. Give a real example with estimate against actual, and what I changed in my method afterwards.

Follow-up

  • Tell me about an estimate you missed. What caused the miss?
  • How do you estimate work in an area you have never touched?
  • A stakeholder needs it in half the time. What do you do?

Present a case where you had to pivot your strategy due to unforeseen circumstances.

Medium · Problem-Solving / Case Studies

Approach

  1. Pick a case where new information invalidated the plan: a library or component failed a performance or reliability test, requirements changed mid-project, or an integration constraint surfaced late.
  2. Show the signal: what I observed, how I confirmed it was real (benchmark, prototype, test results) and how quickly I raised it.
  3. Walk through the decision: the options, the cost and risk of each, how I set aside work already sunk, who I consulted and why I chose the new direction.
  4. Explain how I re-planned and communicated: a revised scope and timeline shared early with the people depending on the work.
  5. End with a measurable result and the habit it left, such as spiking risky dependencies before committing to them. The story fails if the pivot was someone else's decision or if it blames others.

Follow-up

  • Looking back, could you have spotted the problem earlier, and how?
  • What did the pivot cost in time or scope, and how did you justify it?
  • How did the team or stakeholders react, and how did you handle disagreement?

Given a hypothetical scenario of a failing system, how would you approach troubleshooting?

Medium · Problem-Solving / Case Studies

Approach

  1. Assess impact and stabilise first: who is affected and how badly, then mitigate (roll back, fail over, disable a feature flag) before hunting the root cause if users are hurting.
  2. Build a timeline: what changed and when (deploys, config, traffic, dependencies, hardware or network), lined up against when the symptom started.
  3. Use the telemetry systematically: rate, errors and duration per service; utilisation, saturation and errors per resource; logs correlated by request id; traces to find which hop fails. Check that the monitoring itself is not the broken part.
  4. Test one hypothesis at a time and bisect: by component, by host, by commit (git bisect), by input. Reproduce in staging or with replayed inputs or simulation where touching the live system is risky.
  5. Close it out: fix the root cause, add a test and an alert that would have caught it, and write a blameless postmortem with owners for each follow-up.

Follow-up

  • Errors appear on only some hosts. What do you compare first?
  • Every dashboard is green but users report failures. Where do you look?
  • How do you decide between rolling back and fixing forward?

Suggested practice checklist

The plan follows the three reported rounds: coding fundamentals first, then system design and troubleshooting, then behavioral stories and a full run-through of an onsite. Each day names the reported questions it practises.

Day 1 — Map the loop and build the story bank

  • Write out the three reported rounds (Recruiter Phone Screen, Technical Interviews, Onsite Interview) and mark which question types each stage covers.
  • List five projects you know well and, for each, note the language used, your decisions and the result.
  • Match each project to the reported behavioral prompts it could answer, so every prompt has a story and no story is used for all of them.

Deliverable: A one-page loop map and a story-bank table linking each of five projects to the behavioral prompts it can answer.

Day 2 — Coding fundamentals in your strongest language

  • Write string reversal in Java, Python or C++ on paper in two ways (in place and building a new string) and state the complexity of each.
  • Write binary search for a sorted array, then a variant that finds the first occurrence among duplicates. Test empty, one-element and absent-target cases.
  • Practise explaining the time and space complexity of each solution out loud as you finish it.

Deliverable: Handwritten solutions for string reversal and sorted-array search, each with a stated complexity and a list of tested edge cases.

Day 3 — Live data-structure problems without an IDE

  • Solve three data-structure problems by hand, one each with a hash map, a stack or queue, and a heap or linked list, narrating your choice of structure.
  • For each, write the brute-force approach and its complexity before the improved one.
  • Trace one solution on a small input and then on an edge case, as you would on a whiteboard.

Deliverable: Three solved problems, each with the chosen structure, brute-force and final complexity, and a traced test case.

Day 4 — System design I: real-time data processing and API design

  • Design a real-time data processing pipeline: ingestion, processing, storage and consumers. Name the delivery guarantee, how you handle a slow consumer, and what you monitor.
  • Design an API for a new feature: resources, error codes, idempotency keys for retries, pagination and versioning.

Deliverable: A diagram and a one-page write-up for the data pipeline, and an API specification with its error and retry behavior.

Day 5 — System design II: microservices, databases and reliability

  • Write a checklist for splitting a system into microservices: service boundaries, synchronous versus asynchronous calls, data ownership, tracing and deployment.
  • Compare two databases you have used (for example relational versus key-value) on consistency, query shape, scaling and operations.
  • Outline how you would keep a service available: redundancy, health checks, timeouts, retries with backoff, graceful degradation, and the signals you alert on.

Deliverable: A microservices checklist, a two-database comparison table, and a reliability outline that names its alerts and failure modes.

Day 6 — Troubleshooting, estimation and technical stories

  • Write a step-by-step troubleshooting script for a failing system: what changed, what the signals show, how to narrow the search, how to mitigate first, then find the root cause.
  • Write your estimation method: break work down, estimate by piece, add risk and buffer, and re-plan as you learn. Prepare a story of a pivot when plans changed.
  • Prepare the project story about a challenging technical problem you solved, and short answers on code quality and maintainability, and on the languages you are most comfortable with and why.

Deliverable: A troubleshooting script, a written estimation method with a pivot story, and notes for the problem-solving, code-quality and languages answers.

Day 7 — Behavioral answers out loud and an onsite run-through

  • Answer aloud and record the lifecycle, Git, collaboration, conflict, motivation, leading and deadline prompts, using "I" and a specific result in each.
  • Run a mock onsite: one coding problem, one design problem and one behavioral story back to back, with no notes.
  • Listen to the recordings and trim any story that never states a decision of yours; note one follow-up question for each.

Deliverable: Recorded answers to seven behavioral prompts, plus a short list of fixes from the mock onsite.

Stories to prepare for the behavioral prompts

Candidates report behavioral prompts about collaboration, conflict, motivation, taking the lead and prioritising under deadlines, alongside two experience questions about the software development lifecycle and Git. The onsite is described as covering team fit as well as technical skills, and the role's listed work includes code review, working with product managers and engineers, and troubleshooting. Prepare stories that show your own decisions and their results.

  1. Describe a scenario where a project did not go as planned and how you handled it.

Explain the software development lifecycle and your experience with it.

Medium · Technical / Domain Questions

Approach

  1. Pick one real project and walk through the lifecycle in the order you lived it: how requirements arrived, who shaped the design, how work was split into iterations, how changes were reviewed, tested and released, and how you watched the result in production. A list of textbook phases with no project behind it is the weak version of this answer.
  2. Name the methodology you actually worked in (the requirements candidates describe for this role list Agile and Scrum) and say what it looked like in practice: planning, standups, backlog refinement, retrospectives, and one thing the team changed because of a retrospective.
  3. Cover the middle stages that people skip: code review rules, automated tests at more than one level, the CI pipeline that gated merges, the release step and the rollback path. Reported responsibilities for this role include code reviews and continuous integration and deployment, so this is where concrete detail helps.
  4. Say where the process hurt and what you changed, such as a late requirements change, a flaky test suite or a release that needed a hotfix. If you ever tested in simulation or staging before touching real hardware or production, explain where that stage sat in your cycle.

Follow-up

  • How did your process differ for an urgent hotfix compared with a planned feature?
  • Where does Agile work badly, for example when hardware lead times or long test cycles dominate the schedule?
  • What would you change about the process on your last team?

Discuss your experience with version control systems, specifically Git.

Medium · Technical / Domain Questions

Approach

  1. Start with the workflow you used daily: a branch per change, small commits whose messages explain why, pull requests reviewed before merge, and whether the team used trunk-based development or longer-lived feature and release branches. Say why that workflow suited the team.
  2. Be exact about merge versus rebase. A merge keeps both histories and adds a merge commit. A rebase replays your local commits onto a new base for a linear history, so never rebase commits other people have already pulled. Mention squash merges and when you chose each option.
  3. Bring one recovery or debugging story. Examples: git bisect to find the commit that introduced a regression, git reflog to recover a branch after a bad reset, git revert to undo a commit already on a shared branch, or cherry-pick to carry a fix onto a release branch. Say what went wrong and what you ran.
  4. Cover conflict resolution and safety habits: pull often, keep changes small, resolve by understanding both sides, and rerun tests after resolving. Prefer force-with-lease to a bare force-push, and mention protected main branches, required reviews and release tags.

Follow-up

  • You pushed a bad commit to main. How do you undo it, and why use revert instead of reset?
  • When is rebasing a shared branch acceptable, and when is it dangerous?
  • How would you use bisect to find a regression when some commits in the range do not build?

Describe a time when you had to work collaboratively to complete a project.

Medium · Behavioral / Leadership

Approach

  1. Choose a project that needed several people or teams. State your own piece in the first two sentences, then name the dependencies on others. Use "I" for what you did and describe teammates' contributions separately, so the story shows your role and not only the team's.
  2. Show the mechanics of collaboration: how the interfaces between your work and others' were agreed (an API contract, a shared design document, a review checkpoint), how you stayed in sync, and how you handled a handoff or a blocked dependency.
  3. If the project crossed disciplines, say how you translated between them. Reported responsibilities for this role include working with product managers and other engineers to define specifications, so a story that spans those roles fits well.
  4. End with the result and one thing you would change. The mistake that sinks this answer is a story where everything went smoothly and you cannot name a single decision that was yours.

Follow-up

  • What was the hardest misunderstanding or disagreement on that project, and how did it resolve?
  • What did a teammate do that you would not have thought of yourself?
  • How did you handle a teammate who was falling behind schedule?

How do you handle conflict within a team?

Medium · Behavioral / Leadership

Approach

  1. Pick a real disagreement about substance, such as a design choice, review feedback or scope, rather than a personality clash you cannot explain. State what each side wanted and why both positions were reasonable.
  2. Describe your steps: you listened until you could restate their argument, found the shared goal, then moved the discussion to evidence such as a small prototype, a benchmark or a failure case. If you still could not agree, you involved the person who owned the decision.
  3. Give the outcome honestly, including a time you were wrong or compromised. A disagree-and-commit story works when you explain how you supported the final decision afterwards.
  4. Close with the relationship afterwards and one habit you kept, such as agreeing on criteria before debating or writing decisions down. Avoid saying you have never had conflict, and avoid casting the other person as the villain.

Follow-up

  • What would you have done if the evidence had been inconclusive?
  • Has the disagreement ever been with your manager or a more senior engineer, and how did you handle it?
  • What did you change about the way you disagree after that episode?

What motivates you to perform at your best?

Medium · Behavioral / Leadership

Approach

  1. Name two or three real motivators and attach a moment to each, rather than listing adjectives. For example, a project where you stayed with a problem because another system or user depended on it, or a debugging session you could not put down.
  2. Choose motivators that fit this work. Reports describe software that drives robots in warehouses, so motivation from seeing software act on physical systems, solving problems in real time or building dependable systems is credible only if you can back it with something you built or studied.
  3. Show what you do to stay at your best when conditions are poor: repetitive tasks, a tight deadline or blunt feedback. That turns a soft answer into evidence.
  4. Avoid answers that are only about pay, title or praise for the company. Keep the answer short and specific, and leave room for the follow-up.

Follow-up

  • Tell me about a time your motivation dropped and what you did about it.
  • What kind of work drains you, and how do you manage it?
  • How does what motivates you fit the day-to-day work of this role?

Give an example of when you took the lead on a project.

Medium · Behavioral / Leadership

Approach

  1. Pick a project where nobody handed you authority: you saw the need, put forward the approach and others followed. Define the goal and the scale (people involved, scope, stakes) in one or two sentences.
  2. Explain how you organised the work: how you broke it into pieces, how you assigned them, what review and testing standards you set, and how often the group checked in.
  3. Include a hard moment such as a teammate stuck, a scope change or a slipping deadline, and say what you did: pair on it, cut scope, or escalate early.
  4. Report the result with specifics (shipped, fewer defects, faster releases) and what the team could do afterwards that it could not before. The mistake is listing tasks you did alone and calling it leadership, or claiming all the credit.

Follow-up

  • How did you decide who worked on which piece?
  • What did you do when a teammate disagreed with your plan?
  • What would you do differently if you took the lead on it again?

How do you prioritize tasks when working under tight deadlines?

Medium · Behavioral / Leadership

Approach

  1. Describe the method before the story: list everything due, estimate effort and risk for each item, mark dependencies and the critical path, and rank by impact against effort so high-value, low-cost work goes first. Name a technique you really use, such as an impact and effort grid, MoSCoW or critical-path planning.
  2. Tell one concrete case: what the deadline was, what you cut or deferred, and how you treated scope as the lever rather than quality. Tests and review on the parts that shipped stayed in.
  3. Show the communication: who you told about the trade-off, when, and with which options, so stakeholders chose with full information. Say how you re-planned when something changed midway.
  4. Include the cost: what you left undone, what you logged as follow-up work, and whether the call was right in hindsight. Claiming you simply worked longer hours is not prioritisation and weakens the answer.

Follow-up

  • Two stakeholders each say their task is the top priority. How do you decide?
  • When do you push back on the deadline instead of cutting scope?
  • What did you cut, and did it turn out to be the right call?