← Figma Interview Insights

Figma·Software Engineer·Onsite - System Design / Architecture·Senior

SeniorPrefer not to say
Jun 2026

Summary

Figma infra team interview, basically one long system design session about running a monolith on Kubernetes. Covered a lot of ground, from deployment topology all the way to disaster recovery and migration strategy. Dense question, and I think I undercooked the migration path section.

Questions Asked (5)

Q1

You're joining an infra team running a single monolithic backend on Kubernetes, with no plans for microservices or aggressive scaling. How would you design and operate it? Walk through deployment topology, networking, config and secret management, CI/CD, and rollout strategies.

System DesignTechnical Trade-offs
Author's notes

I started with pod replicas and node pools, talked about using a Deployment with a reasonable replica count and keeping stateless app nodes separate from anything touching persistent workloads.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by acknowledging the constraints (monolith, no microservices, no aggressive scaling) and emphasize simplicity, reliability, and cost-efficiency. Then walk through each area (deployment, networking, config/secrets, CI/CD, rollouts) with concrete choices and trade-offs, focusing on operational maturity over complexity.

Pro tip: Highlight that a monolith on Kubernetes still benefits from Kubernetes primitives like Deployments, Services, and ConfigMaps, but avoid over-engineering with service meshes or complex autoscaling. Emphasize observability and safe rollouts as key to stability.

1. Clarify constraints and goals

Restate the scenario: single monolith, no microservices, no aggressive scaling. Define goals: simplicity, reliability, cost-efficiency, and developer productivity.

2. Design deployment topology

Use a Kubernetes Deployment with multiple replicas for high availability, spread across nodes/availability zones. Consider a single container per pod, with resource requests/limits and liveness/readiness probes.

3. Plan networking and ingress

Expose the monolith via a Service (ClusterIP) and an Ingress controller for external traffic. Use TLS termination at Ingress, and consider a CDN for static assets if applicable.

4. Manage configuration and secrets

Use ConfigMaps for non-sensitive config and Secrets for sensitive data, mounted as volumes or env vars. Consider external secret management (e.g., Vault, AWS Secrets Manager) for rotation and audit.

5. Implement CI/CD and rollout strategies

Use a CI pipeline to build, test, and push container images. Deploy via GitOps (e.g., ArgoCD) or Helm. Use rolling updates with maxSurge/maxUnavailable, and consider blue-green or canary for critical changes.

Key Points to Mention

  • Use Kubernetes Deployments with multiple replicas and anti-affinity for high availability.
  • Leverage Ingress for external access and TLS termination; avoid service mesh unless needed.
  • Separate config from code using ConfigMaps and Secrets; integrate with external secret stores for rotation.
  • Implement CI/CD with automated testing and GitOps for declarative deployments.
  • Adopt rolling updates with health checks; use blue-green or canary for risky changes.
  • Emphasize observability (metrics, logs, tracing) and cost monitoring for a monolith.

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

Q2

How would you handle resource requests and limits, autoscaling, and stateful dependencies like databases, caches, and object storage in this Kubernetes setup?

System DesignTechnical Trade-offs
Author's notes

Talked through HPA vs VPA and why VPA is actually more interesting for a monolith since you're not splitting load across services.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Structure your answer around the three pillars: resource management, autoscaling, and stateful dependencies. For each, explain how you'd configure Kubernetes primitives (requests/limits, HPA/VPA, StatefulSets/Operators) and the trade-offs involved, tying decisions back to Figma's real-time, latency-sensitive workload.

Pro tip: Emphasize that stateful services like databases and caches are often better run outside Kubernetes or via operators, and that autoscaling must consider downstream bottlenecks—not just pod metrics.

1. Set resource requests and limits

Explain how you'd right-size CPU/memory requests based on profiling, set limits to prevent noisy neighbors, and use tools like Vertical Pod Autoscaler for recommendations.

2. Implement autoscaling

Describe using Horizontal Pod Autoscaler (HPA) with custom metrics (e.g., request latency, queue depth) and Cluster Autoscaler for node scaling, while considering cold-start and scaling delays.

