{"id":14284,"url":"\/distributions\/14284\/click?bit=1&hash=82a231c769d1e10ea56c30ae286f090fbb4a445600cfa9e05037db7a74b1dda9","title":"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u0430\u043d\u0446\u044b \u0441 \u0441\u043e\u0431\u0430\u043a\u0430\u043c\u0438","buttonText":"","imageUuid":""}

Как собеседовать Python-разработчика. Самые популярные вопросы

Python надежно занял третье место в списке наиболее популярных языков программирования (это подтверждает, например, рейтинг Stack Overflow 2020 года). В ближайшие годы сдавать свои позиции язык не собирается. И нужно понимать, как подбирать таких сотрудников к себе в IT-команду.

Язык повсеместно используют в Data Science, машинном обучении и при создании веб-приложений. В том числе такие лидеры, как Google, Facebook и Dropbox. Количество вакансий на том же HeadHunter постоянно растет, и сейчас уже достигло больше четырех тысяч.

Число рабочих мест для Python пока что растет быстрее, чем количество достойных программистов. Поэтому IT-рекрутерам, неизбежно, приходится брать в том числе и пока что не слишком «доросший» материал. Мы встречали такое даже у зарубежных стартапов: если команда крупная, приходится в том числе и выращивать новый капитал.

Работодатели берут только недавно выпустившихся студентов. Или тех, кто ещё только учится. А иногда на позицию джунов кандидаты попадают даже без релевантного высшего образования. Для таких кандидатов, как правило, проводят дополнительные испытания, и разбираются, понимают ли они вообще, куда идут.

Разумеется, основное требование — знание языка Python. Но на собеседованиях, особенно предварительных, нередко приходится проверять общую IT-грамотность соискателя: понимание им алгоритмов, технологий и структур данных.

И менеджерам, и ИТ-рекрутерам, и руководителям нужно уметь быстро отделить зерна от плевел. В этой статье мы попытаемся с этим помочь.

Проверяем базовые знания Python и требуемых технологий

Кандидат обязательно должен знать базу. Перед собеседованием это должен освежить каждый, это занимает всего пару часов. Если даже во всех таких вопросах соискатель не уверен, это значит, что он просто несерьезно подходит к получению предлагаемой вами работы. Или практически не работал с Python вообще.

Итак, на собеседовании, особенно на должность джуна, на наш взгляд, стоит спросить про:

  1. Алгоритмы и структуры данных (в общем). Человек, разумеется, должен знать, как работают и что содержат массивы, связные списки, графы. В идеале — понимать, какая временная сложность алгоритмов при работе с ними. Знать бинарный поиск, алгоритмы сортировки.
  2. Структуры данных конкретно в Python. Какие есть, как используются, какие плюсы-минусы у каждой. Кортежи, строки, множества. Классно, если он знает структуры данных, встроенные непосредственно в язык. К примеру, defaultdict или OrderedDict.
  3. Изменяемые/неизменяемые типы данных. Чем отличаются, как можно использовать. Можно хотя бы просто попросить перечислить те, которые кандидат знает. В идеале — дать несложную задачу и спросить, какой тип данных лучше было бы использовать для ее решения.
  4. GIL. Что это, как работает. Если вы проводите собеседование на позицию junior developer, ответы на такие вопросы о потоках у него будут вряд ли. Но если знает — ему отдельный большой плюс.
  5. Как устроен Django/Flask. Соискатель должен быть знаком хотя бы с одним из популярных фреймворков. Уметь создать базу данных, написать пару запросов. Python — довольно простой язык, если люди с ним сталкивались, и относятся к делу серьезно, с такими вопросами не должно быть проблемы.
  6. Что такое декораторы, итераторы, генераторы, контекстные менеджеры. Для чего их используют и как они устроены. Отдельно — о functools.wraps.
  7. Основы работы интернета. Понимание основных протоколов, моделей OSI/TCP IP. Чаще всего можно задать «простой» вопрос — что происходит «за ширмой», когда в поиске вбиваешь Google.com.
  8. Асинхронное программирование. В чем заключается разница между процессами и потоками; какие существуют способы межпроцессорного взаимодействия.
  9. Утилиты командной строки. Можно попросить назвать несколько команд (до десятка), которыми кандидат пользуется чаще всего.Логические и математические задачи. Если вы хотите нанять разработчика с потенциалом, проверьте, чтобы кандидат по крайней мере знал теорию вероятностей и основы комбинаторики, а также умел работать числами в различных системах счисления. Хороший программист, который хочет расти, всегда будет рад решить что-нибудь новое и интересное.

