celebrate · Software Engineer
Updated · 2026-10-02

celebrate Software Engineer
Interview Guide

THE 60-SECOND BRIEF

Candidate reports do not spell out celebrate's product line, so this guide does not guess at it. They describe the Software Engineer role as building user-facing digital product features and owning them from a design concept through to production. The work is reported to start from Figma designs, which engineers turn into working, maintainable applications alongside cross-functional colleagues, and to pass through peer review on GitHub. The requirements candidates describe list modern frontend frameworks, strong CSS and styling knowledge, and full-stack awareness, so the logic behind the interface matters as well as the interface itself.

This guide is for engineers interviewing for the celebrate Software Engineer role, with the heaviest weight on frontend work. It covers the five questions candidates report (frontend technology choices, a complex past feature, debugging under an ambiguous requirement, pull request quality, and design versus performance), the coding assignment and code review that candidates describe, and a seven-day plan that practises each of them.

Candidates do not report named rounds or a fixed order. They describe a remote process that includes a coding assignment, interaction through GitHub and a review of how clearly you explain your decisions.

Frontend developmentCode reviewsCSS

30 min read

Browse Software Engineer questions

See the practice prompts

13Practice promptsAcross five skill areas

The reported emphasis is narrow and practical: frontend development, CSS, building UI from a Figma design, and code review. Candidates say the CSS you write is read for accuracy against the design and for maintainability, which means the file structure, naming, and reuse of spacing and colour values matter as much as the rendered result. Prepare by rebuilding one real design at several viewport widths, with hover, focus, empty and error states, and by being able to say why each layout decision (flexbox or grid, fixed or fluid sizing) was made.

Code review shows up twice in what candidates describe: as a topic in its own right and as the medium for much of the process, because work is exchanged on GitHub. Written clarity is therefore part of the preparation. Practise writing pull request descriptions that state the goal, the assumptions you made where the requirement was unclear, and what you did not do. Practise answering review comments with either a change or a reasoned reply, never silence.

The five reported questions are conversation prompts rather than algorithm problems: which frontend technologies you know best and why, a complex feature you delivered, how you debug when a requirement is ambiguous, how you keep code quality high during a pull request review, and how you balance a designer's aesthetic with performance limits. Each rewards a specific past project with concrete numbers and trade-offs, so build your answers from your own work.

Candidates also report a coding assignment that takes roughly 4-5 hours of focused work and is meant to be treated as a professional project. No round sequence is reported beyond that, so ask your recruiter what the stages are, what the assignment contains, and which tools you will use, then block out the time in one or two uninterrupted sessions rather than squeezing it in.

01

Preparation focus

editorial

No round names or ordering are reported for celebrate. Candidates describe a remote process that moves from an introductory conversation to a deeper technical assessment and then a conversation about fit, with a coding assignment and GitHub-based review as the hands-on part. They say the CSS you submit is checked against the Figma design and that explaining your reasoning in review matters. Approach it as three skills to rehearse: building UI from a design, discussing your engineering experience, and handling feedback in writing. Ask the recruiter for the stage list, the assignment brief format and the review mechanics before you start.

What to demonstrate

  • Translating a Figma design into accurate, maintainable CSS and frontend code
  • Clear technical communication in pull request comments and spoken answers
  • Judgement on code quality, ambiguity and design versus performance trade-offs
  • Ownership of features from concept to production, as shown by your past work

How to prepare

  • Rebuild one design from a Figma file at mobile, tablet and desktop widths, then compare it with the original and list every difference you find
  • Write a pull request description and review your own diff as a reviewer would, leaving at least five comments you would accept from a colleague
  • Prepare spoken answers for the five reported questions, each anchored to one specific project with a trade-off and a result
  • Ask the recruiter about stages, assignment format, expected time and tooling, and plan one uninterrupted block of several hours for the assignment
PracHub preparation framework ↗

PracHub editorial advice for the preparation topics above.

01

Matching the Figma design at one screen width only, with hard-coded pixel values and no interactive states

Since candidates report that CSS is reviewed for accuracy and maintainability, define spacing, colour and type values once (custom properties or a theme file) and reuse them. Check your build at several widths and build hover, focus, disabled, empty and error states even when the design shows only the default. Compare against the design file one last time before opening the pull request.