3. Handle stateful dependencies

Discuss running databases/caches via Operators (e.g., Postgres Operator, Redis Operator) or managed services, and object storage via CSI drivers or external services like S3.

4. Address data persistence and networking

Cover PersistentVolumes, StatefulSets for stable identities, and headless services for direct pod access, ensuring data durability and low-latency connectivity.

5. Monitor and iterate

Highlight the importance of observability (metrics, logs, tracing) to tune resource settings and autoscaling policies continuously based on real usage.

Key Points to Mention

  • Resource requests vs limits and their impact on scheduling and QoS classes
  • Horizontal vs Vertical Pod Autoscaler and when to use each
  • Using Operators or managed services for databases and caches to reduce operational overhead
  • Object storage integration via CSI drivers or direct SDK usage
  • StatefulSet vs Deployment for stateful workloads
  • Trade-offs between self-managed and managed stateful services (cost, control, reliability)

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

Q3

What does observability look like for this monolith, and how would you handle incident response and disaster recovery?

System DesignRoot Cause Analysis
Author's notes

Logs, metrics, traces, the usual trio.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by defining observability for a monolith as the three pillars—metrics, logs, and traces—and explain how you'd instrument the system to gain insight into its internal state. Then, outline a structured incident response process (detect, triage, mitigate, resolve, learn) and a disaster recovery strategy (backups, replication, failover, testing). Emphasize how these practices reduce mean time to detection and recovery.

Pro tip: Tie observability directly to incident response by showing how high-quality telemetry enables faster root cause analysis and reduces downtime. Mention that you'd regularly test disaster recovery plans through game days or chaos engineering to ensure they work under real conditions.

1. Define Observability for a Monolith

Explain that observability is about understanding the system's internal state from its outputs. For a monolith, this means instrumenting the application to emit metrics (e.g., request rates, error rates, latency), structured logs, and distributed traces.

2. Instrument and Collect Data

Describe how you would implement instrumentation using libraries like OpenTelemetry, and aggregate data in tools like Prometheus for metrics, ELK for logs, and Jaeger for traces. Ensure data is correlated (e.g., trace IDs in logs) for effective debugging.

3. Incident Response Process

Outline a clear incident response workflow: detection via alerts, triage to assess severity, mitigation to restore service, resolution to fix root cause, and a post-mortem to learn and improve. Include roles like incident commander and communication protocols.

4. Disaster Recovery Strategy

Detail a DR plan: regular backups (full and incremental), replication across availability zones, automated failover, and a recovery time objective (RTO) and recovery point objective (RPO). Emphasize testing through drills.

5. Continuous Improvement

Explain how you'd use observability data and incident post-mortems to iteratively improve system resilience, such as adding new alerts, refining runbooks, and conducting chaos experiments.

Key Points to Mention

  • The three pillars of observability: metrics, logs, and traces, and how they apply to a monolith.
  • Tools like Prometheus, Grafana, ELK stack, Jaeger, and OpenTelemetry for instrumentation and visualization.
  • Incident response best practices: on-call rotations, severity levels, communication channels, and blameless post-mortems.
  • Disaster recovery concepts: RTO, RPO, backup strategies, multi-AZ deployment, and failover automation.
  • The importance of testing DR plans through regular drills and chaos engineering.
  • How observability reduces MTTR by enabling faster root cause analysis.

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

Q4

What are the real trade-offs of staying monolithic versus moving to microservices in this context, and what concrete signals would tell you it's time to evolve the architecture?

Technical Trade-offsProduct StrategyAdaptability & Ambiguity
Author's notes

This part I actually liked.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Frame the decision as a context-dependent trade-off between operational simplicity and independent scalability, explicitly tying it to Figma's collaborative, real-time, multi-tenant product. Then describe concrete, measurable signals (e.g., deployment bottlenecks, scaling pain, team friction) that would indicate when evolution is necessary, and emphasize incremental, reversible steps rather than a big-bang rewrite.

Pro tip: Show that you understand Figma's specific architecture—a monolithic Ruby on Rails app with a separate C++ multiplayer service—and that they deliberately kept the monolith for most features while extracting only the real-time engine. This demonstrates you can apply the trade-off to their actual context, not just recite textbook pros and cons.

