Reddit · Software Engineer
Updated · 2026-09-24

Reddit Software Engineer
Interview Guide

THE 60-SECOND BRIEF

Reddit is a platform of communities where users discover, discuss and share content. For a Software Engineer, the source notes place the engineering work in the core content feed, real-time chat, search, ad-bidding platforms and machine learning pipelines. They name team areas such as Core App, Ads Engineering, Infrastructure and Community Tools. Depending on the team, the work is backend microservices, data pipelines, or web and mobile clients.

This guide covers the Software Engineer loop as candidates report it: a recruiter conversation, a technical screen and a virtual onsite. It groups the reported questions into algorithms, practical object-oriented and domain design, system design and behavioural. It adds original drills on feed, counter, notification and pagination problems, with worked solutions for three of them. It includes a seven-day plan in which each day maps to a round or a question category. Confirm the current format with your recruiter, because these stages come from candidate reports, not from a published process.

Reddit candidates report 3 rounds · ≈ 3-5 weeks. The stages below are what candidates describe, not a published process.

Shard hot counters and absorb celebrity read fanoutChoose push, pull or hybrid fanout deliberatelyBound thread reads with denormalized roots or paths

40 min read

Practice 15 Software Engineer prompts
12Company bank questionsSnapshot · Sep 24, 2026 PT
8Candidate experiences ↗Read their reports
15Practice promptsAcross five skill areas
3With worked solutionsIncluded in the practice prompts

Software Engineers at Reddit work on the systems behind the content feed, real-time chat, search and ads, and on machine learning pipelines. The source notes name team areas such as Core App, Ads Engineering, Infrastructure and Community Tools. Depending on the seat, the day-to-day work is building microservices, optimizing data pipelines, or working on web and mobile clients. The notes also list architectural design reviews, code reviews and on-call rotations as part of the job, so be ready to talk about operating a system as well as shipping features.

The reported questions reflect that spread. The coding questions include classical algorithm problems: finding nodes with zero or one parent in a parent-child graph, the lowest common ancestor of two nodes in a binary tree, BFS or DFS over arrays, and processing a transaction stream with hashing. They also include practical domain problems: a tennis scoring tracker with deuce and advantage, parsing an administrator action log and checking whether one admin can remove another, merging fragmented chat messages, and an in-memory cache with eviction. The reported design questions cover a newsfeed that distributes posts to subscriber feeds, an ad-serving API with real-time click and impression aggregation, a caching layer for a read-heavy application, and an ML feature store or real-time signal pipeline.

The role notes list Python, Go, Java, C++, TypeScript and Swift or Kotlin as languages, and PostgreSQL, Redis and Cassandra as data stores. They list AdTech, auction systems and streaming systems such as Kafka as nice-to-haves. Use that list to choose your design vocabulary, but only claim tools you have actually run in production.

The practical coding category is where a purely puzzle-based preparation falls short. Practise modelling state and parsing input cleanly. Build a working baseline before handling every edge case, and say your assumptions out loud whenever a prompt leaves the input format open.

01

Recruiter Conversation

reported

Candidate reports describe this as a conversation with a recruiter about your background, your career direction and how you fit the open positions. Use it to find out which seat you are interviewing for. The role notes name team areas such as Core App, Ads Engineering, Infrastructure and Community Tools, and the work ranges from backend services and data pipelines to web and mobile clients. Also ask which format the technical screen takes, because reports describe both a live coding session and a hiring manager phone screen. Say which parts of the posting you have done and which you have not. If you claim all of it, the gaps come out in a later round.

What to demonstrate

  • Whether your background maps clearly onto one team area and one kind of work rather than onto the whole posting
  • Whether you can explain your career direction, and why this role fits it, in a few concrete sentences
  • Whether you are open about the parts of the posting you have not done

How to prepare

  • Mark each line of the posting as done, adjacent or new, and for each adjacent line write one sentence naming the closest thing you built
  • Ask which team the role is on, whether the technical screen is live coding or a hiring manager screen, and how the onsite sessions are split
  • Prepare a short answer to why you want to join Reddit that names a community you actually use and one concrete thing you noticed about it
PracHub interview research
02

Technical Screening

reported

Reports describe this stage as either live coding in a collaborative editor such as CodeSignal or CoderPad, or a hiring manager phone screen. Either way it focuses on core algorithms, coding fluency and problem-solving speed. Candidate notes say screens often use classical problems on arrays, trees and graph search. The reported coding questions include finding nodes with zero or one parent in a parent-child graph, the lowest common ancestor in a binary tree, BFS or DFS over arrays, and a transaction stream solved with hashing. Write a correct brute force first and state its cost. Then improve it while the working version is still on screen. Before you say you are finished, trace an empty input, a single element and duplicate keys.

What to demonstrate

  • Whether degenerate inputs get checked without prompting: an empty collection, one element, all elements equal, and a node that appears only on one side of a relationship
  • Whether the complexity you state matches the code you actually wrote, including a sort or a copy inside a loop
  • Whether you check the finished answer against the worked examples before calling it done

How to prepare

  • Drill the reported coding categories: a parent-count map built from edge pairs, lowest common ancestor in a general binary tree and in a BST, BFS or DFS on a grid, and a single hash-map pass over a stream
  • Practise the brute force as a separate skill: on ten problems, write only the obviously correct slow version and time how long it takes to pass
  • Take five problems you have solved and, without running anything, write what each returns for empty input, one element and all duplicates; then run them and count how many you got wrong
  • If you get a hiring manager screen, prepare a walkthrough of one system you built: its scale, the part you owned, and one trade-off you made
PracHub interview research
03

Virtual Onsite Loop

reported

Reports describe a virtual onsite that can include multiple sessions and can be split across two days. It covers practical domain coding, system design, product and cross-functional collaboration, and behavioural conversations. Candidate notes say onsite coding leans on practical object-oriented modelling, string processing and domain design more than on puzzle-style algorithms. The reported questions in those categories include a tennis scoring tracker, an admin log parser with a seniority-based permission check, and chat message merging with caching. The reported design questions include a newsfeed, an ad-serving API and a caching layer. For the practical problems, build a working baseline and then extend it. Aim to leave each session with one concrete thing the interviewer can cite, such as a bug you caught yourself or a trade-off you named. Keep your project facts the same in every session.

What to demonstrate

  • Whether practical coding problems get clear state and classes, and whether you extend them in steps without breaking what already worked
  • Whether a design states requirements, a data model and the scaling bottleneck before choosing components
  • Whether the scale, team size and decisions you attach to a project stay the same when it comes up in a different session
  • Whether you describe work with product managers and data scientists in terms of a specific decision and what it cost

How to prepare

  • Build the tennis tracker and the admin log parser in stages: get one game or one record type tested first, then extend it
  • Sketch the newsfeed with push, pull or hybrid fanout and the ad aggregation path with idempotent counting, then work the at-most-once push design exercise
  • Write a one-page sheet per project with the figures you will quote, and repeat them aloud until they come out the same every time
  • Prepare one cross-functional story: a decision you negotiated with a product manager or data scientist, what you gave up, and the result
PracHub interview research

8 candidate reports. Individual accounts describe a particular role and hiring cycle.

Software Engineer

Reddit Software Engineer Interview Experience — A Word-Search Rule Clarified Too Late

Technical ScreenOutcome: rejected

The author reports an unsuccessful Reddit coding screen involving word search. After presenting the task, the interviewer remained quiet while the applicant worked. The author did not confirm the movement rules and implemented a more permissive search than the interviewer expected. A typo also consumed about ten minutes. Although the applicant’s own tests passed, the interviewer said near the end…

Read full experience
Machine Learning Engineer

Reddit Machine Learning Engineer Interview Experience — General Pooling and a Ranking Interview

Technical Screen → OnsiteOutcome: rejected

I applied to a particular team while sending out lots of applications online. The first phone screen was a question from the forum: analyze a spent-hours dataset and predict clicks. Since I had prepared it, the interview went quite smoothly. A week after the interview, I still hadn't heard anything, so I logged into the candidate portal. The position I had applied for was gone, and the interview…

Read full experience
Machine Learning Engineer

Reddit Machine Learning Engineer interview experience: two DSA rounds

Technical Screen

The interview was straightforward: two data-structures-and-algorithms rounds along with machine-learning knowledge. The interviewers were kind and easygoing, and one of them in particular made the conversation feel comfortable. The format matched what I expected for the role. There were no strange surprises, just a clean sequence with a relaxed tone. I did not receive an offer, but the interview…

Read full experience
Backend Engineer

Reddit Backend Engineer Interview Experience — Load Balancer Deep-Dive and a One-Week Offer

Technical ScreenOutcome: offer

General coding 1: the Report Chain problem General coding 2: the Tennis Game problem — afterward the interviewer also chatted with me a bit about the strategy pattern Backend programming: the Load Balancer problem: It's split into four parts, and they give you a codebase. Part 1: The load balancer keeps getting error code 500. You need to find the cause — the cause is that the LB has the hostname…

Read full experience

PracHub editorial advice for the preparation topics above.

01

Counting only nodes that appear as children in the parent-child graph question

Build the parent count from every pair, and give every node that appears anywhere a count of zero first, including nodes that only ever appear as a parent. Nodes that appear only as parents are exactly the zero-parent answer, and a dictionary that records only children silently drops them. Ask whether duplicate pairs can occur. Before you finish, trace a node with two parents and a repeated pair.

02

Writing the tennis scoring tracker as one growing chain of if-statements

Name the states before writing code: point scores within a game, deuce, advantage, game won, and then set and match counters. Write the transition for a won point from each state, including advantage back to deuce, and reject points recorded after the match is decided. Get one game correct and tested before adding sets and the match. Extending a working game is cheaper than debugging a whole match of nested conditions.

03

Parsing the admin log before settling its format and what seniority means

The reported prompt asks for admins ordered by last addition time and a check of whether one admin can remove another based on seniority. Before parsing, state the record separator and timestamp format, and say what happens when an admin is added twice or removed and re-added. Also settle whether seniority means an earlier addition or a position in an ancestor chain (the related bank question uses ancestor relationships and creation timestamps). Write those assumptions down, parse into a map keyed by admin, and test the re-added case.

04

Aggregating ad clicks and impressions from an at-least-once stream with no event id

In the ad-serving and ad event pipeline design questions, the aggregates feed reporting and billing, so an event counted twice after redelivery is a billing error. Give each event a unique id and make the aggregation step idempotent, either by deduplicating on event id within the redelivery window or by upserting keyed rows. State that a partitioned log guarantees order only within a partition. Explain how late events are handled and how a batch reconciliation corrects the real-time count.

05

Answering 'why Reddit' and 'how would your manager rate you' with generic lines

The reported behavioural questions include why you want to join Reddit and which community is your favourite, and how your current or previous manager would rate you from 1 to 10. Use the product before the loop and name a community you actually read, with one concrete observation about how it works for its members. For the rating, give a number below 10, cite the feedback it is based on, and name the growth area and what you have done about it. A perfect score with no evidence leaves the interviewer nothing to write down.

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

12 technical prompts3 include a worked solution

Implement a solution to find nodes with 0 parents and 1 parent in a pa…

medium
data structures and algorithms

Implement a solution to find nodes with 0 parents and 1 parent in a parent-child graph relationship.

Approach
  1. State the target complexity and say which constraint rules the naive version out.
  2. Choose the data structure from the access pattern, not from familiarity.
  3. Walk one small example through your approach before writing the whole thing.
Follow-up
  • Which test case would catch an off-by-one here?
  • What is the worst case, and how likely is it on real data?

Process a transaction stream using optimal hashing and array lookup te…

medium
data structures and algorithms

Process a transaction stream using optimal hashing and array lookup techniques.

Approach
  1. State the target complexity and say which constraint rules the naive version out.
  2. Restate the input: its shape, its size, and what is guaranteed about it.
  3. Name the brute-force solution and its complexity before improving on it.
Follow-up
  • How does this change if the input no longer fits in memory?
  • Which test case would catch an off-by-one here?

Solve array-based data manipulation problems utilizing depth-first sea…

medium
data structures and algorithms

Solve array-based data manipulation problems utilizing depth-first search (DFS) or breadth-first search (BFS).

Approach
  1. Choose the data structure from the access pattern, not from familiarity.
  2. State the target complexity and say which constraint rules the naive version out.
  3. Walk one small example through your approach before writing the whole thing.
Follow-up
  • What is the worst case, and how likely is it on real data?
  • How does this change if the input no longer fits in memory?

Given a binary tree structure, find the lowest common ancestor of two …

medium
data structures and algorithms

Given a binary tree structure, find the lowest common ancestor of two specified nodes.

Approach
  1. Choose the data structure from the access pattern, not from familiarity.
  2. Restate the input: its shape, its size, and what is guaranteed about it.
  3. State the target complexity and say which constraint rules the naive version out.
Follow-up
  • How does this change if the input no longer fits in memory?
  • What is the worst case, and how likely is it on real data?

