Всем привет! Кратко о себе. По образованию я математик, а вот по профессии — программист. В сфере разработки с 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 на питоне?
Советую также понимать недостатки реализации через декоратор (особенно для тестирования). Самый элегантный и универсальный способ, конечно же через метаклассы. Декораторы.
Думаю, будет полезно прочитать и понять: Как в питоне реализованы 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 лучше погуглите. Касательно тестов мне понравились такие вопросы: Какие Вы знаете структуры данных в пайтоне? Какие из них являются 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, для чего они нужны и как их использовать? Есть функция: Что будет выведено на экран: К моему удивлению, вопросы по этой теме мне показались уж слишком простыми (прям как для школы), кроме буквально 2-3-х. К сожалению я запомнил немного вопросов, поскольку для моего собеседника важен был мой предыдущий опыт работы в разработке ПО и работы с БД (это, я считаю, очень умно). Удивительно, но только на одном из десятка собеседований меня просили написать код. Наверное потому, что на всех других хотели проверять код после теоретической части. А поскольку собеседования длились не менее часа (самое длинное — три часа!), а все вопросы так и не были заданы, то у ребят просто физически не оставалось времени на проверку кода.
Кроме практики ничего больше не посоветую. Для общеобразовательных целей стоит прочитатать следующие статьи: Совет всем, кто действительно желает достичь мастерства — не ленитесь повторять код в консоли (будь то питон, БД либо другие вещи). НЕ копировать, а именно повторять. Конечно имеется ввиду новый материал, а не тот, который Вы давно пишите вслепую. На самом деле вопросов было раза в 3-4 больше. Кое что позабылось. Но самые главные я всё же привёл. Наверное, Вы заметили, что вопросов по фронту практически не было. Это потому, что мы до них либо не успевали добраться, либо их было настолько мало, что я их забыл. Кстати, вот неплохая матрица компетенций по различным областям в ИТ. Если Вам выпадет возможность проводить интервью, советую хотя бы понимать что нужно спрашивать и на какой левел, а не грести всех под одну планку (как это часто сейчас делается) — слишком уж много разных областей накопилось. Лично я не понимаю, зачем требовать от senior front-end отменного понимания работы БД, либо от senior back-end глубокого понимания работы движка браузера либо взаимодействия Event loop с renderer-ом браузера, или же вот от тестера — умения найти кратчайший путь во взвешенном графе и т.д. Надеюсь, смотря на эту матрицу, Вы понимаете, что я имею ввиду. Искренне желаю успехов всем, кто решиться закрепить для себя и продемонстрировать другим свои знания с целью получить хорошее интересное предложение! UPD: 
Тут можно попрактиковаться проходить собеседования, если 4то — pramp.com. Спасибо non_smile за ссылку.