A Place for Mom · Software Engineer
Updated · 2026-10-02

A Place for Mom Software Engineer
Interview Guide

THE 60-SECOND BRIEF

A Place for Mom runs a platform that helps families find senior care. Reports place engineers on the consumer web experience, the software advisors use, and AI voice and chat agents, with search-driven discovery and provider matching underneath. The reported stack is a Next.js front end, NestJS on Node for APIs, Postgres for data, Redis or Kafka for events and queues, and an Agentic Platform that lets teams ship AI features safely. Reports describe the Software Engineer role as spanning those layers: web pages and APIs, event-driven services behind engagement and messaging, and the points where AI providers plug in.

This guide is for Software Engineer candidates at A Place for Mom, across frontend and backend work. It covers the seven reported questions (five hands-on implementation tasks and two system design prompts), the evaluation areas candidates describe, a loop section that is candid about how little is reported on round format, a behavioral section, and a day-by-day plan. It does not cover other roles at the company.

No fixed round list has been reported. Candidates describe a progression from a recruiter conversation to technical and cross-functional sessions covering TypeScript coding, system design, observability and AI safety, and behavioral alignment. Confirm the real format with your recruiter.

JavaScriptTypeScriptReact

34 min read

Browse Software Engineer questions

See the practice prompts

14Practice promptsAcross five skill areas

The reported work is full-stack TypeScript with a platform flavour. On the web side it is Next.js and React, with performance and accessibility called out. On the server side it is NestJS APIs, Postgres schemas and indexes, and event-driven services built on queues or streams such as Kafka and Redis. Candidates also describe an Agentic Platform where engineers add provider abstractions, safety guardrails and evaluation hooks. The five reported implementation tasks mirror that spread: a NestJS endpoint, a React refactor, a schema-validated API wrapper, a streaming parser and a retrying provider call. Prepare for all of them in one language, TypeScript, with tests written alongside the code.

For the implementation tasks, depth in the language matters more than breadth. Be ready to talk through generics, type narrowing, utility types, interfaces versus type aliases and strict compiler settings, because the typed-wrapper question rests on them. On NestJS, know modules, dependency injection, pipes, guards and exception filters, plus how a validation pipe turns a request body into a checked object. On React and Next.js, know what triggers a re-render, how memoisation helps and when it does not, the server versus client component split, and the semantic HTML, labels and focus handling that make a component accessible. Reports also list streaming responses, structured logging, feature flags and SSR caching as less common topics.

The design questions are about contracts and failure. The event-driven pipeline for matching families to providers needs a clear event schema, a partition key, idempotent consumers, a retry path, a dead-letter queue and a way to measure the SLA. The monolith-to-service migration needs a versioning scheme, a traffic-shifting plan and a rollback. Candidates also report observability prompts: what to log, trace and alert on, how to cut a P95 latency regression without raising errors, and how to build a redaction layer so personal data never reaches monitoring tools. Practise saying the failure mode out loud for every component you draw.

Sensitive data and AI quality run through the reports. Candidates are told to treat personal and senior-care data with extra care in every example, to describe guardrails, audit trails and failure modes, and not to treat manual spot checks as enough for AI output quality. Scenarios are described as centred on family and advisor experience: faster first conversations, better search and personalisation, steadier voice and chat agents. Bring one system you owned in detail, with the metrics you moved and what you would change, and tie your trade-offs to a user outcome you can defend with real numbers.

01

Preparation focus

editorial

Candidates do not report a numbered list of rounds, round lengths or an order of questions. What is described is a coding component in TypeScript (backend endpoints, React work, API wrappers, streaming, retries), a system design component (event-driven pipelines, monolith migration, API contracts), discussion of observability and AI safety, and behavioral conversations with cross-functional themes. Start by asking your recruiter for the sequence, which stages involve writing code, and what environment you will use. Then prepare every area: write code with tests and error handling, narrate your trade-offs, and keep a reusable architecture diagram you can adapt on the spot.

