Всем привет!
Кратко о себе. По образованию я математик, а вот по профессии — программист. В сфере разработки с 2006 года. Хотя, поскольку программирование начали изучать ещё в школе, свои первые программки и игры я начал писать ещё в школе (примерно, с 2003). Так сложилось, что пришлось выучить и поработать на нескольких языках. Если не брать во внимание ВУЗ-овские лекции по С, С++, Бэйсику, Паскалю и Фортрану, то реально я работал с Delphi (более 6 лет), PHP (более 5 лет), Embedded (Atmel + PIC около 2.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?
Дурацкий вопрос. Не люблю таких. Зачем спрашивать то, что используется раз в никогда, либо же точно не на моём проекте?
Какие шаблоны проектирования Вы знаете?
Гугл Вам в помощь;)
На одном из собеседований по низкоуровневой разработке много спрашивали про алгоритмы.
В общем желательно хотя бы примерно понимать что такое О-большое при оценке сложности алгоритмов. Так же, наверное, желательно знать базовые алгоритмы: простой поиск, бинарный поиск, сортировка, быстрая сортировка, работа с деревьями (обход в ширину и глубину). Один знакомый посоветовал мне прочитать замечательную книгу "Грокаем алгоритмы. Адитья Бхаргава". Не думал, что можно так красиво и просто объяснить достаточно сложные вещи. Читается на одном дыхании (честное слово)! Настоятельно рекомендую всем, кто, как и я, не считает себя алгоритмистом. Просто слов нету!
Что такое PEP8? Как Вы к нему относитесь?
Какие шаблоны программирования Вам известны и как их можно реализовать?
Какие варианты реализации шаблона Singleton на питоне?
Советую также понимать недостатки реализации через декоратор (особенно для тестирования). Самый элегантный и универсальный способ, конечно же через метаклассы.
Декораторы.
Думаю, будет полезно прочитать и понять:
- Часть 1 (базовое понимание декораторов);
- Часть 2 (продвинутое использование).
Как в питоне реализованы 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]
- Как работает Serializer в Django REST Framework?
- За что отвечает Meta в сериализаторе?
- Какая разница в быстродействии между django и Flask (и почему)?
- Какое предназначение этих фреймворков?
- Как в django работает система аутентификации?
- Как в django обрабатывается (и генерируется) CSRF-token?
- Что такое куки? Зачем они, как с ними работать и где они сохраняются?
- Может ли сервер изменить (добавить, удалить) куки?
- Что такое JWT (JSON Web Token)?
- Agile\scrum: все что необходимо знать
- Какая разница между CI и CD? Для тех, кто в танке: CI — continuous integration, CD — continuous delivery
- Какая разница между Scrum и Kanban?
- Какие Вы знаете виды тестов?
Гуглить в сторону: юнит-тесты, интеграционные тесты, приёмочные тесты и т.д. - Вопрос для тим-лидов (скорее всего): Что Вы будете делать, если на проекте нет тестов и заказчик не хочет тратить на их разработку время и деньги?
Лично я апелирую к прибыльности для бизнеса заказчика. - Что такое Code Debt и как с ним быть (жить, любить, бороться)?
- Какие системы контроля версий Вы знаете (используете)?
- Что такое 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?
К сожалению я запомнил немного вопросов, поскольку для моего собеседника важен был мой предыдущий опыт работы в разработке ПО и работы с БД (это, я считаю, очень умно).
- Что такое Hadoop?… и HDFS?
- Что такое MapReduce и как он работает?
- Можно ли создавать много mappers и reducers (или указать их число)?
- Какая разница между Hive и HBase
- Можно ли создавать индекс в HBase?
- Что такое repartition?
- Какая разница между repartition и coalesce?
Очень просто и доступно описано тут. - Что такое master election в Zookeeper?
Удивительно, но только на одном из десятка собеседований меня просили написать код. Наверное потому, что на всех других хотели проверять код после теоретической части. А поскольку собеседования длились не менее часа (самое длинное — три часа!), а все вопросы так и не были заданы, то у ребят просто физически не оставалось времени на проверку кода.
Кроме практики ничего больше не посоветую.
- Есть файл, в котором содержаться слова разделённые пробелом. Например: "abba com mother bill mother com abba dog abba mother com". Нужно найти и вывести тройку слов, которые чаще всего встречаются вместе (порядок не имеет значения). То есть в моём примере тройки слов это "abba com mother", "com mother bill", "mother bill mother" и т.д. Тут правильным ответом должно быть "abba com mother" (частота — 3 раза).
- Напишите функцию обхода дерева в глубину (в ширину).
Чтобы Вы не тратили время — приведу ссылку, где очень красиво и просто реализованы обе функции.
Была ещё одна несложная задачка: написать генератор.
Для общеобразовательных целей стоит прочитатать следующие статьи:
- "Вопросы на собеседование по питону". Я разные прочитал, но почему-то в закладки добавил только эти две — 1 и 2. Но советую погуглить ещё.
- Ликбез по типизации в языках программирования.
- Жаль что при обсуждении баз данных не было вопросов по САР-теоремме. Узнать больше можно здесь, более подробно.
- Не знаю, почему не была затронута тема про микросервисы. Могу лишь предположить, что те, кто меня собеседовал, мало с ними работал либо уделял им должное внимание. Впрочем, если Вам будет интересно — вот хорошая статейка.
- Также к моему удивлению, никто даже не задал вопросов об виртуализации, докере, контейнерах, Kubernetes. Советую хотя бы разобраться с докером, благо сейчас есть масса простых пошаговых инструкций с объяснениями.
- Супер полезные ссылки по Python.
- Дзен Питона в примерах.
- Всем, кто работает с питоном думаю, стоит знать про классные нововведения.
- Немногие из собеседников знали про словари в питоне то, что сам соавтор рассказывает здесь.
- Никто не спрашивал про Lambda в питоне, но лучше понимать что это такое и с чем его едят.
- Типы и трюки в питоне. Статья старенькая, но большинство "трюков" актуальны и сейчас.
- Кстати, для любителей питона — дайджест самых свежих новостей и пр. материалов.
- По фронту советую посмотреть краткую лекцию про цикл событий в JavaScript. Не думаю, что Вы знаете, как он работает на самом деле. ОЧЕНЬ рекомендую.
- Касательно серверной части желательно понимать разницу между nginx и apache. В интернете полно статей. Если уж реально интересно, в чём там разница под капотом — вот статейка с примерами.
Совет всем, кто действительно желает достичь мастерства — не ленитесь повторять код в консоли (будь то питон, БД либо другие вещи). НЕ копировать, а именно повторять. Конечно имеется ввиду новый материал, а не тот, который Вы давно пишите вслепую.
На самом деле вопросов было раза в 3-4 больше. Кое что позабылось. Но самые главные я всё же привёл.
Наверное, Вы заметили, что вопросов по фронту практически не было. Это потому, что мы до них либо не успевали добраться, либо их было настолько мало, что я их забыл.
Кстати, вот неплохая матрица компетенций по различным областям в ИТ. Если Вам выпадет возможность проводить интервью, советую хотя бы понимать что нужно спрашивать и на какой левел, а не грести всех под одну планку (как это часто сейчас делается) — слишком уж много разных областей накопилось. Лично я не понимаю, зачем требовать от senior front-end отменного понимания работы БД, либо от senior back-end глубокого понимания работы движка браузера либо взаимодействия Event loop с renderer-ом браузера, или же вот от тестера — умения найти кратчайший путь во взвешенном графе и т.д. Надеюсь, смотря на эту матрицу, Вы понимаете, что я имею ввиду.
Искренне желаю успехов всем, кто решиться закрепить для себя и продемонстрировать другим свои знания с целью получить хорошее интересное предложение!
UPD:
Тут можно попрактиковаться проходить собеседования, если 4то — pramp.com. Спасибо non_smile за ссылку.