Собеседование php-developer в 2020

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

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

  1. Что нового в PHP 7.*
  2. Типы данных
  3. Type hinting + strict mode
  4. Строгое и нестрогое сравнение
  5. Работа с ссылками
  6. Copy-on-write
  7. Run time error handling
  8. Замыкания
  9. Функции по работе с массивами
  10. Функция list ()
  11. Область видимости переменной
  12. Область видимости свойства/метода/константы класса
  13. Final классы и методы
  14. Позднее статическое связывание
  15. Магические методы
  16. Динамические переменные
  17. Генераторы
  18. Reflection API
  19. Autoloader
  20. SPL
  21. APC/APCu
  22. OPcache
  23. PSR standards
  24. Composer
  25. XDebug
  26. Rest API
  27. Тесты


OOP

  1. Инкапсуляция/наследование/полиморфизм
  2. Абстрактные классы/методы
  3. Интерфейсы
  4. Traits
  5. GRASP шаблоны
  6. Паттерны банды четырех
  7. SOLID
  8. Kiss
  9. Dry


Databases
Docker
HTTP и другие протоколы
Авторизация и аутентификация
JS

PHP


Что нового в PHP 7.*


Эх, помню времена когда рассказывал в чем отличие между 4 и 5 версиями, в глаза никогда не видев 4-ю, старые традиции нужно соблюдать, вопрос встречается почти на всех собеседованиях, и хоть никто не ожидает, что вы вспомните дословно в какой версии какие изменения произошли, в целом эту информацию стоит знать:

Типы данных


Хотя PHP это динамический язык, все же все данные в нем имеют четкие типы:
Скалярные типы:

  • bool
  • int
  • float (иногда встречается название double что для php не имеет разницы)
  • string


Смешанные типы:

  • array
  • object
  • callable
  • iterable


Специальные типы:

  • resource
  • null


Подробнее о типах и псевдо-типах в документации.

Type hinting + strict mode


Как логичное продолжение темы типов и строгой типизации, которая пришла вместе с php 7.*, нужно знать о разнице между строгой и нестрогой типизацией, подробности в документации.

Строгое и нестрогое сравнение


Нужно понимать разницу между нестрогим сравнением (сравнение значений без учета типа данных) и строгим сравнением (с учетом типа данных), которую довольно хорошо отражает данная табличка. Отдельно стоит выделить строгое и нестрогое сравнение объектов.

Работа с ссылками


Ссылки в PHP — это, грубо говоря, способ получить доступ к одной и той же переменной (области памяти) под разными именами.

Основные операции которые можно совершать с ссылками:


Важно понимать особенности с передачей объектов. Вы могли читать, что в php все объекты передаются по ссылке
well yes, but actually no

Это было верно до php5, но сейчас передается только идентификатор объекта (документация).
Если вкратце, если вы создали объект, и передали его в функцию, внутри которой вы сделали

$object = null;

это не значит что оригинальный объект тоже обнулится, вы все так же можете с ним работать. А вот если вы явно передали объект по ссылке — то это действие «обнулит» и оригинальный объект.

Copy-on-write


Каждый раз передавая переменную в функцию её значение (теоретически) должно быть скопировано. Это может не быть проблемой для данных типа integer или float, но представьте, что вы передаете в функцию массив, содержащий десять миллионов значений. Для того чтобы избежать этого в PHP используется парадигма копирования-при-записи (copy-on-write). Так, на самом деле, при передаче массива его копирование не происходит до того момента, пока вы не захотите изменить что либо в этом массиве. Статья с более детальным объяснением.

Run time error handling


В 7-й версии php произошли ряд изменений которые касаются иерархии ошибок (больше информации по иерархии), в остальном ожидается что соискатель будет знать как отлавливать исключения, или даже сможет написать свой собственный error_handler.

Замыкания


Они же анонимные функции, наиболее полезны в качестве значений callback-параметров, документация. Есть хорошая, хотя и немного старая статья о работе с замыканиями на Хабре.

Функции по работе с массивами


Часто просят назвать все функции по работе с массивами которые вы помните на память. И хотя, по моему мнению, этот вопрос чуть более чем бессмысленный, перечень функций можно повторить по документации.

Функция list ()


Благодаря изменениям в PHP 7.1 функцией стало пользоваться удобнее, как следствие используют ее чаще, всю информацию можно найти в документации.

Область видимости переменной


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

Область видимости свойства/метода/константы класса


Определяется при помощи ключевых слов public (видно всем), protected (доступен только текущему классу или его наследникам) или private (доступен только текущему классу), и может применяться как для свойств/метода, так начиная и с PHP 7.1 для констант класса. Подробнее в документации.

Final классы и методы


Разместив ключевое слово final перед объявлениями методов класса, можно предотвратить их переопределение в дочерних классах, а в случае объявления самого класса как final — его невозможно будет унаследовать. Такие классы и методы призваны защитить чувствительный код от изменений, а сам код становится проще поддерживать.
Подробнее в документации.

Позднее статическое связывание


Выражается в разнице между вызовом self: и static::. «Позднее связывание» означает что static: будет вычисляться в ходе исполнения и может быть переопределен в классах — наследниках. Подробнее в документации.

Магические методы


В PHP без магии совсем никуда, поэтому у нас есть методы которые позволяют реализовать дополнительный функционал объекту, переопределить стандартное поведение объекта (к примеру __serialize ()/__unserialize ()), или же поведение объекта в нетипичных для него ситуациях (__toString ()) и другие.
Документация, и хорошая, хоть и немного устаревшая статья на хабре.

Динамические переменные


Вы можете передать имя одной переменной в другую, а затем использовать эту переменную «динамически».

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

Генераторы


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

Описание в документации, и есть довольно старая (однако с того момента синтаксис генераторов не изменился) и хорошая статья на хабре.

Reflection API


Кратко говоря, это способность взглянуть внутрь своего (или чужого кода), узнать какие у класса есть переменные, методы, константы, сделать их при желании публичными. Данная способность активно используется фреймворками (например в симфони для автогенерации dependency injection) и библиотеками. Описание в документации и разумеется статья на хабре.

Autoloader


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

SPL


Или Standart PHP Library — набор классов (структуры данных, итераторы, исключения, классы для обработки файлов), интерфейсов и функций для решения стандартных задач. Как правило, знание наизусть библиотеки не требуется, но понимать из чего она состоит стоит хотя бы для личного развития. Подробнее в документации — www.php.net/manual/ru/book.spl.php

APC/APCu


Alternative PHP cache (APC) или альтернативный кош без опкода (APCu) — бесплатный кеш с открытым исходным кодом, предназначенный для кэширования и оптимизации промежуточного кода PHP. В основном используется для сохранения вычислений между запросами. Документация:

OPcache


Улучшает производительность PHP путём сохранения скомпилированного байт-кода скриптов в разделяемой памяти, тем самым избавляя PHP от необходимости загружать и анализировать скрипты при каждом запросе. Официальная документация, а так же очень хорошая статья как это все работает на Хабре.

PSR standards


PHP Standards Recommendations — стандарты оформления кода, а так интерфейсы для стандартных задач. Используются данные стандарты во всех (известных мне) фреймворках, и облегчают взаимодействия между разными библиотеками. Официальная документация, а также хорошая статья на Хабре.

Composer


Менеджер зависимостей, а также инструмент реализующий автозагрузку кода библиотек и самого приложение. Может помочь в оптимизации и ускорении приложения для продакшена.

XDebug


Большинство разработчиков использует это расширения для облегчения работы с кодом или же его оптимизации, основные знания здесь — как его настроить и запустить, с этим поможет следующая статья blog.denisbondar.com/post/phpstorm_docker_xdebug.

Rest API


REpresentational State Transfer — архитектурный подход который позволяет организовать взаимодействие между приложениями используя все возможности HTTP. Хорошая статья на эту тему, а также различия REST и SOAP.
В контексте API нужно понимать основные форматы обмена данными, чаще всего это XML и JSON.

Тесты


В основе всех unit тестов лежит PHPUnit (насколько мне известно), и на сегодняшний день, уметь и знать как писать тесты является обязательной частью разработки. Многие фреймворки (тот же Symfony) предлагают свои обертки и решения для тестирования. Вот хорошая статья о лучших инструментах для тестирования.

OOP


Инкапсуляция/наследование/полиморфизм


  • Инкапсуляция. Это механизм, который объединяет данные и методы, манипулирующие этими данными, и защищает их от внешнего вмешательства или неправильного использования. Когда методы и данные объединяются таким способом, создается объект. Т.е. переменные состояния объекта скрыты от внешнего мира. Изменение состояния объекта (его переменных) возможно ТОЛЬКО с помощью его собственных методов. Можно сказать, что инкапсуляция подразумевает под собой сокрытие данных, что позволяет эти данные защитить.
  • Наследование. Это процесс, посредством которого, один объект может наследовать свойства другого объекта и добавлять к ним черты, характерные только для него.
  • Полиморфизм. Это свойство, которое позволяет одно и тоже имя использовать для решения нескольких технически разных задач. Проще говоря, концепцией полиморфизма является идея «один интерфейс, множество реализаций». Это означает, что можно создать общий интерфейс для группы близких по смыслу действий.


Абстрактные классы/методы


  • Не предполагает создание экземпляров.
  • Реализуют на практике один из принципов ООП — полиморфизм.
  • Может содержать абстрактные методы и свойства. Абстрактный метод не реализуется для класса, в котором описан, однако должен быть реализован для его не абстрактных потомков.
  • Представляют собой наиболее общие абстракции, то есть имеющие наибольший объем и наименьшее содержание.


Нюансы реализации в документации.

Интерфейсы


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

Официальная документация, и хорошая статья на хабре.

Traits


Трейт очень похож на класс, но предназначен для группирования функционала и его дальнейшего переиспользования во множестве классов, которые не могут быть связаны одним абстрактным классом. Иногда еще говорят, что трейт — это способ реализовать множественное наследование в PHP.

Так как каждый класс может реализовать множество трейтов, могут возникать конфликты когда один и тот же метод реализован в разных трейтах и/или самом классе. Подробней о трейтах в документации.

GRASP шаблоны


General Responsibility Assignment Software Patterns — шаблоны проектирования для решения общих задач. В отличие от паттернов из Банды Четырех, GRAPS шаблоны не имеют выраженной структуры, четкой области применения и конкретной решаемой проблемы, а лишь представляют собой обобщенные подходы/рекомендации/принципы, используемые при проектировании дизайна системы.

Хорошая статья по теме — habr.com/ru/post/92570

Паттерны банды четырех


Тема паттернов обширна, на нее написано уже много статей, и пытаться описать это в нескольких предложениях просто невозможно. Мне нравится этот ресурс — refactoring.guru/ru/design-patterns/catalog, но при необходимости вы можете воспользоваться этой ссылкой.

SOLID


Его спрашивают все, но спрашивают по-разному.

Плохой вариант — вас просят зачитать на память принципы и их определения.
Хороший — вам называют принцип, и просят объяснить его, описать примеры использования, придумать реальную ситуацию когда тот или иной принцип чем то поможет. Такой вариант, по моему мнению, намного лучше дает понять уровень кандидата и его реальное понимание принципов.

На Хабре можно найти десятки действительно хороших статей по этим принципам, поэтому я даю ссылку на medium.

Kiss


Keep it simple, stupid — хороший принцип, вся суть которого уже содержится в названии, подробнее можно узнать здесь.

Dry


Don«t repeat yourself — принцип, описывающий что необходимо переиспользовать код везде, где это возможно. Подробнее здесь.

Databases


Хорошую статью на тему SQL баз данных можно найти здесь. Вопросы по NoSql базам в моем случае обычно встречаются на примере MongoDB. В случае с ElasticSearch обычно используются библиотеки-обертки, общую информацию можно почерпнуть из статьи на Хабре.

In memory хранилища (те что хранят значения в оперативной памяти) — memcached и/или redis (чаще всего), как правило работа с ними осуществляется через библиотеки-обертки, если вы хотите разобраться в вопросе подробнее, разумеется есть статья на Хабре.

Docker


Очень важный инструмент который использовался почти на всех проектах (в моем случае). И хотя зачастую настраивается он единожды за проект, основные понятия и принцип работы с ним нужно знать. Лично мне для собеседования нравится эта статья.

HTTP и другие протоколы


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

Авторизация и аутентификация


Авторизация — предоставление прав на выполнение определённых действий, а также процесс проверки прав при попытке выполнения этих действий.

Аутентификация — процедура проверки подлинности, например проверка подлинности пользователя путем сравнения введённого им пароля.

Важно понимать разницу между авторизацией и аутентификацией, как они реализуются при использовании session и cookies, JSON Web Tokens (JWT) и др.

JS


Я не особо знаю этот язык, поэтому никогда не претендую на позиции где нужно знать js фреймворки и быть full-stack, возможно поэтому для всех собеседований было достаточно знаний описанных в статье — habr.com/ru/post/486820

© Habrahabr.ru