Зачем инженеру знать основы
System Design -- это не только про микросервисы и базы данных. Каждое архитектурное решение в конечном счёте упирается в физические ограничения: скорость процессора, объём памяти, пропускную способность сети и латентность дисков.
Инженер, который понимает, как работает железо и операционная система, принимает более обоснованные решения. Он знает, почему кэш работает быстро, почему SSD лучше HDD для случайного чтения и почему контейнеры легче виртуальных машин.
Что отличает junior от senior
| Уровень | Как думает | Пример |
|---|---|---|
| Junior | "Это работает" | Использует Redis, потому что все используют |
| Middle | "Это работает и я знаю почему" | Понимает, что Redis быстрый из-за работы в RAM |
| Senior | "Это работает, я знаю почему и какие есть ограничения" | Знает, что Redis ограничен объёмом RAM и при swap деградирует |
Карта знаний для System Design
Аппаратный уровень
Понимание аппаратного уровня помогает оценивать производительность и стоимость решений.
CPU и GPU:
- Тактовая частота и IPC (Instructions Per Clock)
- Многоядерность и параллелизм
- Когда GPU эффективнее CPU (batch-обработка, ML)
Память и хранилища:
- Иерархия: регистры -> L1/L2/L3 кэш -> RAM -> SSD -> HDD
- Разница в латентности -- порядки величин
- IOPS и throughput для разных типов хранилищ
Уровень ОС
Операционная система -- это мост между приложением и железом.
Процессы и потоки:
- Как ОС распределяет ресурсы
- Разница между процессами и потоками
- Контекстное переключение и его стоимость
Управление памятью:
- Виртуальная память и страницы
- Swap и его влияние на производительность
- OOM Killer в Linux
Уровень виртуализации
Виртуализация позволяет эффективно использовать аппаратные ресурсы.
Виртуальные машины:
- Полная изоляция на уровне гипервизора
- Overhead на эмуляцию аппаратуры
Контейнеры:
- Лёгкая изоляция на уровне ядра ОС
- cgroups и namespaces
- Docker и Kubernetes
Числа, которые должен знать каждый инженер
Эти числа критически важны для System Design. Джефф Дин из Google составил знаменитый список "Latency Numbers Every Programmer Should Know".
| Операция | Латентность | Аналогия (если 1 такт CPU = 1 секунда) |
|---|---|---|
| L1 кэш | ~1 нс | 1 секунда |
| L2 кэш | ~4 нс | 4 секунды |
| L3 кэш | ~10 нс | 10 секунд |
| RAM | ~100 нс | 1.5 минуты |
| SSD random read | ~16 мкс | 4.5 часа |
| HDD random read | ~2 мс | 23 дня |
| Сеть (один дата-центр) | ~500 мкс | 5.8 дня |
| Сеть (между континентами) | ~150 мс | 4.8 года |
Ключевой вывод: Разница между L1 кэшем и обращением по сети -- это как разница между одной секундой и пятью годами. Именно поэтому кэширование -- одна из главных тем в System Design.
Как это применяется в разработке
Понимание основ помогает писать более производительный код и проектировать системы правильно.
<?php
declare(strict_types=1);
/**
* Understanding hardware helps make better architectural decisions.
*
* This class demonstrates how knowledge of memory hierarchy
* influences caching strategy design.
*/
final class PerformanceAwareService
{
/** @var array<string, mixed> */
private array $localCache = [];
public function __construct(
private readonly RedisConnection $redis,
private readonly DatabaseConnection $db,
) {}
/**
* Multi-level caching mirrors hardware memory hierarchy:
* L1 (in-process array) -> L2 (Redis/RAM) -> L3 (Database/Disk)
*/
public function getData(string $key): mixed
{
// Level 1: In-process cache (~nanoseconds)
// Like CPU L1 cache - fastest, smallest
if (isset($this->localCache[$key])) {
return $this->localCache[$key];
}
// Level 2: Redis cache (~microseconds, network hop)
// Like RAM - fast, limited by memory
$cached = $this->redis->get($key);
if ($cached !== null) {
$this->localCache[$key] = $cached;
return $cached;
}
// Level 3: Database (~milliseconds, disk I/O)
// Like HDD - slow, virtually unlimited
$data = $this->db->query(
'SELECT data FROM cache_table WHERE key = :key',
['key' => $key],
);
if ($data !== null) {
$this->redis->set($key, $data, ttl: 3600);
$this->localCache[$key] = $data;
}
return $data;
}
}
Этот раздел покрывает все уровни от аппаратуры до контейнеризации:
- CPU и GPU -- архитектура процессоров, параллелизм, SIMD/SIMT
- RAM и хранилища -- иерархия памяти, типы накопителей, latency
- Операционные системы -- процессы, потоки, планирование, memory management
- Linux для инженеров -- практические навыки работы с Linux
- Android архитектура -- мобильная платформа и её особенности
- Виртуализация -- гипервизоры, VM, overhead
- Контейнеризация -- Docker, cgroups, namespaces
Как изучать этот раздел
Не нужно знать всё на уровне kernel-разработчика. Для System Design достаточно понимать:
- Порядки величин -- насколько одна операция быстрее/медленнее другой
- Trade-offs -- что мы получаем и чем платим за каждое решение
- Ограничения -- физические и логические пределы каждой технологии
Совет: Когда на интервью вас спрашивают "почему вы выбрали это решение?", ответ, подкреплённый пониманием аппаратных ограничений, всегда сильнее ответа "так принято" или "так написано в блоге".
Выводы
Основы Computer Science -- это фундамент, на котором строится System Design. Без понимания того, как работает процессор, память и операционная система, невозможно принимать обоснованные решения о производительности, масштабируемости и стоимости систем. Каждая тема этого раздела даёт инструменты для более глубокого анализа архитектурных решений.