Start with a conversation that two teammates can see. One assigns it while the other writes a reply. A network response arrives late. Your preparation becomes much more concrete when you can explain which state each person sees and how it converges.
The official careers page describes Front’s customer operations product and emphasizes collaboration, high standards and low ego. Use that context to practise decisions that improve a shared workflow. The exercises below are editorial models, not descriptions of Front’s internal infrastructure.
Pick an explicit unit of work. A message, a delivery attempt and a conversation update are different objects. Give each an identity. A repeated delivery may carry the same event while two legitimate messages may contain identical text. Deduplicating by text silently loses information.
Keep the UI honest. A local edit can be visible before it is durable, but the interface should distinguish pending work from a confirmed save. Trace a request from a component through a service and back. Explain cancellation, stale responses and recovery with the same precision as the happy path.
Bound asynchronous work
editorialStart with a finite queue and a concurrency limit. Follow one successful request, one rejection and one slow request. Decide whether results preserve input order and whether a single failure stops unrelated work.
What to demonstrate
- Explain resource use when the queue grows.
- Keep failure results associated with the correct input.
How to prepare
- Build the batching exercise with a fake clock or controlled promises.
- Show what happens at limits one and larger than the input size.
Protect shared state
editorialModel a conversation with a monotonically increasing revision. A reader may be behind, and two teammates may submit changes from the same revision. Describe which operations commute and which require conflict handling.
What to demonstrate
- Separate identity, ordering and authorization.
- Explain reconciliation after reconnecting.
How to prepare
- Sketch the shared-inbox exercise with two clients.
- Use the note scenario below to practise conditional updates before adding message delivery.
Make recovery understandable
editorialA timeout does not tell the user whether their action succeeded. Preserve the operation identity and query a durable result before inviting a repeated action. Keep enough diagnostic metadata to investigate without logging message bodies.
What to demonstrate
- Define a next action for pending and conflicting states.
- Use evidence to separate a client race from a server failure.
How to prepare
- Reproduce the stale-response prompt.
- Prepare a real incident story with detection, mitigation and a follow-up check.
PracHub editorial advice for the preparation topics above.
What happens when two people edit the same note?
Choose a scenario to trace what changes.
You open a shared note and edit its text. Nobody else changes the saved note before you press Save.
- 01You edit a shared noteThe app remembers which saved revision you opened, along with your unsaved changes.
- 02The saved note is unchangedThe server atomically checks that nobody has saved a newer revision since you opened it.
- 03Your changes are savedThe server stores the edited note as the next revision and returns confirmation to the app.
Save only if the note still matches the revision you opened. Confirm success after the server accepts the change.
PracHub practice model: two support teammates edit one internal conversation note. The revision is the saved note version. Explore a successful save, a conflicting edit and a lost acknowledgement.
Calling cancellation a correctness guarantee
A cancelled request can already have produced a response or committed server work. Keep request identity checks and durable operation lookup.
Deduplicating by message text
Two messages can legitimately say the same thing. Deduplicate stable event identities within their workspace.
Creating unlimited suspended jobs
A semaphore limits active requests but can still leave one task allocated per input. Explain both concurrency and memory bounds.
Hiding uncertainty behind a success toast
Show pending and confirmed states separately, and preserve user input while resolving conflicts.
Choose a category, try a prompt, then open its approach, worked solution or follow-up when you need it.
Process tasks with a concurrency limit
Implement a Python asyncio helper that runs zero-argument async jobs with a positive integer worker limit. Return results in input order as success/value or failure/error records. Ordinary job exceptions must not cancel unrelated jobs; caller cancellation should propagate.
Approach
- Start only min(limit, job_count) workers, each pulling an index from a shared queue. Avoid creating one suspended task per job if you claim bounded worker count.
- Place each result at its original index. Catch ordinary Exception inside the worker, while allowing cancellation to stop the operation. Explain that the input and output lists still require O(n) memory.
Worked solution 35 min
- Create a queue of input indices and a fixed-size worker group.
- Each worker removes one index, awaits its job and writes a tagged result. There is no await between checking queue emptiness and taking the next item.
- Catch ordinary failures per job. External cancellation propagates through gather; production work may additionally need per-job timeouts and resource cleanup.
import asyncio
async def bounded(jobs, limit):
if type(limit) is not int or limit <= 0:
raise ValueError("positive integer limit required")
queue = asyncio.Queue()
for i in range(len(jobs)):
queue.put_nowait(i)
results = [None] * len(jobs)
async def worker():
while not queue.empty():
i = queue.get_nowait()
try:
results[i] = (True, await jobs[i]())
except Exception as error:
results[i] = (False, type(error).__name__)
await asyncio.gather(*(worker() for _ in range(min(limit, len(jobs)))))
return results
Scroll sideways to view long lines.
Follow-up
- What changes for an unbounded producer, priority work or a hard deadline?
Apply each event once per workspace
Given (workspace, event_id, payload) records, retain first-seen order. Ignore exact repeats, reject a repeated identity with a different payload and allow the same event ID in different workspaces.
Approach
- Key the lookup by workspace and event ID. Store the payload fingerprint alongside the accepted record.
- Return a conflict instead of choosing whichever payload arrived last. Bound the retention policy separately if this becomes a long-running stream.
Follow-up
- How does deduplication interact with deleting a workspace or replaying old events?
Count recent message acknowledgements
Given nondecreasing integer timestamps, count events in (now − 10, now]. Each event counts once. The clock can advance without a new event; an event at the lower boundary has expired.
Which events still count?
The left boundary is excluded; the right boundary is included. Drag past an event to see it enter, then expire 10 seconds later.
See the event values
- At 0s: +1 — expired
- At 5s: +1 — in window
- At 10s: +1 — in window
- At 14s: +1 — not arrived
- At 19s: +1 — not arrived
Synthetic message acknowledgements at 0, 5, 10, 14 and 19 seconds, each with weight one. Drag the clock: at 10 seconds only 5 and 10 count; at 30 seconds none remain. The lower boundary is excluded.
Approach
- Keep a deque and remove timestamps at or before now − 10 before reporting a count. Equal timestamps represent distinct events unless a separate event ID says otherwise.
- Expose both add(time) and count(now). Reject a backward clock and document the O(k) retained-event memory cost. Each event is inserted and removed once, giving amortized O(1) updates.
Follow-up
- How would late arrivals, multiple producers or a per-customer limit change the contract?
Find the current conversation state
Given updates(workspace, conversation_id, revision, status), return the highest revision per conversation for workspace a. Each identity and revision is unique; revisions, not arrival order, define freshness.
Approach
- Filter to the authorized workspace, then rank by revision descending within workspace and conversation.
- Keep rank one. Add a regression fixture with the same conversation ID in a second workspace.
Worked solution 35 min
- Treat the composite workspace and conversation identity as the partition.
- Rank by the authoritative revision; arrival timestamps are irrelevant to this contract.
- The workspace predicate is supplied from an authorized server context, not trusted from a client field.
CREATE TABLE updates (workspace TEXT, conversation_id TEXT, revision INTEGER, status TEXT,
PRIMARY KEY(workspace, conversation_id, revision));
INSERT INTO updates VALUES ('a','c1',2,'closed'),('a','c1',1,'open'),
('a','c2',1,'open'),('b','c1',9,'secret');
WITH ranked AS (
SELECT *, ROW_NUMBER() OVER (
PARTITION BY workspace, conversation_id ORDER BY revision DESC) AS rn
FROM updates WHERE workspace='a'
)
SELECT conversation_id, revision, status FROM ranked WHERE rn=1 ORDER BY conversation_id;
Scroll sideways to view long lines.
Follow-up
- How would you represent a deleted conversation without accidentally resurrecting an older row?
List conversations with no agent reply
For a fixed cutoff, return each conversation that has a customer message before the cutoff and no agent reply before it. Use workspace-scoped keys; many messages must still produce one conversation row.
Approach
- Start with authorized conversations and use EXISTS for an eligible customer message.
- Use NOT EXISTS for a qualifying agent reply. State whether automated acknowledgements count and how messages exactly at the cutoff are treated.
Follow-up
- How would you instead identify customer messages unanswered since the last agent reply?
Design shared inbox synchronization
Design a simplified shared inbox for two clients and then many workspaces. Support assignment changes, reconnecting clients and a durable history cursor. No workspace may read another workspace’s conversations.
Approach
- Commit an authorized state change and its outbound event in one database transaction. Use a per-conversation revision to reject obsolete state.
- Offer snapshot-plus-cursor recovery. Define how events produced during snapshot creation are replayed, and require a fresh snapshot when the retention window expires.
Worked solution 35 min
- Start with one durable state store, an authorized mutation endpoint and a per-workspace event feed.
- For each change, commit the new revision and an outbox entry together. A publisher can retry; clients reject repeated event IDs and older revisions.
- Return a snapshot with a cursor tied to its consistent view. Replaying from an unrelated later cursor can skip an update.
- On reconnect, replay from the cursor or replace state from a new snapshot if history expired. Reauthorize both paths.
Follow-up
- Which operations require total ordering, and where would that ordering become a bottleneck?
Design retryable webhook delivery
Build an editorial webhook sender with at-least-once delivery. A target may return errors, become slow or receive a request but lose the acknowledgement. Define retry limits and workspace fairness.
Approach
- Persist a delivery record before dispatch and distinguish the logical event from its attempts. Use a stable event ID so receivers can deduplicate.
- Use bounded concurrency, backoff with jitter and a terminal review path. Enforce an overall retry horizon and avoid claiming exactly-once execution at the receiver.
Follow-up
- How do you stop one failing destination consuming the whole worker pool?
Stop an older response replacing the current conversation
The user opens conversation A, then B. B responds first, but the late A response replaces B’s content. Reproduce the bug and specify a fix that also handles leaving and returning to the same conversation.
Approach
- Use controlled promises to complete requests in reverse order. Record the selected conversation and a request generation.
- Accept a response only if both identities match the current view. Cancellation saves work but does not replace the identity check.
Worked solution 35 min
- Select A and start request generation one; select B and start generation two.
- Resolve B, then A. A must be ignored because its identity is no longer current.
- Navigate back to A with generation three. The old generation-one response must still be rejected.
Follow-up
- How would an obsolete error response cause the same class of problem?
A PracHub practice schedule with one outcome per session. Adjust the pace to your experience and interview date; it is not a company hiring timeline.
Prepare, practise & reflect
One practical outcome each day. Spend longer where you need it.
0 / 7 done01Map one shared workflow
- Draw two teammates viewing the same conversation.
- Mark every point where their state can diverge.
Deliverable: A shared-state diagram
02Bound the workers
- Implement the async helper.
- Measure the maximum active job count and isolate one rejection.
Deliverable: A tested worker pool
Practice prompt ↗03Check the data boundary
- Run the current-state SQL.
- Add colliding workspace IDs and a late old revision.
Deliverable: A tenant-scoped fixture
Practice prompt ↗04Design reconnects
- Trace snapshot creation, one update and cursor replay.
- Explain the history-expiry fallback.
Deliverable: A recovery timeline
Practice prompt ↗05Reproduce the UI race
- Control the completion order of two requests.
- Test a return to the same conversation.
Deliverable: A deterministic regression test
Practice prompt ↗06Practise collaboration
- Rehearse one disagreement and one customer incident.
- Name the evidence that changed the decision.
Deliverable: Two story outlines
Practice prompt ↗Practice prompt ↗07Review the weak path
- Switch the note scenarios and move the event clock.
- Explain a retry that is safe and one that requires reconciliation.
Deliverable: A final review sheet
Practice prompt ↗Practice prompt ↗Expand any day for tasks and deliverables. Your progress is saved on this device.
Use a real project. Explain your responsibility, the decision you made, the evidence you used and what you would change.
Push back on an ambiguous workflow
Describe a feature where you clarified what users needed before implementing the requested solution.
Approach
- State the user impact and your personal responsibility. Describe an alternative fairly before defending your choice.
- Explain the evidence, collaboration and observed result. Include what you would change; do not invent a metric for a stronger story.
Follow-up
- What would the other person in the story say you learned?
Resolve a design disagreement
Explain a code-review disagreement where evidence changed your decision or your teammate’s.
Approach
- State the user impact and your personal responsibility. Describe an alternative fairly before defending your choice.
- Explain the evidence, collaboration and observed result. Include what you would change; do not invent a metric for a stronger story.
Follow-up
- What would the other person in the story say you learned?
Own a customer-visible failure
Walk through a production incident you helped resolve, including the uncertainty you communicated.
Approach
- State the user impact and your personal responsibility. Describe an alternative fairly before defending your choice.
- Explain the evidence, collaboration and observed result. Include what you would change; do not invent a metric for a stronger story.
Follow-up
- What would the other person in the story say you learned?
- 01
Choose examples you can discuss without sharing confidential customer data.
Must I solve the async exercise in Python?
Python keeps the reference solution runnable and compact. The same contracts apply to TypeScript promises or another permitted language; this guide does not assert a required interview language.
Are these verified company interview questions?
These are PracHub practice exercises informed by the supplied guide themes and official product context. They include original constraints and worked solutions; they are not an independently verified list of questions asked by the employer.
Why include SQL alongside coding and design?
SQL is supplemental practice for inspecting system state and checking invariants. Its inclusion does not mean every role has a SQL interview. Prioritize the skills in your exact opening.
How should I use the seven-day checklist?
Attempt each task before opening its solution. Save one artifact per session, such as a tested function, fixture or failure timeline. Repeat weak areas and adjust the pace instead of treating seven days as a readiness guarantee.
Sources & methodology 3 sources ↗
Official role evidence, timestamped platform data and clearly labeled preparation advice.
- 01Front — official engineering and product context ↗
Company context only; preparation recommendations are PracHub editorial advice.
official · Accessed 2026-09-20 - 02PostgreSQL — Window functions ↗
Technical reference for SQL reasoning. Runnable teaching fixtures below use SQLite.
official · Accessed 2026-09-20 - 03PracHub — Software Engineer practice ↗
Cross-company practice; not evidence of company interview questions.
platform · Accessed 2026-09-20