Когда осталось 1-2 недели
Краткосрочная подготовка -- это не время учить новое. Это время систематизировать знания, отработать подход и набрать уверенность.
Принципы
- Не учить новое -- закрепляйте то, что знаете
- Практика > теория -- решайте задачи, а не читайте
- Mock interviews -- минимум 2-3 за неделю
- Отдых -- выгорание перед интервью = провал
Расписание на 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 минуты
- Поприветствуйте
- Послушайте задачу
- Переформулируйте задачу своими словами
- Скажите: "Перед тем как начать проектировать, позвольте задать несколько уточняющих вопросов"
Если застряли
- Проговорите вслух: "Я думаю о..."
- Вернитесь к требованиям: что самое важное?
- Начните с простого решения и усложняйте
- Спросите интервьюера: "Хотите, чтобы я углубился в X или перешел к Y?"
Выводы
Краткосрочная подготовка -- это систематизация и отработка. Доверяйте своим знаниям, практикуйте подход, высыпайтесь. Уверенность приходит с практикой, а не с чтением ещё одной книги.