Skip to content

Instantly share code, notes, and snippets.

@zert0man
Last active February 6, 2023 10:33
Show Gist options
  • Save zert0man/12f1e76e01b1135f7d1672e00d23f0fb to your computer and use it in GitHub Desktop.
Save zert0man/12f1e76e01b1135f7d1672e00d23f0fb to your computer and use it in GitHub Desktop.
Вопросы на собеседование PHP
Какие вопросы должен задавать программист своему потенциальному работодателю
29 ноября 2013
Мне очень давно хотелось написать заметку на эту тему, но что-то все никак руки не доходили. А тут недавно я наткнулся на замечательный пост, который так точно отражает мое видение ситуации, что я даже подумывал просто взять и перевести его на русский язык. Но в конце концов я решил все-таки написать свою версию, немного расширенную и чуть более адаптированную к российским реалиям.
Чисто на случай, если для кого-то это не вполне очевидно, сообщаю, что на собеседовании не только оценивают вас, но и вы оцениваете потенциальное место работы. Поэтому прийти, порешать задачки, а затем отправиться домой ждать звонка — не лучшая идея. Чтобы получить представление о компании и условиях работы в ней, нужно задавать вопросы. Примерно такие.
1. Какая методология разработки используется в команде? Scrum, водопадная модель, XP, или что? Правильный ответ — Scrum или Scrum с элементами XP. Чистый XP в России, насколько мне известно, никто не практикует. Абсолютно неправильные ответы — водопадная модель или «не знаю».
2. Вообще, расскажите поподробнее о вашем воркфлоу. От кого поступают запросы на написание новых фичей, кто пишет ТЗ, как производится тестирование, чем катите, какой багтрекер, а также какие системы непрерывной интеграции и контроля версий используются? Правильный ответ примерно такой. Фичи просят менеджеры, ТЗ пишут аналитики, тестирование производится в несколько этапов (функциональное, нагрузочное, альфа, бета) командой тестировщиков, катим deb-пакетами, используем Jira, Git и Jenkins. В некоторых компаниях ТЗ пишут менеджеры прямо в Jira, в принципе, это ОК. Jenkins до сих пор используют не везде. Его, в общем-то, нетрудно внедрить. А вот, например, отсутствие системы контроля версий или команды тестировщиков обычно является тревожным знаком.
3. Почему вы нанимаете? Годный ответ — бизнес растет, задач очень много. Ни на что не годный ответ — неделю назад команда разработчиков дружно встала и ушла.
4. Чем мне конкретно предстоит заниматься? Тут заодно можно расспросить об используемых компиляторах, операционных системах и версиях СУБД. Ответ в стиле «вам предстоит писать на Erlang часть системы, отвечающую за обработку котировок, там используется Erlang R16, LevelDB и все это крутится на CentOS» считается правильным. Ответ типа «мы пишем высоконагруженный стартап, но не можем о нем рассказать, так как заказчик заставил подписать NDA» должен вас насторожить. Ответ вроде «как мы уже отметили, нам нужен профессиональный CSS-программист со знанием JavaScript, Ruby, NoSQL и Django» считается очень, очень неправильным.
5. Каков размер команды? Если в команде до пяти-шести программистов, это ОК. Если больше, это повод задуматься. Возможно, начальство пытается успеть сдать проект к дэдлайну, наняв побольше людей. А может быть, баги лезут из-за всех щелей с такой скоростью, что команда не успевает заниматься ничем другим, кроме их исправления.
6. А сколько, вы говорите, лет проекту? Чем старше проект, тем больше вероятность, что это ужасный легаси говнокод, а поддерживающая его команда программистов полностью меняется в течение одного года. Если проекту не более пяти лет, скорее всего, бояться вообще нечего. Если же системе лет 15 или даже больше, скорее всего, работа над ней окажется сомнительным удовольствием. Если где-то посередине, то ничего непонятно.
7. Расскажите, пожалуйста, о вашем соцпакете. Если соцпакета нет, а есть только зарплата и 28 дней отпуска, это не очень круто. Если есть халявные кофе и печеньки, а также бесплатные обеды, медстраховка, деньги на новый ноутбук, занятия английским в офисе, оплачиваемое посещение конференций и прочие нештяки, это большой плюс.
8. А могу я взглянуть, где у вас работают программисты? «Нельзя» — плохой ответ. Плохо, если программисты работают в большом душном опенспейсе вместе с бухгалтерами и отделом продаж. Плохо, если программисты сидят в узких кьюбиклах. Если программисты сидят в старом курятнике рядом с грудой гудящих одноюнитовых серверов, это очень, очень плохо! Хорошо, если программисты работают отдельно от остальных коллег в небольшой тихой кондиционируемой комнате человек на семь, с широкими столами и удобными креслами. И при этом есть свободное место спиной к стене.
9. Расскажите о зарплате. Лично я считаю, что белая зарплата — это плюс, хотя кому-то пофиг. Узнайте, есть ли премии. Мне всегда казалось, что премии — это такой развод. Как бы, зарплата, которую на самом деле могут не дать. Но кто-то может со мной не согласиться. Выясните, как часто производится пересмотр зарплаты. Хорошо, если раз в год, плохо, если никогда. Спросите, есть ли прозрачная схема повышения зарплаты. Хорошо, если есть. Например, где-то зарплату повышают на определенную сумму за каждый поддерживаемый проект, а где-то увеличивают на сколько-то процентов каждый год. Однако учтите, что если расспрашивать про зарплату слишком долго, вы рискуете произвести негативное впечатление.
10. Оцените уровень кровавости вашего энтерпрайза по шкале от 1 до 10. Насколько гибок рабочий график, возможно ли работать удаленно, например, в случае болезни. Стоит ли менеджер над душой, спрашивая каждые 10 минут, когда будет готово, или же дает задачу и идет по своим делам? Приходится ли ежедневно отчитываться о своей работе, сколько часов на какую задачу было потрачено? Ходят ли программисты в рубашках и галстуках? И так далее.
11. Как бы вы оценили стрессовость работы? Есть ли постоянные факапы в продакшене, регулярные переработки, спущенные сверху сроки, звонки по ночам от службы поддержки, вечно орущий начальник и все в таком духе. Вряд ли вы наслаждаетесь стрессом.
12. Сколько времени вам понадобится на решение? Просто чтобы не было недоразумений. Где-то могут позвонить на следующий день, где-то собеседуют многих программистов в течение нескольких месяцев и выбирают пару наиболее понравившихся, а где-то и вовсе никого не ищут, а так, смотрят, не зайдет ли случайно настоящая рок-звезда.
Можете еще поспрашивать про качество кода и текучесть кадров, но, скорее всего, никто вам на эти вопросы честно не ответит. Можете спросить про нагрузку проекта (число запросов к системе в секунду, количество пользователей и так далее), но, по моему опыту, как ни странно, это не имеет особого значения. О том, сколько именно вам будут платить, спрашивать не нужно. Тот, кто вас собеседует, сам поднимет этот вопрос, не сомневайтесь. Кстати, кое-какие мои соображения касательно поиска работы, в том числе, на счет того, как отвечать на вопрос о желаемом уровне зарплаты, вы можете найти в этой старенькой заметке.
Учтите также, что нужно не только слушать ответы, но и смотреть на то, как ведет себя человек во время ответа. Ведь существенная часть общения происходит невербально! Важно, кто именно вас собеседует. Хорошо, если это делают сами программисты, менее хорошо, если технический директор, плохо, если HR. А если вы проходите собеседование в кадровом агентстве, тогда я вообще не понимаю, каким местом вы думаете.
Паттерны (шаблоны) проектирование в PHP. Введение.
logo
Паттерн проектирования (design pattern) - это общее типовое решение некоторой проблемы, многократно повторяемое в процессе проектирования архитектуры программного продукта. Они показывают отношения и взаимодействия между классами, позволяют сделать систему гибкой и легко изменяемой. За счет их правильного использования повышается коэффициент использования готовых решений.
Я буду постепенно описывать каждый паттерн и добавлять его в список на этой странице.
Я предполагаю, что читатель осведомлен о понятиях ООП и знает в чем разница между интерфейсом и абстрактным классом. Знает что такое полиморфизм, инкапсуляция и наследование. Если вы не уверены в своих силах, рекомендую к прочтению статью из википедии "Объектно-ориентированное программирование".
В процессе описания я буду использовать UML, для графического изображением классов и их отношений. На этот счет не стоит беспокоиться, даже если вы не сталкивались с ним раньше, его можно интуитивно понять.
Понятия
Здесь и далее в статьях я буду употреблять "паттерн" (pattern) вместо русского аналога "шаблон"
Инстанация (instanate) - процесс создания объекта определенного класса.
Код клиента - это код программиста, который будет работать с нашей частью программы по принципу черного ящика, т.е. только через публичный интерфейс
Список
Порождающие
Abstract Factory (Абстрактная фабрика)
Factory Method (Фабричный метод)
Singleton (Одиночка)
Prototype (Прототип)
Builder (Строитель)
Структурные
Adapter (Адаптер)
Bridge (Мост)
Composite (Компоновщик)
Decorator (Декоратор)
Facade (Фасад)
Flyweight (Приспособленец)
Proxy (Прокси)
Паттерны поведения
Chain of Responsibility (Цепочка обязанностей)
Command (Команда)
Interpreter (Интерпретатор)
Iterator (Итератор)
Mediator (Посредник)
Memento (Хранитель)
Observer (Наблюдатель)
State (Состояние)
Strategy (Стратегия)
Template Method (Шаблонный метод)
Visitor (Посетитель)
PHP
принципиальное различие скриптовых и “обычных” языков
3 принципа ООП
что такое MVC и зачем это нужно
локига в контроллере, должна ли быть и почему
Тесты
зачем нужны
что такое TDD
Web специфика
javascript, опыт работы с ним, используемые библиотеки
Настройка http-серверов
nginx, его отличие от apache
балансировка нагрузки на сервера приложений (haproxy)
Базы данных
Общие вопросы
транзакции
блокировочные и версионные СУБД
индексы (зачем нужны, плюсы и минусы)
репликация
шардинг (партиционирование)
типичные bottle necks
PostgreSql
pgBouncer — что это и зачем нужно
системы репликации
PgQ (другие очереди)
синхронные и асинхронные операции
Организация разработки
Система контроля версий
зачем нужна
какими пользовались
Git (если есть опыт)
как перенести изменени из одной ветку в другую (2 способа)
зачем нужна команда git rebase
разница между git и svn (если есть)
Система тикетов и организация задач
зачем нужна
какими пользовались
как была организована работа в команде
методы разрешения конфликтов
Повышение квалификации
какие ресурсы читаются и как часто
какие задачи интересуют
что интересно по жизни, какие хобби
есть свой блог
какие три последние книги прочитал
что сделал в своей жизни такого, чем можешь гордиться
Что такое ООП? Назовите 3 основополагающих принципа ООП.
Чем интерфейс отличается от абстрактного класса?
Назовите 5 различных функций для работы с массивами.
Какими библиотеками и фреймворками пользовались?
В чем разница между 4 и 5 версиями? Какие нововведения были в версии 5.3/5.4?
Что такое PEAR и PECL?
Знакомы ли с паттернами проектирования? Какие использовали в работе?
Напишите небольшую реализацию паттерна Singleton.
Что такое MVC и какие преимущества его использования? Какие ещё знаете архитектурные паттерны?
Знакомы ли с ORM, ActiveRecord?
Написать функцию для возведения числа в заданную степень с помощью рекурсии.
Что выведет на экран скрипт в результате?
class Foo {
public $test = NULL;
}
$foo = new Foo;
$foo->test = '12345678';
$bar = $foo;
$bar->test = '87654321';
echo $foo->test;
Что выведет код и почему?
$i = 10;
$i += ++$i + $i + $i++;
print $i;
MySQL
Задача: основная таблица + справочник. Вывести объединение. Написать SQL запрос. Чем отличаются INNER и OUTER JOIN-ы.
Задача: вывести список дубликатов значений поля и их количество. Написать SQL запрос.
В чем заключается оптимизация БД, и в частности MySQL.
Основные отличия MyISAM и InnoDB. Преимущества и недостатки.
Проектирование БД. Нормальные формы.
Client-side
Назвать два распространённых подхода к вёрстки. Назовите их, а также объясните, какой лучше и почему?
В чем разница между HTML и xHTML?
Приходилось работать с AJAX, XML, JSON?
C какими JavaScript-фреймворками приходилось работать?
В чем преимущество JavaScript-фреймворков перед чистым JavaScript?
Назовите распространенные методы клиентской оптимизации.
Дополнительные вопросы
Что такое Apache и mod_rewrite?
C каким серверным ПО приходилось работать?
Знакомы ли c SCM системами - Git, Mercurial, SVN, etc?
Есть высоко-нагруженный сайт на котором начались проблемы с производительностью, как делать оптимизацию? С чего начать?
Какие Вы знаете технологии повышения производительности PHP?
Логика этих вопросов в том, чтобы понять максимальный уровень знаний кандидата. Если человек отвечал на все вопросы, дальше уже шли вопросы из головы. Человек уверенно заявляет, что использовал Builder и Strategy - отлично, прошу рассказать о них. Рассказывает - ещё лучше, задаю вопрос про паттерн Hydrator. Уверенно размышляет об MVC - "Что Вы знаете о сигнальной архитектуре?". Любимый вопрос, для самый умных - "Если приложение будет представлять из себя только один файл следующего содержания, можно ли считать это MVC?". Удивительно, сколько людей начинали паниковать и нести ахинею, когда выдели такую реализацию.
$config = [
'db' => [
'host' => '127.0.0.1',
'user' => 'root',
'pass' => '',
'use' => 'database',
]
];
function model_posts($id = NULL) {
$sql = "SELECT * FROM posts WHERE id = ?";
return db_query($sql, [$id]);
}
function controller_post($id = NULL) {
if ($model = model_posts($id)) {
return view('../templates/post.php', [
'post' => $model
]);
}
return false;
}
function view($template, Array $variables = array()) {
ob_start();
extract($variables);
include $template;
return ob_get_clean();
}
function db_query($sql, Array $params = array()) {
global $config;
$db = new PDO($config['db']['dsn'], $config['db']['user'], $config['db']['passwd']);
$query = $db->prepare($sql);
$query->execute($params);
return $query->fetchAll();
}
function dispatch() {
$result = FALSE;
$uri = $_SERVER['REQUEST_URI'];
if (preg_match('#^/post/(?P\d+)/?$#ui', $uri, $matches)) {
$result = controller_post($matches['id']);
}
// ...
if ($result) {
echo $result;
} else {
die('Error');
}
}
dispatch();
Если по опыту работы кандидата было видно, что с интерфейсами он знаком и с рекурсией уже сталкивался не раз, чтобы не мучать его общими вопросами, я предлагал провести беседу в формате "Что будет, если …?", где кандидат пытался решить смоделированную мной ситуацию, а я выступаю в роли компилятора его решений. Выглядело это так:
- Допустим, Вы попали в ситуацию - Вас взяли на работу, задача - дорабатывать и развивать уже готовый проект. Через неделю Вашего знакомства с проектом, маркетинговый отдел запустил довольно успешную кампанию и время загрузки сайта за сутки увеличилось с 0.5c до 15с. Как вы будете решать проблему?
- Посмотрю на вывод SHOW PROCESSLIST; в консоли MySQL на кол-во и время выполнения запросов.
- Хорошо. Допустим, там постоянно висит 2-3 различных запроса с большим временем выполнения. Ваши действия?
- Оптимизация базы, индексы, объединения.
- Ок, а если много различных запросов с небольшим временем выполнения?
- Необходимо использовать кэширование запросов
- Ок, допилили кэширование, но проблема все же осталась
- Некорректная работа кэширующего механизма?
- Допустим. Давайте немного скорректируем условия - вы открываете консоль MySQL и видите там обычное кол-во запросов. В чем ещё может быть проблема?
И ещё 40 минут в таком же духе. Мои любимые темы - тестирование запросов на малых объемах данных, когда на production данных значительно больше, вложенные запросы страниц, подтягивание внешнего источника (напр. RSS фида) в основном потоке, когда внешний источник упал и т.п. В этом диалоге также есть не-явная суть - проверить мышление кандидата, узнать где и как он ищет решение проблем ("я не знаю, погуглю" - без иронии, один из лучших ответов), может ли он допустить проблему в стороннем системном компоненте и готов ли разобраться с этой проблемой, как хорошо он знает механику работы web-приложений, которая лежит за рамками серверной части.
Расскажите о нововведениях в PHP 5.6. Даже если не всегда получается использовать новые версии PHP, их знание является большим плюсом. Следом идет вопрос о том что значит следующий синтаксис: function(...$args)
Типы данных в PHP, очень стандартный вопрос, но много кто не знает, что NULL это отдельный тип, а еще есть такой тип resource. Еще для понимания приведения типов в PHP спрашиваем чему будет равно 10 + "10a" + "a10"
Какими SPL классами вы пользуетесь? Мало кто вообще знает, что такое SPL.
Какие структуры данных вы знаете? Разница стэка и очереди.
Естественно, куда же без ООП. Шаблоны проектирования, все знают Singleton, но его минусы перечислить могут не все.
Особенности ООП в PHP. Можно ли сделать множестенное наследование в PHP, что такое traits? Что такое позднее статическое связывание?
Знаете ли вы, что такое SOLID? Объясните.
Немного вопросов о функциях в PHP. Функции сортировки массивов, отличие include от require.
Далее спрашиваем об использовании фреймворков. Идут пару вопросов о тех фреймворках, с которыми я имел дело, в зависимости от ответа. Что такое DI, объясните MVC, что такое fat controller.
Дальше идет целый пласт вопросов о базах данных, о знании SQL. Какие уровни изоляции транзакций вы знаете? В каких случаях стоит использовать составной индекс, в каких - нет.
Имеем таблицу employees, в ней name, department_id, salary. Просим написать запрос: вывести список сотрудников, получающих максимальную зарплату в своём отделе. Второй запрос: вывести список отделов, содержащих как минимум 5 сотрудников.
Большим плюсом будет знание конфигурации БД, репликации, EXPLAIN.
Пару вопросов про безопасность, как защититься от CSRF, от SQL-Injection. Как вы сохраняете пароли в своих проектах.
Можно задавать много вопросов про смежные технологии. Например, если человек использовал Symfony, то пару вопросов про mapping в Doctrine. Если использовал Memcache, то с какими проблемами сталкивался.
Какие схемы использовались кандидатом для раскладки кода. CI? Composer?
Конечно же тесты: функциональные, стресс, юнит.
Системы контроля версий. Обычно так: с SVN работал? Да. Что такое cherypick? С Git работал? Да. Чем отличается rebase от merge?
Пару базовых вопросов по UNIX. Как найти файл с определенной подстрокой в директории со вложенностями.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment