Хабрахабр

[Из песочницы] Обширный обзор собеседований по Python. Советы и подсказки

Всем привет!

В сфере разработки с 2006 года. Кратко о себе. По образованию я математик, а вот по профессии — программист. Так сложилось, что пришлось выучить и поработать на нескольких языках. Хотя, поскольку программирование начали изучать ещё в школе, свои первые программки и игры я начал писать ещё в школе (примерно, с 2003). Конечно же без баз данных тоже никак не обойтись. Если не брать во внимание ВУЗ-овские лекции по С, С++, Бэйсику, Паскалю и Фортрану, то реально я работал с Delphi (более 6 лет), PHP (более 5 лет) и последним временем Python + чуть-чуть Scala.

А также для тех, кто желает поднять свой уровень знаний и мастерства. Для кого эта статья? Для всех, кто, как и я, хотел (или хочет) найти для себя достойную хорошо оплачиваемую работу с интересным проектом, классным коллективом и всякими плюшками.

Первые два пришлось отклонить, поскольку закончился deadline по принятию решения, а я ждал предложений от других контор. Как появилась эта статья? После 3-х недель собеседований, поисков, учёбы, бессонных ночей (часто прокручивал в голове возможные повороты событий, варианты ответов и т.д.) я получил достаточно много предложений. Честно говоря, выбор у меня был достаточно сложный, поскольку варианты, между которыми я выбирал, в целом были очень привлекательными. В результате я принял для себя конкретный день, чтобы определиться и ждал результатов текущих и пройденных собеседований. Даже после принятия решения (и предложения) другие продолжали приходить (но для меня это уже было неважно). В общем я решил поставить для себя приоритетом направление развития, а не условия и проект.

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

К большому сожалению такие вопросы можно было сосчитать на пальцах обеих рук. Я ценил вопросы, которые могли реально показать моё понимание (либо непонимание) некоторых фундаментальных концепций.

В конце концов я решил, что стоит собрать весь этот опыт и поделиться ним с другими.

Мне кажется, что некоторые вещи на практике уж очень редко используются, чтобы о них постоянно спрашивать. Конечно же, этими вопросами не исчерпываются знания, которые должен иметь каждый опытный разработчик. Более того, наверное я не ошибусь, если скажу, что 90+% вопросов элементарно гуглятся за 10-30 сек.

Некоторые вопросы я объединил в один — для экономии времени и пространства.
Также в конце статьи я дам ссылки, которые мне показались самыми интересными.

Содержание

Общая теория

  • Мне поначалу казалось, что собеседник меня поймёт и примет такой вариант ответов, но почему-то в двух случаях ребята решили, что ответ на этот вопрос я не знал (лучше я не буду дальше это комментировать (рукалицо)). Первый вопрос на большинстве собеседований: "Что такое SOLID?" Честно признаюсь, никогда не мог запомнить полную расшифровку этой аббревиатуры, поэтому либо объяснял своими словами, либо просил собеседника подсказывать хотя бы англоязычные названия, а я тогда смогу расшифровать. Лично я однажды перепутал Dependency Injection с Dependency Inversion.

  • Лично я предпочитаю этот вариант. Второй типичный вопрос: "Что такое REST?" а потом вдогонку "Что такое Restfull?" либо "Какие тут основные условия".
    Вы можете найти свой ответ.

  • Какие у него есть методы? Что такое HTTP?

  • Какие методы в HTTP идемпотентные, а какие — нет?

  • Пускай у Вас есть довольно большой список URL страниц (например аудио или видео), которые нужно скачать на диск. Понравился мне один вопрос про HTTP, с которым я никогда не сталкивался на практике, поэтому и не знал. Как тут использовать HTTP (какие методы)?
    Правильный ответ — метод HEAD (прочитайте о нём). Но для каждой из них нужно проверить, хватит ли на компе места для этих файлов. Я указал, что воспользуюсь методом GET, но чтобы не качать весь файл укажу параметр Range с минимальным шагом. Лично я дал ответ, о котором собеседник даже не слышал (либо забыл) и быстрый поиск показал, что я был тоже прав (как вариант). Я это пишу к тому, что этот вопрос только показывает, работал ли я с такой задачей или нет. Хотя это будет работать только если сервер пришлёт в ответе ненулевой параметр Accept-Ranges. Секундный поиск даст исчерпывающий ответ.

  • Честно говоря, я сразу задал риторический вопрос: "а почему Вы упустили ещё идентификацию?". Какая разница между аутентификацией и авторизацией? Этим я аккуратно пытался дать понять собеседнику, что осведомлён в этих вопросах.

  • Чем отличаются HTTP и HTTPS?

  • Что такое CSRF-token?

  • Какие форматы данных Вы знаете, кроме JSON, XML?
    Их слишком много, поэтому не буду ограничиваться конкретным списком.

  • Не люблю таких. Что такое SOAP?
    Дурацкий вопрос. Зачем спрашивать то, что используется раз в никогда, либо же точно не на моём проекте?

  • Какие шаблоны проектирования Вы знаете?
    Гугл Вам в помощь;)

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