What to demonstrate

  • Working TypeScript with tests and explicit error handling for the five reported implementation tasks
  • API and event-driven design with clear contracts, retries, dead-letter handling and rollout plans
  • Observability, privacy and product-linked reasoning: what you log, trace and alert on, how personal data is kept out of tools, and which user outcome a choice serves
  • AI-feature safety: handling non-deterministic output, building an evaluation set, and guardrails and rollback for an Agentic Platform feature

How to prepare

  • Ask the recruiter which stages involve live coding, which involve design, and whether a take-home or code sample is expected
  • Complete the NestJS pagination endpoint, the typed API wrapper and the retry wrapper end to end, each with its own tests
  • Draw the provider-matching pipeline and the monolith migration once each, naming the failure mode of every box, and prepare one system you owned with its metrics and an incident lesson
  • Outline one AI feature end to end: a small evaluation set with regression tracking, guardrails that keep personal data out of prompts and traces, provider failover, and the trigger for rolling it back
PracHub preparation framework ↗

PracHub editorial advice for the preparation topics above.

01

Returning an unbounded, unvalidated list endpoint

For the NestJS pagination question, cap the page size, validate every query parameter and filter value through a DTO and a validation pipe, choose a stable sort with a tiebreaker such as the id, and cover the bad-input paths in your tests, not just the happy path.

02

Casting an API response to a type and calling it validated

A cast such as as Provider checks nothing at runtime. Parse the response with a schema library, return a typed result or a typed error, and say what happens when the provider adds, drops or renames a field.

03

Retrying everything the same way, with no jitter and no limit

Retry only transient failures (network errors, 408, 429, 502/503/504, and 500 only for idempotent operations), respect Retry-After, add jitter and a maximum attempt count, set a timeout per attempt, and state that non-idempotent calls need an idempotency key before they are retried at all.

04

Drawing an event pipeline with no answer for duplicates, ordering or poison messages

Name the partition key and what ordering it preserves, make consumers idempotent, route repeated failures to a dead-letter queue with an owner and a replay path, and say which metric tells you the matching SLA is being missed, for example consumer lag or message age.

05

Instrumenting with raw payloads and leaking personal data into logs or traces

Reports stress care with personal and senior-care data. Log identifiers and metadata only, redact at a single boundary before data reaches observability tools, and describe how you would prove the redaction works with a test that asserts forbidden fields never appear.

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

11 technical prompts0 include a worked solution

Refactor a React component to remove unnecessary re-renders and improve accessibility.

medium
Coding and TypeScript

Refactor a React component to remove unnecessary re-renders and improve accessibility.

Approach
  1. Measure before changing anything: record the slow interaction in the React DevTools Profiler with highlight updates on and the option that records why each component rendered. Memoizing components whose renders cost nothing adds complexity without a gain.
  2. Find the usual causes: state held higher than the components that read it, a context value object recreated on every render, and inline objects, arrays or arrow functions passed to memoized children. Fix in order of preference: move state down or pass expensive subtrees as children, split or memoize the context value, then React.memo on the expensive child with useCallback/useMemo for its props.
  3. Remove derived state: a filtered list or a computed label belongs in render (wrapped in useMemo only if it is expensive), not copied into state and synced with useEffect, which costs an extra render and can go stale. Use stable keys from the data, not array indexes, for lists that reorder.
  4. Fix accessibility at the element level: replace clickable divs with (focusable, and Enter and Space activate it natively), associate every input with a , give icon-only buttons an accessible name, reflect open/closed state with aria-expanded, move focus into a dialog on open and back to its trigger on close, and announce async results through an aria-live region.
  5. Lock both changes in with tests: React Testing Library queries by role and name (getByRole('button', { name })), user-event for keyboard paths, an axe check such as jest-axe, and a render-count or Profiler assertion on the hot path so the regression cannot return unnoticed.
Follow-up
  • When does React.memo cost more than it saves, and how would React Compiler change this refactor?
  • The list renders 5,000 rows. What do you do beyond memoization?
  • How would you make a custom select or combobox usable by keyboard and screen reader?