Suppress duplicate notifications under bounded memory and redelivery

hardWorked solution
deduplicationprobabilistic structuresbounded state

The notification path receives envelopes as (recipient_id, dedup_key, ts_ms) at 300,000 per second, and at-least-once redelivery means the same (recipient_id, dedup_key) can reappear at any point within 24 hours. Deliver each pair at most once per 24-hour window using memory that does not grow with the stream. Exact deduplication over 24 hours at this rate spans roughly 26 billion events, which does not fit in memory. Give the design, state the memory it consumes, and state precisely which direction it can be wrong in and how often.

Approach
  1. Separate events from distinct pairs before sizing anything. The gate only has to remember distinct pairs, not deliveries, so measure the redelivery ratio first: at 26 billion events and a 12x ratio the distinct set is about 2 billion, which at 16 to 24 bytes an entry is still 32 to 48 GB. That does not by itself solve the problem, but it changes the constant by an order of magnitude and it is the first number to establish.
  2. Make expiry O(1) per bucket rather than per entry by time-bucketing the state: 24 rotating hourly sets, a lookup probes all 24, an insert goes to the current one, and expiry frees the oldest set wholesale. Per-entry TTLs cost a delete per entry and fragment the allocator. Two prices come with that bucket count and both are quantitative: the effective window runs from 24 to 25 hours depending on where in a bucket the first delivery landed, and a lookup gets 24 independent chances to return a false positive rather than one. State the slop instead of claiming exactly 24 hours, and carry the 24 into the sizing rather than the footnotes.
  3. Choose the error direction deliberately, which is the real content of the question. A Bloom filter has no false negatives and false positives at rate p, so a false positive suppresses a real notification: a silent, user-visible loss with no recovery path. If the product prefers a rare duplicate to a rare silent drop, demote the filter to a negative cache where a miss is definitive and a hit is confirmed against a durable store, so a false positive costs one lookup instead of a notification.
  4. Size from the rate a caller sees, not the per-filter rate, or the headline is wrong by the bucket count. The 24 filters hold disjoint sets, so their false positives are independent and the delivered rate is P = 1 - (1 - p)^24, about 24p. Invert it: p = 1 - (1 - P)^(1/24), about P/24. For a target P = 10^-4 that is p = 4.2 * 10^-6, and the optimal geometry is bits per element = 1.44 * log2(1/p) = 25.8 with hashes = 0.693 times that, about 18 per filter, so 2 billion distinct pairs is roughly 6.4 GB across all buckets against 32 GB or more for exact. Sizing each bucket at p = 10^-4 instead looks cheaper at 19.2 bits and 4.8 GB, but its delivered rate is 2.4 * 10^-3.
  5. Treat the bucket count as the tuning knob it is, with no free corner: B buckets give window slop up to 24/B hours, bits per element proportional to log2(B/P), and B filters probed per lookup. B = 4 costs 22.1 bits and 5.5 GB but up to 6 hours of slop; B = 24 holds the slop under an hour and costs 25.8 bits and about 430 random bit probes per lookup, which at 300,000 lookups per second is roughly 130 million random memory reads per second and is the part that bites on real hardware, not the gigabytes.
  6. Convert P into a number a product owner can accept or reject, noting that only a first delivery can be wrongly suppressed: about 2 billion first-deliveries a day times P = 10^-4 is roughly 200,000 notifications silently suppressed per day, and at the mis-sized 4.8 GB geometry the same sentence reads about 4.8 million. That sentence is the deliverable; the byte count alone is not. Then shard on a hash of the pair so each worker owns a disjoint key space and needs no coordination, or shard on recipient_id if coalescing decisions for one recipient must be co-located, and state the restart behaviour plainly: losing a worker's in-memory sets produces duplicates, not drops, which is the safer direction, and persisting only the current bucket bounds how many. Exact at-most-once needs memory proportional to the distinct pairs in the window; any design using materially less trades one error direction for the other, and the answer is naming which.
Worked solution 40 min
  1. Compute the exact bill first: 300,000 per second times 86,400 seconds is 25.9 billion events; apply a measured redelivery ratio to get distinct pairs, then price an exact hash set at 16 to 24 bytes per entry and write that number down.
  2. Lay out 24 hourly buckets, define lookup as a probe of all 24 and expiry as dropping the oldest, and state both consequences of that bucket count: window slop of up to one bucket, and 24 independent false-positive chances per lookup.
  3. Fix the delivered target P, invert the union bound to p = 1 - (1 - P)^(1/24), then size each bucket with bits per element = 1.44 * log2(1/p) and hashes = 0.693 times that, and report both the total in gigabytes and the bit probes per lookup.
  4. Convert P into the daily count of silently suppressed notifications, counting first deliveries only, and decide explicitly whether that is acceptable; if it is not, restructure the filter as a negative cache in front of a durable store.
  5. Choose the shard key, and state that a worker restart yields duplicates rather than drops.
EXPECTED RESULTA sharded, bucket-rotating dedup gate sized from the delivered rate rather than the per-filter rate: with 24 hourly buckets at P = 10^-4 the per-bucket p is 4.2 * 10^-6, which is 25.8 bits per element and about 18 hashes, roughly 6.4 GB for 2 billion distinct pairs against 32 GB or more for exact, about 430 bit probes per lookup, a window slop of one bucket, an explicit error direction, and about 200,000 notifications silently suppressed per day.
Follow-up
  • Add coalescing: 40 likes on one item within five minutes should become one notification. Does that change the key, the structure, or both?
  • You are told a silent drop is unacceptable but a duplicate push is merely bad. Redesign the gate and state the new memory bill.
  • The service does a rolling restart every 30 minutes. What does that do to your guarantee, and what is the cheapest durable state that restores it?

For a candidate senior enough that the loop turns on design and judgement rather than on whether the coding round gets finished. Five days build one system properly and then stress it; coding gets a single maintenance day, on the assumption that the risk at this level is an unexamined tradeoff rather than a missed algorithm.

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
01Recruiter call and role mapping
  • Mark each line of the posting as done, adjacent or new, and match your experience to one team area the source notes name: Core App, Ads Engineering, Infrastructure, Community Tools, or web and mobile client work.
  • Write three questions for the recruiter: which team, which technical screen format (live coding in a tool such as CodeSignal or CoderPad, or a hiring manager screen), and how the onsite sessions are split.
  • Write your why-Reddit answer around a community you actually use and one concrete thing you noticed about how it works.

Deliverable: A one-page role map, three recruiter questions, and a why-Reddit answer that names a real community.