Python

  • Как Вы к нему относитесь? Что такое PEP8?

  • Какие шаблоны программирования Вам известны и как их можно реализовать?

  • Самый элегантный и универсальный способ, конечно же через метаклассы. Какие варианты реализации шаблона Singleton на питоне?
    Советую также понимать недостатки реализации через декоратор (особенно для тестирования).

  • Декораторы.
    Думаю, будет полезно прочитать и понять:

  • Как в питоне реализованы public, private, static методы?

  • Что такое Метаклассы?
    Советую полностью прочитать это либо это.

  • 7 и 3. Не спрашивали, но я советую почитать про принципиальные отличия 2-й и 3-й версий (хотя бы 2. 4).

  • И чем он отличается от init()? Что такое new()? В какой последовательности они выполняются?

  • Какие плюсы и минусы у них?
    Лично я работал с pylint, pychecker, но назвал три основные: pychecker, pylint, pyflakes, поскольку перед этим про них прочитал=) Кстати, вот свежий выпуск, где подробно рассказывается про инструменты для анализа кода Python. Какие Вы знаете программы для проверки code style?

  • Что такое mocking?
    Лично я использую tox, unittest, nose, либо же смотрю, что скажет Travis. Как Вы тестируете код? Про mock лучше погуглите.

  • Касательно тестов мне понравились такие вопросы:

    • что делать, если тестируемая функция использует удалённое подключение к внешним сервисам, которое иногда видает ошибку таймаута, 404 и им подобные?
    • что делать, если тестируемая функция занимает много времени на выполнение повторяющихся операций внутри неё? Например, внутри цикл от 1..1000000, где что-то считывается, записывается, рассчитывается.
      Советую прочитать про патчинг.

  • Какие из них являются mutable/immutable?
    Лично я тепер знаю, что их достаточно много. Какие Вы знаете структуры данных в пайтоне? доке (да-да, начните именно с неё). Кроме типичных (dict, list, set, tuple) обязательно прочитайте про frozen_set, default_dict, ordered_dict (для новых версий уже не актуально) ну и то, что ещё будет в оф.

  • Что такое коллизии и как с ними бороться?
    Думаю, что для высоких позиций это имеет смысл знать. Как работает хэш-таблица (словарь)?

  • Где будет быстрее поиск, а где перебор и почему: dict, list, set, tuple?

  • Как передаются значения аргументов в функцию или метод?

  • Чем он отличается от итератора?
    Есть статьи покороче, но мне понравилась вот эта. Что такое генератор? Тут есть много вещей, которые в коротких ответах на stackoverflow невозможно полностью раскрыть.

  • Что такое list/dict comprehension?

  • Конкретного вопроса не могу сформулировать, поэтому советую прочитать про introspection (использование dir(), dir, hasattr(), getattr()), name mangling.

  • Какая разница между одинарным (_) и двойным (__) подчеркиванием?
    Исчерпывающий ответ здесь.

  • Какие у него есть проблемы? Что такое GIL?

  • Какая разница между MRO2 и MR3 (diamond problem)?
    Начните гуглить и Вы сами всё поймёте. Что такое MRO?

  • Что такое и чем отличается old-style от new-style classes?

  • Threading vs Multiprocessing?
    Советую прочитать и самому попробовать — http://effbot.org/zone/thread-synchronization.htm. Что Вы знаете о Threading. Статья немножко старенькая, но дает хорошее понимание.

  • В чём его особенность?
    Рекомендую прочитать статьи про асинхронный пайтон и самим пощупать его. Работали ли Вы с asyncio?

  • В чём его плюсы и минусы?
    Думаю всё, что нужно для ответа, описано здесь. Что такое garbage collector (gc)?

  • Зачем нужен Celery?

  • Что такое async/await, для чего они нужны и как их использовать?

  • Есть функция:

    def f(sum, l=[]):
    l.append(sum)
    print(l)

    Что будет выведено на экран:

    l = [1]
    f(10) // [10]
    f(10) // [10, 10]
    f(10, l) // [1, 10]
    f(10) // [10, 10, 10]
    print(l) // [1, 10]

