Как подготовиться к собеседованию на позицию Middle Python Developer

Как подготовиться к собеседованию на позицию Middle Python Developer
👋
Хочешь поучаствовать в жизни сайта? Мы ищем авторов!

Всем привет! Меня зовут Александр, я Python-разработчик в компании VK. За свою карьеру питониста приходилось достаточно часто проходить собеседования, особенно работая на аутсорсе. И я, проходя все эти собеседования, выявил некоторые общие моменты, которыми хочу с вами поделиться.

Оглавление

Знания в Питоне

Для начала необходимо знать разобраться в самом питоне и знать, что отвечать на различные вопросы по питону:

Алгоритмы

Затем могут быть вопросы по алгоритмам, без знаний алгоритмов сейчас никуда, хоть и в работе не так часто мы их пишем вручную, но знания алгоритмов значительно увеличат ваши шансы пройти секцию лайв-кодинга, где необходимо будет закодить какую-либо задачку. Если говорить - какие именно алгоритмы, то это бинарный поиск, сортировка выбором, быстрая сортировка. Также нужно знать, как работают рекурсии, хэш-таблицы. И еще могут быть алгоритмы по-сложнее: поиск в ширину и алгоритм Дейкстры.

  • Очень рекомендую книгу "Грокаем Алгоритмы", автор Адитья Бхаргава. В ней простым языком описаны все основные алгоритмы и показаны примеры их реализации на питоне. Просто пролистать каждый алгоритм из книги - мало, необходимо самому закодить, продебажить и посмотреть каждый алгоритм.
  • Также рекомендую полученные знания проверить на задачках на литкоде. На одном из последних собеседований у меня даже спросили - есть ли у меня профиль на литкоде. Вы тоже заведите и прорешайте на нем побольше задач. Если попросят - будет, что показать.

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

def compare_version(version1: str, version2: str) -> int:
   """
   Необходимо реализовать функцию, которая сравнивает версии ПО.
   Если version1 > version2 вернуть 1
   Если version1 < version2 вернуть -1
   Если version1 == version2 вернуть 0
 
   Номер версии - не пустая строка, которая содержит цифры, разделенные знаком "."
   При этом 0 на первой позиции в номере версии равнозначен его отсутствию. См. подготовленные тесты
   """
   pass
   
assert compare_version("1.1", "10") == -1
assert compare_version("0.1", "1.1") == -1
assert compare_version("1.0.1", "1") == 1
assert compare_version("1", "1.0.1") == -1
assert compare_version("7.5.2.4", "7.5.3") == -1
assert compare_version("1.01", "1.001") == 0
assert compare_version("1.0", "1.0.0") == 0
assert compare_version("2", "2.0.0") == 0
assert compare_version("1.01", "1.101") == -1
assert compare_version("2.1", "1.15") == 1

Следующая задачка, которая на первый взгляд выглядит сложной, на самом деле тоже решается просто (если загуглить, что такое метрика ROC-AUC):

# у нас есть два классификатора, для каждого из них есть roc-кривая, заданная координатами точек

roc_one = [(x0, y0), (x1, y1), ..., (xn, yn)]
roc_two = [(x0_, y0_), (x1_, y1_), ..., (xn+k_, ynn+k_)]
# нужно определить разницу в метрике ROC-AUC

Фреймворки

Следующий блок вопросов и задач, это блок по вашему фреймворку (Python/Flask/FastAPI и т.д.) Я работаю на джанго, поэтому у меня, например, была вот такая задачка:

# Есть две модели, нужно получить авторов, отсортировав их по кол-ву книг от большего к меньшему, изданных позднее 2000 года включительно

from django.db import models
 
 
class Author(models.Model):
   name = models.CharField(max_length=255, unique=True)
 
 
class Book(models.Model):
   name = models.CharField(max_length=255)
   release_date = models.PositiveSmallIntegerField(verbose_name="Год выпуска")
   author = models.ManyToManyField(Author, related_name="authors")
 
   class Meta:
       unique_together = ("name", "release_date")

Что касается вопросов по Django, то очень часто спрашивают про разницу между select_related и prefetch_related, а также как это выглядит под капотом в SQL. Также спрашивают что такое Middleware в Django и как это работает. Есть очень хороший GitHub репозиторий, который я упоминал выше, в котором собран большой список вопросов по питону, джанге, и другим технологиям, советую почитать.

Базы данных

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

Мне попадалась вот такая задача на собеседовании:

-- Есть таблица с полями id (PK) и name (varchar/text). Со временем в поле name накопились дубли. Написать запрос, который выведет только дублирующиеся по полю name записи в порядке убывания количества дублей.

create table books (
	id serial primary key,
	name varchar(255) not null
)

insert into books ("name") values ('книга 1');
insert into books ("name") values ('книга 1');
insert into books ("name") values ('книга 1');
insert into books ("name") values ('книга ABC');
insert into books ("name") values ('книга ABC');
insert into books ("name") values ('книга ZXC');

-- select ...

Общие советы

  • Не бойтесь задавать уточняющие вопросы, если вам что-то непонятно!
  • Также, во время написания кода желательно комментировать свои действия, как например я объяснял свой код вот в этом видео.
  • Еще хочу посоветовать вот этот YouTube канал, в котором есть записи собеседований на Python разработчиков.
  • Записывайте свои собеседования на OBS, чтобы потом переслушать, выписать вопросы, ответ на которые вы не знали, найти ответы на эти вопросы и законспектировать.

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

Материал подготовлен с ❤️ редакцией Кухни IT.

Александр Вагнер

Александр Вагнер

Middle Full Stack Developer