Menu
Medium #system-design·May 22, 2026

Addressing 'Works on My Device' as a System Design Challenge

This article highlights how the common "works on my device" issue is fundamentally a system design problem, stemming from a lack of considering diverse environmental factors and non-ideal conditions. It emphasizes the need for architects to design systems that are resilient, observable, and adaptable to various states beyond the happy path, moving beyond assumptions of perfect environments.

Read original on Medium #system-design

The phrase "works on my device" often points to a deeper architectural flaw: a system designed only for ideal conditions. In real-world scenarios, software operates within a complex ecosystem of fluctuating network conditions, diverse hardware, varying data states, and external service dependencies. Ignoring these factors leads to brittle systems that fail unexpectedly in production, highlighting a critical gap in initial system design considerations.

Understanding Environmental Variability

System designers must actively anticipate and account for variability in their architectural choices. This includes: network latency and packet loss, device heterogeneity (older phones, different OS versions), stale or inconsistent data, and external API rate limits or failures. Designing for the "happy path" alone is insufficient and leads to operational fragility.

  • Network Conditions: Variable latency, bandwidth, and intermittent connectivity.
  • Client Diversity: Wide range of device capabilities, operating systems, and browser versions.
  • Data State: Potential for stale, inconsistent, or corrupted data due to race conditions or eventual consistency.
  • External Dependencies: Reliability and performance of third-party services, APIs, and microservices.

Architectural Principles for Robustness

To mitigate the "works on my device" problem, system designs should incorporate principles that promote resilience and adaptability. This means moving beyond optimistic assumptions and embracing defensive programming, robust error handling, and comprehensive monitoring across the entire stack. Key architectural considerations include:

  • Graceful Degradation: Designing systems to operate at reduced functionality rather than outright failing during partial outages or resource constraints.
  • Observability: Implementing robust logging, metrics, and tracing to understand system behavior in non-ideal conditions, providing insights into production issues.
  • Circuit Breakers & Timeouts: Protecting downstream services from cascading failures and preventing indefinite waits.
  • Idempotency: Ensuring that repeated requests do not cause unintended side effects, crucial for unreliable networks or retries.
  • Client-Side Resilience: Implementing retry mechanisms, caching, and offline capabilities on client applications to handle backend instability or network issues.
💡

Proactive Design Thinking

Instead of debugging production issues caused by environmental variability, adopt a proactive design approach. Simulate adverse conditions during development and testing to uncover vulnerabilities early. This shifts the focus from 'if it fails' to 'how it fails' and 'how it recovers'.

resilienceobservabilityfault toleranceerror handlingnetwork variabilitysystem robustnessproduction issuesclient-side resilience

Comments

Loading comments...