Discord Interview Question

Android System Design Framework — Discord Interview

senior15 minAndroid System Design

How Discord Tests This

Discord interviews focus on real-time messaging at scale, voice/video infrastructure, distributed ID generation, and community platform architecture. They test your ability to handle millions of concurrent connections efficiently.

Interview focus: Real-time messaging, distributed ID generators, and community platform infrastructure.

Key Topics
frameworkoffline firstarchitecture

Android system design interviews are less about memorising components and more about showing a structured way to think.

This guide gives you a repeatable framework for solving Android system design interview questions: clarifying requirements, choosing the right architecture, handling offline-first data flow, reasoning about performance and battery, and defending trade-offs.

If you are preparing for FAANG-style system design interviews, this is the framework to practice and refine.


What the interviewers are looking for:

What Android interviewers are grading you on:

  • Can you clarify scope without getting lost in details?
  • Can you design the app/library in layers instead of drawing random boxes?
  • Can you explain trade-offs clearly? Important “Signal”.
  • Do you know Android-specific concerns like offline-first, lifecycle, memory, battery, and background work?
  • Can you communicate a clean, senior-level design under pressure?

My Experience with (Android) System Design Interviews

I have failed multiple system design interviews. I have botched some of the most lucrative offers due to System Design interview preparation being sub par. Some of the most lucrative company interviews bombed.
This framework is what helped me consistently approach and solve these questions.
For preparation, you can use tools like Hello Interview and Mockingly.AI to prepare for system design interviews and practice some AI mock interviews. But first, you need to know how to go about these questions.


The Core Challenges

Instead of being generic, I’ll talk about problems that I faced during my interviews and what some of you might also face.

1. Clarifying Requirements

I started with clarifying requirements, but requirements are “almost” similar for most system design interview questions. They revolve around clarifying for offline support, number of users, battery optimisations, modular architecture etc….

A challenge I faced here was if the interviewer challenged my knowledge on a requirement. Why do you care about number of users? What difference does it make? Why do you care about geography?

It’s important to know about the tradeoffs that come with these choices. If you’ve never designed a system from scratch, or are just unaware of the challenges, then you will not know answers to these. You’ll need to look these up.

2. The "Getting Started" Struggle

This is where you need to start building components. I struggled here because I was unable to think of my Android apps in terms of building blocks. Didn’t know where to start, should I be drawing UseCases, ViewModels, how ViewModels talk to UseCase, how to picture the data layer?

If it’s a library, it was even tougher. How do you start? it doesn’t have any screen. Library was my nemesis. The framework we’ll talk about will specifically solve for this.

3. The Power of Tradeoffs

Drawing the architecture is only part of the interview. The real signal comes from how well you explain your decisions and trade-offs. You don’t need to draw a lot for your interview to go well. What you need is to explain your choices.

The interviewer will throw technical trivia randomly to test your technical depth. You should be ready to discuss:

  • HTTP vs HTTPS
  • GraphQL vs REST vs WebSockets
  • Offset vs Cursor Pagination
  • RecyclerView optimization and DiffUtils
  • Caching strategy (In-memory vs Disk)
  • ViewModel vs Plain Presenter
  • Room vs DataStore vs SharedPreferences
  • Flow vs LiveData
  • WorkManager vs Foreground Service
  • Paging 3 vs Manual Pagination
  • Compose vs XML
  • Offline-first vs Network-first

4. Backend Signals

The interviewer can ask basic questions about APIs even in an Android interview. For example, they could ask you what a basic backend API would look like if you want to fetch a list of items on homescreen. What would you use for mutating some data? A GET or POST api? What would that look like?


🔥 Resources for Preparation

  • Practice Mocks: Use mockingly.ai for practicing android system design interview questions. It is the most effective way to practice with AI feedback.
  • Company Questions: Use hellointerview to find previously asked questions.
  • Discussion: Use leetcode discuss section for community insights.

Deep-dive examples using this framework:

QuestionKey topics
Design a Notes AppOffline-first, Room, WorkManager, conflict resolution
Design a Photo Sharing AppGlide/Coil, Paging 3, WorkManager uploads, pre-signed URLs
Design RedditPaging 3 + RemoteMediator, optimistic UI, offline feed
Design a Notification LibraryLibrary framework, FCM, AlarmManager, BroadcastReceiver
Design a Trading AppWebSocket, Kotlin Flow, real-time order book, battery optimisation
Design Uber's Mobile AppForeground Service, FusedLocationProvider, gRPC, trip state machine

Framework 1: Building a Library

There are 2 types of questions:

  1. Build a system design for an app (notes, weather etc…)
  2. Build a library (notification library, caching library etc…)

Phase 1: Scoping

Clarify Functional requirements:

  • What is the CORE purpose of the library?
  • Should it support offline capability?
  • Should it encrypt data?
  • Should it handle batching for API calls?

Narrow the Scope:

  • Target Audience: Internal vs Public?
  • Minimal Supported API level?
  • Assets: Can we exclude GIFs or WebPs?

Non-Functional Requirements:

  • Binary Size: Be mindful of the footprint added to the host app.
  • Battery Optimization: Handle background tasks gracefully.
  • Performance: Move expensive tasks to background threads.

Phase 2: The High-Level Diagram

A good structure for an Android library system design:

  1. Request Manager: Accepts raw input, wraps it into a internal Request Object, and handles deduplication.
  2. Dispatcher: Decides where the request executes (Thread Pool / Coroutines).
  3. Data Source: Local (Room/File) and Remote (OkHttp/Retrofit).
  4. Memory Cache: In-memory LRU cache or Bitmap pools.

Example: Image Loading Library Data Flow

text
[ API Call ] -> [ Request Manager ] -> [ Memory Cache (L1) ] -> Found? Return.
                         |
                 [ Dispatcher/Pool ]
                         |
               [ Disk Cache (L2) ] -> Found? Return & Update L1.
                         |
               [ Network Fetcher ] -> Success? Update L1 & L2 -> Return.

Phase 3: Deep Dive

Request Manager

Deduplication is key. If three parts of the app request the same resource, merge them into one task to save bandwidth and CPU.

Dispatcher

This is the "meat" of the diagram. It validates requests, manages the job queue, handles worker allocation, and controls prioritization.

Cache & Storage

  • Memory Cache (L1): RAM storage (LRU Cache). Fast but volatile.
  • Disk Cache (L2): Persistent storage (Room/File system). Survives restarts.

Framework 2: Android App System Design

Phase 1: Functional & Non-Functional Requirements

Functional:

  • Core Action: Primary task (Post, Send, Order).
  • User Roles: Buyer vs Seller?
  • Data Types: Text, Media, Streams?
  • Discovery: Search, Feed, Notifications.

Non-Functional (Senior Signals):

  • Offline Usage: Does it work without network?
  • Latency: What is acceptable for this use case?
  • Reliability: 0-loss policy?
  • Efficiency: Minimize battery and data usage.

Phase 2: High-Level Architecture (HLD)

Follow Clean Architecture for modularity.

  1. UI / Presentation Layer: Jetpack Compose + ViewModels.
  2. Domain Layer: Plain Kotlin UseCases (e.g., GetMessagesUseCase).
  3. Data Layer: Repository Pattern. Decides between Network and Local sources.

Visualizing the Architecture:

text
[   UI LAYER   ]        [ PRESENTATION ]        [ DOMAIN LAYER ]        [   DATA LAYER   ]
(Compose/Views)  <--->    (ViewModel)    <--->    (Use Cases)    <--->    (Repository)
                                                                             |
                                                         ---------------------------------------
                                                         |                                     |
                                                [ LOCAL DATA SOURCE ]                [ REMOTE DATA SOURCE ]
                                                   (Room/SQLite)                        (Retrofit/WS/gRPC)
                                                         |                                     |
                                                         ---------------------------------------
                                                                             |
                                                                   [ WORKMANAGER / SYNC ]

Phase 3: Data Flow

  1. Single Source of Truth: UI observes the database (Room) via Flow/LiveData.
  2. Networking: Choose REST, GraphQL, or WebSockets based on the frequency of updates.
  3. Data Strategy: Use "Cache-First" or "Network-First" depending on the app's requirements.

Offline-First: The Senior Requirement

Offline-first architecture is critical.

  • UI always reads from local storage.
  • Local database acts as the single source of truth.
  • Network calls update the database, never the UI directly.
  • UI reacts automatically via Flow/LiveData.

Correct Flow: UI -> observes DB -> Repository syncs with network -> DB updates -> UI reacts


Common "How Would You Handle" Questions

  • Battery Drain: Limit parallel downloads, use WorkManager with constraints.
  • Storage Management: Implement a cache flush mechanism or LRU eviction.
  • Data Usage: Add a "WiFi-only" configuration for large payloads.
  • Pagination: Choose Cursor pagination for large feeds to avoid data consistency issues.

Conclusion: The Interview Strategy

  1. Clarify the problem and constraints.
  2. Define core use cases.
  3. Draw the top-level architecture.
  4. Explain the data flow (Single Source of Truth).
  5. Deep dive into a critical subsystem (e.g., Sync or Caching).
  6. Call out trade-offs.
  7. End with testing and edge cases.

Practice makes perfect. Use Mockingly.ai to simulate real interview pressure and refine your delivery.

Companies That Ask This

Related System Design Guides