02

Guessing at an unclear requirement and building on the guess without telling anyone

Ask early, as candidates are advised to do, and write the question so it can be answered in one line. When no answer arrives, state your assumption at the top of the pull request description and keep the code easy to change if the assumption is wrong. This also gives you a concrete story for the ambiguous-requirement question.

03

Treating review feedback as an argument, or replying to comments with a bare 'done' or nothing at all

Review is reported to be a main channel of the process, so reply to each comment with the change you made or the reason you kept the original. Name the trade-off in a sentence, thank the reviewer only when it adds something, and never resolve a thread silently. Rehearse with a friend commenting on your own pull request.

04

Answering the frontend technologies question with a list of tools and no depth

Pick two or three you know best, tie each to a shipped project, and say what it did better than the alternative and where it hurt. Be ready to explain how you handled state and styling in that project, because those are the areas candidates are told to expect questions about.

05

Squeezing the coding assignment into a gap and submitting without a self-review or README

Candidates report that it takes roughly 4-5 hours and should be handled like professional work. Schedule it in blocks, leave time at the end to read your full diff, remove dead code, check the layout against the design, and write a short note covering how to run it, what you assumed and what you would improve next.

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

10 technical prompts0 include a worked solution

Archive a resource graph without breaking live references or recursing

medium
graph traversaltopological ordertenant isolation

Resources reference other resources within a tenant; for the largest tenant the reference table holds up to 2,000,000 nodes and 8,000,000 edges. Archiving a resource must archive everything reachable from it that nothing outside the set still references, refuse when a live external referrer exists, and terminate when references form cycles, which they legitimately do. Produce the archive order and the refusal list, targeting O(V+E). Say what stops the traversal crossing a tenant boundary, and why recursion is the wrong control structure at this size.

Approach
  1. Load the subgraph with the tenant predicate on both endpoints of the edge, not only on the side you started from. Scoping the left table alone is the classic cross-tenant leak: one mis-entered edge then pulls another tenant's resources into the traversal and, worse, into the archive.
  2. Traverse iteratively with an explicit stack. A 2,000,000-node graph can hold a chain deep enough to exhaust a native stack in the low tens of thousands of frames, and that failure is a process crash rather than an error you can return.
  3. Treat cycles as data rather than corruption: compute strongly connected components with Tarjan in O(V+E) using its own explicit stack, then condense. The condensation is a DAG, so a topological order over it gives the archive order, and every member of a component archives in one transaction because no order within a cycle is valid.
  4. Decide refusals with reverse edges. A candidate is archivable only if every in-edge originates inside the candidate set, so build the transpose or count in-degrees restricted to the visited set, and emit each blocked resource with the id of the external referrer, which is the only part of the answer an operator can act on.
Follow-up
  • The graph is read in one query and the archive writes a minute later. What can change in between, and how do you make the write safe?
  • The candidate set is 400,000 resources. Is that one transaction, and if not, what does a half-finished archive look like to a reader?

Track a rolling failure rate per destination for circuit decisions

easy
sliding windowring buffercircuit 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?

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

medium
top-kheavy hittersstreaming

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?

The plan follows the reported emphasis: confirm the process, build from a design, then cover each of the five reported questions, the code review conversation, and a full dry run of the assignment and a spoken round.

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 process and choose your stack story
  • Email your recruiter to ask for the list of stages, the format and expected length of the coding assignment, the tools used for review and any language or framework requirement
  • List the frontend technologies you know best, pick two, and write the project, the reason you chose each and one drawback you hit
  • Say your answer to the frontend technologies question aloud and cut anything that is only a list of tool names

Deliverable: A recruiter email sent, plus a written two-technology answer with one project and one drawback each.

Practice prompt ↗
02Build a design at several widths
  • Choose any design you can open in Figma (or a similar design file) and build one component with a header, an image, text and a button
  • Style it for mobile, tablet and desktop, define spacing, colour and type values once, and include hover, focus, disabled and empty states
  • Compare your result with the design element by element and write down every mismatch you find and how you fixed it