Конечно, на собеседованиях редко нужны вопросы из всех этих разделов. Выберите те, которые нужны для вашей компании и вашей индустрии. Если вы пытаетесь найти в команду разработчиков джуна, не ждите, что он верно ответит на все вопросы. Но какие-то знания у него быть обязаны, и вы будете видеть, думает ли он в правильном направлении.

5 простых вопросов и ответов по Python

Давайте конкретику. Какие вещи можно спросить, и какие ответы на них хочется ожидать.

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

  • Хеширование

Что такое хеширование? Хеш-таблицы представляют собой важные структуры данных, напоминающие ассоциативные массивы. В качестве ключей в таких структурах могут выступать не только числа, но и различные иные объекты. При этом существует важное условие: для получения каждого ключа требуется рассчитать особый код. Подобным действием занимаются особые функции, которые называют хеш-функциями. Им «кормят» на входе различные данные, и на выходе они возвращают уникальный хеш определенной длины. Даже если один набор данных пройдет через хеш-функцию много раз, результат будет тем же. А если набор отличается хотя бы на один символ, код получится совершенно другой. Хеширование защищает данные, и, к тому же, сокращает текст, и позволяет хранить его более компактно.

Любые ли данные можно хешировать? Конечно, нет. К примеру, не стоит хешировать список, имеющий свойство изменяться во время работы программы. В разные моменты его хеш будет отличаться, и система работать не будет. В общем случае говорят, что изменяемые объекты в Python не хешируются, а вот неизменяемые хешировать можно. Хотя это не совсем верно (понятия разные, хотя между ними и есть корреляция).

  • Виды строк

Язык предлагает много отличных методов для работы со строками, работать с ними в Python — сплошное удовольствие. В языке есть поддержка строковых литералов и «сырых» строк.

Строковые литералы — позволяют быстро обрабатывать/выводить крупные и многострочные блоки текста. Это удобно, к примеру, при работе с кодом HTML. В Python литералы строк заключаются в апострофы или кавычки (‘text235′ или «text235″). Это позволяет компилятору знать, что перед ним действительно стоит строка. При этом для длинных строк рекомендуется использовать тройные апострофы или кавычки (»’text235»’ или «»»text235″»»). В таком случае нам можно не вводить все непечатаемые символы вручную, мы можем набирать текст так, как нам удобно, спокойно используя клавиши Enter и Tab.

Сырые строки — отключают механизм экранирования. Что удобно, например, при работе с регулярными выражениями. Чтобы любая строка превратилась в сырую, достаточно указать перед ней символ ‘r’. Например:

regular_string = ‘C:\Document.txt’

raw_string = r’C:\Document.txt’

print(regular_string) # C: ocument.txt

print(raw_string) # C:\Document.txt

Здесь во втором случае экранирование отключено. Как результат, обратная косая черта считается самостоятельным символом, а не частью кода программы.

  • Изменяемые и неизменяемые типы данных

Все данные в Python делятся на два этих типа. Первые — могут меняться в процессе работы (к примеру, массивы, словари, списки). В них могут добавляться новые элементы, из них могут убираться старые. Вторые — в конце программы всегда выглядят точно так же, как и в её начале. Это, например, строки, числа и кортежи.

Два типа данных важно различать потому, что способ обработки данных внутри функции зависит от их типа. Чтобы работать с (неизменяемыми) числами, к примеру, делается их независимая копия. В результате любые трансформации значения числа внутри функции никак не влияет на изначальное число, они просто не зависят друг от друга.

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

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

  • Функции для копирования объектов в Python

Конечно, каждый назовет команду «copy():’. Она копирует объект в нужное место, и возвращает поверхностную копию транслируемого аргумента.

Но существует также команда «deepcopy():». Она точно так же копирует объект, но разница в том, что при этом возвращается полная копия передаваемого аргумента. Эту разницу полезно понимать.

  • Списки

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

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

A0 = dict(zip((‘a’,’b’,’c’,’d’,’e’),(1,2,3,4,5)))

Ответ: A0 = {‘a‘: 1, ‘c‘: 3, ‘b‘: 2, ‘e‘: 5, ‘d‘: 4}

A1 = range(10)

Ответ: A1 = range(0, 10)

A2 = sorted([i for i in A1 if i in A0])

Ответ: A2 = []

А3 = sorted([A0[s] for s in A0])

Ответ: A3 = [1, 2, 3, 4, 5]

A4 = [i for i in A1 if i in A3]

