20 вопросов Senior Backend PHP/GO разработчику на собеседовании в Avito.

20 вопросов Senior Backend PHP/GO разработчику на собеседовании в Avito.

Всем привет! Третьего дня, после короткого и приятного общения с HR откликнулся на вакансию Senior Backend PHP/GO разработчика в Avito. Само собеседование разбито на 4 этапа: Разговор с HR, технический скрининг, практическая часть, углублённая теория. Сегодня я расскажу, как проходил первый технический этап и какие вопросы задавали.

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

Вопросы были поделены на несколько категорий, например - PHP, базы данных, сети, операционные системы и алгоритмы.

Ответы будут скрыты под спойлерами, можете проверить себя, если хотите.

Или нажмите сюда, если хотите открыть все ответы

Как получить первый символ строки

Ответ

Чтобы получить первый символ строки на любом языке нужно использовать функцию mb_substr, другие способы ($str[0] или substr) получат только первый байт строки. А первый байт будет символом только в строке на английском языке.

Здесь я разобрал этот вопрос подробнее

В чем разница между стрелочной функцией и обычной анонимной функцией

Ответ

Стрелочные функции появились в PHP 7.4, как более лаконичный синтаксис для анонимных функций. Единственная разница между ними: стрелочная анонимная функция автоматически захватывает по значению все переменные из родительской области видимости.

В каких случаях не вызывается деструктор класса

Ответ

Деструктор (метод __destruct) не вызывается, если исполнение скрипта не началось, либо завершилось неожиданно для самого php. Например, если:

  • В другом деструкторе есть вызов exit() или die()
  • В другом деструкторе выкидывается исключение (Exception)
  • Где-то в коде произошла фатальная ошибка (Fatal error)
  • При попытке включения битого класса (Parse error)

В чём отличие self от static

Ответ

Если коротко, self ссылается на класс, в котором он написан, а значение static вычисляется во время выполнения (это называется позднее статическое связыванние) и ссылается на класс, в котором в данный момент происходит исполнение.

Что такое property promotion

Ответ

Или же Constructor Property Promotion - это определение свойств класса в конструкторе. Все параметры конструктора, в которых есть определение области видимости автоматически станут аттрибутом класса и им будут присвоены значения соответствующих переменных.

Каким образом можно можно запускать один и тот же тест на разном наборе данных

Ответ

В PHPUnit можно запускать один и тот же тест с разными данными с помощью data provider’а: Специальная функция, которая возвращает массив массивов с аргументами теста. У этой функции должна быть аннотация @dataProvider и названием метода.

Например, вместо такого теста

public function testSomething()
{
    $data = [[1, 1, true], [1, 4, false]];
    foreach($data as $dataSet) {
       $this->assertEquals($dataSet[2], $dataSet[0] === $dataSet[1]);
    }
}

Напишем data provider - функция, которая вернём необходимые наборы данных и обозначим его в нашем тесте:

public function testSomething(int $left, int $right, bool $expected)
{
     $this->assertEquals($expected, $left === $right);
}

/**
 * @dataProvider dataProviderForTest
 **/
public function dataProviderForTest()
{
    return [
      [1, 1, true],
      [1, 4, false]
    ];
}

И PHPunit запустит тест 2 раза и в случае ошибки покажет, на каком именно наборе данных она произошла.

В чем отличие composer.json и composer.lock

Ответ

composer - это менеджер зависимостей для PHP. В файле composer.json вы указываете желаемые версии пакетов (они могут быть примерными). Ппосле выполнения composer install Composer вычислит подходящие версии для всех требуемых вами пакетов, а также все версии всех зависимостей этих пакетов, установит их и запишет всю информацию обо всех установленных пакетах в composer.lock.

Это позволит другому разработчику взять ваш composer.json и composer.lock и получить абсолютно те же самые версии всех пакетов. Если же composer.lock будет отсутствовать, Composer будет снова вычислять все версии и может установить совершенно другии версии.

Что значат 3 числа в версии пакетов composer.json

Ответ

Это пример семантического версионирования, которое в Composer принято использовать. 3 числа через точку обозначают версию в таком виде: мажорная.минорная.патч. Если следовать семантическому версионированию, увлеличивать версии нужно следуя этим правилах:

  1. МАЖОРНУЮ версию, когда сделаны обратно несовместимые изменения API
  2. МИНОРНУЮ версию, когда вы добавляете новую функциональность, не нарушая обратной совместимости
  3. ПАТЧ-версию, когда вы делаете обратно совместимые исправления.

Для чего нужны индексы

Ответ

Индексы ускоряют поиск данных по таблице.

Почему поиск по индексу быстрее

Ответ

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

Примеры индексов

Ответ

Сбалансированное дерево, Хэш-таблица, GIN.

Что такое транзакции в базах данных

Ответ

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

Что такое ACID

Ответ

ACID - это акроним образованный по начальным буквам 4 требований к транзакционным системам.

Транзакция должна быть

  • Атомарной (Atomicity) - Все изменения из транзакции применяются как будто это одна операция. Они либо все применяются успешно, либо ни одна из них не применяется.
  • Согласованной (Consistency) - Данные должны изменяться предсказуемо и без нарушения ограничений базы данных.
  • Изолированной (Isolation) - Действия из одной транзакции не должны влиять на другие транзакции.
  • Надежной (Durability) - Если транзакция применилась, она применена перманентно и не исчезнет даже при отказах системы.

Отличие WHERE от HAVING

Ответ

HAVING можно применять для фильтрации по результатам агрегатных функций, например по COUNT, MAX или MIN. Это потому что применение WHERE идёт до формирования групп (агрегатов) по GROUP BY, а HAVING - после.

Что такое триггеры в базах данных

Ответ

Триггер - это созданная пользователем функция базы данных, которая исполняется автоматически при изменении данных. Другими словами, триггер - это особая функция, которая активируется до или после (в PostgreSQL может и вместо) операций с данными, такими как INSERT, UPDATE, DELETE.

В чём разница между UDP и TCP

Ответ

TCP обеспечивает надёжную доставку пакетов: устанавливается двухстороннее соединение и сервер подтверждает получение пакетов, в случае же неудачно отправки клиент её повторяет. Например, протоколы HTTP и FTP работают черезе TCP, так как там важна целостность данных

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

Из чего состоит HTTP запрос

Ответ

HTTP запрос состоит из:

  • Стартовой строки (first line), описывающей запрос. Например, включает метод (POST, GET) и версию протокола.
  • Заголовков (headers), определяющих запрос, параметры передачи или описывающих тело сообщения.
  • Пустой строки, указывающей, что вся мета информация отправлена.
  • Тела (body), содержащего пересылаемые с запросом данные (например, содержимое HTML-формы). Наличие тела и его размер определяется стартовой строкой и заголовками HTTP.

В чём разница между HTTP и HTTPS

Ответ

S - значит Secure. В отличии от HTTP, данные по HTTPS передаются в зашифрованном с помощью TLS виде. Это позволяет предотвратить перехват и изменение данных промежуточными узлами, другими словами предотвращает атаку Man In The Middle.

HTTP обычно работает на 80 порту, HTTPS на 443.

В чём отличие потоков от процессов

Ответ

Процесс является основной единицей распределения ресурсов операционной системы, а поток является основной единицей планирования и выполнения задач процессора. Процесс состоит как минимум из одного потока, все потоки используют ресурсы процесса.

Лично я запорол почти все вопросы по базам данных, но очень быстро после собеса восполнил этот пробел в знаниях :)

Что скажете, как вам вопросы? На сколько ответили правильно?