Django/Flask

  • Как работает Serializer в django?
  • За что отвечает Meta в сериализаторе?
  • Какая разница в быстродействии между django и Flask (и почему)?
  • Какое предназначение этих фреймворков?
  • Как в django работает система аутентификации?
  • Как djangoобрабатывается (и генерируется) CSRF-token?

Frontend

  • Что такое куки? Зачем они, как с ними работать и где они сохраняются?
  • Может ли сервер изменить (добавить, удалить) куки?
  • Что такое JWT (Jason Web Token)?

SDLC

  • Agile\scrum: все что необходимо знать
  • Какая разница между CI и CD? Для тех, кто в танке: CI — continuous integration, CD — continuous delivery
  • Какая разница между Scrum и Kanban?
  • Какие Вы знаете виды тестов?
    Гуглить в сторону: юнит-тесты, интеграционные тесты, приёмочные тесты и т.д.
  • Вопрос для тим-лидов (скорее всего): Что Вы будете делать, если на проекте нет тестов и заказчик не хочет тратить на их разработку время и деньги?
    Лично я апелирую к прибыльности для бизнеса заказчика.
  • Что такое Code Debt и как с ним быть (жить, любить, бороться)?

Git, Versioning, Refactoring

  • Какие системы контроля версий Вы знаете (используете)?
  • Что такое Git Flow?
    Советую просто почитать, поскольку это документированная вещь.
  • Что такое Git Rebase?
  • Что такое Git Cherry pick?
  • Какие инструменты Вы используете для code review?
    Лично я любитель гитхабовского веб-клиента (там полно интересных и удобных плюшек). Но мой собеседник решил, что я лопух и поставил мне "минус". Дома я погуглил и увидел, что есть много специализированного софта, который ну уж слишком похож на то, что я использовал более 3-х лет. Софт как софт — на любителя.
    П.С. Этот момент мне не понравился, поскольку стаж по code review у меня достаточно большой + приходилось постоянно читать коммиты длиной от 500 до 3000 изменений (да-да, на одном из моих крупных проектов такие комиты были нормой), а чел решил, что раз уж я не знаю других утилит — значит лопух.
  • Что такое форсированный push?
  • Что такое precommit check?
  • Что такое code cohesion & code coupling?

Базы данных

К моему удивлению, вопросы по этой теме мне показались уж слишком простыми (прям как для школы), кроме буквально 2-3-х.

  • Что такое транзакция? Какие у неё есть свойства?
  • Что такое уровни изолированности транзакций? Какие они бывают?
    Советую внимательно это прочитать, поскольку это фундаментальные вещи.
  • Что такое вложенные транзакции?
  • Что такое курсор и зачем он нужен?
  • Какая разница между PostgreSQL и MySQL?
  • Что такое VACUUM в PostgreSQL?
  • Что такое EXPLAIN? Какая разница между ним и EXPLAIN ANALYZE?

Big Data

К сожалению я запомнил немного вопросов, поскольку для моего собеседника важен был мой предыдущий опыт работы в разработке ПО и работы с БД (это, я считаю, очень умно).

  • Что такое Hadoop?… и HDFS?
  • Что такое MapReduce и как он работает?
  • Можно ли создавать много mappers и reducers (или указать их число)?
  • Какая разница между Hive и HBase
  • Можно ли создавать индекс в HBase?
  • Что такое repartition?
  • Какая разница между repartition и coalesce?
    Очень просто и доступно описано тут.
  • Что такое master election в Zookeeper?

