Extensive review of Python interviews. Hints and Tips

Hello!


Briefly about yourself. I am a mathematician by education, but a programmer by profession. In the field of development since 2006. Although, since I began to study programming at school, I began to write my first programs and games at school (approximately, since 2003). It so happened that I had to learn and work in several languages. If you do not take into account the university lectures on C, C ++, Basic, Pascal and Fortran, then I really worked with Delphi (more than 6 years), PHP (more than 5 years), Embedded (Atmel + PIC about 2.5 years) and the latest Python + time is a bit of Scala. Of course, without the database, too, can not do.


Who is this article for? For everyone who, like me, wanted (or wants) to find for himself a decent well-paid job with an interesting project, a cool team and all sorts of buns. And also for those who wish to raise their level of knowledge and skill.


How did this article come about? After 3 weeks of interviews, searches, studies, sleepless nights (often scrolled in my head possible turns of events, answers, etc.), I received quite a lot of suggestions. The first two had to be rejected because the deadline for a decision was over, and I was waiting for proposals from other offices. As a result, I accepted a specific day for myself to decide and waited for the results of current and completed interviews. To be honest, my choice was rather complicated, since the options between which I chose were generally very attractive. In general, I decided to prioritize the direction of development, not the conditions and the project. Even after the decision was made (and the proposals), others continued to come (but for me it was already unimportant).


Before each interview, I rather thoroughly prepared + read out those places, the answers to questions on which I either did not know, or did not remember, or did not figure it out to the end.


I appreciated the questions that could really show my understanding (or misunderstanding) of some fundamental concepts. Unfortunately, such questions could be counted on the fingers of both hands.


In the end, I decided that it was worth collecting all this experience and sharing it with others.


Of course, these questions do not exhaust the knowledge that every experienced developer should have. It seems to me that some things in practice are very rarely used to constantly ask about them. Moreover, probably I will not be mistaken if I say that 90 +% of questions just googling for 10-30 seconds.


I combined some questions into one - to save time and space.
Also at the end of the article I will give links that seemed to me the most interesting.


Content


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


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


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


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


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


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


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


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


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


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


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


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



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


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


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


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



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


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


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


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


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


  • Как Вы тестируете код? Что такое 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? Какие у него есть проблемы?


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


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


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


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


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


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


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


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


    deff(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 REST Framework?
  • За что отвечает Meta в сериализаторе?
  • Какая разница в быстродействии между django и Flask (и почему)?
  • Какое предназначение этих фреймворков?
  • Как в django работает система аутентификации?
  • Как в django обрабатывается (и генерируется) CSRF-token?

Frontend
  • Что такое куки? Зачем они, как с ними работать и где они сохраняются?
  • Может ли сервер изменить (добавить, удалить) куки?
  • Что такое JWT (JSON 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?

Database

К моему удивлению, вопросы по этой теме мне показались уж слишком простыми (прям как для школы), кроме буквально 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?

Challenges

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


  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. Напишите функцию обхода дерева в глубину (в ширину).
    Чтобы Вы не тратили время — приведу ссылку, где очень красиво и просто реализованы обе функции.
    Была ещё одна несложная задачка: написать генератор.

Questions and links from me

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


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

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


In fact, there were 3-4 times more questions. Something is forgotten. But I did bring the most important ones.


You probably noticed that there were practically no questions on the front. This is because we either did not have time to get to them, or there were so few of them that I forgot them.


By the way, here is a good matrix of competencies in various areas in IT. If you get the opportunity to conduct an interview, I advise you to at least understand what you need to ask and what level, and not to row everyone under the same bar (as is often the case now), too many different areas have accumulated. Personally, I don’t understand why to require a senior front-end to have a good understanding of the database, or a senior back-end to have a deep understanding of the browser engine, or the interaction of the Event loop with the renderer of the browser, or the tester - the ability to find the shortest path in a measured way. graph, etc. I hope, looking at this matrix, you understand what I mean.


I sincerely wish success to all who decide to consolidate for themselves and demonstrate to others their knowledge in order to get a good interesting offer!


UPD:
Here you can practice your interviews, if 4to - pramp.com. Thank you non_smile for the link.


Also popular now: