cswork / libraryOpen practice workspace

Interview guides · Abbott

Abbott Software Engineer Interview Guide

Abbott Software Engineer interview guide: four reported rounds, behavioral, React, SQL, Kafka and medical-device questions, with a 7-day prep plan.

The 60-second brief

Candidates link Abbott software roles to several kinds of product. The names that come up are the Lingo continuous biosensor, web storefronts, cardiac and vascular devices, diagnostic instruments and cloud systems, and the business units mentioned are Lingo, Vascular, Heart Failure, Electrophysiology and Diagnostics. Reports describe two broad kinds of work. Teams on consumer-facing digital health are said to build microservices, web front ends and pipelines that handle continuous health signals. Teams on devices and diagnostics are said to write application code, automated verification and compliance records such as the Design History File (DHF), with FDA QSR and ISO 13485 named as frameworks. Which of the two you face depends on the unit that hires you.

This guide is for Software Engineer candidates at Abbott, whether the target team builds web products, backend services or software for devices and diagnostics. It covers the four reported stages and twenty reported questions in four groups of five: behavioral, frontend and full-stack, backend and databases, and systems engineering and verification. It also has a seven-day plan that spends time on each group.

Candidates report four stages in order: HR Screen, Technical Evaluations, Onsite Tour and Final Panel. Overall timelines are reported as roughly three to five weeks, with some accounts stretching to six.

Focus areas

  • Behavioral Interviewing (STAR method)
  • Competency-Based Interviewing
  • Problem Solving

Overview

The reported questions fall into four groups, and the groups map onto different kinds of team. For frontend work candidates list React, Next.js (App Router and Server Components), TypeScript, Storybook, Tailwind CSS, Vitest, Jest, Playwright and Turborepo. For backend work they list Node.js, C#/.NET, Java and Go services, SQL Server, Oracle and PostgreSQL, and Kafka or RabbitMQ for streaming data. The systems questions cover secure device-to-cloud design, testing strategy, traceability and risk analysis. You will not need all four groups at equal depth: pick the ones that match the unit you are targeting, then make sure the behavioral stories are sharp, because they apply to every unit.

Candidates describe the hands-on tasks as practical rather than puzzle-based: writing SQL, reviewing live code or a pull request, working a system-design scenario and solving a logic exercise from the team's field, plus an architecture presentation for some mid-to-senior roles. So practise the real tasks. Write table definitions with keys and constraints, review a React component out loud and name the bugs, and sketch how a device telemetry stream is ingested, validated and stored.

A recurring theme in the reports is quality. Candidates mention requirements traceability, unit, integration and end-to-end validation, FMEA, ISO 13485, ISO 14971 and HIPAA, and they advise bringing up testing, error handling and edge cases in every technical answer. If you have no regulated-industry background, learn the vocabulary well enough to describe how a requirement becomes a test case and how a risk becomes a mitigation. Finally, candidates say the resume is examined line by line, so every technology, standard and method you list should come with a decision you made, something that went wrong, and how you know it worked.

The Abbott interview process

Candidates describe four stages in this order. The reported questions are grouped by topic, not by stage, so use the stages to plan your preparation rather than to predict which question appears where.

HR Screen

Candidates describe the HR Screen as a first conversation in which HR checks your background against the role. Reports also advise raising compensation expectations with the recruiter at this point, because roles are tied to pay bands. Treat it as the place to tell your resume story cleanly and to learn which unit and work arrangement the role belongs to.

What to demonstrate

  • How well your background matches the role you applied for
  • How clearly you can summarise your own experience and the technologies on your resume
  • Candidate fit and qualifications, which is the reported purpose of the screen

How to prepare

  • Rehearse a spoken run through your resume in order, with one sentence on the purpose of each technology, standard or methodology you list.
  • Write a specific answer to why you want to work at Abbott that names a business unit (Lingo, Vascular, Heart Failure, Electrophysiology or Diagnostics) and what its software involves.
  • Decide your compensation expectations and ask which stages follow, whether the role is site-specific, and whether it is onsite, hybrid or remote.

Technical Evaluations

Candidates describe Technical Evaluations as hands-on checks of technical skill: exercises in code, work in SQL, or an architecture presentation. Reports of the wider loop also mention reviewing a pull request, writing relational schemas and queries, design scenarios and domain-specific logic exercises, and a panel presentation for some mid-to-senior roles. Reports do not say which of these a given candidate gets, so prepare the groups that match your target team.

What to demonstrate

  • Working code or SQL when the exercise is hands-on
  • Design reasoning, including the alternatives you rejected and why
  • How clearly you explain technical choices when you present or review

How to prepare

  • Write a PostgreSQL schema with primary keys, foreign keys, NOT NULL, UNIQUE and CHECK constraints, then run inserts that should fail, so the validation rules are proven.
  • Review a React component that has a fetch effect, a list and a form, and say aloud what is wrong, in order of severity.
  • Build a short architecture presentation from a past project that states the options you weighed and the one you picked.
  • Work through the event-batch and rolling-failure-rate practice drills to get fluent at stream-style logic.

Onsite Tour

Candidates report an Onsite Tour for site-specific roles, where you observe the operational environment in person. No format for the tour is reported. It is a chance to connect software to the physical setting, and candidates suggest having questions ready about team practices.

What to demonstrate

  • Nothing is reported about what the tour assesses; candidates describe it as a chance to observe the operational environment
  • No question format is reported for this stage

How to prepare

  • Read up on the business unit you are visiting and write down what its software must do, such as ingest sensor data, drive a device or support diagnostics.
  • Prepare questions about development practices, technology decisions, deployment cadence and how engineering works with other departments.
  • Keep your hardware-and-software troubleshooting story ready, since it ties software to physical equipment.

Final Panel

Candidates describe the Final Panel as interviews with leadership, and report that panel members take turns asking targeted questions about your technical expertise and project outcomes. Prepare to speak about your past projects at the level of results and trade-offs rather than syntax.

What to demonstrate

  • Overall fit and alignment with company values, the reported purpose of the final interviews
  • Technical expertise, which candidates report panel members ask about directly
  • The outcomes of your past projects, another reported topic of the panel's questions