Задачки

Наверное потому, что на всех других хотели проверять код после теоретической части. Удивительно, но только на одном из десятка собеседований меня просили написать код. А поскольку собеседования длились не менее часа (самое длинное — три часа!), а все вопросы так и не были заданы, то у ребят просто физически не оставалось времени на проверку кода.
Кроме практики ничего больше не посоветую.

  1. Есть файл, в котором содержаться слова разделённые пробелом. Например: "abba com mother bill mother com abba dog abba mother com". Нужно найти и вывести тройку слов, которые чаще всего встречаются вместе (порядок не имеет значения). То есть в моём примере тройки слов это "abba com mother", "com mother bill", "mother bill mother" и т.д. Тут правильным ответом должно быть "abba com mother" (частота — 3 раза).
  2. Напишите функцию обхода дерева в глубину (в ширину).
    Чтобы Вы не тратили время — приведу ссылку, где очень красиво и просто реализованы обе функции.
    Была ещё одна несложная задачка: написать генератор.

Вопросы и ссылки от меня

Для общеобразовательных целей стоит прочитатать следующие статьи:

  • "Вопросы на собеседование по питону". Я разные прочитал, но почему-то в закладки добавил только эти две — 1 и 2. Но советую погуглить ещё.
  • Ликбез по типизации в языках программирования.
  • Жаль что при обсуждении баз данных не было вопросов по САР-теоремме. Узнать больше можно здесь, более подробно.
  • Не знаю, почему не была затронута тема про микросервисы. Могу лишь предположить, что те, кто меня собеседовал, мало с ними работал либо уделял им должное внимание. Впрочем, если Вам будет интересно — вот хорошая статейка.
  • Также к моему удивлению, никто даже не задал вопросов об виртуализации, докере, контейнерах, Kubernetes. Советую хотя бы разобраться с докером, благо сейчас есть масса простых пошаговых инструкций с объяснениями.
  • Супер полезные ссылки по Python.
  • Дзен Питона в примерах.
  • Всем, кто работает с питоном думаю, стоит знать про классные нововведения.
  • Немногие из собеседников знали про словари в питоне то, что сам соавтор рассказывает здесь.
  • Никто не спрашивал про Lambda в питоне, но лучше понимать что это такое и с чем его едят.
  • Типы и трюки в питоне. Статья старенькая, но большинство "трюков" актуальны и сейчас.
  • Кстати, для любителей питона — дайджест самых свежих новостей и пр. материалов.
  • По фронту советую посмотреть краткую лекцию про цикл событий в JavaScriptю Не думаю, что Вы знаете, как он работает на самом деле. ОЧЕНЬ рекомендую.
  • Касательно серверной части желательно понимать разницу между nginx и apache. В интернете полно статей. Если уж реально интересно, в чём там разница под капотом — вот статейка с примерами.

НЕ копировать, а именно повторять. Совет всем, кто действительно желает достичь мастерства — не ленитесь повторять код в консоли (будь то питон, БД либо другие вещи). Конечно имеется ввиду новый материал, а не тот, который Вы давно пишите вслепую.

Кое что позабылось. На самом деле вопросов было раза в 3-4 больше. Но самые главные я всё же привёл.

Это потому, что мы до них либо не успевали добраться, либо их было настолько мало, что я их забыл. Наверное, Вы заметили, что вопросов по фронту практически не было.

Если Вам выпадет возможность проводить интервью, советую хотя бы понимать что нужно спрашивать и на какой левел, а не грести всех под одну планку (как это часто сейчас делается) — слишком уж много разных областей накопилось. Кстати, вот неплохая матрица компетенций по различным областям в ИТ. Надеюсь, смотря на эту матрицу, Вы понимаете, что я имею ввиду. Лично я не понимаю, зачем требовать от senior front-end отменного понимания работы БД, либо от senior back-end глубокого понимания работы движка браузера либо взаимодействия Event loop с renderer-ом браузера, или же вот от тестера — умения найти кратчайший путь во взвешенном графе и т.д.

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

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть