Python надежно занял третье место в списке наиболее популярных языков программирования (это подтверждает, например, рейтинг Stack Overflow 2020 года). В ближайшие годы сдавать свои позиции язык не собирается. Его повсеместно используют в Data Science, машинном обучении и при создании веб-приложений. В том числе такие лидеры, как Google, Facebook и Dropbox. Количество вакансий на том же HeadHunter постоянно растет, и сейчас уже достигло больше четырех тысяч.

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

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

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

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

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

Кандидат обязательно должен знать хотя бы базу. Такие знания перед собеседованием должен освежить каждый, это всего несколько часов. Если даже во всех таких вопросах соискатель не уверен, это значит, что он просто несерьезно подходит к получению предлагаемой вами работы. Или практически не работал с 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. Утилиты командной строки. Можно попросить назвать несколько команд (до десятка), которыми кандидат пользуется чаще всего.
    10. Логические и математические задачи. Если вы хотите нанять разработчика с потенциалом, проверьте, чтобы кандидат по крайней мере знал теорию вероятностей и основы комбинаторики, а также умел работать числами в различных системах счисления. Хороший программист, который хочет расти, всегда будет рад решить что-нибудь новое и интересное.

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

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

Собеседование с разработчиками Python

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

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

    1. Хеширование

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

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

    1. Виды строк

Язык предлагает много отличных методов для работы со строками, работать с ними в 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

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

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

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

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

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

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

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

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

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

    1. Списки

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

Вот шесть маленьких задачек по списком в 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 = []

A3 = 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

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

    1. Потоки

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

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

    1. Асинхронность

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

    1. Тестирование

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

    1. Отладка

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

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

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

Собеседование с разработчиками Python

С другой стороны — зачем собеседовать нового кандидата, если можно взять готового и проверенного? Если вы думаете, где найти хорошего программиста, то ответ — у нас, в Rubrain.com. Мы отобрали более 6 тысяч классных разработчиков (уровня middle и senior), которые готовы работать на вас за умеренную плату. В том числе есть и готовые команды программистов на проект, которые давно сработались и быстро реализуют любую вашу задумку.

О том, как мы реализуем услугу аутстаффинга, можно узнать вот здесь. А короткая информация о том, где искать Python-разработчиков, плюс дополнительные вопросы для них на собеседование, у нас имеются тут.