Ответ: A4 = [1, 2, 3, 4, 5]

A5 = {i:i*i for i in A1}

Ответ: A5 = {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

A6 = [[i,i*i] for i in A1]

Ответ: A6 = [[0, 0], [1, 1], [2, 4], [3, 9], [4, 16], [5, 25], [6, 36], [7, 49], [8, 64], [9, 81]]

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

5 вопросов о Python-технологиях

Знания технологий не настолько важны, когда вы собираетесь воспитывать и развивать нового сотрудника внутри компании. Но общее представление, конечно, желательно о них иметь.

  • Потоки

О потоках на собеседовании кандидата на Python стоит спросить обязательно. Это один из наиболее ярких топиков в сообществе. Бывает, что если несколько потоков работают одновременно, возникает конфликт. В Cpython для защиты от такой ситуации применяется технология GIL. Система следит, чтобы активным в любой момент оставался только один паток — и, по сути, попросту запрещает их параллельность. Это облегчает разработку, но и все плюсы многопоточности тоже убираются: ускорить работу программы, разделив потоки, нельзя.

Сообщество Python уже не раз предлагало владельцам языка убрать эту систему Global Interpreter Lock, об этом регулярно создаются петиции, но пока что всё остается таким, как есть. Чтобы создать «виртуальные» потоки (например, для удобной параллельной загрузки файлов с сервера) приходится применять модули thread и threading.

  • Асинхронность

Другой способ, помогающий решать одновременно несколько задач. Для этого используется функция callback (обратного вызова). Увидев блокирующий запрос в коде, обработчик запоминает это место (вешает сигнальный маяк) и продолжает движение,. Когда запрос закончится, маяк дает сигнал. Интерпретатор возвращается, получает результат и делает коллбек. Среди самых распространенных библиотек, содержащих асинхронные выражения, соискатель может назвать Tornado и AsyncIO. Также в более свежих версиях Python есть такие конструкции как await и async.

  • Тестирование

Для автоматизации тестирования, объединения тестов в группы, настройки тестов используется стандартный модуль unittest. Чтобы упростить тестирование, также можно применять объекты mock (которые содержатся в дополнении Mock).

  • Отладка

Разумеется, код в Python нужно отлаживать. Можно спросить соискателя-джуна, как называется интерактивный отладчик в питоне, и что он дает. Разумеется, ответ — это pdb, Python DeBugger. Он позволяет приостанавливать ход выполнения кода, просматривать текущие значения переменных и так далее. В результате создается понимание того, чем на самом деле занимается программа, и выявить в ней логические ошибки. Вопросы об отладке очень примитивные, но тем не менее об особенностях этой системы кандидат знать обязан — чтобы в полной мере отвечать за свой код.

  • Расширения на C/C++

Как внедрить в программу расширения, написанные на языках C или C++? Что позволяет использовать библиотеки C-языков, что дает возможность управления ресурсами на более низком уровне? Конечно же, кандидат должен знать, что за такое отвечает интерпретатор CPython. Его потенциальные возможности и глубина понимания кода сильно расширятся.

Кстати, если вы ищете достойных работодателей (включая Сбербанк, «Альфа-банк», «Яндекс», X5 и топовые зарубежные IT-стартапы) — приходите в Rubrain.com! Мы связываем лучших IT-специалистов с успешными компаниями, которые нанимают их по договорам аутсорса или аутстаффа.

0
10 комментариев
Написать комментарий...
Денис Федорец

так-то я больше по Objective-С, могу и ошибаться... но вроде на обоих картинках в статье про питонистов не питоновский код?

Ответить
Развернуть ветку
Serge Z

То есть непосредственно текст вопросов не вызвал?)))

Ответить
Развернуть ветку
Simon

Процентов 30% на верные темы и про "поговорить", остальное - типичный сборник бед практисов для собеса =(
Отдельно доставил лапшакод на пхп на картинке))

Ответить
Развернуть ветку
alpden

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

И да, надо записать название кампании, чтобы не дай то бог попасть к ним на собеседование 😂

Ответить
Развернуть ветку
Serge Z

Приходишь на собеседование, тратишь время, а там такое... :-)

Ответить
Развернуть ветку
Yarro S

Не уверен, value-based и reference-based корректно называть «изменяемыми» и «неизменяемыми». 

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Yarro S

В Python вроде всё mutable, тут про передачу в функцию по ссылке либо по копии

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Gulneck M.

Строки immutable. Числа тоже. И туплы. Может ещё что. 

Ответить
Развернуть ветку
7 комментариев
Раскрывать всегда