Назад к материалам

Видео + статья / Собеседования

Собеседование Python-разработчика: GIL, ClickHouse и лайвкодинг

Разбор сильного собеседования Python-разработчика: самопрезентация, GIL, потоки и процессы, ClickHouse, PostgreSQL и задача с URL.

Компания
АВ Софт
Опубликовано
Обновлено
Видео вышло
Видео
16:49
Текст
9 минут

Если ролик не загружается, выберите другую площадку.

Смотреть на

На собеседовании Python-разработчика в компании «АВ Софт» обсуждали промышленный опыт, изменения в CPython, конкурентность, выбор базы данных и задачу с подозрительными ссылками. Мы убрали личные детали кандидата и собрали ответы, которые можно использовать для самостоятельной подготовки.

Как построить сильную самопрезентацию

Самопрезентация нужна не для пересказа резюме. За две минуты дайте интервьюеру карту опыта: текущая роль, тип систем, личная зона ответственности, один результат и связь с вакансией. Затем остановитесь и дайте выбрать направление для уточнения.

Если проект закрыт соглашением о конфиденциальности, не раскрывайте клиента и внутренние данные. Объясните архитектурный контекст, собственное решение и проверенный результат.

Как отвечать про GIL и free-threaded Python

Короткий ответ: в обычной сборке CPython GIL разрешает только одному потоку одновременно выполнять Python-байткод. Потоки всё равно полезны для ожидания сети и диска, а нативный код некоторых библиотек может освобождать GIL.

С Python 3.13 существует отдельная сборка CPython с отключённым GIL. Официальное руководство по free threading подчёркивает, что это особый режим: не все расширения готовы к нему, а некоторые могут снова включить GIL. Поэтому ответ «в Python 3.14 GIL больше нет» неверен — стандартная сборка продолжает его использовать.

На интервью разделяйте факт и выбор. Сначала уточните версию и сборку интерпретатора, затем характер нагрузки и совместимость зависимостей. Только после этого обсуждайте возможный выигрыш.

Сколько потоков и процессов можно запустить

Короткий ответ: число ядер не задаёт жёсткий максимум потоков или процессов. Оно ограничивает, сколько CPU-задач могут реально исполняться одновременно. Создать объектов можно больше, но они будут конкурировать за процессор, память и время планировщика.

Инструмент Память Хороший базовый сценарий
asyncio общая в одном потоке много сетевых ожиданий
потоки общая внутри процесса блокирующий ввод-вывод
процессы отдельная вычисления на нескольких ядрах

В обычном CPython потоки не ускоряют чистый Python-код, который постоянно занят вычислениями. Для него чаще подходят процессы или библиотека с нативным кодом. Документация threading прямо разделяет I/O-задачи и CPU-bound вычисления.

Сильный ответ начинается не с числа воркеров, а с измерения нагрузки. Лишние процессы могут только увеличить переключения и расход памяти.

Когда выбирать ClickHouse, а когда PostgreSQL

Короткий ответ: ClickHouse — колоночная СУБД для аналитических запросов по большим объёмам. PostgreSQL — строковая реляционная СУБД общего назначения, особенно удобная для транзакций, связей и частых точечных изменений.

Колоночное хранение читает только нужные столбцы и хорошо сжимает однотипные значения. Это помогает считать агрегаты по миллионам событий. Строковое хранение удобно, когда приложение читает и меняет отдельную запись целиком. Сравнение ClickHouse показывает эту разницу через тип нагрузки, а не через правило «одна база быстрая, другая медленная».

Обе базы развиваются и умеют больше базовых сценариев. Выбор зависит от профиля чтения и записи, транзакций и задержки. На собеседовании приведите конкретный запрос, объём данных и частоту обновлений.

Как решить лайвкодинг с подозрительными URL

В задаче нужно расставить ссылки по приоритету домена. Первая ошибка — делить строку по точкам: в URL могут быть порт, логин, Unicode и путь. Используем urlsplit, проверяем схему и берём нормализованный hostname.

