MidПрактика5 min

Краткосрочная подготовка

План подготовки к System Design интервью на 1-2 недели: стратегия повторения, чек-листы, типичные паттерны

Когда осталось 1-2 недели

Краткосрочная подготовка -- это не время учить новое. Это время систематизировать знания, отработать подход и набрать уверенность.

Принципы

  1. Не учить новое -- закрепляйте то, что знаете
  2. Практика > теория -- решайте задачи, а не читайте
  3. Mock interviews -- минимум 2-3 за неделю
  4. Отдых -- выгорание перед интервью = провал

Расписание на 2 недели

Неделя 1: Интенсивная практика

День Утро (1 час) Вечер (1 час)
Пн Задача: URL Shortener Повтор: кэширование
Вт Задача: Chat System Повтор: очереди сообщений
Ср Mock interview #1 Разбор ошибок
Чт Задача: News Feed Повтор: шардирование
Пт Задача: Notification System Повтор: consistency
Сб Mock interview #2 Разбор ошибок
Вс Отдых Легкое чтение

Неделя 2: Шлифовка

День Утро (1 час) Вечер (1 час)
Пн Задача: Rate Limiter Повтор слабых мест
Вт Задача: Payment System Behavioral вопросы
Ср Mock interview #3 Разбор ошибок
Чт Повтор ключевых паттернов Подготовка STAR историй
Пт Легкая задача Отдых
Сб/Вс Интервью

Шпаргалка по паттернам

Быстрая карта решений

<?php

declare(strict_types=1);

/**
 * Quick reference: common problems and their key components
 */
final class SystemDesignCheatSheet
{
    public const PATTERNS = [
        'Read-heavy system' => [
            'components' => ['CDN', 'Cache (Redis)', 'Read replicas'],
            'ratio' => '100:1 reads to writes',
            'examples' => ['Twitter timeline', 'Product catalog'],
        ],
        'Write-heavy system' => [
            'components' => ['Message queue', 'Write-behind cache', 'LSM storage'],
            'ratio' => '1:1 or writes dominate',
            'examples' => ['Logging system', 'IoT data ingestion'],
        ],
        'Real-time system' => [
            'components' => ['WebSocket', 'Pub/Sub (Redis)', 'Presence service'],
            'latency' => '<200ms end-to-end',
            'examples' => ['Chat', 'Live scores', 'Collaborative editing'],
        ],
        'Search system' => [
            'components' => ['Inverted index', 'Elasticsearch', 'Ranking service'],
            'optimization' => 'Index updates vs query latency',
            'examples' => ['Autocomplete', 'Product search', 'Log search'],
        ],
        'Transactional system' => [
            'components' => ['ACID database', 'Idempotency keys', 'Saga pattern'],
            'guarantee' => 'Exactly-once or at-least-once with dedup',
            'examples' => ['Payments', 'Booking', 'Inventory'],
        ],
    ];

    // Common numbers to remember
    public const NUMBERS = [
        'L1 cache reference' => '0.5 ns',
        'L2 cache reference' => '7 ns',
        'RAM reference' => '100 ns',
        'SSD random read' => '150 us',
        'HDD random read' => '10 ms',
        'Network round trip (same DC)' => '0.5 ms',
        'Network round trip (cross-region)' => '150 ms',
        'Read 1MB from SSD' => '1 ms',
        'Read 1MB from network' => '10 ms',
        'Read 1MB from HDD' => '20 ms',
    ];
}

Формулы для оценки

<?php

declare(strict_types=1);

/**
 * Quick estimation formulas
 */
final class EstimationHelper
{
    /**
     * QPS (Queries Per Second) estimation
     */
    public static function estimateQPS(int $dailyActiveUsers, int $actionsPerUserPerDay): array
    {
        $dailyRequests = $dailyActiveUsers * $actionsPerUserPerDay;
        $avgQps = (int) ($dailyRequests / 86400);
        $peakQps = $avgQps * 3; // Assume 3x peak factor

        return [
            'daily_requests' => $dailyRequests,
            'avg_qps' => $avgQps,
            'peak_qps' => $peakQps,
        ];
    }