Write a streaming data handler that safely parses partial payloads and back-pressure signals.

medium
Coding and TypeScript

Write a streaming data handler that safely parses partial payloads and back-pressure signals.

Approach
  1. State the framing first: chunk boundaries never line up with message boundaries. For newline-delimited JSON, keep a carry-over buffer, append each chunk, split on '\n', parse every complete line and keep the trailing fragment for the next chunk; for server-sent events, split events on a blank line and read the data: lines.
  2. Decode bytes with a streaming decoder (TextDecoder's decode(chunk, { stream: true }) or Node's StringDecoder) so a multi-byte UTF-8 character split across two chunks is not corrupted. On end, flush the decoder and handle the final fragment: parse it, or report a truncated message.
  3. Bound memory: cap the carry-over buffer at a maximum message size and fail the stream with a clear error when a line exceeds it, otherwise a peer that never sends a delimiter grows memory without limit. Scan only newly appended bytes for delimiters so total work stays linear in input size.
  4. Respect back-pressure: writable.write() returns false once its buffer passes highWaterMark, so stop reading until 'drain'. The simplest correct forms are a Transform with readableObjectMode joined by pipeline() from 'node:stream/promises', which propagates errors and destroys every stage, or a for await loop over the readable that awaits each async handler so reading pauses while work is slow.
  5. Decide the error contract per message: a malformed line is either counted, logged without its content and skipped, or it fails the stream; say which and why. Propagate cancellation upstream with an AbortController when the client disconnects, and test by splitting the same payload at every byte offset, including inside a multi-byte character.
Follow-up
  • A single JSON value is tens of megabytes. How do you parse it without holding it all in memory?
  • The consumer is a slow database writer. How do you batch writes without defeating back-pressure?
  • The client closes the connection mid-stream. What must be cleaned up, and how do you test it?

Merge partitioned event streams into one ordered feed with bounded lateness

hard
k-way mergewatermarksout-of-order streams

The read-model service consumes 64 log partitions carrying about 4,000 events per second in total. Each partition is ordered within itself, but partitions drift by up to 30 seconds, and the activity feed must present a tenant's events in occurred_at order. Produce the merge. State its complexity, the buffer it requires in events and in bytes, what happens when one partition is idle, and what you do with an event that arrives after you have already emitted its position. Payloads average 1 KB.

Approach
  1. Merge with a min-heap over the 64 partition heads keyed on (occurred_at, event_id): O(log P) per event and O(n log P) overall. The tie-break on event_id is what makes the output deterministic when two partitions carry the same millisecond, which matters because the feed is paginated and a non-deterministic order reorders pages under the reader.
  2. Emitting the heap head is only correct once every partition has produced everything up to that timestamp, so the emit condition is a watermark: the minimum across partitions of the highest occurred_at seen, less the allowed lateness. Events are held until the watermark passes them, which is what turns individually ordered streams into a jointly ordered one.
  3. Size the buffer from the lateness rather than guessing: 4,000 events per second times 30 seconds is 120,000 buffered events, and at 1 KB each about 120 MB of heap. That number is the real price of the ordering guarantee and belongs in front of whoever asked for it.
  4. Handle the idle partition explicitly, because it fails the feed rather than corrupting it: a partition with no traffic never advances its own maximum, so the watermark freezes and output stops entirely. Either every partition emits a periodic idle marker carrying the broker's current time, or the watermark falls back to wall clock for a partition silent beyond a threshold.
Follow-up
  • The lateness budget is raised to five minutes. What is the new buffer, and what besides memory changes?
  • The consumer restarts. Where does it resume from, and what does the feed look like for the first 30 seconds?

The plan follows the reported question set: TypeScript and backend implementation first, React, web performance and streaming next, then the two design questions, observability and AI platform safety, then behavioral stories and a full mock. PracHub practice questions are used where they exercise event ordering, concurrency and incident-style reasoning.

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

Prepare, practise & reflect

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