1. Clarify the context and constraints

Start by acknowledging that the right answer depends on team size, product stage, scaling needs, and deployment frequency. Ask clarifying questions if needed, but for Figma, assume a fast-growing product with a small-to-medium engineering team and a real-time collaborative core.

2. Lay out the core trade-offs

Compare monolith vs. microservices on dimensions like development velocity, operational complexity, scalability, fault isolation, and team autonomy. Be specific: monoliths are simpler to develop and deploy early on but can become a bottleneck; microservices enable independent scaling and team ownership but add distributed system overhead.

3. Identify concrete signals for evolution

List measurable pain points that justify moving to microservices: e.g., deploy times exceeding 30 minutes, inability to scale a single component independently, teams blocked on shared codebase, or a specific feature (like real-time collaboration) needing different performance characteristics.

4. Propose an incremental path

Recommend extracting services only when a clear boundary and need exist, using patterns like strangler fig or modular monolith. Emphasize that evolution should be driven by business needs, not hype, and that you'd start with a pilot service to validate the approach.

5. Tie back to Figma's product and values

Connect your answer to Figma's real-time collaboration, multi-player editing, and need for low-latency performance. Mention that they already have a hybrid model (monolith + C++ multiplayer service) and that this shows pragmatic evolution rather than dogma.

Key Points to Mention

  • Monolith benefits: simpler local development, easier debugging, atomic deployments, no network latency between components.
  • Microservices benefits: independent scaling, fault isolation, technology heterogeneity, team autonomy aligned with bounded contexts.
  • Concrete signals: deployment frequency and lead time, scaling bottlenecks, team coordination overhead, reliability issues from coupled failures.
  • Figma's context: real-time collaboration requires a specialized service (C++ multiplayer) while most CRUD features fit well in a monolith.
  • Incremental evolution: use strangler fig pattern, start with a modular monolith, extract services only when justified by clear metrics.
  • Avoid dogma: microservices are not a goal; they are a means to solve specific organizational and scaling problems.

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

Q5

If those signals do appear, how would you outline a low-risk incremental migration away from the monolith? Think about service boundaries, data ownership, API contracts, and how team workflows change.

System DesignTechnical Trade-offsCross-functional Alignment
Author's notes

This is where I ran out of steam a bit.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by acknowledging that migration should be incremental and driven by clear signals, then outline a phased approach that prioritizes low-risk extractions. Focus on defining service boundaries using domain-driven design, establishing clear data ownership and API contracts, and adapting team workflows to align with the new architecture.

Pro tip: Emphasize the importance of a strangler fig pattern and feature flags to decouple deployment from release, allowing for safe rollbacks and gradual traffic shifting. Also, highlight the need for observability and automated testing to catch regressions early.

1. Identify and Prioritize Candidates

Use signals like high change frequency, scaling bottlenecks, or team autonomy needs to select a bounded context for extraction. Start with a low-risk, well-understood domain that has minimal dependencies.

2. Define Service Boundaries and Data Ownership

Apply domain-driven design to define bounded contexts and ensure each service owns its data. Avoid shared databases; instead, use APIs or events for data exchange.

3. Design API Contracts and Integration

Establish clear, versioned API contracts (REST or gRPC) and consider asynchronous messaging for decoupling. Use consumer-driven contract testing to ensure compatibility.

4. Implement Incremental Migration

Use the strangler fig pattern to gradually route traffic to the new service while keeping the monolith operational. Employ feature flags and canary releases to control rollout and enable quick rollback.

5. Adapt Team Workflows and Ownership

Align teams to service ownership, fostering autonomy and accountability. Establish cross-team collaboration for API evolution and shared concerns like observability and security.

Key Points to Mention

  • Strangler fig pattern for incremental migration
  • Domain-driven design for service boundaries
  • Data ownership and avoiding shared databases
  • API versioning and contract testing
  • Feature flags and canary releases for risk mitigation
  • Team topologies and ownership models (e.g., stream-aligned teams)

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