← revolut Interview Insights

revolut·Software Engineer·Technical Phone Screen·Senior

Senior
Jun 2026

Summary

Revolut backend interview covering some pretty dense fundamentals. Three questions, all technical, no fluff. The concurrency one went okay but I fumbled parts of the performance investigation and honestly blanked on some CQRS specifics.

Questions Asked (3)

Q1

How do databases handle concurrency, and how do isolation levels map to anomalies like dirty reads, non-repeatable reads, and phantom reads?

System DesignTechnical Trade-offs
Author's notes

This one I actually felt decent about.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by explaining the fundamental concurrency control mechanisms (locking vs. MVCC) and then map each isolation level to the anomalies it prevents. Use concrete examples to illustrate dirty reads, non-repeatable reads, and phantom reads, and discuss the trade-offs between consistency and performance.

Pro tip: Mention that most databases default to Read Committed (e.g., PostgreSQL, Oracle) or Repeatable Read (MySQL InnoDB), and that Snapshot Isolation prevents phantoms in practice but is not serializable. This shows awareness of real-world implementations beyond theory.

1. Define concurrency anomalies

Clearly define dirty read, non-repeatable read, and phantom read with simple examples (e.g., reading uncommitted data, re-reading a row that changed, re-running a query that returns new rows).

2. Explain concurrency control mechanisms

Describe how databases prevent anomalies using locking (shared/exclusive locks, two-phase locking) and multiversion concurrency control (MVCC) with snapshots.

3. Map isolation levels to anomalies

List the SQL standard isolation levels (Read Uncommitted, Read Committed, Repeatable Read, Serializable) and state which anomalies each prevents (e.g., Read Committed prevents dirty reads but allows non-repeatable reads).

4. Discuss implementation variations and trade-offs

Highlight that actual databases may differ (e.g., MySQL InnoDB's Repeatable Read prevents phantoms via next-key locks; PostgreSQL's Serializable uses SSI). Discuss performance vs. consistency trade-offs.

5. Relate to system design

Explain how to choose an isolation level based on application needs (e.g., financial transactions may require Serializable, while analytics can tolerate Read Committed) and mention optimistic vs. pessimistic concurrency control.

Key Points to Mention

  • Dirty read: reading uncommitted data from another transaction.
  • Non-repeatable read: re-reading a row and finding it changed due to another committed transaction.
  • Phantom read: re-executing a query and seeing new rows inserted by another committed transaction.
  • Isolation levels: Read Uncommitted, Read Committed, Repeatable Read, Serializable.
  • MVCC vs. locking: MVCC provides snapshots for reads, reducing blocking; locking ensures stricter isolation.
  • Real-world examples: PostgreSQL defaults to Read Committed; MySQL InnoDB defaults to Repeatable Read and uses next-key locks to prevent phantoms.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q2

A service is running slower than usual. Walk me through how you'd investigate and isolate the bottleneck.

Root Cause AnalysisSystem Design
Author's notes

Started with latency and error rate signals, mentioned checking recent deploys first because that's usually it.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the scope and impact of the slowdown, then systematically narrow down the bottleneck using metrics, logs, and tracing from the user-facing layer down to the infrastructure. Emphasize a data-driven, hypothesis-testing approach while considering recent changes and dependencies.

Pro tip: Always check for recent deployments or configuration changes first—most slowdowns are caused by something that changed. Also, mention that you'd validate your hypothesis with a quick experiment or rollback before diving deep.

1. Define the problem and scope

Ask clarifying questions to understand when the slowdown started, which endpoints or services are affected, and the impact on users. Check if it's isolated to a specific region, customer segment, or time window.

2. Check recent changes and high-level metrics

Review recent deployments, config changes, and feature flags. Look at service-level dashboards (latency, error rates, throughput) to identify patterns and correlate with the timeline.

3. Drill down with tracing and profiling

Use distributed tracing to identify which service or component is the bottleneck. If needed, profile the suspect service to find slow functions, database queries, or external calls.

4. Analyze resource utilization and dependencies

Check CPU, memory, disk I/O, and network on the suspect service and its dependencies (databases, caches, third-party APIs). Look for saturation, throttling, or connection pool exhaustion.

5. Validate and mitigate

Form a hypothesis about the root cause and validate it with a targeted experiment (e.g., rollback, scaling, query optimization). If confirmed, apply a fix and monitor to ensure resolution.

Key Points to Mention

  • Use of monitoring and observability tools (e.g., Prometheus, Grafana, Datadog, New Relic)
  • Distributed tracing (e.g., Jaeger, Zipkin, OpenTelemetry) to pinpoint latency
  • Log analysis and correlation with recent changes (deployments, config updates)
  • Database query performance and indexing
  • Resource contention (CPU, memory, I/O, network) and scaling issues
  • Caching effectiveness and cache hit ratio
  • External dependency latency and error rates

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q3

What are DDD and CQRS? When would you actually use them, and what are the common mistakes teams make?

System DesignTechnical Trade-offs
Author's notes

Blanked a little on the CQRS pitfalls part.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Define DDD and CQRS clearly, then explain when each is appropriate based on complexity and read/write patterns. Emphasize that they are not silver bullets and discuss common pitfalls like over-engineering and misapplying CQRS without event sourcing.

Pro tip: At Revolut, where high scalability and clear domain boundaries are crucial, highlight that DDD helps model complex financial domains, while CQRS can optimize read/write performance—but only when justified by actual needs, not hype.

1. Define DDD and CQRS

Briefly explain Domain-Driven Design (focus on ubiquitous language, bounded contexts, aggregates) and Command Query Responsibility Segregation (separate read/write models).

2. When to use DDD

Discuss scenarios like complex business domains with evolving rules, collaboration with domain experts, and when a shared language is critical. Avoid for simple CRUD apps.

3. When to use CQRS

Explain use cases: high read/write disparity, complex queries, scalability needs, and when eventual consistency is acceptable. Often paired with event sourcing.

4. Common mistakes

Highlight over-engineering, applying DDD/CQRS everywhere, ignoring eventual consistency challenges, and not having the right team expertise.

5. Relate to Revolut context

Connect to Revolut's domain: e.g., DDD for modeling payments, CQRS for separating transaction writes from reporting reads, ensuring scalability and auditability.

Key Points to Mention

  • Ubiquitous language and bounded contexts in DDD
  • Aggregates, entities, value objects
  • CQRS separates commands (writes) from queries (reads)
  • Event sourcing as a common companion to CQRS
  • Eventual consistency trade-offs
  • Over-engineering and complexity pitfalls

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.