Тестовое задание для программиста

DEPRECATED WARNING: этот пост был написан для найма программистов в веб-студию в 2010-2013 годах, а сейчас УСТАРЕЛ по многим причинам. Сейчас в мировом вебе используются новые технологии, и нужно задавать новые вопросы. Однако вы можете извлечь из текста что-то полезное.

Я не даю абстрактных, выдуманных из головы тестовых заданий. Я считаю что это абсурд – на основе быстрого решения какой-то единичной проблемы пытаться сделать выводы о том, насколько человек окажется эффективным сотрудником. Реальную эффективность можно оценить только спустя недели и месяцы реальной работы в команде. Поэтому, когда есть такая возможность, вместо тестовых заданий – я задаю самые различные вопросы, чтобы понять обладает ли кандидат широким кругозором, опытом, развитым ассоциативным и нестандартным мышлением. Я решил опубликовать эту подборку, чтобы кандидаты могли реально оценить свои силы для участия в моих проектах.

Примечание: если вы работодатель, вы можете заказать собеседование IT-специалистов у меня.

Подразумевается, что далее речь идёт об обычном программисте-разработчике сайтов на PHP/MySQL, который также хорошо знаком с html, js, css, командной строкой linux, умеет обращаться с системами контроля версий (термины feature branches, git-flow), владеет инструментами для программного тестирования, понимает ограничения шаред-хостингов и т.д. Итак, поехали:

  1. Вы зашли в каталог с сайтом и сказали “sudo chmod -R 777 ./*”, но обнаружили, что права на один файл не поменялись. На какой и почему?
  2. Пользователь загружает изображение (произвольного формата и размера), но при обработке в системе на выходе получается чёрный прямоугольник. Объясните, как сделать автоматический тест, контролирующий эту проблему.
  3. Сайт имеет очень большую посещаемость. Все загружаемые пользователями файлы складываются в один каталог. Объясните, чем это плохо.
  4. Дано: MySQL-таблица имеет два числовых столбца и миллион строк. Вас просят сделать индексы для ускорения выборки из таблицы. Объясните, почему это не поможет.
  5. Дано: MySQL-таблица содержит один столбец с текстами произвольной и очень большой длины. Будет ли эффективен индекс для поиска слов по ней?
  6. Три программиста работают над проектом: Вася в транке, Миша в бранче, а Петя коммитит одно и то же в обе ветки. Какие проблемы это создаст в будущем, и как их решать?
  7. Двумя последовательными запросами jQuery load() вы создаете объект и назначаете ему права, однако получаете ошибку. По-отдельности оба запроса работают успешно. В чём тут проблема?
  8. Объясните, что плохого в таком коде: <?php $username=’mylogin’; $pwd=’mypassword’; ?>
  9. А что плохого в таком коде: <?php if …  else { echo(‘Ошибка’); } ?>
  10. Вы делаете сайт для людей. Каким словом вы назовёте объект каталога, чтобы это было понятно всем пользователям?
  11. Вам нужно определить текущее значение memory_limit внутри php-скрипта, но ini_get не работает (известная ошибка PHP 5.1). Объясните, какими ещё способами можно получить это значение.
  12. Вам дали сложный SQL-запрос и потребовали оптимизировать его скорость. Что вы сделаете в первую очередь?
  13. Продолжите список: GET, POST, …?
  14. Вы скачиваете файл с удалённого сервера средствами PHP. Однако файл большой и он не успевает скачаться по таймауту PHP. Как решить эту проблему?
  15. Вы делаете функционал контекстного меню на яваскрипте. Один из его пунктов – “Копировать в буфер обмена”. Объясните, причём здесь Flash.
  16. Вам дали задание сделать блэклист (чёрный список) слов для фильтрации спама, и вы сделали управление им в админке – обычным строковым полем. Почему это неправильно?
  17. Некая функция определения наличия блокировки называется getIsLocked(). Предложите более простое название и объясните чем оно лучше.
  18. На стороннем сайте вы видите изображение на странице, открываете html-код, берёте ссылку на изображение и вставляете в адресную строку браузера. Но изображение не открывается. Почему?
  19. Вы пишете систему мониторинга контента страниц. Она должна отслеживать значительные изменения контента, но игнорировать мелкие. Предложите простое решение.

В целом: я нанимаю людей, которые должны гармонично вписаться в существующую команду, и успешно транслировать задачи реального мира в программный код. Люди с большим практическим опытом решения задач в стрессовых условиях, обладающие здравым смыслом и коммуникабельностью, в реальном проекте дадут 100 очков форы идеалистам-архитекторам с их теоретическим абстрактным мышлением.

Cо времени публикования поста подборка вопросов расширилась. Напишите мне, если хотите узнать какие вопросы я добавил, и каков процент успешных ответов на наших собеседованиях.