Rupeek hires Software Engineers; this guide collects what candidates report about the process.
Initial Assessment
reportedStart with validating core coding competency through a preliminary assessment.
What to demonstrate
- Start with validating core coding competency through a preliminary assessment
- Depth in Data Structures & Algorithms (DSA)
How to prepare
- Answer aloud and timed: Trapping Rain Water
- Answer aloud and timed: Sliding window techniques
Technical Rounds
reportedEngage in deep-dive technical rounds assessing problem-solving and architectural thinking.
What to demonstrate
- Engage in deep-dive technical rounds assessing problem-solving and architectural thinking
- Depth in Data Structures & Algorithms (DSA)
How to prepare
- Answer aloud and timed: Tree traversal (e.g., right view of a tree, mirror tree)
- Answer aloud and timed: Dynamic programming and graph-based problems
Behavioral Evaluation
reportedDiscuss past projects and professional maturity, focusing on decision-making and handling ambiguity.
What to demonstrate
- Discuss past projects and professional maturity
- Focusing on decision-making and handling ambiguity
How to prepare
- Prepare three examples from your own work, each with a decision you made and an outcome you can quantify.
- Re-read the description of the behavioral evaluation above and write down what you would ask to confirm before it.
1 candidate reports. Individual accounts describe a particular role and hiring cycle.
Software Engineer interview at Rupeek: DSA and system design
My SDE 3 process took about three weeks and had four rounds covering DSA and design. After an initial coding or assessment stage, I tackled medium problems such as coin change and trapping-rain-water-style questions. Another round covered Java, Spring, REST APIs, fundamentals, and design decisions. The design work included low-level design for a health-app-style scenario and high-level design for…
Read full experiencePracHub editorial advice for the preparation topics above.
Clarify early
When given a problem, ask clarifying questions before writing a single line of code. This shows you are methodical.
Think aloud
Your interviewer is interested in your thought process. Explain your trade-offs as you decide on a data structure or an architectural approach.
Review your resume
Be prepared to explain every technical decision you made in your listed projects. If you mention a technology, expect a question on how it works under the hood.
Practice mock interviews
Explaining technical concepts to another person is a skill that requires practice. Use this to ensure your communication is concise and clear.
Choose a category, try a prompt, then open its approach, worked solution or follow-up when you need it.
Trapping Rain Water
Trapping Rain Water
Approach
- Restate the input: its shape, its size, and what is guaranteed about it.
- Name the brute-force solution and its complexity before improving on it.
- Choose the data structure from the access pattern, not from familiarity.
- 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?
Sliding window techniques
Sliding window techniques
Approach
- Restate the input: its shape, its size, and what is guaranteed about it.
- Name the brute-force solution and its complexity before improving on it.
- Choose the data structure from the access pattern, not from familiarity.
- 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?
Tree traversal (e.g., right view of a tree, mirror tree)
Tree traversal (e.g., right view of a tree, mirror tree)
Approach
- Restate the input: its shape, its size, and what is guaranteed about it.
- Name the brute-force solution and its complexity before improving on it.
- Choose the data structure from the access pattern, not from familiarity.
- 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?
Dynamic programming and graph-based problems
Dynamic programming and graph-based problems
Approach
- Restate the input: its shape, its size, and what is guaranteed about it.
- Name the brute-force solution and its complexity before improving on it.
- Choose the data structure from the access pattern, not from familiarity.
- 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?
Write the update path that detects a concurrent edit
resource carries version INT NOT NULL DEFAULT 1. resource_revision holds revision_id, resource_id, version, actor_user_id, change_kind, patch JSONB, request_id, created_at with UNIQUE (resource_id, version). outbox_event holds aggregate_type, aggregate_id, aggregate_version, event_type, payload, status. A PUT carries the version the client read. Write the exact statements for the single transaction that applies the edit, records the revision and enqueues 'resource.updated', and give the handler's branch on zero affected rows. Then say what PostgreSQL 16 does under READ COMMITTED when two of these updates hit one row at once.
Approach
- One transaction, three writes, no network call inside it: UPDATE resource SET title = $3, version = version + 1, updated_at = now() WHERE resource_id = $1 AND tenant_id = $4 AND version = $2; then INSERT the resource_revision row at version $2 + 1; then INSERT the outbox_event row at the same aggregate_version. The event goes to a table rather than a broker because no transaction spans both.
- Branch on the affected-row count before doing anything else. Zero has three causes — stale version, wrong tenant, row gone — so re-read once and map to 409 carrying the current version, or 404 for an id outside the caller's tenant, which also stops the endpoint confirming that another tenant's id exists.
- State the engine behaviour instead of assuming it. Under READ COMMITTED the second UPDATE blocks on the row lock, and when the first commits PostgreSQL re-evaluates the WHERE clause against the newly committed row, so the version predicate now fails and the statement reports zero rows. Under REPEATABLE READ the identical collision raises SQLSTATE 40001 instead, so the handler must fold both shapes into one conflict response.
- Keep UNIQUE (resource_id, version) even though the predicate already serialises writers. It is what makes a lost update unwritable if any other path ever reaches the revision table, and it converts a logic bug into 23505 rather than into a silently missing history row.
Follow-up
- A client sends the version it read ten minutes ago and the resource has moved three versions. What is in your 409 so it can resolve the conflict without a full re-fetch?
- Two editors, two disjoint fields, no overlap. Does your answer still refuse the second write, and should it?
Find version gaps and relay lag with window functions
outbox_event holds event_id, aggregate_type, aggregate_id, aggregate_version, event_type, payload, status ('pending','published','dead'), attempts, created_at, published_at. A projection is missing rows and you must decide whether the relay skipped events or the consumer dropped them. Write three queries over the last seven days: one listing every aggregate_id whose published aggregate_version sequence has a hole, one giving per-day counts with a running total, and one returning the newest published event per aggregate. For each, say where the window function is evaluated relative to WHERE and LIMIT. PostgreSQL 16.
Approach
- Gaps: compute lead(aggregate_version) OVER (PARTITION BY aggregate_id ORDER BY aggregate_version) in a subquery, then filter next_version <> aggregate_version + 1 in the outer query. Window functions are evaluated after WHERE, GROUP BY and HAVING and before the outer ORDER BY and LIMIT, so the predicate cannot sit in the same WHERE clause and PostgreSQL 16 has no QUALIFY.
- Say what the seven-day filter does to the answer: it truncates every partition, so the first row per aggregate has no predecessor inside the window and a hole spanning the boundary is invisible. Widen the window, or join to resource.version as the authority for the true maximum.
- Running total: SELECT date_trunc('day', created_at) AS d, count() AS n, sum(count()) OVER (ORDER BY date_trunc('day', created_at) ROWS UNBOUNDED PRECEDING). An aggregate inside a window call is legal because grouping runs before windowing. The grouping key is unique per row here so ROWS and RANGE agree, but write the frame anyway — over ungrouped rows with tied timestamps the default RANGE frame pulls in every peer row and the total jumps.
- Newest per aggregate: DISTINCT ON (aggregate_id) ... ORDER BY aggregate_id, aggregate_version DESC is the cheap PostgreSQL-only form when an index matches that order; row_number() OVER (PARTITION BY aggregate_id ORDER BY aggregate_version DESC) = 1 is the portable form and needs a subquery for the same evaluation-order reason as the gap query.
Follow-up
- Relay failover redelivers events. Does a duplicate break the gap query, and how would you detect one from this table alone?
- Turn the gap check into a continuous monitor rather than a query someone runs after an incident. What does it watch?
Design a parking lot system
Design a parking lot system
Approach
- Fix the scope first: who calls this, how often, and what they do when it fails.
- Name the read and write paths separately; they rarely have the same bottleneck.
- Choose a partition key and say what query it makes expensive.
- State the consistency you need, and where you are willing to be stale.
Follow-up
- What breaks first when traffic grows ten times?
- How does this behave when that dependency is down for an hour?
Create a schema for a health app or ride-sharing service
Create a schema for a health app or ride-sharing service
Approach
- Fix the scope first: who calls this, how often, and what they do when it fails.
- Name the read and write paths separately; they rarely have the same bottleneck.
- Choose a partition key and say what query it makes expensive.
- State the consistency you need, and where you are willing to be stale.
Follow-up
- What breaks first when traffic grows ten times?
- How does this behave when that dependency is down for an hour?
Design an API contract for a specific business requirement
Design an API contract for a specific business requirement
Approach
- Fix the scope first: who calls this, how often, and what they do when it fails.
- Name the read and write paths separately; they rarely have the same bottleneck.
- Choose a partition key and say what query it makes expensive.
- State the consistency you need, and where you are willing to be stale.
Follow-up
- What breaks first when traffic grows ten times?
- How does this behave when that dependency is down for an hour?
Implement system components for friend suggestions or customer verification
Implement system components for friend suggestions or customer verification
Approach
- Fix the scope first: who calls this, how often, and what they do when it fails.
- Name the read and write paths separately; they rarely have the same bottleneck.
- Choose a partition key and say what query it makes expensive.
- State the consistency you need, and where you are willing to be stale.
Follow-up
- What breaks first when traffic grows ten times?
- How does this behave when that dependency is down for an hour?
Design a smart home device backend
Design a smart home device backend
Approach
- Fix the scope first: who calls this, how often, and what they do when it fails.
- Name the read and write paths separately; they rarely have the same bottleneck.
- Choose a partition key and say what query it makes expensive.
- State the consistency you need, and where you are willing to be stale.
Follow-up
- What breaks first when traffic grows ten times?
- How does this behave when that dependency is down for an hour?
Architecture for a ride-sharing pool feature
Architecture for a ride-sharing pool feature
Approach
- Fix the scope first: who calls this, how often, and what they do when it fails.
- Name the read and write paths separately; they rarely have the same bottleneck.
- Choose a partition key and say what query it makes expensive.
- State the consistency you need, and where you are willing to be stale.
Follow-up
- What breaks first when traffic grows ten times?
- How does this behave when that dependency is down for an hour?
Strategies for data storage and API creation for high-concurrency systems
Strategies for data storage and API creation for high-concurrency systems
Approach
- Say who the caller is and what they do when the call fails halfway.
- Define the identity of a request so a retry cannot double-apply it.
- Separate accepted, pending, failed and confirmed; they are different facts.
- Design the error taxonomy before the success shape; callers branch on it.
Follow-up
- What happens if the caller retries after a timeout?
- How does a client discover it is on an old version of this contract?
Read latency spikes on a sixty-second sawtooth
The cached listing read path serves about 14k reads/second at an 85% hit rate. p99 sits at 35 ms for 57 seconds, jumps to 900 ms for 3, and repeats. During each spike the primary shows several hundred identical listing queries starting within the same millisecond, all carrying one large tenant's id. Cache entries use a 60-second TTL. Give the mechanism, the ordered checks, the fix, and the correctness hazard your fix must not introduce.
Approach
- Match the period to a configured number before theorising about load. A spike every 60 seconds against a 60-second TTL is an entry expiring, and you confirm it by correlating spike timestamps with the entry's write time rather than with the traffic curve. If the period had matched a cron or a GC interval instead, this is a different investigation.
- Establish the concurrency of the miss. Several hundred identical queries in one millisecond means the miss path has no coalescing: every request that arrives between expiry and repopulation recomputes. The herd size is that key's arrival rate times its recompute time, so at 1.2k reads/second for the hot key and a 250 ms recompute you expect about 300 concurrent misses, which matches what is observed.
- Add single-flight on the miss path so one caller per key recomputes under a short-lived lock while the rest wait for its result. Prefer stale-while-revalidate where the read tolerates it: return the expired value immediately and refresh asynchronously, which removes the latency spike rather than serialising it into a queue of waiters.
- De-synchronise the keys. Write TTLs with jitter, for example 60 seconds plus or minus 10%, so a deploy or a mass invalidation does not align every key on the same second and turn a per-key herd into a fleet-wide one.
Follow-up
- The same sawtooth appears on a key that is invalidated on write rather than expired. Is that the same bug?
- How does your answer change if the recompute takes 4 seconds instead of 250 ms?
Built from the rounds and topics Rupeek candidates report.
Prepare, practise & reflect
One practical outcome each day. Spend longer where you need it.
0 / 7 done01Map the Rupeek loop
- Write out the reported sequence: Initial Assessment, Technical Rounds, Behavioral Evaluation.
- For each round, write one sentence on what it is judging, from the description above, and mark the one you are least ready for.
Deliverable: A one-page map of the 3 reported rounds, with the weakest marked.
02Work Data Structures & Algorithms (DSA)
- Spend the session on Data Structures & Algorithms (DSA), which Rupeek candidates report being tested on.
- Write one worked example in Data Structures & Algorithms (DSA) and time yourself on it.
Deliverable: One timed worked example in Data Structures & Algorithms (DSA).
03Work Design of Low-Level Design (LLD)
- Spend the session on Design of Low-Level Design (LLD), which Rupeek candidates report being tested on.
- Write one worked example in Design of Low-Level Design (LLD) and time yourself on it.
Deliverable: One timed worked example in Design of Low-Level Design (LLD).
04Work Coin Change Problem
- Spend the session on Coin Change Problem, which Rupeek candidates report being tested on.
- Write one worked example in Coin Change Problem and time yourself on it.
Deliverable: One timed worked example in Coin Change Problem.
05Answer out loud: Data Structures and Algorithms
- Answer aloud, timed: Trapping Rain Water
- Answer aloud, timed: Sliding window techniques
Deliverable: Spoken answers to 2 reported Data Structures and Algorithms question(s), under time.
06Answer out loud: Low-Level Design (LLD)
- Answer aloud, timed: Design a parking lot system
- Answer aloud, timed: Create a schema for a health app or ride-sharing service
Deliverable: Spoken answers to 2 reported Low-Level Design (LLD) question(s), under time.
07Answer out loud: High-Level Design (HLD)
- Answer aloud, timed: Design a smart home device backend
- Answer aloud, timed: Architecture for a ride-sharing pool feature
Deliverable: Spoken answers to 2 reported High-Level Design (HLD) question(s), under time.
Expand any day for tasks and deliverables. Your progress is saved on this device.
Behavioural rounds judge the decision you made and what it cost.
Deep-dive into your previous projects: Why did you choose specific technologies?
Deep-dive into your previous projects: Why did you choose specific technologies?
Approach
- Pick a story where you made the decision, not one where you watched it.
- State the situation in two sentences and spend the rest on the reasoning.
- Give the blast radius: what could have broken, and what you measured.
- Name the disagreement and how you resolved it with evidence.
Follow-up
- What would you do differently if you ran that again?
- How did you know your change caused the improvement?
How do you handle ambiguous requirements?
How do you handle ambiguous requirements?
Approach
- Pick a story where you made the decision, not one where you watched it.
- State the situation in two sentences and spend the rest on the reasoning.
- Give the blast radius: what could have broken, and what you measured.
- Name the disagreement and how you resolved it with evidence.
Follow-up
- What would you do differently if you ran that again?
- How did you know your change caused the improvement?
Describe a time you had to balance technical debt with feature delivery.
Describe a time you had to balance technical debt with feature delivery.
Approach
- Pick a story where you made the decision, not one where you watched it.
- State the situation in two sentences and spend the rest on the reasoning.
- Give the blast radius: what could have broken, and what you measured.
- Name the disagreement and how you resolved it with evidence.
Follow-up
- What would you do differently if you ran that again?
- How did you know your change caused the improvement?
- 01
Deep-dive into your previous projects: Why did you choose specific technologies?
- 02
How do you handle ambiguous requirements?
- 03
Describe a time you had to balance technical debt with feature delivery.
How much time should I spend preparing for the coding rounds?
Focus on consistent practice rather than cramming. Aim to be comfortable solving medium-level problems on platforms like LeetCode, with a focus on explaining your logic aloud while you code.
Rupeek Software Engineer candidate reports ↗What is the most common reason for rejection in technical rounds?
Often, it is not the lack of a solution, but the inability to communicate the thought process or failing to handle edge cases. Always clarify requirements before jumping into implementation.
Rupeek Software Engineer candidate reports ↗Is there a specific focus on behavioral questions?
Yes, particularly in the managerial round. Be prepared to discuss your past projects, the challenges you faced, and how you contributed to team success.
Rupeek Software Engineer candidate reports ↗What is the typical timeline for the interview process?
The process typically spans 2 to 4 weeks. This includes the initial screening, technical assessments, and final managerial discussions.
Rupeek Software Engineer candidate reports ↗What topics does Rupeek test in interviews?
Rupeek interviews most often cover SQL, Communication Skills, Data Structures & Algorithms (DSA), Problem Solving, and Java. The exact emphasis depends on the specific role you apply for.
Rupeek 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.
- 01Rupeek Software Engineer candidate reports ↗
Company-reported rounds, questions and FAQ.
Candidate reports · Accessed 2026-09-22 - 02PracHub Software Engineer practice ↗
PracHub practice material, not company-reported.
PracHub page · Accessed 2026-09-22 - 03PracHub preparation framework ↗
PracHub preparation guidance.
PracHub page · Accessed 2026-09-22