0 / 7 done
01Confirm the format and refresh TypeScript
  • Write to your recruiter asking for the stage sequence, which stages involve live coding, the coding environment and whether any take-home or code sample is expected.
  • Rework a small module covering generics, type narrowing, utility types such as Pick, Omit and Partial, and strict compiler options; write down one example of each.
  • Set up a NestJS project with Jest and supertest so day 2 starts with a working test harness.

Deliverable: A saved recruiter reply, a one-page TypeScript cheat sheet with one example per feature, and a NestJS project that runs one passing test.

02NestJS endpoint and typed API wrapper
  • Build the paginated, filterable endpoint with a DTO, a validation pipe, a capped page size, a stable sort and an error response for bad input; add tests for valid, invalid and empty-result requests.
  • Decide cursor versus offset pagination and write two sentences defending your choice, including what a page boundary does when rows are inserted.
  • Write a generic function that calls a third-party API, parses the result with a schema and returns a typed success or a typed failure; test it with a malformed payload.

Deliverable: A tested NestJS endpoint, a written pagination decision, and a tested schema-validated wrapper.

Practice prompt ↗Practice prompt ↗
03React re-renders, accessibility and Core Web Vitals
  • Take a component that re-renders too often, find the cause with the React profiler, and fix it with stable props, memoisation or state moved closer to where it is used; record before and after render counts.
  • Audit the same component for accessibility: semantic elements, labels for inputs, keyboard operation, focus handling and announcements for dynamic updates.
  • Write a short note on which parts would be server components and which client components in Next.js, and why.
  • Measure LCP, INP and CLS on one Next.js page with Lighthouse or the web-vitals library, and name one fix for each: next/image with priority for the LCP image, less client JavaScript or cheaper hydration for INP, and reserved width and height for CLS.

Deliverable: A refactored component with before and after render counts, an accessibility checklist applied to it, a server versus client split note, and a Web Vitals measurement with one fix per metric.

Practice prompt ↗
04Streaming parser and retry wrapper
  • Write a handler that reads a chunked stream, buffers an incomplete trailing record across chunks, parses complete records, and stops reading when the consumer signals back-pressure; test with payloads split mid-record.
  • Write a retry wrapper with exponential backoff and jitter, a maximum attempt count, a per-attempt timeout and a classifier for retryable versus fatal errors; test with a fake provider that fails twice and then succeeds.
  • Work the PracHub practice question on merging partitioned event streams into one ordered feed to practise ordering and lateness.

Deliverable: A tested streaming handler, a tested retry wrapper, and a worked solution to the stream-merging practice question.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
05Event-driven provider-matching pipeline
  • Design the pipeline for matching families to providers on a whiteboard: event schema, topics, partition key, consumers, retry path, dead-letter queue, SLA metric and the real-time read model for the UI.
  • Say how a duplicate event, an out-of-order event and a poison message are each handled, and how a replay from the dead-letter queue stays safe.
  • Work the PracHub practice questions on version gaps with window functions, on a partition that stops advancing while others drain, and on an update path that detects a concurrent edit.

Deliverable: One annotated diagram with a failure mode for every component, plus worked answers to the three practice questions.

Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗
06Monolith migration, observability and AI platform safety
  • Outline the migration of one monolith endpoint into a service: route-level traffic shifting, versioned API contract, shadow comparison, rollback trigger and the data ownership boundary.
  • Write the instrumentation plan for a new feature: structured log fields, trace and correlation identifiers, SLIs, alerts tied to user impact, and a redaction layer that keeps personal data out of monitoring tools.
  • Design an API for a long-running agent task (Agent-as-a-Service): a create call that returns a job id, status by polling or SSE, a cancel endpoint, and retries guarded by an idempotency key so a resubmitted request does not start a second run.
  • Sketch a provider abstraction that handles provider churn with failover, then build a small evaluation set with regression tracking against a baseline and a rollback trigger, and show how personal data is kept out of prompts and traces.

Deliverable: A migration outline with rollback criteria, an instrumentation plan with redaction rules, an agent-task API contract, and a provider abstraction with an evaluation set and rollback rule.