Practice prompt ↗Practice prompt ↗Practice prompt ↗Worked solution ↗
02Technical screen: trees and graphs
  • Solve the reported parent-child graph question (nodes with zero parents and exactly one parent) with a count map. Trace it on a node that appears only as a parent and on a repeated pair.
  • Solve lowest common ancestor twice: once for a general binary tree with a recursive search, and once for a BST using the ordering (the bank's Lowest Common Ancestor in BST). State the complexity of each.
  • Solve two BFS or DFS problems of your choice over an array or grid, for example counting connected regions with BFS and a flood fill with DFS. Write the brute force first and time how long it takes to pass.

Deliverable: Five solved problems (parent count, LCA in a binary tree, LCA in a BST, and two BFS or DFS problems), each with its complexity stated and a written trace for empty, single-element and duplicate inputs.

Practice prompt ↗Practice prompt ↗
03Coding: hashing, intervals and streams
  • Solve the reported transaction-stream question with a hash map. State what the map is keyed by and how large it grows.
  • Solve the bank's Merge Overlapping Chat Messages: sort by stream and start time, then merge overlapping or consecutive intervals in O(n log n). Test touching intervals, one message, and messages from different streams.
  • Implement the bank's sliding-window rate limiter and say whether your version is exact per request or approximate.
  • Work the duplicate-notification worked exercise (Suppress duplicate notifications under bounded memory and redelivery) and recompute its sizing figures yourself.

Deliverable: Three working implementations with tests (transaction stream, chat message merge, rate limiter), plus your own recomputed numbers for the dedup exercise.

Practice prompt ↗Practice prompt ↗
04Onsite: practical object-oriented coding
  • Build the tennis scoring tracker in stages: one game with deuce and advantage, tested; then sets and match; then rejecting input once the match is over.
  • Solve the admin log question. Write down the log format assumptions, parse into a map, return admins by last addition time, then add the permission check (compare the bank's Permission Deletion Logic).
  • Design an in-memory cache with a memory bound, an eviction policy and an invalidation rule, and say why that policy fits the access pattern.
  • For extra repetitions, time yourself on the bank's Implement a Stateful Chatter Message Store or Design Add, Overwrite, Undo, and Redo for Billing State.

Deliverable: The tennis tracker and admin log solutions built in stages, each with its assumptions and test list written out, plus a written cache design.

Practice prompt ↗Practice prompt ↗Worked solution ↗
05Onsite: system design for feed and ads
  • Newsfeed: choose push, pull or hybrid fanout and state the follower threshold where you switch. Name the partition key and the query it makes expensive.
  • Ad-serving API: separate the bid request path from the click and impression aggregation path. Design idempotent aggregation and a reconciliation job.
  • Work the design exercise (At-most-once push when the dedup store fails over) and compare your fail-open and fail-closed classes with the worked answer.
  • Sketch the bank's Rate Limiter for Multiple APIs with per-user quotas enforced across several nodes.

Deliverable: Two designs taken to API, data model and failure handling, each with the trade-off you chose against written beside it.

Practice prompt ↗Practice prompt ↗
06Storage, caching and incidents
  • Work the SQL exercise (Take a viral item's like counter off one hot row), then explain the difference between lock contention and a genuine lost update.
  • Work the debugging drill (Feed page latency scales with page size) and write the ordered list of what you inspect before reading the approach.
  • Design the reported caching layer for a read-heavy application: cache-aside or write-through, the staleness window, and how you prevent a stampede.
  • Write short answers to the bank's Database Down Scenario, CSRF Mitigation and XSS Mitigation. If the team is ads- or ML-adjacent, also sketch the ML feature store question.

Deliverable: The hot-counter exercise completed, a written N+1 diagnosis, a caching design, and short incident and web-security answers.

Practice prompt ↗Practice prompt ↗
07Behavioural stories and onsite consistency
  • Write STAR stories for the reported behavioural questions about a difficult colleague and harsh technical feedback, and one for the bank's Your Strengths and Weaknesses.
  • Prepare the manager-rating answer: a number, the feedback behind it, the growth area, and what you changed.
  • Prepare one story each for the bank's Collaborate Across Product and Data Science and Manage Technical Debt Under Delivery Pressure.
  • Write a one-page fact sheet per project. Have someone ask you the same project question twice, an hour apart, and compare the two answers for numbers that changed.

Deliverable: Five behavioural stories, a manager-rating answer, and a project fact sheet that held steady across two tellings.

Practice prompt ↗Practice prompt ↗Worked solution ↗

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

The reported behavioural questions cover conflict with a colleague, handling harsh technical feedback, how your manager would rate you, and why you want to join Reddit. Prepare each one as a specific story you owned: the situation in two sentences, what you did, what changed afterwards, and what you would do differently. Keep the figures and decisions in these stories the same as when the same projects come up in coding and design conversations.

Describe a situation where you had to work with a difficult colleague.…

medium
behavioural and engineering judgement

Describe a situation where you had to work with a difficult colleague. How did you resolve the situation and maintain team momentum?

Approach
  1. Close with what you would do differently, concretely.
  2. State the situation in two sentences and spend the rest on the reasoning.
  3. Name the disagreement and how you resolved it with evidence.
Follow-up
  • What did you decide not to do, and why?
  • What would you do differently if you ran that again?

Tell me about a time you received harsh or critical technical feedback…

medium
behavioural and engineering judgement

Tell me about a time you received harsh or critical technical feedback. How did you process it and what changes did you make?

Approach
  1. Pick a story where you made the decision, not one where you watched it.
  2. State the situation in two sentences and spend the rest on the reasoning.
  3. Close with what you would do differently, concretely.
Follow-up
  • What would you do differently if you ran that again?
  • What did you decide not to do, and why?

Unblock an engineer seeing duplicate items on page two

easy
mentoringpaginationcursors

An engineer on your team reports that users see the same items twice when they load page two of the feed. Their query is ORDER BY sort_key DESC LIMIT 40 OFFSET 40, and their proposed fix is to dedupe by content_id in the client. They are blocked, frustrated, and have been on it a day. Unblock them without taking the keyboard: get them to a reproduction, explain why the duplicates appear, why client-side dedup is the wrong layer, and what you would have them build instead.

Approach
  1. Get them to a deterministic reproduction before explaining anything. Insert k items at the head between the two requests and watch exactly k already-seen items reappear on page two. A reproduction they ran themselves teaches the mechanism; an explanation teaches them that you were right.
  2. Describe the cause as counting rather than as a bug. OFFSET defines a window by counting from the start of a result set that is mutating at the head, so k insertions above the window push k rows down into page two. Then show the half they have not seen: deletions shift the other way and skip rows entirely, with no signal to the client that anything was missed.
  3. Use the skip case to show why client dedup is the wrong layer. It suppresses the visible repeat and can do nothing about the invisible omission, because nothing ever told the client an item existed. Add the performance argument second: the database still produces and discards OFFSET rows, so page n costs more than page one even when no duplicate appears.
  4. Hand over the replacement with its precondition attached, because the precondition is where this bug comes back. Seek on the previous page's last key: WHERE owner_id = :owner AND sort_key < :cursor ORDER BY sort_key DESC LIMIT 40, served by the index on (owner_id, sort_key DESC). The key must be unique within the owner, or the boundary row is either repeated or dropped, which is why the sort key is the time-sortable content id rather than a timestamp that collides at high insert rates.
  5. Leave them the work and the proof: they write the query, the test that inserts at the head between page requests, and the plan check confirming an index scan rather than a sort. Then ask them to explain the skip case back to you, which is the only cheap way to find out whether the mentoring landed.
Follow-up
  • What must the cursor encode once a page merges pushed timeline entries with items pulled from above-threshold authors?
  • The product wants a 'new items above' indicator. How do you show what arrived above the cursor without breaking the page sequence?
  • What test would have caught this before release, and why did the existing tests pass?
  • 01

    Describe a situation where you had to work with a difficult colleague. How did you resolve the situation and maintain team momentum?

  • 02

    Tell me about a time you received harsh or critical technical feedback. How did you process it and what changes did you make?

  • 03

    How would your current or previous direct manager rate your engineering performance on a scale of 1 to 10, and why?

  • 04

    Why do you want to join Reddit, and what is your favorite community on the platform?

  • 05

    How do you collaborate with product managers and data scientists to align goals and manage trade-offs?

  • 06

    Tell me about a time you had to reduce technical debt while still delivering committed roadmap work.

PracHub interview preparation framework
Is this an official Reddit interview guide?

No. It is PracHub's own research and practice material for the Software Engineer role at Reddit. Rounds and questions reflect what candidates have reported, not a process Reddit has published, and they change over time. Confirm the current format and scope with your recruiter.

PracHub interview research
What does the Reddit Software Engineer technical screen look like?

Candidate reports describe it as either a live coding session in a collaborative editor such as CodeSignal or CoderPad, or a hiring manager phone screen. Both focus on core algorithms and coding fluency. Ask your recruiter which one you have. To cover both, do timed algorithm practice on arrays, trees and graph search, and prepare a short walkthrough of a system you built.

PracHub Software Engineer practice
Can I choose my programming language for the coding rounds?

Candidate reports say you can generally choose a standard modern language such as Python, Go, Java or JavaScript/TypeScript. Confirm with your recruiter. Practise in the language you will use, including its standard collections for maps, heaps and sorting, so you are not looking up syntax during the round.

PracHub interview research
How much algorithmic coding versus practical coding should I expect?

Both. Candidate notes say screens often use classical algorithm problems (arrays, trees, graph search), while onsite coding leans on practical object-oriented modelling, string processing and domain design. The reported questions include a tennis scoring tracker and an admin log parser. Split your practice between the two, and for practical problems, practise building a working baseline and then extending it.

PracHub interview research
Which system design topics should I prepare?

The reported design questions cover a newsfeed that distributes posts to subscriber feeds, an ad-serving API with real-time click and impression aggregation, a caching layer for a read-heavy application, and an ML feature store or real-time signal pipeline. The bank adds a real-time ad event pipeline, a rate limiter for multiple APIs, a game leaderboard and scaling a small forum app. Prepare fanout strategy, cache invalidation, idempotent stream aggregation and rate limiting.

PracHub Software Engineer practice
Do I need ads or machine learning experience?

The role notes list AdTech, auction systems and streaming systems such as Kafka as nice-to-have skills, not requirements. Several reported design questions touch ads and ML pipelines, so learn the basics of event aggregation and feature freshness even if your background is elsewhere. Be clear about what you have and have not built.

PracHub Software Engineer practice
How soon do candidates hear back after the onsite?

Reports vary. Candidate notes say most people hear back within three to five business days after the final loop, usually through a call with the recruiter. At the end of the onsite, ask your recruiter what timeline to expect.

PracHub interview research
Sources & methodology 3 sources ↗

Official role evidence, timestamped platform data and clearly labeled preparation advice.