Deliverable: One working component with a mismatch list, plus a short note on your spacing and colour scheme.

03Design fidelity versus performance
  • Take your day 2 component and measure it: image sizes and formats, font loading, layout shift, and whether animations use transform and opacity
  • Pick three places where the design costs performance, and for each write the change you would propose to a designer and the cost you would accept
  • Practise the answer aloud in a form that names a specific project, a trade-off and the result

Deliverable: A three-row table of design cost, fix and trade-off, and a spoken answer to the design versus performance question.

Practice prompt ↗
04Pull request quality and review conversations
  • Write your own review checklist covering correctness, naming, tests, accessibility, CSS reuse and risk, and keep it to one page
  • Open a pull request for your day 2 component, review it as a stranger would, and write at least five comments
  • Rehearse the review disagreement exercise from PracHub's practice set and write the comment you would leave

Deliverable: A one-page checklist and a pull request with five self-review comments and your replies.

Practice prompt ↗Practice prompt ↗
05Ambiguity, debugging and the logic behind the UI
  • Write the sequence you follow when a requirement is unclear: who you ask, what you write down, what you build first, and when you stop to check
  • Pick one past bug that came from a misunderstood requirement and write what you did differently afterwards
  • Work the two PracHub practice SQL exercises on concurrent edits and keyset paging, since the role is described as full-stack

Deliverable: A written ambiguity routine with one real bug story, and two worked data-layer exercises.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
06Walk through a complex feature
  • Choose the feature from your career that you can describe from design to production, and outline it as context, your part, decisions, trade-offs and result
  • Prepare the diagram or screenshot you would describe if sharing a screen, and mark the two decisions you would change today
  • Use the PracHub estimation practice exercise to rehearse how you state a range and the assumptions behind it, then practise the unblock-an-engineer exercise aloud

Deliverable: A one-page feature walkthrough with a result, plus a rehearsed estimate and an unblocking story.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
07Assignment dry run and spoken round
  • Give yourself a small feature spec, build it in a fresh repository in one sitting, and open a pull request with a description, assumptions and a README
  • Ask a friend to leave review comments on it and reply to each as you would in the real process
  • Answer all five reported questions aloud back to back and note the two weakest answers for another pass

Deliverable: A completed pull request with replies to review comments, and a ranked list of your two weakest answers.

Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗

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

The questions candidates report for celebrate are experience-based, so the behavioral side is about specific past work: a feature you owned, a requirement you had to clarify, and a review conversation you handled. Build each story from a real project with the decision, the trade-off and the outcome, and be ready to explain your reasoning in plain written and spoken language.

Unblock an engineer without taking the keyboard

easy
mentoringleasesat-least-once

A teammate has spent two days on a job handler that occasionally writes duplicate rows. They are certain the queue is delivering twice by mistake. You suspect a lease expiring under a slow handler, so the job is running concurrently with itself. Describe how you have unblocked someone in this position: what you asked before offering a hypothesis, what you showed them rather than told them, and what you left them owning. Then say what you would do if their theory turned out to be the right one.

Approach
  1. Ask before diagnosing, and ask for things answerable from data they already have: the attempt count on the job rows that produced duplicates, the handler's observed duration against its lease expiry, and whether the duplicate rows share a natural key that a unique constraint could have caught.
  2. Teach the shape rather than the answer. A lease cannot distinguish a dead worker from a slow one, so a handler that outruns its lease is running twice by design, and deploys deliver the other half by killing handlers mid-run on every rollout. Both of their candidate theories produce identical duplicate rows, which is why the evidence has to come from timings rather than from argument.
  3. Hand over a checklist they execute: a natural key on every write the handler performs so the second copy collides rather than appends, the record of intent written before any external effect, a lease heartbeat while running, and the metric that shows it working.
  4. Keep ownership with them deliberately. Pair on the first write, then step back; if you finish it yourself you have closed one ticket and left the same person stuck on the next redelivery.
Follow-up
  • How would you distinguish a genuine double-delivery from a lease expiry using only the data already stored?
  • Their handler calls an external endpoint before recording that it did. What do you tell them to change first?

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?

Estimate work you have never done and defend the range