Practice prompt ↗
07Behavioral stories and a full mock
  • Write bullet outlines for the stories under the behavioral prompts, each with a situation, your action, a measured outcome and what you would change.
  • Practise the PracHub behavioral questions on reversing a decision, telling callers their integration breaks, and a code review disagreement.
  • Run one full mock: an implementation task from days 2 to 4, a design from days 5 and 6, then two behavioral stories, and note two questions to ask your interviewers.

Deliverable: Six story outlines, three practised behavioral answers, a completed mock and two questions to ask.

Practice prompt ↗Practice prompt ↗Practice prompt ↗

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

Candidates describe conversations about systems they owned, metrics they moved, reliability work, responsible handling of sensitive data, and collaboration with Product, Marketing or SEO, Data and Design. No specific behavioral questions have been reported, so prepare stories rather than scripts, each with a measurable outcome and an honest account of what went wrong.

Reverse your own decision and price the reversal

medium
reversibilitymeasurementmigrations

Describe a technical decision you made and later reversed. Pick one that cost something: a service you split and merged back, a cache you added and removed, an index you created that pushed the planner onto a worse plan, a projection you rebuilt from scratch. State what you believed when you decided, the measurement that changed your mind, how long the wrong version ran in production, and what the reversal cost in migrations, dual writes, and a deprecation window for callers you did not own.

Approach
  1. State the original rationale without irony, in the version you would still defend given what was known then. If it is not defensible, the story is about carelessness rather than judgement, and a different example serves you better.
  2. Give the measurement that moved with a before and after: the p99 that did not improve, the cache hit rate that sat at 40%, the plan that flipped to a sequential scan once the table passed a size you can name.
  3. Cost the reversal in steps, not adjectives: expand-and-contract deploys, the dual-write window, the callers who had to be notified, the rows already written in the wrong shape that had to be backfilled or abandoned.
  4. Distinguish reversal from rewrite by naming what you kept. Most good reversals preserve the schema or the interface and undo one decision inside it, which is also why they were affordable.
Follow-up
  • What in that decision was irreversible, and did you know it was irreversible when you made it?
  • How did you tell the people who had already built on top of the original decision?

Tell callers you do not own that their integration breaks

medium
deprecationcompatibilitystakeholders

A field in a write endpoint's response must change shape. You own the endpoint; you do not own the four internal callers or the outbound webhook consumers who read it. Describe a deprecation you were responsible for: what you shipped first, how you established who was actually reading the field, the window you gave and what set its length, what you did about the consumer who never moved, and how you decided removal was safe. Name the signal you used, not the announcement you sent.

Approach
  1. Establish the reader set empirically rather than from a wiki of owners: per-field usage counters keyed by principal, or access logs attributed to a consumer. State the blind spot of whichever you pick, since a consumer that reads the field only on a monthly job will not appear in a week of logs.
  2. Ship additive first. Populate the new field alongside the old one so no reader is forced to move, which is also what keeps a rolling deploy safe, because old and new instances answer the same requests at the same time and a rollback must still find the old shape present.
  3. Set the window from the slowest legitimate consumer's release cadence, not from your calendar, and decide separately what to do for a consumer with no release process at all, such as an external webhook endpoint you can only email.
  4. Convert silence into evidence before you rely on it: a short, low-traffic removal window that makes a still-dependent consumer fail visibly and loudly while you are watching, rather than at three in the morning after you have moved on.
Follow-up
  • How would you detect a consumer that reads the field only during a monthly export?
  • One caller refuses to move and has a commercial relationship behind it. What changes in your plan and what does not?

Turn a code review disagreement into a decision

easy
code reviewoptimistic concurrencycommunication

A colleague's change updates a row with UPDATE resource SET version = version + 1 WHERE resource_id = $1 AND version = $2 and treats an affected-row count of zero as a successful no-op. You read that as a silently lost update; they think returning 200 is friendlier to clients than returning a conflict. Describe how you have handled a review disagreement of this shape: what goes in the comment, when you leave the thread, and who decides. Then write the comment you would leave here, in under 80 words.