How to prepare

  • Choose three stories (a wrong technical decision, a disagreement, an explanation to a non-technical partner) and write each in situation, task, action, result form with your own decision highlighted.
  • Practise your architecture presentation with interruptions, answering a follow-up and then returning to your outline.
  • Rehearse telling a business stakeholder who wants an immediate release about a serious bug, covering impact, options and a remediation timeline.

Where candidates lose points

Reviewing the React component by listing naming and formatting nits while missing an effect that races or a stale closure

Do a first pass for correctness only: effect dependencies, who owns each piece of state, keys, cancellation and cleanup, loading, error and empty states. Then comment on performance, accessibility and style. Mark each comment as blocking or optional so the reviewer hears a verdict, not a pile of remarks.

Writing table definitions that only list columns, with no keys, foreign keys or validation rules

The reported SQL task asks for relationships and data validation, so show primary keys, foreign keys with a stated delete behaviour, NOT NULL, UNIQUE and CHECK constraints, and indexes on foreign key columns. Then insert rows that should be rejected, to show the rules fire. Know the dialect differences in case your team names a database: PostgreSQL writes GENERATED ALWAYS AS IDENTITY where SQL Server writes IDENTITY(1,1); SQL Server allows only one NULL under a UNIQUE constraint while PostgreSQL allows several; SQL Server uses TOP where PostgreSQL uses LIMIT; Oracle uses NUMBER types and sequences.

Answering the streaming design question with 'put Kafka in the middle' and nothing about keys, delivery or invalid data