hard
estimationbackfillsexpand-contract

You are asked to estimate a change you have never attempted: add a column to a 100-million-row table, populate it, move reads across, and drop the old shape. Give a range with the assumptions that generate it, including batch size, the signal your backfill throttles on, and wall-clock hours, and name the three unknowns that would move the number most. Then describe a real estimate you gave under comparable ignorance: how you expressed its uncertainty, what you committed to, and how wrong you turned out to be.

Approach
  1. Decompose into independently deployable steps before estimating anything: add the column nullable, write both shapes, backfill in batches, verify, move reads, stop writing the old shape, drop it. That is four deploys spread over days, and the calendar estimate is dominated by them rather than by the loop's runtime.
  2. Do the arithmetic aloud for the part that has arithmetic in it: batch size times number of batches times per-batch duration, at a write rate the primary can absorb alongside roughly 1.2k writes per second of production traffic. The loop is throttled by replication lag and lock waits, not by how fast it can issue statements.
  3. Price the schema step by its lock rather than its statement duration. In PostgreSQL an ALTER TABLE taking ACCESS EXCLUSIVE waits for every open transaction on that table while later queries queue behind it, so a millisecond change issued during a thirty-second analytics query stalls that table for thirty seconds. Adding a nullable column with a non-volatile default avoids a rewrite from version 11; a new index wants CREATE INDEX CONCURRENTLY, which cannot run inside a transaction block and leaves an invalid index behind if it fails.
  4. Express the answer as a range whose endpoints each trace to a stated assumption, then name the cheapest experiment that collapses it, which is almost always running one real batch against the real table and multiplying.
Follow-up
  • How do you verify the backfill genuinely finished, given rows written by production traffic while it ran?
  • Where does the backfill resume from after a worker is killed mid-batch, and what makes that resume point trustworthy?
  • 01

    Walk through a complex feature you delivered in a previous role, from the design you received to production: what you owned, the hardest decision, what you cut and what happened after release.

  • 02

    Describe a time you had to debug something where the requirement itself was unclear: who you asked, what you assumed in the meantime, and how you confirmed you were right.

  • 03

    Tell the story of a pull request review where you disagreed with a reviewer or an author: what you wrote in the comment, how it was resolved and what you changed afterwards.

  • 04

    Describe a case where a designer's vision conflicted with performance, how you measured the cost, and what you agreed on.

  • 05

    Give an example of feedback on your code that changed how you work, and say what you do differently now.

PracHub preparation framework ↗
How much time should I set aside for the coding assignment?

Candidates report roughly 4-5 hours of focused work and advise treating it as a professional project. Confirm any deadline and submission method with your recruiter, split the work into blocks, and keep time at the end to check your result against the design and write a short README.

celebrate Software Engineer candidate reports ↗
What do candidates find hardest about the process?

Reports point to the collaboration side more than the coding itself: explaining your thinking clearly when your work is reviewed. Practise writing pull request descriptions and review replies, and rehearse saying your reasoning aloud.

celebrate Software Engineer candidate reports ↗
Is the process remote?

Candidates describe a remote process that uses virtual meetings and GitHub for reviewing work. Make sure you can open a pull request, respond to review comments and push follow-up commits comfortably, and test your video and screen-sharing setup beforehand.

celebrate Software Engineer candidate reports ↗
How should I prepare for the CSS review?

Candidates report that CSS is checked for accuracy against the Figma design and for maintainability. Practise rebuilding a design at several widths with shared spacing and colour values, consistent naming, and no duplicated rules, and compare your build against the design before submitting.

PracHub Software Engineer practice ↗
Which frontend framework should I know?

The requirements candidates describe ask for modern frontend frameworks and strong CSS without naming one. Ask your recruiter whether the assignment expects a specific language or framework, and use the frontend technologies question to explain the one you know best, including where it was a poor fit.

celebrate Software Engineer candidate reports ↗
What topics do candidates say are covered?

The reported topics are frontend development, CSS, building UI from design specs in Figma, code reviews and technical communication during reviews. The five reported questions add past feature delivery, debugging under an ambiguous requirement and balancing aesthetics with performance.

PracHub Software Engineer practice ↗
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.