Design a Cloud DevBox Platform
OpenAISoftware Engineer · Technical ScreenLast updated
This question evaluates a candidate's ability to design scalable, secure cloud development platforms, testing competencies in distributed systems architecture, orchestration and scheduling, storage and persistence, multi-tenancy and RBAC, runtime isolation, and operational observability.
Design a cloud DevBox platform: a service that gives developers disposable or persistent remote development machines, accessible through a browser, SSH, or IDE plugins (e.g. a VS Code / JetBrains remote tunnel).
The platform should support the full lifecycle of a dev box and the operational needs of an organization:
- Lifecycle: users can create, start, stop, pause, resume, and delete dev boxes from predefined templates.
- Box contents: each dev box bundles an operating system image, language/toolchain dependencies, a repository checkout, a user home directory, injected secrets, and allocated CPU, memory, storage, and optional GPU.
- Multi-tenancy: organizations and teams, quota enforcement, role-based access control (RBAC), audit logs, and cost controls.
- Quality bar: optimize for fast provisioning, high availability, scalability to many concurrent dev boxes, strong isolation, reliable persistence, and operational observability.
Walk through requirements, the high-level architecture, the lifecycle/state model, scheduling and provisioning, isolation, storage/persistence, failure handling, and observability/cost. Call out the major tradeoffs and where the system is actually bottlenecked.
Constraints & Assumptions
State these explicitly; they size the design. Reasonable defaults if the interviewer doesn't specify:
- Workloads are untrusted — boxes run arbitrary, possibly hostile user code, so isolation must be a real kernel/hardware boundary.
- Pause/resume (RAM snapshot) is in scope, not just stop/start.
- Multi-region deployment for latency and resilience.
- Scale: on the order of $10^5$ total boxes (e.g. ~200k), of which a smaller fraction (~10–20%) are running concurrently at peak; thousands of organizations.
- Provisioning SLO targets: warm resume in single-digit seconds; cold create of a common template in tens of seconds, not minutes.
- Availability target: control-plane HA; a control-plane outage must not terminate running boxes or live sessions.
- Identity: an external OIDC/SSO identity provider already exists and is consumed (not designed here).
- Out of scope: building the in-box IDE itself, and the billing/invoicing system (you emit metering events that feed it, not invoices).
Clarifying Questions to Ask
- Trust model: are workloads untrusted (arbitrary, possibly hostile code) or trusted internal developers? This is the single biggest design fork.
- Is pause/resume (RAM snapshot) required, or only stop/start?
- What is the expected steady-state concurrency and the create rate (including peak bursts like a Monday-morning login spike)?
- Single-region or multi-region for v1?
- Are boxes mostly persistent (survive node failure) or ephemeral/scratch, and what is the acceptable data-loss bound for each?
- Is there a GPU requirement, and what fraction of boxes need it?
Hints
Hint 1
Frame the split first: The single most important structural decision is a **control plane / data plane split**. The control plane (API, RBAC, scheduler, metadata DB) makes decisions and holds durable state; the data plane (compute nodes, runtimes, the connection gateway) runs the boxes and carries traffic. Aim for a design where a control-plane outage blocks only *new* mutations and never kills *running* boxes or live sessions.
Hint 2
Model lifecycle as desired vs actual state: Don't hand-code each transition imperatively. Give every box a `desired_state` (set by the API) and an `actual_state`, and have an idempotent, leased **reconciler** drive `actual → desired`. This is what makes the system self-healing and safe under retries, duplicate events, and crashed workers. Be precise about **stop** (release compute, keep the workspace disk, cold boot to resume) vs **pause** (snapshot RAM + disk, warm resume with processes intact).
Hint 3
Provisioning latency is the hard NFR: "Fast provisioning" is where the real engineering hides, and the win comes from *not doing work on the critical path* — pre-doing it, sharing it, or restoring it instead of rebuilding it. Decompose a cold create into its serial costs (boot, image fetch, dependency build, workspace attach) and attack whichever dominates. Identify the actual bottleneck before optimizing — it is *not* the small metadata DB.
Hint 4
Let the trust model force the isolation choice: Pin down the trust model early. Untrusted, arbitrary user code points you at a hardware boundary (**microVM** / VM), not a shared-kernel container. This one fork shapes the runtime, the node fleet, and the entire security posture, so state it explicitly.
Follow-up questions
- How do you implement **pause/resume** so a warm resume hits single-digit seconds at scale, and what does that cost in storage?
- A node dies with multiple running **persistent** boxes on it. Walk through exactly how the system detects this and recovers, and state the data-loss guarantee.
- How do you keep **secrets** out of base images and RAM snapshots while still injecting them at runtime?
- How does the **scheduler** decide where to place a new or resuming box, and how do you avoid both fragmentation and noisy-neighbor contention?
Solution walkthrough is for members
Get the full walkthrough with reference code and complexity analysis, plus Kitty Coach at 300 messages a day. Hints, the code runner and community answers stay free.