Пример кодаPython
from urllib.parse import urlsplit


def host_priority(url: str, weights: dict[str, int]) -> int:
    # Разбираем URL стандартной библиотекой, а не вручную по символам.
    parts = urlsplit(url)

    # Принимаем только ожидаемые веб-схемы и URL с настоящим hostname.
    if parts.scheme not in {"http", "https"} or not parts.hostname:
        return 0

    try:
        # IDNA переводит Unicode-домен в однозначную ASCII-форму для сравнения.
        host = parts.hostname.rstrip(".").encode("idna").decode("ascii").lower()
    except UnicodeError:
        # Некорректный домен не должен ломать обработку всей очереди.
        return 0

    # Совпадение разрешаем для самого домена и его поддоменов.
    return max(
        (
            weight
            for domain, weight in weights.items()
            if host == domain or host.endswith("." + domain)
        ),
        default=0,
    )


def sort_urls(urls: list[str], weights: dict[str, int]) -> list[str]:
    # Ссылки с большим приоритетом ставим в начало списка.
    return sorted(urls, key=lambda url: host_priority(url, weights), reverse=True)

Документация urllib.parse предупреждает, что разбор не равен полной проверке безопасности. В рабочем фильтре дополнительно ограничивают схемы, длину, порты, редиректы и сетевые адреса. Если нужно определить регистрируемую часть домена вроде example.co.uk, используйте актуальный Public Suffix List через проверенную библиотеку.

На лайвкодинге сначала сделайте рабочую версию, проговорите крайние случаи и добавьте два-три теста. Не пытайтесь молча построить полноценный антивирус за десять минут.

Какие вопросы задать компании и команде

Эксперимент с новой версией Python или небольшая команда сами по себе не являются тревожным сигналом. Спросите, есть ли staging, нагрузочные тесты, мониторинг и план отката.

Если несколько разработчиков обслуживают большой поток данных, уточните распределение ответственности: кто дежурит, как измеряются SLO, есть ли документация, резерв знаний и время на технический долг. Один сильный ответ компании может снять сомнение; уклонение от конкретики, наоборот, даёт повод копнуть глубже.

Вопросы кандидата показывают зрелость, когда связаны с будущей работой. Вместо «у вас всё нормально с процессами?» спросите: «Как изменение проходит путь от pull request до production и кто принимает решение об откате?»

Итог: получил ли кандидат оффер

Известный факт: итоговое решение работодателя в доступной записи не названо.

Наша оценка: кандидат, скорее всего, прошёл бы технический этап. Он уверенно связывал ответы с рабочим опытом, понимал GIL и назначение ClickHouse, проговаривал решение на лайвкодинге и задавал содержательные вопросы. Ошибка про ограничение числа потоков была заметной, но кандидат принял уточнение и продолжил рассуждение.

Перед следующей встречей мы бы повторили модель конкурентности и безопасность URL. Для практики в случайном порядке используйте тренажёр собеседований ЮНИКОД.

Источники

частые вопросы

Короткие ответы

Что повторить перед собеседованием Python-разработчика?

Подготовьте модель исполнения CPython, структуры данных, конкурентность, HTTP, базы, тестирование и один рассказ о проекте. Для каждой темы нужен пример и ограничение.

Что делать, если ошибся на техническом вопросе?

Спокойно уточните условие, назовите допущение и исправьте ход решения вслух. Интервьюер оценивает не только первый ответ, но и способность работать с обратной связью.

Как вести себя на лайвкодинге?

Сначала проговорите входные данные и крайние случаи, затем соберите простую рабочую версию. После запуска обсудите сложность, безопасность и улучшения.

следующий шаг

Отработайте технические ответы заранее

Тренажёр ЮНИКОД помогает повторить вопросы по Python, найти пробелы и привыкнуть рассуждать вслух.

Перейти в тренажёр →