EasyТеория5 min

Обзор основ Computer Science

Фундаментальные знания CS, необходимые для проектирования систем: от аппаратного уровня до виртуализации

Зачем инженеру знать основы

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;
    }
}
## Структура раздела

Этот раздел покрывает все уровни от аппаратуры до контейнеризации:

  1. CPU и GPU -- архитектура процессоров, параллелизм, SIMD/SIMT
  2. RAM и хранилища -- иерархия памяти, типы накопителей, latency
  3. Операционные системы -- процессы, потоки, планирование, memory management
  4. Linux для инженеров -- практические навыки работы с Linux
  5. Android архитектура -- мобильная платформа и её особенности
  6. Виртуализация -- гипервизоры, VM, overhead
  7. Контейнеризация -- Docker, cgroups, namespaces

Как изучать этот раздел

Не нужно знать всё на уровне kernel-разработчика. Для System Design достаточно понимать:

  • Порядки величин -- насколько одна операция быстрее/медленнее другой
  • Trade-offs -- что мы получаем и чем платим за каждое решение
  • Ограничения -- физические и логические пределы каждой технологии

Совет: Когда на интервью вас спрашивают "почему вы выбрали это решение?", ответ, подкреплённый пониманием аппаратных ограничений, всегда сильнее ответа "так принято" или "так написано в блоге".

Выводы

Основы Computer Science -- это фундамент, на котором строится System Design. Без понимания того, как работает процессор, память и операционная система, невозможно принимать обоснованные решения о производительности, масштабируемости и стоимости систем. Каждая тема этого раздела даёт инструменты для более глубокого анализа архитектурных решений.