State a partition key (such as a device identifier so a device's readings stay ordered), at-least-once delivery with idempotent consumers so a redelivery does nothing twice, schema validation at ingest, a dead-letter queue for messages that fail validation, and how consumer lag is monitored. Compare Kafka and RabbitMQ on retention, replay and routing.

Treating the testing and regulatory questions as 'we test everything' with no structure

Describe how a requirement traces to test cases, what belongs at unit, integration and end-to-end level, how a hazard analysis such as FMEA ranks failure modes and drives mitigations and extra tests, and where design records such as the DHF fit. If you have not worked in a regulated setting, say so and describe the closest process you have followed.

Behavioral answers told entirely in 'we', or a 'wrong decision' story whose mistake is really a strength

For every story, say what you personally decided or built, what it cost, and what changed afterwards. Rehearse the wrong-decision, conflict and non-technical-explanation stories until each has a clear action and a verifiable result. Because candidates report resume questions line by line, make sure each project you tell can withstand follow-ups about technology choices.

Questions & practice

Collapse a redelivered event batch into per-aggregate high-water marks

Easy · hashing · at-least-once · aggregation

You drain a batch of up to 5,000,000 events, each (aggregate_id BIGINT, aggregate_version INT, event_type, payload). The log guarantees order within one aggregate only; the batch merges 64 partitions, and a relay failover has redelivered a range, so an older version for an aggregate can appear after a newer one. Given a map of last_applied_version per aggregate, produce the events worth applying, at most one per (aggregate_id, version), plus the count discarded. Target O(n) time. State the memory for 2,000,000 distinct aggregates and what you do when it does not fit.

Approach

  1. One pass, one hash map from aggregate_id to the highest version kept, and a discard counter. An event whose version is at or below last_applied_version for its aggregate is dropped without further work, which is the whole reason the event carries its version rather than a delta. O(n) expected time, O(d) space in distinct aggregates.
  2. Keep the maximum, never the last occurrence. The redelivered range means the final appearance of an aggregate in the batch can be an older version than one seen earlier in the same batch, so last-wins applies stale state over newer state and the projection regresses with no error anywhere.
  3. Cost the memory instead of calling it large: an 8-byte key plus a 4-byte version is 12 bytes of payload, and an open-addressed table held at a 0.7 load factor costs roughly 17 bytes per entry before per-slot metadata, so 2,000,000 aggregates is tens of megabytes in a native layout and several times that in a runtime that boxes both key and value.
  4. If the distinct set exceeds memory, partition on hash(aggregate_id) mod P and reduce each partition independently. Every event for one aggregate hashes to the same partition, so the per-partition result is exact and the merge is concatenation rather than a second reduction.

Follow-up

  • The payload is a patch rather than a snapshot, so applying only the highest version loses the intermediate changes. What changes in your reduction?
  • How do you detect that version 7 arrived while version 6 was never delivered, and what should the consumer do about the gap?

Identify the heaviest tenants in a five-minute window under memory pressure

Medium · top-k · heavy hitters · streaming

The edge service handles about 3,000 requests per second across roughly 50,000 tenants, peaking near 9,000. Expose the 50 heaviest tenants by request count over the trailing five minutes so limits can be tightened before one tenant's backfill starves the fleet. You may not retain five minutes of raw records. Give the exact solution and its memory, then the bounded-memory approximation with its error stated as a formula, and say which you would ship and at what tenant cardinality that choice changes.

Approach

  1. Do the exact version first, because it is affordable at this cardinality: a ring of 300 one-second counters per tenant, advanced lazily, is 1,200 bytes of counters per tenant and roughly 60 to 90 MB for 50,000 tenants with overhead. Carry a running total and subtract the bucket you overwrite so a window read is O(1) rather than 300 adds.
  2. Extract the top 50 with a size-k min-heap over the tenant sums: O(d log k) for d tenants, against O(d log d) to sort them all. Maintaining the heap continuously instead of on query requires a tenant-to-heap-index map, because incrementing a count already inside the heap means sifting from a known position, and without that map you rebuild the heap on every request.
  3. State the approximation precisely rather than gesturing at sketches. Misra-Gries with m counters retains every item whose true count exceeds N/(m+1), and each retained count underestimates the truth by at most N/(m+1). With m = 1,000 and N = 900,000 requests in the window the error is roughly 900 requests, which is fine for spotting a tenant sending 50,000 and useless for ranking two tenants 200 apart.
  4. Say what breaks when the window slides: Misra-Gries and Space-Saving are insert-only and cannot be decremented as records age out. The workable construction is one summary per sub-window, say ten seconds, with 30 summaries merged at query time, and the merged error is the sum of the per-summary errors, so the bound degrades linearly in the number of sub-windows.

Follow-up

  • The heaviest tenant is heavy because of one export job rather than user traffic. Should the limiter treat those as the same tenant?
  • Two tenants sit tied at the boundary of the top 50. Does your answer flap, and does the flapping matter?

Track a rolling failure rate per destination for circuit decisions

Easy · sliding window · ring buffer · circuit breaker

The egress service delivers about 1,500 webhooks per second across roughly 40,000 destinations, each call bounded by a 10 second timeout. Maintain, per destination, the failure rate over the trailing 60 seconds so a caller can ask before dispatch whether the circuit should open. Attempts arrive as (destination_id, finished_at_ms, outcome). Requirement: amortised O(1) per attempt, with total memory bounded by the destination count rather than by traffic. Give the structure, its exact memory, and the rule that stops a destination with three attempts from opening a circuit.

Approach

  1. Name the exact-deque version and then reject it as the default. Holding timestamps and advancing a tail pointer past anything older than now minus 60 seconds is a correct two-pointer window at amortised O(1) per attempt, but its memory tracks in-window traffic, so one destination in a retry storm holds hundreds of thousands of entries while thousands of quiet destinations hold none.
  2. Use a ring of 60 one-second buckets per destination, each bucket a pair of counters for attempts and failures. On an attempt, advance the ring by the elapsed whole seconds, zeroing at most min(elapsed, 60) buckets, then increment the head. That is amortised O(1) with a fixed footprint per destination.
  3. State the footprint: 60 buckets times two 4-byte counters is 480 bytes of payload per destination, so 40,000 destinations is roughly 20 to 25 MB with per-entry overhead, bounded by the catalogue rather than by the rate. The cost is granularity, since the oldest bucket ages out in whole seconds, which is far tighter than the decision needs.
  4. Require a minimum sample before the circuit may open. A destination with three attempts and three failures reads as 100 percent and is not evidence; a floor of roughly 20 attempts in the window makes the ratio meaningful, and below that floor use a run of consecutive failures as the trigger instead.

Follow-up

  • The fleet is 30 instances and each sees roughly a thirtieth of a destination's traffic. Where does the rate actually live, and what does a per-instance answer get wrong?
  • A destination answers in 9.5 seconds and succeeds. It is not failing but it is consuming your per-destination concurrency. What signal should open the circuit here?

Write SQL queries to create relational database tables, establish key relationships, and enforce data validati

Medium · Backend Systems, Databases & Cloud Infra

Write SQL queries to create relational database tables, establish key relationships, and enforce data validation rules.

Approach

  1. Start from the entities and their relationships, for example customers, products, orders and order_items. Use surrogate primary keys (GENERATED ALWAYS AS IDENTITY in PostgreSQL, IDENTITY in SQL Server, identity columns or sequences in Oracle) and foreign keys from orders to customers and from order_items to both orders and products.
  2. Encode the rules declaratively: NOT NULL, UNIQUE on email, CHECK (quantity > 0), CHECK (unit_price >= 0), and a CHECK or lookup table for status values. Store money as NUMERIC/DECIMAL, never float, and use DEFAULT for timestamps.
  3. Choose the referential action deliberately: ON DELETE RESTRICT for orders (history must survive), CASCADE only for true children such as order_items. Add a UNIQUE (order_id, product_id) if a product appears once per order.
  4. Index the foreign key columns yourself: PRIMARY KEY and UNIQUE create indexes, but PostgreSQL and SQL Server do not index FK columns automatically, so joins and parent deletes would scan the child table.
  5. Know the limits: a CHECK cannot reference another table, so a rule like stock never going negative under concurrent orders needs a transaction with an atomic UPDATE ... SET on_hand = on_hand - qty WHERE on_hand >= qty (or SELECT ... FOR UPDATE). Also note that NULL handling in UNIQUE differs between PostgreSQL and SQL Server.

Follow-up

  • Product prices change later. How does the schema keep the price a customer actually paid?
  • How would you add a NOT NULL column to a large table that is live in production?
  • Would you use soft deletes here, and what does that do to your foreign keys and unique constraints?

Stop tag and share joins from fanning out a page

Medium · join fan-out · semi-joins · many-to-many

resource_tag is (resource_id, tag_id) with PK (resource_id, tag_id); resource_share is (resource_id, shared_with_user_id, permission). The tagged-and-shared listing inner-joins resource to both, filters tenant_id, tag_id = ANY($2) and shared_with_user_id = $3, orders by updated_at DESC and takes 50. Pages come back with fewer than 50 distinct resources and the total in the header is far too high. Explain the row multiplication, rewrite both the page query and the count query so each is correct, and name the index each one needs. PostgreSQL 16.

Approach

  1. Do the arithmetic against the predicates that are actually there. An inner join emits one row per matching child row, and both joins are filtered: tag_id = ANY($2) admits only the requested tags, shared_with_user_id = $3 admits one user's share rows. So a resource holding three of the requested tags and shared with $3 once yields three rows, not one — the multiplier is its count of matching tags times its share rows for that single user, and that second factor is 1 unless the table admits duplicate (resource_id, shared_with_user_id) pairs. LIMIT 50 then limits rows rather than resources, and COUNT(*) counts pairs — the header is the product, not the population.
  2. Reject DISTINCT as the fix. It deduplicates after the product has been built, so the planner must materialise and sort the fanned-out set before the LIMIT can apply, and it leaves any SUM or AVG in the same select list wrong.
  3. Rewrite both filters as semi-joins, keeping resource as the only row source: AND EXISTS (SELECT 1 FROM resource_tag rt WHERE rt.resource_id = r.resource_id AND rt.tag_id = ANY($2)) and the same shape against resource_share. A semi-join stops at the first match per resource and preserves the driving index order, so ORDER BY updated_at DESC, resource_id DESC LIMIT 50 still stops after 50 rows.
  4. Count with the same predicates and no join at all: SELECT count(*) FROM resource r WHERE r.tenant_id = $1 AND r.status = 'active' AND EXISTS (...) AND EXISTS (...). Nothing multiplies a resource, so the number is the population.

Follow-up

  • The filter changes from 'any of these tags' to 'all of these tags'. Rewrite it and state what it costs relative to the ANY form.
  • A resource can be shared with the same user twice under different permissions. Does your count change, and should it?

How would you structure a TypeScript monorepo to balance code sharing with independent application deployment?

Medium · Frontend & Full-Stack Engineering

Approach

  1. Lay it out as apps/* (one folder per deployable app) and packages/* (shared ui, types, config, api-client), wired with pnpm, npm or yarn workspaces. Each package exposes a public API through its package.json exports field, and deep imports into another package's src are blocked.
  2. Share one base tsconfig and use TypeScript project references (composite: true, tsc -b) so type-checking is incremental and follows the dependency graph instead of recompiling the whole repo.
  3. Orchestrate with Turborepo: a build task with dependsOn ^build, content-hash caching (remote cache in CI), and filters such as turbo run build --filter=web... so a pipeline builds only one app and its dependency closure.
  4. Independent deployment: each app has its own pipeline triggered only when the app or a package it depends on changes. Internal packages consumed as workspace:* keep a breaking change atomic in one PR; anything consumed outside the repo is versioned and published (for example with Changesets).
  5. Guardrails: CODEOWNERS per package, a boundary lint rule (eslint import restrictions or dependency-cruiser), and a single version of React across apps to avoid duplicate React instances and broken hooks.

Follow-up

  • A change to the shared UI package would redeploy every app. How do you limit that?
  • Two apps need different major versions of React. What do you do?
  • How do you keep CI time flat as the number of apps grows?

How do you optimize web applications for Core Web Vitals, client-side rendering performance, and accessibility

Medium · Frontend & Full-Stack Engineering

How do you optimize web applications for Core Web Vitals, client-side rendering performance, and accessibility (WCAG 2.1)?

Approach

  1. Measure before optimizing: field data (CrUX, or RUM via the web-vitals library) at the 75th percentile, then Lighthouse and the Performance panel to diagnose. The targets are LCP at or under 2.5 s, INP at or under 200 ms (INP replaced FID in March 2024) and CLS at or under 0.1.
  2. LCP: find the LCP element, never lazy-load it, give it fetchpriority="high" or a preload, serve AVIF/WebP with srcset, cut TTFB with SSR or streaming plus a CDN, and remove render-blocking CSS and JS.
  3. INP and client rendering: break up long tasks (over 50 ms), code-split with dynamic import or React.lazy, defer third-party scripts, use the React Profiler to find needless re-renders (memo, stable props, state colocated lower), virtualize long lists, and use useTransition for non-urgent updates.
  4. CLS: set width and height or aspect-ratio on images and embeds, reserve space for banners and late content, and use font-display with a size-matched fallback font.
  5. WCAG 2.1 AA: semantic HTML before ARIA, full keyboard operation with visible focus, labels tied to inputs, text alternatives, 4.5:1 contrast for body text (3:1 for large text and UI components), and reflow at 320 CSS px. Automate axe checks in Playwright, then do a manual screen-reader pass.

Follow-up

  • Lighthouse reports a good LCP but field data says poor. What explains the gap?
  • A filterable list re-renders on every keystroke. How do you find and fix it?
  • How do you make a custom dropdown accessible to keyboard and screen-reader users?

Describe how you would build a dynamic, multi-step user checkout flow with form validations and external payme

Medium · Frontend & Full-Stack Engineering

Describe how you would build a dynamic, multi-step user checkout flow with form validations and external payment gateway integrations.

Approach

  1. Model the flow as an explicit state machine (cart, shipping, payment, review, confirmation) with one source of truth for form data, a URL per step so back and refresh work, and progress persisted in a server-side cart or session storage.
  2. Validate each step with a schema (for example zod) shared by client and server. The client validates for UX (on blur, with an accessible error summary); the server re-validates everything and recomputes prices, tax and totals instead of trusting the client.
  3. Use the gateway's hosted fields or tokenization so card data never touches my servers, which shrinks PCI DSS scope. The server creates the payment intent with the server-computed amount, and the client handles 3-D Secure / SCA challenges.
  4. Make payment idempotent: one idempotency key per order attempt, a disabled submit button while in flight, and order states pending, authorized, paid and failed. Treat the gateway's signed webhook as the source of truth and handle duplicate or out-of-order webhook deliveries.
  5. Edge cases and tests: price or stock changing between steps, expired sessions, declined cards, and a user abandoning mid-3DS. Cover them with unit tests on the schemas and Playwright end-to-end runs using the gateway's test cards.

Follow-up

  • The user pays and closes the tab before the redirect. How does the order end up marked paid?
  • The client times out and retries the payment call. How do you guarantee one charge?
  • When do you reserve inventory, and when do you release it?

How do you design event-driven microservices using messaging queues like Kafka or RabbitMQ for processing stre

Medium · Backend Systems, Databases & Cloud Infra

How do you design event-driven microservices using messaging queues like Kafka or RabbitMQ for processing streaming data?

Approach

  1. Pick the broker for the workload. Kafka is a partitioned, retained log: per-partition ordering, replay, and consumer groups tracking offsets. RabbitMQ routes messages through exchanges to queues with per-message acks, which suits task distribution and flexible routing. For device telemetry, Kafka keyed by device_id keeps each device's events in order.
  2. Assume at-least-once delivery and make consumers idempotent: dedupe on an event id or upsert on (device_id, sequence), and commit offsets only after processing. Kafka's exactly-once covers read-process-write within Kafka transactions, not side effects in external systems.
  3. Avoid dual writes between the database and the broker with a transactional outbox (or change data capture). Version event schemas with Avro or Protobuf in a schema registry and only make backward-compatible changes.
  4. Plan for failure: retries with backoff, a retry topic, a dead-letter queue for poison messages, and alerts on consumer lag. Partition count caps useful parallelism, since consumers beyond the partition count in a group sit idle.
  5. Shape the pipeline as ingest, validate, enrich, then store (for example a time-series store). Handle late or out-of-order events by event time rather than arrival time.

Follow-up

  • One noisy device creates a hot partition. What do you change?
  • A bug corrupted a week of processed data. How do you reprocess it?
  • How do you retry a failed message without breaking per-device ordering?

How do you implement robust authentication, authorization, and rate-limiting across distributed API gateways?

Medium · Backend Systems, Databases & Cloud Infra

Approach

  1. Authentication at the gateway with OIDC/OAuth 2.0: short-lived JWT access tokens validated locally (signature against a cached JWKS selected by kid, plus iss, aud and exp), refresh tokens for sessions, and mTLS for service-to-service calls.
  2. Authorization in two layers: coarse scope checks at the gateway, fine-grained checks (resource ownership, RBAC or ABAC) inside each service, deny by default. Propagate identity as a signed token, not a plain header a caller could forge. A policy engine such as OPA is one option for keeping rules consistent.
  3. Rate limiting with a token bucket (burst plus steady refill) or a sliding-window counter, keyed by API key, user or IP. Shared state lives in Redis and is updated atomically (Lua script or INCR with EXPIRE).
  4. Trade-offs: a central counter is accurate but adds a network hop and a dependency, while per-node limits (limit / N) are approximate. Decide fail-open or fail-closed per endpoint when the limiter store is down.
  5. Contract and audit: 401 for missing or invalid credentials, 403 for denied, 429 with Retry-After for throttled. Record who accessed what and the decision made; audit logging of access to electronic PHI is a required HIPAA technical safeguard, so it matters for systems that hold health data.

Follow-up

  • How do you revoke a JWT before it expires?
  • Redis goes down. Do you fail open or closed, and for which endpoints?
  • How do you enforce one rate limit across several regions?

Explain the key differences and performance trade-offs between RESTful APIs, GraphQL, and gRPC endpoints.

Medium · Backend Systems, Databases & Cloud Infra

Approach

  1. REST: resource-oriented URLs over HTTP verbs, so HTTP caching (Cache-Control, ETag) and CDNs work naturally. Costs: over-fetching and under-fetching (several round trips per screen) and an explicit versioning strategy.
  2. GraphQL: one endpoint with a typed schema, and the client selects exactly the fields it needs. Costs: the N+1 resolver problem (batch with DataLoader), harder HTTP caching because queries usually go by POST (persisted queries help), and the need for depth and cost limits on queries.
  3. gRPC: Protobuf over HTTP/2 with generated stubs, deadlines, and client, server and bidirectional streaming. Binary payloads are smaller and cheaper to parse than JSON. Browsers need gRPC-Web through a proxy, and payloads are harder to inspect by hand.
  4. Choose by caller: REST for public or partner APIs and cacheable reads, GraphQL as an aggregation layer for varied UI clients, gRPC for internal low-latency calls and streaming such as telemetry. Benchmark before quoting performance numbers.
  5. Schema evolution differs: REST versions via URL or headers, GraphQL deprecates fields instead of versioning, and Protobuf adds fields with new numbers and never reuses a field number.

Follow-up

  • How do you stop a single expensive GraphQL query from overloading the backend?
  • Would you expose gRPC directly to a mobile or web client?
  • How do you make a breaking change in each of the three styles?

Explain the communication protocols and architectural design needed to connect an embedded medical device to a

Medium · Systems Engineering, Verification & Doma

Explain the communication protocols and architectural design needed to connect an embedded medical device to a cloud server securely.

Approach

  1. Sketch the path first: device to phone app over BLE (GATT), or to a gateway, or direct over Wi-Fi or cellular, then to a cloud ingestion endpoint. MQTT over TLS (port 8883) suits constrained devices with pub/sub and QoS 0/1/2; CoAP over DTLS suits very constrained UDP devices; HTTPS suits batch uploads.
  2. Device identity and transport security: a unique X.509 certificate per device with the private key in a secure element or TPM, mutual TLS to the broker, and per-device topic permissions so one device cannot publish as another.
  3. Device integrity: secure boot, signed firmware, OTA updates with signature checks, staged rollout and rollback protection, plus certificate rotation and revocation for compromised units.
  4. Intermittent connectivity: store-and-forward buffering on the device with monotonically increasing sequence numbers. QoS 1 means at-least-once, so the cloud dedupes on (device_id, seq) and records both device time and server receive time to handle clock drift.
  5. Cloud side: broker or IoT hub, then a stream, validation, storage and a device registry, with PHI encrypted at rest and access audited. Back the design with a threat model and an SBOM, which FDA premarket cybersecurity submissions cover.

Follow-up

  • The device is offline for three days. What happens to its data and to the backlog when it reconnects?
  • One device's private key leaks. How do you contain it?
  • How do you roll out a firmware fix to the fleet without bricking units?

How do you ensure software designs comply with regulatory standards like ISO 13485, ISO 14971, or HIPAA?

Medium · Systems Engineering, Verification & Doma

Approach

  1. Separate what each standard covers: ISO 13485 is the quality management system (design controls, document control, CAPA), ISO 14971 is medical-device risk management, and HIPAA governs protected health information in the United States. Name IEC 62304 as the software lifecycle standard that connects them.
  2. Walk the design-control chain: user needs, design inputs (requirements), design outputs (architecture and code), verification (built right), validation (right product) and design reviews. Keep a traceability matrix linking requirement, risk control and test, with the records kept in the Design History File.
  3. Make risk controls real requirements: each hazard from the ISO 14971 analysis maps to a control that is implemented and verified, and third-party libraries (SOUP) are assessed and tracked.
  4. HIPAA technical safeguards in the design: unique user IDs and access control, audit logging, integrity checks, encryption in transit and at rest, minimum-necessary data access, and business associate agreements with cloud vendors.
  5. Day-to-day practice: change control, recorded code reviews, configuration management and CI that produces verification evidence. AAMI TIR45 is a reference for running agile within these constraints.

Follow-up

  • Requirements change mid-sprint. How do you keep traceability current?
  • What do you record about an open-source library before using it in device software?
  • A production hotfix is urgent. How does it go through change control?

What approach do you take to design unit tests, integration tests, and end-to-end automated validation protoco

Medium · Systems Engineering, Verification & Doma

What approach do you take to design unit tests, integration tests, and end-to-end automated validation protocols for critical software?

Approach

  1. Use a test pyramid: many fast unit tests built from equivalence partitions and boundary values, fewer integration tests against real dependencies (for example a database in Testcontainers, contract tests between services), and a small set of end-to-end tests in Playwright for the main user journeys.
  2. Drive tests from requirements and risk: every requirement and every ISO 14971 risk control has at least one test linked in the traceability matrix, and test depth scales with hazard severity.
  3. Cover failure paths explicitly: negative inputs, timeouts, dropped connections and fault injection. For device software, add simulators or hardware-in-the-loop rigs.
  4. Keep automation trustworthy: every change runs in CI, tests are deterministic (injected clocks, fixed seeds, isolated data), flaky tests are quarantined and fixed rather than retried forever, and reports are archived as verification records.
  5. Treat coverage as a floor, not a goal: branch coverage finds untested code, and mutation testing shows whether assertions would catch a real defect. Keep verification (meets the spec) distinct from validation (meets user needs).

Follow-up

  • Coverage was 100 percent and a defect still shipped. How is that possible?
  • How do you test logic that triggers an alarm only after 15 minutes?
  • What is your policy for an end-to-end test that fails one run in twenty?

How do you approach risk management and failure mode analysis (FMEA) in software feature design?

Medium · Systems Engineering, Verification & Doma

Approach

  1. Explain FMEA as a bottom-up analysis: for each function or component, list failure modes, their effects, their causes and the existing controls, then rate severity, occurrence and detection (usually 1-10) and compute RPN = S x O x D.
  2. Make the failure modes software-specific: wrong value, late, missing, duplicated, out-of-order or stale data, unhandled exception, and wrong unit. Trace each effect to the user or patient, for example a stale reading shown as current.
  3. Assign controls and link them: input and range checks, timestamps with staleness indicators, watchdogs, safe defaults and alarms. Each control becomes a requirement with a verification test, and residual risk is re-evaluated afterwards.
  4. Name the RPN pitfalls: equal RPNs can hide very different severities, so high-severity items get addressed regardless of score. Software failure probability is hard to estimate, so ISO 14971 practice often weighs severity first.
  5. Pair it with a top-down fault tree from each hazard and keep the FMEA a living document, updated on design changes and field complaints.

Follow-up

  • Two failure modes have the same RPN. Which do you address first, and why?
  • How do you estimate occurrence for a software failure mode?
  • A new failure mode turns up late in the project. What happens next?

Walk through a time you debugged a performance bottleneck or memory leak in a Linux-based production backend e

Medium · Backend Systems, Databases & Cloud Infra

Walk through a time you debugged a performance bottleneck or memory leak in a Linux-based production backend environment.

Approach

  1. Open with the symptom in numbers (p99 latency, RSS growth per hour, OOM kills) and a timeline lined up against deploys, traffic and config changes, then say what you ruled out first.
  2. Triage the resource systematically (the USE method): top/htop, vmstat, iostat, free and pidstat separate CPU saturation, I/O wait, memory pressure and lock contention. Check GC logs for managed runtimes and the slow query log plus EXPLAIN for database time.
  3. For a leak, confirm RSS or heap grows steadily under constant load rather than warming a cache, then diff heap snapshots: heap dump plus Eclipse MAT for Java, dotnet-gcdump for .NET, tracemalloc for Python, heaptrack or Valgrind for C/C++. Check /proc/<pid>/fd or lsof for descriptor leaks.
  4. For CPU, profile instead of guessing: perf record or async-profiler to produce a flame graph, and strace for syscall storms. Typical causes are unbounded caches, listeners never removed, N+1 queries and a missing index.
  5. Close the loop: reproduce under a load test, fix, show before and after metrics, and add a guard such as an alert on memory slope or a load test in CI. State your own part of the work in the first person.

Follow-up

  • How did you show the growth was a leak and not normal heap sizing or caching?
  • You cannot attach a profiler in production. What do you do?
  • A container is OOMKilled. How do you tell a kernel OOM kill from a runtime out-of-memory error?

Describe a troubleshooting process you used to resolve a complex issue involving both hardware and software in

Medium · Systems Engineering, Verification & Doma

Describe a troubleshooting process you used to resolve a complex issue involving both hardware and software interactions.

Approach

  1. Characterize the failure before theorizing: how often, under which conditions (temperature, firmware version, board revision, unit serial), and with logs from both sides on synchronized timestamps.
  2. Isolate the boundary by changing one variable at a time: known-good hardware with the suspect firmware and the reverse, loopback tests, and a logic analyzer or oscilloscope on the bus (UART, SPI, I2C) to compare what is on the wire with what the software believes it sent.
  3. Work through the usual cross-boundary causes: timing and race conditions, interrupt priority, watchdog resets, power brownouts, signal integrity, buffer overruns, and endianness or struct-packing mismatches in the protocol. For device and diagnostics teams, be ready to discuss C or C++ here: memory ownership, struct packing and endianness, and interrupt-safe code.
  4. List hypotheses with a fishbone diagram or fault tree and eliminate them with tests that rule something out whichever way they turn out. Use 5 whys to get from trigger to root cause.
  5. Close it out: verify the fix against the original reproduction, add a regression or hardware-in-the-loop test, record the CAPA, and say what you personally did versus what the hardware team did.

Follow-up

  • The failure shows up once every few hundred hours. How do you reproduce it?
  • What evidence convinced you it was firmware and not hardware, or the reverse?
  • What changed in the process afterward so the same class of defect is caught earlier?

Suggested practice checklist

The plan starts with your resume and stories, then orders the frontend, backend, streaming and device-systems question groups for study, and ends with a mock panel. Practice-set drills are included on the days they fit.

Day 1 — Map the loop and inventory your resume

  • Write the four reported stages in order and mark which of the four question groups (behavioral, frontend, backend, device systems) your target unit is likely to stress.
  • List every technology, standard and method on your resume, and next to each write one decision you made with it and one thing that went wrong.
  • Write your answer to why Abbott, naming a business unit, and your five-year direction.

Deliverable: A one-page loop map plus a resume inventory sheet with a decision and a failure per item, and a written why-Abbott answer.

Day 2 — Build three behavioral stories

  • Outline a wrong-technical-decision story: the decision, what signalled the error, containment, the permanent fix and what changed in your process.
  • Outline a conflict story with evidence you used to settle it, and a story about explaining a technical issue to a non-technical or clinical partner.
  • Say each aloud, then cut anything that does not show your own decision or a result.

Deliverable: Three situation-task-action-result outlines with a stated personal action and a result for each, and a recording of each spoken version.

Day 3 — Frontend: code review and monorepo structure

  • Write a React component with a fetch effect, a keyed list and a form, plant at least five defects, and review it aloud as you would in a live review.
  • Sketch a Turborepo-style TypeScript monorepo: apps and shared packages (UI library, types, config), per-app build and deploy filtering, and how a shared package change triggers only the affected apps.
  • Write what you would test with Vitest or Jest and what you would cover end to end with Playwright.

Deliverable: An annotated review of the component with blocking and optional comments, plus a monorepo diagram with a one-paragraph deploy policy.

Day 4 — Frontend: performance, checkout and data loading

  • Audit a page you know for LCP, INP and CLS, list the fixes (code splitting, lazy loading, image sizing, avoiding layout shift) and the WCAG 2.1 checks (labels, focus order, contrast, keyboard use).
  • Draw the multi-step checkout as a state machine with per-step validation, a redirect or hosted step for the payment gateway, and a server-side confirmation so a closed tab does not lose the order.
  • Write your data-loading policy: cache keys, freshness, cancellation, optimistic updates and rollback.

Deliverable: A performance and accessibility fix list, a checkout state diagram, and a one-page data-loading policy.

Day 5 — Backend: schemas, constraints and API styles

  • Write PostgreSQL definitions for customer orders and inventory with keys, foreign keys, CHECK and UNIQUE constraints, then add inserts that must fail.
  • Work through the practice SQL exercise on stopping joins from fanning out rows, so your queries stay correct once relationships are one-to-many.
  • Make a comparison table of REST, GraphQL and gRPC covering payload shape, caching, streaming, tooling and typical use.
  • Sketch authentication, authorization and rate limiting at an API gateway: token validation, scopes, per-client limits and what happens when the limiter store is down.

Deliverable: A schema script with failing-insert tests, a solved practice SQL exercise, a three-way API comparison table and a gateway sketch.

Day 6 — Streaming pipelines and debugging stories

  • Design an ingest path for device telemetry on Kafka: partition key, validation, at-least-once delivery with idempotent consumers, dead-letter handling, storage and lag monitoring.
  • Solve the practice drills on collapsing a redelivered event batch and tracking a rolling failure rate, and note how each connects to your pipeline.
  • Write a debugging story for a slow or leaking Linux backend: what you measured (CPU, memory growth, heap profile, I/O), how you narrowed it down, the fix, and how you confirmed it.
  • Outline a hardware-and-software troubleshooting story: how you characterized the failure, isolated the boundary, found the root cause and verified the fix.

Deliverable: A pipeline diagram with delivery and failure semantics, two solved practice drills, and two debugging stories outlined step by step.

Day 7 — Device systems, compliance and mock panel

  • Draw a secure embedded-device-to-cloud architecture: constrained-device transport and protocol choice, mutual authentication, certificate handling, buffering offline, updates and audit logging.
  • Take three requirements and trace each to unit, integration and end-to-end tests, then add an FMEA table with failure mode, effect, cause, detection and mitigation.
  • Write a short statement of how a design meets ISO 13485, ISO 14971 or HIPAA.
  • Deliver your architecture presentation aloud to a friend or recording, take questions, and rework the weakest answer.

Deliverable: A device-to-cloud diagram, a traceability and FMEA table for three requirements, a compliance statement, and a recorded presentation run-through.

Stories to prepare for the Abbott loop

Candidates report behavioral questions about decisions that went wrong, explaining technical ideas to non-engineers or clinical partners, handling disagreement, owning a project from your resume, and your reasons for joining. The reports also advise structuring answers as situation, task, action and result, with your own contribution clear. Prepare each story with a number or a concrete outcome you can defend, and write down a technical follow-up for each project, since resume details come up.

  1. How do you explain a critical software bug and its potential remediation timeline to a business stakeholder who wants an immediate release?

Tell me about a time when you made a technical decision that turned out to be wrong. How did you realize it, a

Medium · Behavioral & Leadership (STAR Model)

Tell me about a time when you made a technical decision that turned out to be wrong. How did you realize it, and how did you course-correct?

Approach

  1. Choose a decision that was yours and was wrong in a way that cost something: a design, a library, a schema, a rollout plan. A flaw that is really a disguised strength sinks the story.
  2. Explain why the choice looked reasonable at the time, naming the information you had and the constraint you were under, so the mistake reads as a judgment error and not carelessness.
  3. Say how you found out with something concrete: a metric, an incident, a failing test, a review comment. Then describe containment first (rollback, feature flag, reduced scope) before the permanent fix.
  4. Close with the result and a change that outlasts the story, such as a design note recording the trade-off, a test that would have caught it, or a review checklist item. In a regulated setting, mention that you documented the change and re-verified it.
  5. Keep personal ownership clear: say 'I decided' and 'I missed', and give credit to others only for what they actually did.

Follow-up

  • What would you have needed to know at the time to decide differently?
  • How did you tell your team and any stakeholders, and when?
  • What did you change in how you make similar decisions now?

Describe a situation where you had to convey complex technical concepts to non-technical stakeholders or clini

Medium · Behavioral & Leadership (STAR Model)

Describe a situation where you had to convey complex technical concepts to non-technical stakeholders or clinical partners.

Approach

  1. Pick a real case where the audience had to make a decision that depended on a technical fact: a defect's effect, a latency or data-loss trade-off, a delay. Open with the decision they needed to make, not with the architecture.
  2. Translate the concept into their terms: risk, time, user or patient effect, cost of waiting. One analogy that is accurate beats three that are approximate, and state what the analogy leaves out.
  3. Show how you checked it landed: you asked them to restate the options, you used a simple diagram or one-page summary, you revised after their questions.
  4. Report the outcome as a decision or an action that followed, such as the release held, the scope agreed or the test added. A story that only says you explained it simply, with no result, is incomplete.
  5. Mention how you stated uncertainty honestly (what is known, what is estimated, what you will learn next) since non-technical partners often act on your confidence level.

Follow-up

  • What did they misunderstand at first, and how did you notice?
  • How would you explain a serious bug and its fix timeline to someone who wants to ship now?
  • How do you convey an estimate when you are not sure of it?

How do you handle conflict or differing technical opinions within a software development team?

Medium · Behavioral & Leadership (STAR Model)

Approach

  1. Because the question asks how you handle conflict, state your method in one or two sentences, then prove it with one specific disagreement. A method with no example is only an opinion.
  2. Start with understanding: restate the other person's position well enough that they agree you have it right, then separate facts (measured behaviour, constraints) from preferences (style, familiarity).
  3. Agree on decision criteria before arguing options, such as latency, operational cost, maintainability or risk, and settle disputes with evidence: a short prototype, a benchmark, a failure-mode comparison.
  4. If it is still unresolved, time-box it and bring in the person who owns the decision. Once decided, commit fully and record the reasoning in a design note so the outcome is not relitigated.
  5. The mistake to avoid is a story where you were simply right and the other person came round. Show a point where you changed your mind or adopted part of their approach.

Follow-up

  • What if the other person is more senior than you?
  • Tell me about a time you were the one who turned out to be wrong.
  • How would you handle a disagreement with a QA or regulatory partner about how much testing is enough?

Walk me through a challenging project listed on your resume. What was your specific contribution to its succes

Medium · Behavioral & Leadership (STAR Model)

Walk me through a challenging project listed on your resume. What was your specific contribution to its success?

Approach

  1. Choose a project that appears on your resume and that you can discuss at the level of code and design, since candidates report being asked line by line about technologies listed. Check that every tool you mention can survive a follow-up.
  2. Give context in a few sentences (what the system did, who used it, rough scale if you know it reliably), then draw a clear line around your own part: the components you wrote, the decisions you made, what teammates did.
  3. Spend most of the time on the hardest technical problem: the options you considered, why you chose one, what you tried that failed, and how you tested the result.
  4. State the outcome with whatever evidence you actually have (latency, error rate, release date, adoption) and be honest if a number is an estimate.
  5. Finish with what you would change now. Avoid saying 'we' throughout; an answer that never separates your contribution from the team's fails the question as asked.

Follow-up

  • Why did you choose that approach over the alternative you mentioned?
  • What would break first if the load or the data volume grew tenfold?
  • Which part of this project was not yours, and how well do you understand it?

Why do you want to work at Abbott, and where do you see your engineering career in five years?

Medium · Behavioral & Leadership (STAR Model)

Approach

  1. Name a specific business unit and connect it to your own experience. Candidates mention Lingo, Vascular, Heart Failure, Electrophysiology and Diagnostics, and they suggest reading about the unit you interview with. Say what its software has to do, such as ingest continuous sensor data or support a device, and why that interests you.
  2. Link your past work to it directly: if you have built streaming pipelines, front ends, test automation or anything in a regulated setting, say which part transfers and what you would need to learn.
  3. Avoid praising the mission in general terms or repeating facts anyone could read from the company page. A concrete reason tied to the work is more convincing than enthusiasm.
  4. For the five-year question, describe a direction that fits the role: deeper ownership of a system or domain, more design leadership, mentoring junior engineers. Plans that point away from engineering, or are too vague to check, do not help.
  5. Keep both halves consistent, so the five-year plan follows from the reasons you gave for joining.

Follow-up

  • Which business unit would you want to work in, and why that one?
  • What would you most need to learn in your first months?
  • What would you do if the team you join differs from the one you hoped for?

Perform a live code review on a provided pull request (e.g., identifying state management bugs, anti-patterns,

Medium · Frontend & Full-Stack Engineering

Perform a live code review on a provided pull request (e.g., identifying state management bugs, anti-patterns, or edge cases in a React component).

Approach

  1. Read the pull request description and tests before the diff so you know the intent, then say what you are checking, in order: correctness, then failure and edge cases, then performance, then style. Saying that sequence out loud makes the review easy to follow.
  2. Look for the typical React defects: an effect with a missing or wrong dependency array, a stale closure, state copied from props that then drifts, direct mutation of state or arrays, list keys that use the array index, and derived values stored in state when they could be computed during render.
  3. Check async handling: a fetch effect without cancellation or an ignore flag lets a slow earlier response overwrite a newer one; missing cleanup leaks timers, listeners or subscriptions; there may be no loading, error or empty state, or a form that can be submitted twice.
  4. Check performance and accessibility only after correctness: inline objects or functions passed to memoized children, a context value rebuilt every render, clickable divs instead of buttons, inputs without labels, lost focus after updates.
  5. Give each comment a severity (blocks merge or optional), explain why it matters, and suggest a fix. Finish by naming missing tests, such as a Vitest or Jest unit test for the race and a Playwright check of the main flow.

Follow-up

  • Which of the issues you found would you block the merge on, and why?
  • How would you write a test that proves the race condition is fixed?
  • How would you handle an author who disagrees with your comments?

How do you handle asynchronous data loading, caching, and state synchronization in modern web applications?

Medium · Frontend & Full-Stack Engineering

Approach

  1. Separate server state (data that lives on a backend and can go stale) from UI state (open panels, form drafts). Keep server state in a cache keyed by the request parameters, using something like TanStack Query or SWR on the client, or fetching in Server Components in a Next.js App Router app, and avoid copying it into local component state.
  2. Describe the cache policy: how long data counts as fresh, stale-while-revalidate so the screen shows old data while a refetch runs, request deduplication when several components ask for the same key, and retry with backoff for transient failures.
  3. Handle concurrency: cancel superseded requests with AbortController or ignore out-of-order responses, so typing quickly in a search box never shows results for an old query. Always render explicit loading, error and empty states.
  4. For synchronisation after writes, either invalidate the affected keys and refetch, or apply an optimistic update and roll it back if the server rejects it. Mention how other tabs or devices learn of changes: polling, a push channel, or invalidation on window focus.
  5. Back this with one real example from your own work, covering the symptom (stale or flickering data), the cause and the fix, so the answer is grounded and not a list of library names.

Follow-up

  • How do you invalidate cached data after a mutation, and what do you do if the mutation fails?
  • Two quick searches are sent and the first response arrives last. What happens, and how do you prevent a wrong result?
  • When would you choose server-side fetching over client-side caching?