Подготовка к собеседованию
Один механизм — один урок. В линии Python сначала основа — от классов и коллекций до тестов, потоков и окружений, — дальше в порядке частоты вопроса: декораторы, дескрипторы, итераторы и генераторы. В линии Go тоже сначала основа — от структур и указателей до модулей и паттернов конкурентности. Каждый урок разбирает механизм по документации и исходникам — с замерами, а не по памяти.
- Разделы
- 3
- Статьи
- 71
- ИСТОЧНИКОВ
- 340
Разделы
Статьи
Разобрано статьями
Эти механизмы спрашивают не реже, но разобраны они статьёй — целиком, с замерами и источниками.
Граф знаний
НЕЛИНЕЙНО · С УЧЁТОМ ПРЕДПОСЫЛОКТемы связаны между собой, и связи здесь не нарисованы, а посчитаны: каждая статья сама называет, на что опирается и с чем соседствует, а картинка собирается из этих названий. Пунктирный кружок — тема, которую статьи уже называют связанной, но которая ещё не написана.
30 вершин · 30 связей
Без связей: maps
Связи списком · 29
- Канал в Go: значение мимо буфера, select без приоритетов и цена, которую платят парковкой — связана с: Context в Go: отмена только вниз, cancel, который не про отмену, и Value, который дорожает с глубиной, sync и atomic в Go: два совета, которые разваливаются при замере, Горутины и планировщик Go: две тысячи байт, вытеснение и GOMAXPROCS, который ограничивает не то, что думают
- Функции и замыкания в Go: что захватывается и когда — связана с: Паттерны конкурентности в Go: пул воркеров, конвейер, fan-in, Указатели в Go: всё передаётся по значению, даже указатель
- Паттерны конкурентности в Go: пул воркеров, конвейер, fan-in — связана с: Функции и замыкания в Go: что захватывается и когда
- Context в Go: отмена только вниз, cancel, который не про отмену, и Value, который дорожает с глубиной — связана с: HTTP-сервер в Go: что net/http делает сам и чего не делает, пока не попросят, Горутины и планировщик Go: две тысячи байт, вытеснение и GOMAXPROCS, который ограничивает не то, что думают, Канал в Go: значение мимо буфера, select без приоритетов и цена, которую платят парковкой
- Гонки данных в Go: что ломается, что видит -race и чего он не видит — связана с: sync и atomic в Go: два совета, которые разваливаются при замере, Тестирование в Go: что на самом деле делают t.Run, t.Parallel и бенчмарк
- defer, panic и recover в Go: три момента вместо одного и recover, который молча не работает — связана с: Ошибки в Go: одна буква, которая рвёт цепочку, и утверждение типа, которое перестанет работать
- Встраивание структур в Go: композиция, которую путают с наследованием — связана с: Получатель метода в Go: копия, которой не видно, и «указатель быстрее», которое неверно
- Ошибки в Go: одна буква, которая рвёт цепочку, и утверждение типа, которое перестанет работать — связана с: defer, panic и recover в Go: три момента вместо одного и recover, который молча не работает, Интерфейс в Go: два слова, nil, который не nil, и вызов дороже в четыре раза
- Стек, куча и escape-анализ: почему указатель ещё ничего не значит — связана с: Интерфейс в Go: два слова, nil, который не nil, и вызов дороже в четыре раза, Сборщик мусора: почему пауза не растёт вместе с кучей, а GOGC ничего не ускоряет, Срез в Go: окно над чужим массивом, два пути append и правило роста, которое все помнят неверно
- Сборщик мусора: почему пауза не растёт вместе с кучей, а GOGC ничего не ускоряет — связана с: Профилирование в Go: что показывает pprof и чего он не показывает по умолчанию, Стек, куча и escape-анализ: почему указатель ещё ничего не значит
- HTTP-сервер в Go: что net/http делает сам и чего не делает, пока не попросят — связана с: Context в Go: отмена только вниз, cancel, который не про отмену, и Value, который дорожает с глубиной, Graceful shutdown: откуда берутся пятисотки при каждой выкатке, Таймаут и дедлайн: почему клиент ушёл, а работа продолжается
- Интерфейс в Go: два слова, nil, который не nil, и вызов дороже в четыре раза — связана с: Ошибки в Go: одна буква, которая рвёт цепочку, и утверждение типа, которое перестанет работать, Получатель метода в Go: копия, которой не видно, и «указатель быстрее», которое неверно, Стек, куча и escape-анализ: почему указатель ещё ничего не значит
- io.Reader и io.Writer: контракт из двух методов — связана с: Структуры и методы в Go: значение, которое копируется целиком
- JSON в Go: теги, omitempty и что encoding/json делает молча — связана с: Рефлексия в Go: reflect.Type, reflect.Value и правило изменяемости, Структуры и методы в Go: значение, которое копируется целиком
- Получатель метода в Go: копия, которой не видно, и «указатель быстрее», которое неверно — связана с: Встраивание структур в Go: композиция, которую путают с наследованием, Интерфейс в Go: два слова, nil, который не nil, и вызов дороже в четыре раза
- Модули и зависимости в Go: go.mod, go.sum и минимальная версия — связана с: Пакеты в Go: видимость, init и структура проекта
- Пакеты в Go: видимость, init и структура проекта — связана с: Инструменты go: build, vet, fmt и что они проверяют, Модули и зависимости в Go: go.mod, go.sum и минимальная версия, Структуры и методы в Go: значение, которое копируется целиком
- Указатели в Go: всё передаётся по значению, даже указатель — связана с: Рефлексия в Go: reflect.Type, reflect.Value и правило изменяемости, Структуры и методы в Go: значение, которое копируется целиком, Функции и замыкания в Go: что захватывается и когда
- Профилирование в Go: что показывает pprof и чего он не показывает по умолчанию — связана с: Сборщик мусора: почему пауза не растёт вместе с кучей, а GOGC ничего не ускоряет
- Рефлексия в Go: reflect.Type, reflect.Value и правило изменяемости — связана с: JSON в Go: теги, omitempty и что encoding/json делает молча, Структуры и методы в Go: значение, которое копируется целиком, Указатели в Go: всё передаётся по значению, даже указатель
- Горутины и планировщик Go: две тысячи байт, вытеснение и GOMAXPROCS, который ограничивает не то, что думают — связана с: Context в Go: отмена только вниз, cancel, который не про отмену, и Value, который дорожает с глубиной, sync и atomic в Go: два совета, которые разваливаются при замере, Канал в Go: значение мимо буфера, select без приоритетов и цена, которую платят парковкой
- Срез в Go: окно над чужим массивом, два пути append и правило роста, которое все помнят неверно — связана с: Стек, куча и escape-анализ: почему указатель ещё ничего не значит, Строки, руны и байты: почему len не считает символы, а подстрока держит мегабайты
- Строки, руны и байты: почему len не считает символы, а подстрока держит мегабайты — связана с: Срез в Go: окно над чужим массивом, два пути append и правило роста, которое все помнят неверно
- Структуры и методы в Go: значение, которое копируется целиком — связана с: io.Reader и io.Writer: контракт из двух методов, JSON в Go: теги, omitempty и что encoding/json делает молча, Пакеты в Go: видимость, init и структура проекта, Рефлексия в Go: reflect.Type, reflect.Value и правило изменяемости, Указатели в Go: всё передаётся по значению, даже указатель
- sync и atomic в Go: два совета, которые разваливаются при замере — связана с: Гонки данных в Go: что ломается, что видит -race и чего он не видит, Горутины и планировщик Go: две тысячи байт, вытеснение и GOMAXPROCS, который ограничивает не то, что думают, Канал в Go: значение мимо буфера, select без приоритетов и цена, которую платят парковкой
- Тестирование в Go: что на самом деле делают t.Run, t.Parallel и бенчмарк — связана с: Гонки данных в Go: что ломается, что видит -race и чего он не видит
- Инструменты go: build, vet, fmt и что они проверяют — связана с: Пакеты в Go: видимость, init и структура проекта
- Graceful shutdown: откуда берутся пятисотки при каждой выкатке — связана с: HTTP-сервер в Go: что net/http делает сам и чего не делает, пока не попросят
- Таймаут и дедлайн: почему клиент ушёл, а работа продолжается — связана с: HTTP-сервер в Go: что net/http делает сам и чего не делает, пока не попросят
32 вершины · 44 связи
Связи списком · 32
- *args и **kwargs: две звёздочки, которые стоят по-разному — и одна из них делает неизвестные имена допустимыми — связана с: Декораторы: выражения сверху вниз, применение снизу вверх
- async/await: вызов ничего не выполняет — и отсюда три ошибки, которые не падают — связана с: Исключения и finally: одно слово, после которого функция перестаёт падать, Итераторы и генераторы: один метод разницы и одна тихая ошибка, Контекстные менеджеры: два метода, одна возвращаемая истина и одна тихая потеря данных, Потоки и процессы: что выбрать для вычислений, а что — для ожидания
- Встроенные коллекции: list, tuple, dict и set — что когда брать — связана с: Классы и ООП: self — это аргумент, а атрибут класса — один на всех, Модули и импорт: модуль выполняется один раз, а from копирует ссылку, Словари Python изнутри: хеш-таблица CPython, Сложность операций: O-нотация, посчитанная на встроенных типах, Списки изнутри: рост, сжатие и цена работы с началом, Список против кортежа: 16 байт, которые получаются только при одном сравнении из трёх, и две операции, в которых разницы нет
- Классы и ООП: self — это аргумент, а атрибут класса — один на всех — связана с: MRO и множественное наследование: C3, ромб и куда на самом деле ведёт super(), Встроенные коллекции: list, tuple, dict и set — что когда брать, Дескрипторы: одно правило приоритета, из которого растут property, методы и слоты, Изменяемый аргумент по умолчанию: значение лежит в поле функции, и оно одно на все вызовы, Тестирование: unittest, pytest и mock — что на самом деле проверяется, Что происходит на o.x: дескрипторы, MRO и кеш типа
- Замыкания: захвачена переменная, а не значение — и цепочка областей проходит мимо тела класса — связана с: lambda: то же самое, что def, кроме двух вещей — и знаменитая ошибка с циклом не из их числа, MRO и множественное наследование: C3, ромб и куда на самом деле ведёт super(), Включения: граница области видимости проходит внутри квадратных скобок, а не по ним, Декораторы: выражения сверху вниз, применение снизу вверх, Модули и импорт: модуль выполняется один раз, а from копирует ссылку
- Сложность операций: O-нотация, посчитанная на встроенных типах — связана с: Встроенные коллекции: list, tuple, dict и set — что когда брать, Списки изнутри: рост, сжатие и цена работы с началом, Строки и форматирование: неизменяемость, срезы, f-строки и цена склейки
- Включения: граница области видимости проходит внутри квадратных скобок, а не по ним — связана с: Замыкания: захвачена переменная, а не значение — и цепочка областей проходит мимо тела класса, Итераторы и генераторы: один метод разницы и одна тихая ошибка
- Контекстные менеджеры: два метода, одна возвращаемая истина и одна тихая потеря данных — связана с: async/await: вызов ничего не выполняет — и отсюда три ошибки, которые не падают, Исключения и finally: одно слово, после которого функция перестаёт падать
- Декораторы: выражения сверху вниз, применение снизу вверх — связана с: *args и **kwargs: две звёздочки, которые стоят по-разному — и одна из них делает неизвестные имена допустимыми, Дескрипторы: одно правило приоритета, из которого растут property, методы и слоты, Замыкания: захвачена переменная, а не значение — и цепочка областей проходит мимо тела класса, Метаклассы: шесть шагов создания класса, из которых видно, что делать метаклассом, а что уже не надо
- Дескрипторы: одно правило приоритета, из которого растут property, методы и слоты — связана с: MRO и множественное наследование: C3, ромб и куда на самом деле ведёт super(), Декораторы: выражения сверху вниз, применение снизу вверх, Классы и ООП: self — это аргумент, а атрибут класса — один на всех, Метаклассы: шесть шагов создания класса, из которых видно, что делать метаклассом, а что уже не надо
- Исключения и finally: одно слово, после которого функция перестаёт падать — связана с: async/await: вызов ничего не выполняет — и отсюда три ошибки, которые не падают, Контекстные менеджеры: два метода, одна возвращаемая истина и одна тихая потеря данных, Сборка мусора: почему объект жив, хотя ссылок на него нет
- Сборка мусора: почему объект жив, хотя ссылок на него нет — связана с: is против ==: одно спрашивает про тождество, второе вызывает метод — и половина известных сюрпризов вообще не про них, Исключения и finally: одно слово, после которого функция перестаёт падать, Управление памятью в CPython: три цифры, которые все повторяют неправильно
- is против ==: одно спрашивает про тождество, второе вызывает метод — и половина известных сюрпризов вообще не про них — связана с: Копирование: присваивание не копирует ничего, copy — один уровень, deepcopy — граф целиком, Сборка мусора: почему объект жив, хотя ссылок на него нет, Список против кортежа: 16 байт, которые получаются только при одном сравнении из трёх, и две операции, в которых разницы нет
- Итераторы и генераторы: один метод разницы и одна тихая ошибка — связана с: async/await: вызов ничего не выполняет — и отсюда три ошибки, которые не падают, Включения: граница области видимости проходит внутри квадратных скобок, а не по ним
- lambda: то же самое, что def, кроме двух вещей — и знаменитая ошибка с циклом не из их числа — связана с: Замыкания: захвачена переменная, а не значение — и цепочка областей проходит мимо тела класса
- Список против кортежа: 16 байт, которые получаются только при одном сравнении из трёх, и две операции, в которых разницы нет — связана с: is против ==: одно спрашивает про тождество, второе вызывает метод — и половина известных сюрпризов вообще не про них, Встроенные коллекции: list, tuple, dict и set — что когда брать, Копирование: присваивание не копирует ничего, copy — один уровень, deepcopy — граф целиком
- Метаклассы: шесть шагов создания класса, из которых видно, что делать метаклассом, а что уже не надо — связана с: MRO и множественное наследование: C3, ромб и куда на самом деле ведёт super(), Декораторы: выражения сверху вниз, применение снизу вверх, Дескрипторы: одно правило приоритета, из которого растут property, методы и слоты
- Модули и импорт: модуль выполняется один раз, а from копирует ссылку — связана с: Встроенные коллекции: list, tuple, dict и set — что когда брать, Замыкания: захвачена переменная, а не значение — и цепочка областей проходит мимо тела класса, Изменяемый аргумент по умолчанию: значение лежит в поле функции, и оно одно на все вызовы, Окружения и зависимости: что делает venv, а что — pip, Потоки и процессы: что выбрать для вычислений, а что — для ожидания, Тестирование: unittest, pytest и mock — что на самом деле проверяется
- MRO и множественное наследование: C3, ромб и куда на самом деле ведёт super() — связана с: Дескрипторы: одно правило приоритета, из которого растут property, методы и слоты, Замыкания: захвачена переменная, а не значение — и цепочка областей проходит мимо тела класса, Классы и ООП: self — это аргумент, а атрибут класса — один на всех, Метаклассы: шесть шагов создания класса, из которых видно, что делать метаклассом, а что уже не надо, Что происходит на o.x: дескрипторы, MRO и кеш типа
- Изменяемый аргумент по умолчанию: значение лежит в поле функции, и оно одно на все вызовы — связана с: Классы и ООП: self — это аргумент, а атрибут класса — один на всех, Модули и импорт: модуль выполняется один раз, а from копирует ссылку
- Копирование: присваивание не копирует ничего, copy — один уровень, deepcopy — граф целиком — связана с: is против ==: одно спрашивает про тождество, второе вызывает метод — и половина известных сюрпризов вообще не про них, Список против кортежа: 16 байт, которые получаются только при одном сравнении из трёх, и две операции, в которых разницы нет
- Строки и форматирование: неизменяемость, срезы, f-строки и цена склейки — связана с: Сложность операций: O-нотация, посчитанная на встроенных типах, Строки изнутри: три ширины, четыре случая раскладки и цена склейки
- Потоки и процессы: что выбрать для вычислений, а что — для ожидания — связана с: async/await: вызов ничего не выполняет — и отсюда три ошибки, которые не падают, GIL: не «Python не умеет в потоки», а «поток ждёт столько, сколько вы попросили», Модули и импорт: модуль выполняется один раз, а from копирует ссылку
- Тестирование: unittest, pytest и mock — что на самом деле проверяется — связана с: Классы и ООП: self — это аргумент, а атрибут класса — один на всех, Модули и импорт: модуль выполняется один раз, а from копирует ссылку, Тестирование в Go: что на самом деле делают t.Run, t.Parallel и бенчмарк
- Окружения и зависимости: что делает venv, а что — pip — связана с: Модули и импорт: модуль выполняется один раз, а from копирует ссылку
- Что происходит на o.x: дескрипторы, MRO и кеш типа — связана с: MRO и множественное наследование: C3, ромб и куда на самом деле ведёт super(), Классы и ООП: self — это аргумент, а атрибут класса — один на всех
- Словари Python изнутри: хеш-таблица CPython — связана с: Встроенные коллекции: list, tuple, dict и set — что когда брать
- GIL: не «Python не умеет в потоки», а «поток ждёт столько, сколько вы попросили» — связана с: Потоки и процессы: что выбрать для вычислений, а что — для ожидания
- Тестирование в Go: что на самом деле делают t.Run, t.Parallel и бенчмарк — связана с: Тестирование: unittest, pytest и mock — что на самом деле проверяется
- Списки изнутри: рост, сжатие и цена работы с началом — связана с: Встроенные коллекции: list, tuple, dict и set — что когда брать, Сложность операций: O-нотация, посчитанная на встроенных типах
- Управление памятью в CPython: три цифры, которые все повторяют неправильно — связана с: Сборка мусора: почему объект жив, хотя ссылок на него нет
- Строки изнутри: три ширины, четыре случая раскладки и цена склейки — связана с: Строки и форматирование: неизменяемость, срезы, f-строки и цена склейки
21 вершина · 36 связей
Связи списком · 21
- Очередь accept: соединение установлено, а сервер о нём не знает — связана с: Graceful shutdown: откуда берутся пятисотки при каждой выкатке, Too many open files: чей это лимит, почему он не общий и что считается дескриптором, Балансировка нагрузки: кто выбирает сервер и что он в этот момент знает, Очередь и хвост: почему рост нагрузки на 19 % даёт рост задержки вчетверо, Таймаут и дедлайн: почему клиент ушёл, а работа продолжается
- cgroups и OOM-killer: кого убьют, почему в логе пусто и что на самом деле значит 137 — связана с: Побег из контейнера: как выходят на хост и как это закрыть, Сигналы, зомби и PID 1: почему контейнер не останавливается по SIGTERM
- Консистентное хеширование: сколько ключей переезжает при смене состава — связана с: Балансировка нагрузки: кто выбирает сервер и что он в этот момент знает, Балансировка: почему случайный выбор двух бьёт круговой перебор
- Too many open files: чей это лимит, почему он не общий и что считается дескриптором — связана с: Очередь accept: соединение установлено, а сервер о нём не знает, Сигналы, зомби и PID 1: почему контейнер не останавливается по SIGTERM
- Graceful shutdown: откуда берутся пятисотки при каждой выкатке — связана с: Health-checks: три разные проверки, которые зовут одним словом, Балансировка нагрузки: кто выбирает сервер и что он в этот момент знает, Выкатка и откат: почему канарейка не помогает без нужного детектора, Очередь accept: соединение установлено, а сервер о нём не знает, Сигналы, зомби и PID 1: почему контейнер не останавливается по SIGTERM
- Health-checks: три разные проверки, которые зовут одним словом — связана с: Graceful shutdown: откуда берутся пятисотки при каждой выкатке, SLO и бюджет ошибок: почему «99,9 %» без окна не значит ничего, Балансировка нагрузки: кто выбирает сервер и что он в этот момент знает, Выкатка и откат: почему канарейка не помогает без нужного детектора
- Идемпотентность: «ровно один раз» бывает в эффекте, а не в доставке — связана с: Балансировка нагрузки: кто выбирает сервер и что он в этот момент знает, Ретраи и джиттер: почему сервис падает во второй раз в момент восстановления
- Балансировка: почему случайный выбор двух бьёт круговой перебор — связана с: Балансировка нагрузки: кто выбирает сервер и что он в этот момент знает, Консистентное хеширование: сколько ключей переезжает при смене состава, Очередь и хвост: почему рост нагрузки на 19 % даёт рост задержки вчетверо
- Разрешение имени: приложение зовёт не DNS, а getaddrinfo — связана с: TLS-рукопожатие: за что платит первое соединение, Балансировка нагрузки: кто выбирает сервер и что он в этот момент знает, Таймаут и дедлайн: почему клиент ушёл, а работа продолжается
- Page cache и fsync: почему «записали» и «не потеряется» — разные утверждения — связана с: Сигналы, зомби и PID 1: почему контейнер не останавливается по SIGTERM
- Очередь и хвост: почему рост нагрузки на 19 % даёт рост задержки вчетверо — связана с: SLO и бюджет ошибок: почему «99,9 %» без окна не значит ничего, Балансировка нагрузки: кто выбирает сервер и что он в этот момент знает, Балансировка: почему случайный выбор двух бьёт круговой перебор, Очередь accept: соединение установлено, а сервер о нём не знает
- Ретраи и джиттер: почему сервис падает во второй раз в момент восстановления — связана с: TLS-рукопожатие: за что платит первое соединение, Transaction outbox: что он гарантирует, чего не гарантирует и во что обходится, Балансировка нагрузки: кто выбирает сервер и что он в этот момент знает, Идемпотентность: «ровно один раз» бывает в эффекте, а не в доставке, Таймаут и дедлайн: почему клиент ушёл, а работа продолжается
- Выкатка и откат: почему канарейка не помогает без нужного детектора — связана с: Graceful shutdown: откуда берутся пятисотки при каждой выкатке, Health-checks: три разные проверки, которые зовут одним словом
- Сигналы, зомби и PID 1: почему контейнер не останавливается по SIGTERM — связана с: cgroups и OOM-killer: кого убьют, почему в логе пусто и что на самом деле значит 137, Graceful shutdown: откуда берутся пятисотки при каждой выкатке, Page cache и fsync: почему «записали» и «не потеряется» — разные утверждения, Too many open files: чей это лимит, почему он не общий и что считается дескриптором, Побег из контейнера: как выходят на хост и как это закрыть
- SLO и бюджет ошибок: почему «99,9 %» без окна не значит ничего — связана с: Health-checks: три разные проверки, которые зовут одним словом, Очередь и хвост: почему рост нагрузки на 19 % даёт рост задержки вчетверо
- TIME_WAIT и эфемерные порты: клиент упирается раньше сервера — связана с: TLS-рукопожатие: за что платит первое соединение, Балансировка нагрузки: кто выбирает сервер и что он в этот момент знает
- Таймаут и дедлайн: почему клиент ушёл, а работа продолжается — связана с: Балансировка нагрузки: кто выбирает сервер и что он в этот момент знает, Очередь accept: соединение установлено, а сервер о нём не знает, Разрешение имени: приложение зовёт не DNS, а getaddrinfo, Ретраи и джиттер: почему сервис падает во второй раз в момент восстановления
- TLS-рукопожатие: за что платит первое соединение — связана с: TIME_WAIT и эфемерные порты: клиент упирается раньше сервера, Балансировка нагрузки: кто выбирает сервер и что он в этот момент знает, Разрешение имени: приложение зовёт не DNS, а getaddrinfo, Ретраи и джиттер: почему сервис падает во второй раз в момент восстановления
- Балансировка нагрузки: кто выбирает сервер и что он в этот момент знает — связана с: Graceful shutdown: откуда берутся пятисотки при каждой выкатке, Health-checks: три разные проверки, которые зовут одним словом, TIME_WAIT и эфемерные порты: клиент упирается раньше сервера, TLS-рукопожатие: за что платит первое соединение, Балансировка: почему случайный выбор двух бьёт круговой перебор, Идемпотентность: «ровно один раз» бывает в эффекте, а не в доставке, Консистентное хеширование: сколько ключей переезжает при смене состава, Очередь accept: соединение установлено, а сервер о нём не знает, Очередь и хвост: почему рост нагрузки на 19 % даёт рост задержки вчетверо, Разрешение имени: приложение зовёт не DNS, а getaddrinfo, Ретраи и джиттер: почему сервис падает во второй раз в момент восстановления, Таймаут и дедлайн: почему клиент ушёл, а работа продолжается
- Побег из контейнера: как выходят на хост и как это закрыть — связана с: cgroups и OOM-killer: кого убьют, почему в логе пусто и что на самом деле значит 137, Сигналы, зомби и PID 1: почему контейнер не останавливается по SIGTERM
- Transaction outbox: что он гарантирует, чего не гарантирует и во что обходится — связана с: Ретраи и джиттер: почему сервис падает во второй раз в момент восстановления