Approach
  1. Sort the disagreement before writing anything. A silently discarded write is a correctness claim about data; the choice between 409 and 412 is taste. Only the first justifies blocking a merge, and saying which one you are doing is most of the value of the comment.
  2. Make the claim reproducible in the comment itself with an interleaving rather than a principle: A reads version 7, B reads version 7, B commits version 8, A's predicate matches zero rows, A is told it succeeded and A's edit is gone.
  3. Offer the alternative with its cost attached: return 409 carrying the current version and the revision that won, so the client can re-read and re-apply. Note that automatic retry is not the fix, because a retry re-reads the winner's state and reapplies an intent formed against data that no longer exists.
  4. Apply an escalation rule you can state: two round trips on the thread, then a call, and the service's owner decides rather than the reviewer. A reviewer who cannot be overruled is a bottleneck with extra steps.
Follow-up
  • Where would you put the test that fails if someone reintroduces the swallowed zero rowcount?
  • The author says clients cannot handle a 409. How do you check whether that is true?
  • 01

    Walk through a complex system you owned: the architecture, the metrics you moved, an incident or postmortem, and what you would change now.

  • 02

    Tell me about a time you handled sensitive or personal data in production. What guardrails, audit trail and failure modes did you design, and what did you deliberately not log?

  • 03

    Describe a latency or reliability regression you diagnosed. What did you measure first, which lever fixed it, and how did you confirm error rates did not rise?

  • 04

    Tell me about a time Product, SEO or Data wanted something that conflicted with an engineering constraint. How did you size the impact and reach a decision?

  • 05

    Describe an abstraction or shared component you built that other teams adopted. How did you know it saved them work?

  • 06

    Describe a technical decision you reversed. What changed your mind and what did the reversal cost?

PracHub preparation framework ↗
What is the interview format?

No round list, stage lengths or question order have been reported in detail. Candidates describe coding in TypeScript, system design, observability and AI safety discussion, and behavioral conversations. Ask your recruiter for the sequence, which stages involve live coding and what environment is used, then prepare each area.

A Place for Mom Software Engineer candidate reports ↗
Which technologies should I prepare?

The reported stack is TypeScript, Node.js with NestJS, React with Next.js, REST or GraphQL API design, and Postgres, with Redis or Kafka for events and queues. Reports also mention CI/CD, structured logging and tracing. Prioritise TypeScript depth and the five reported implementation tasks.

A Place for Mom Software Engineer candidate reports ↗
What do the seven reported questions cover?

Five are hands-on implementation tasks: a NestJS endpoint with pagination, filtering, validation and tests; a React refactor for re-renders and accessibility; a schema-validated wrapper around a third-party API; a streaming handler for partial payloads and back-pressure; and retries with exponential backoff for a provider integration. Two are system design prompts: an event-driven provider-matching pipeline with SLAs and dead-letter handling, and a monolith-to-service migration with versioned APIs and a rollout plan. Several of the implementation tasks also carry design decisions, such as pagination strategy and retry policy, so be ready to explain those choices.

A Place for Mom Software Engineer candidate reports ↗
How should I handle AI and LLM topics?

Candidates are told to expect discussion of how AI systems differ from ordinary services: non-deterministic output, systematic evaluation, switching between providers, and rollback plans. Do not rely on manual spot checks as your only quality story. Prepare how you would build an evaluation set, track regressions and keep personal data out of prompts and logs.

A Place for Mom Software Engineer candidate reports ↗
How much should personal data feature in my answers?

Reports say sensitive and senior-care data should be treated with extra rigor. In any design or instrumentation answer, name what data is personal, where it is redacted, what is logged as metadata only, and how access is audited. Mention these without being asked.

PracHub Software Engineer practice ↗
Is there a take-home?

None is reported. The reported advice is to share code samples or references promptly if requested, so keep one or two clean examples ready, and ask the recruiter whether any written or take-home exercise is part of your loop.

A Place for Mom Software Engineer candidate reports ↗
Sources & methodology 3 sources ↗

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