    /**
     * Storage estimation
     */
    public static function estimateStorage(
        int $dailyRequests,
        int $avgSizeBytes,
        int $retentionYears
    ): array {
        $dailyGb = ($dailyRequests * $avgSizeBytes) / (1024 ** 3);
        $yearlyTb = ($dailyGb * 365) / 1024;
        $totalTb = $yearlyTb * $retentionYears;

        return [
            'daily_gb' => round($dailyGb, 2),
            'yearly_tb' => round($yearlyTb, 2),
            'total_tb' => round($totalTb, 2),
            'with_replication_tb' => round($totalTb * 3, 2),
        ];
    }

    /**
     * Bandwidth estimation
     */
    public static function estimateBandwidth(int $peakQps, int $avgResponseBytes): array
    {
        $bytesPerSecond = $peakQps * $avgResponseBytes;
        $mbps = $bytesPerSecond / (1024 * 1024);
        $gbps = $mbps / 1024;

        return [
            'peak_mbps' => round($mbps, 2),
            'peak_gbps' => round($gbps, 3),
        ];
    }
}

// Example: Estimate for URL Shortener
// 100M new URLs/day, 10B redirects/day

// Write QPS: 100M / 86400 ≈ 1,157 QPS
// Read QPS: 10B / 86400 ≈ 115,741 QPS
// Peak Read QPS: ~350K

// Storage: 100M * 500 bytes = 50GB/day
// 5 years: 50GB * 365 * 5 = ~91TB
// With 3x replication: ~273TB

Шаблон для любой задачи

Универсальный подход за 45 минут

<?php

declare(strict_types=1);

/**
 * Universal template for any system design problem
 * Practice this sequence until it becomes automatic
 */
final class InterviewTemplate
{
    // Minutes 0-5: REQUIREMENTS
    public function step1_requirements(): void
    {
        // Ask about:
        // - Users: who, how many, where
        // - Features: must-have vs nice-to-have
        // - Scale: requests/sec, data volume
        // - Constraints: latency, consistency, budget
    }

    // Minutes 5-8: ESTIMATION
    public function step2_estimation(): void
    {
        // Calculate:
        // - QPS (average and peak)
        // - Storage (daily, yearly, total)
        // - Bandwidth
        // - Number of servers needed
    }

    // Minutes 8-18: HIGH-LEVEL DESIGN
    public function step3_highLevel(): void
    {
        // Draw components:
        // Client -> LB -> API -> Service -> DB
        //                     -> Cache
        //                     -> Queue -> Workers
        // Explain data flow for main use cases
    }

    // Minutes 18-25: API & DATA MODEL
    public function step4_apiAndData(): void
    {
        // Define:
        // - REST/gRPC endpoints
        // - Request/Response schemas
        // - Database tables/collections
        // - Key indexes
    }

    // Minutes 25-38: DEEP DIVE
    public function step5_deepDive(): void
    {
        // Pick 2-3 most interesting/complex components
        // For each:
        // - How does it work internally?
        // - What happens on failure?
        // - How does it scale?
    }

    // Minutes 38-45: TRADE-OFFS & WRAP-UP
    public function step6_wrapUp(): void
    {
        // Discuss:
        // - Known limitations
        // - Alternative approaches considered
        // - What to improve with more time
        // - Monitoring and observability
    }
}

Подготовка к типичным вопросам

"Как бы вы масштабировали это?"

<?php

declare(strict_types=1);

/**
 * Scaling checklist (memorize this order)
 */
final class ScalingPlaybook
{
    public const STEPS = [
        1 => 'Vertical scaling: bigger machine',
        2 => 'Read replicas: separate read/write traffic',
        3 => 'Caching: Redis/Memcached for hot data',
        4 => 'CDN: static content closer to users',
        5 => 'Database indexing: optimize slow queries',
        6 => 'Horizontal scaling: multiple app servers + LB',
        7 => 'Message queues: async heavy operations',
        8 => 'Database sharding: partition data across nodes',
        9 => 'Microservices: decompose for independent scaling',
        10 => 'Multi-region: geographic distribution',
    ];
}

