Всем привет!


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


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


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


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


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


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


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


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


Содержание


Общая теория
  • Первый вопрос на большинстве собеседований: "Что такое 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, для чего они нужны и как их использовать?


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


    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 (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?

Базы данных

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


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

Комментарии (24)


  1. Andrew_Pinkerton
    08.02.2019 19:02

    Без лишней скоромности можно сказать, что ваш обзор шикарен по своей полноте

    Spoiler header
    Хотя конечно найдутся недовольные


  1. dunaldo
    08.02.2019 20:26

    Отличная статья, спасибо.

    Не думал, что можно так красиво и просто объяснить достаточно сложные вещи. Читается на одном дыхании (честное слово)!

    Один в один слова моей супруги после прочтения данной книги, её восторгу не было предела, пришлось тоже прочесть и… нисколько не пожалел. Кстати книга не слишком объемная, прочел за пару вечеров.


  1. Compolomus
    08.02.2019 21:25

    Многие переходят с php на phyton. Как вам помог бэкграунд php? Понятно что бд, http одно и то же по сути


    1. pawlissimo Автор
      10.02.2019 11:07

      Думаю, мне найбольше помог опыт работы с Delphi (я на нём написал свою первую платформу по документообороту), а уж потом php (поскольку для него изучил 90% все основных шаблонов программирования). Для меня любознательность + интерес к своему делу — основные мотиваторы (наряду или после ЗП).
      Мне также помог знакомый, который показал все прелести работы на питоне=)


  1. mrlolthe1st
    09.02.2019 12:26

    Ну, вопросы это хорошо, но только не по огромному кол-ву теории по языку, лучше дать задачу по типу Knight's Dial, ведь большая часть вопросов выше не дает гарантии на то, что вы сумеете решать задачи, а не собирать решение из коструктора лего. Дали бы ДО по Декартачам, что-нибудь аккуратно закодить — и уже ясно, что такой человек нуден компании, а вот человек который не имеет представление о всем этом, а только собирает из лего — бесполезен.


    1. Andrey_Dolg
      09.02.2019 12:47

      Личный опыт или просто предположение?


      1. mrlolthe1st
        09.02.2019 18:00

        Всё вместе :)


    1. pawlissimo Автор
      10.02.2019 11:13

      1. У меня была цель не обучить других языку, а помочь при подготовке к собеседованиям.
      2. Я с Вами полностью согласен! Мне тоже непонятно зачем искать «швейцарский нож» для 2-3 задач. Разве что в долгосрочной перспективе такого сотрудника можно кидать на разные проекты.
      3. Из моей практики чаще полезно знать теорию и понимать, как оно работает под капотом. Это все зависит от Вашых обязаностей и проблем на проекте.


  1. xPomaHx
    09.02.2019 13:08

    На какую зп в мск можно рассчитывать зная всё это?


  1. hollow1
    09.02.2019 13:34
    +2

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

    Кричал


    1. ayurtaykin
      10.02.2019 11:03

      Агонь :D 3A оно такое...))


    1. semifunctional
      11.02.2019 02:26

      Почему? Все должны знать разницу между идентификацией, аутентификацией и авторизацией — ничего необычного вроде нет, это базовые вещи.


  1. Andriyevski
    09.02.2019 13:42
    +1

    Автор, ты красава !)


  1. igrishaev
    09.02.2019 15:22
    +2

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


    1. pawlissimo Автор
      10.02.2019 11:26

      У Вас много терпения!
      Такой детальный мануал получился! Кратко, внятно обо всём самом нужном.


  1. fenric
    09.02.2019 17:17
    +1

    Отличная статья, я хоть и не пишу на пайтоне, но прочитал с удовольствием, и еще с большим удовольствим подтянул теоретическую часть. Спасибо.


  1. tnsaturday
    09.02.2019 18:53

    А есть нечто подобное для PHP?


  1. pesh1983
    09.02.2019 20:04

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


    1. pawlissimo Автор
      10.02.2019 11:15

      100%! Без практики вся теория — в топку!


  1. Rijenkii
    10.02.2019 10:55

    JWT (Jason Web Token)

    А не JSON-ли?


    1. pawlissimo Автор
      10.02.2019 10:56

      Спасибо, поправил очипатку=)


  1. Ar20L80
    10.02.2019 10:57
    +1

    Интересная и очень познавательная статья. С удовольствием прочитал. Сколько у вас ушло примерно времени на изучение самого языка Phyton?
    PS. У вас опечатка:

    про цикл событий в JavaScriptю


    1. pawlissimo Автор
      10.02.2019 10:59

      Спасибо, поправил.
      П.С. Очень много правок было=)

      Сам синтаксис язика очень приятный и учиться за пару недель.
      На практику у меня ушло около полугода. Теорию подтянул за 2-3 месяца. Благо, мой бэкграунд это позволил мне сделать с найменьшими усилиями. Также интересно и полезно было сравнивать уже известные язики с питоном.


  1. WeberWebber
    10.02.2019 10:59

    > По образованию я математик, а вот по профессии — программист.
    Так пишите, как будто здесь противоречие. У Вас как раз-то отличное образование для IT.