"Что произойдет, если X упадет?"

Для каждого компонента системы подготовьте ответ:

Компонент При сбое Митигация
Load Balancer Весь трафик потерян Резервный LB (active-passive)
API Server Часть запросов потеряна Несколько инстансов за LB
Database Данные недоступны Replicas + failover
Cache (Redis) Увеличение latency Cache-aside, DB handles load
Message Queue Сообщения задерживаются Persistent queues, dead letter
External API Функция недоступна Circuit breaker + fallback

"Как обеспечить консистентность?"

<?php

declare(strict_types=1);

/**
 * Consistency patterns quick reference
 */
final class ConsistencyPatterns
{
    // Strong consistency: all reads see the latest write
    // Use when: financial transactions, inventory, bookings
    // How: single leader, synchronous replication
    // Cost: higher latency, lower availability

    // Eventual consistency: reads may see stale data temporarily
    // Use when: social feed, analytics, notifications
    // How: async replication, conflict resolution
    // Cost: complex conflict handling, user may see stale data

    // Read-your-writes: user sees their own writes immediately
    // Use when: user profile updates, post creation
    // How: read from leader for recent writes, replica otherwise

    /**
     * Example: Implementing read-your-writes consistency
     */
    public function readWithConsistency(
        string $userId,
        string $key,
        \PDO $leader,
        \PDO $replica,
        \Redis $cache
    ): mixed {
        // Check if user has recent writes
        $lastWrite = $cache->get("last_write:$userId");

        if ($lastWrite !== false && (time() - (int) $lastWrite) < 5) {
            // Recent write detected: read from leader
            $stmt = $leader->prepare('SELECT * FROM data WHERE key = :key');
        } else {
            // No recent writes: safe to read from replica
            $stmt = $replica->prepare('SELECT * FROM data WHERE key = :key');
        }

        $stmt->execute(['key' => $key]);

        return $stmt->fetch(\PDO::FETCH_ASSOC);
    }
}

Подготовка Behavioral-историй

Подготовьте 5-7 историй по методу STAR:

Категория Ваша история
Сложная техническая проблема ?
Конфликт в команде ?
Провал проекта ?
Успешная оптимизация ?
Лидерство без полномочий ?
Обучение новой технологии ?
Работа под давлением ?

День перед интервью

Чек-лист

  • Перечитать шпаргалку по паттернам
  • Пройти одну задачу за 45 минут (легкую, для уверенности)
  • Подготовить рабочее место (камера, микрофон, whiteboard)
  • Выспаться (минимум 7 часов)
  • Подготовить вопросы для интервьюера
  • Убедиться, что знаете имя интервьюера и детали встречи

Вопросы интервьюеру

Хорошие вопросы показывают вашу заинтересованность:

  • Какая самая интересная техническая задача в команде сейчас?
  • Как устроен процесс design review?
  • Какой tech stack и почему его выбрали?
  • Какие возможности для роста?

Во время интервью

Первые 2 минуты

  1. Поприветствуйте
  2. Послушайте задачу
  3. Переформулируйте задачу своими словами
  4. Скажите: "Перед тем как начать проектировать, позвольте задать несколько уточняющих вопросов"

Если застряли

  1. Проговорите вслух: "Я думаю о..."
  2. Вернитесь к требованиям: что самое важное?
  3. Начните с простого решения и усложняйте
  4. Спросите интервьюера: "Хотите, чтобы я углубился в X или перешел к Y?"

Выводы

Краткосрочная подготовка -- это систематизация и отработка. Доверяйте своим знаниям, практикуйте подход, высыпайтесь. Уверенность приходит с практикой, а не с чтением ещё одной книги.