Xenus
Новичок
Выслали тестовое задание мне. Я его сделал, через полдня мне ответ что по итогам тестового задания со мной даже разговаривать не будут на собеседовании, причины не объяснили. Тестовое задание и мои решения привожу здесь. Может мне тут кто-нибудь разъяснит в чем я прокололся так сильно.
1. В БД MySQL есть 2 таблицы (фотографии и комментарии к ним):
CREATE TABLE `photos` (
`photo_id` int(11) NOT NULL,
`photo_title` tinytext NOT NULL,
PRIMARY KEY (`photo_id`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251;
CREATE TABLE `comments` (
`comment_id` int(11) NOT NULL AUTO_INCREMENT,
`photo_id` int(11) unsigned NOT NULL,
`user_id` int(11) unsigned NOT NULL,
`comment_text` text NOT NULL,
PRIMARY KEY (`comment_id`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251;
Напишите SQL-запрос, который выведет список фотографий, с указанием количества комментариев, отсортированные в порядке убывания их количества, у которых меньше 5 пользователей-комментаторов.
Мой ответ:
2. Перечислите все возможные способы выставления cookie клиенту в PHP?
Мой ответ: setrawcookie, setcookie(), напрямую отправить через header()
3. Какова алгоритмическая сложность (в О-нотации) функции strlen($s) в PHP? Прокомментируйте свой ответ.
Мой ответ:Я не очень хорошую теоретическую подготовку имею, поэтому могу сказать что по моему алгоритмическая сложность данной функции является зависимостью от длины строки $s
4. Имеется переменная $url содержащая адрес веб-страницы и вызов preg_match($regexp, $url, $matches). Какое значение переменной $regexp приведет к тому, что в $matches будет 2 элемента, причем второй элемент будет содержать только домен?
Мой ответ: Примерно такое: '|^(?:http://)([^/]+)|i
5. Какой паттерн по смыслу ближе всего к принципу действия «триггеров» в базе данных? Прокомментируйте свой ответ.
singleton
abstractfactory
observer
adapter
decorator
Мой ответ: Паттерн observer, т.к. он тут единственный паттерн поведения, суть которого в возможности изменять свойства одного зависимого объекта при изменении другого. Примерно так же действуют триггеры, позволяя выполнять какое-либо действие при изменении таблицы.
6. Вам нужно хранить большой массив идентификаторов пользователей в noSQL хранилище. А потом проверять входит ли произвольно указанный идентификатор в этот массив. В каком формате вы сохраните данные?
$userIds = array(userId1, userId2, userId3, ...)
или
$userIds = array(userId1 => true, userId2 => true, userId3 => true, ...)
или
$userIds = "userId1,userId2,userId3,..."
или другой вариант
В чем плюсы/минусы каждого из форматов? Каким образом вы будете проверять вхождение (пример PHP кода)?
Мой ответ: Второй вариант предпочтительнее, т.к. в данном случае поиск по массиву можно осуществлять по ключам массива, что как правило быстрее чем в первом случае, где нужно будет совершать поиск по всем значениям массива. Третий вариант вовсе не массив, а строка, поиск нужно осуществлять по строке, что гораздо медленнее поиска в массиве, к тому же изменение данных в строке (если понадобится) будет сделать гораздо сложнее.
$hasUser = array_key_exists($userId,$userIds ); или isset(userIds[$userId])
7. Есть новостной сайт, с нагрузкой до 20000 запросов в минуту. Запросы равномерно распределяются по 5 серверам приложений. Данные хранятся на отдельном MySQL сервере, а на каждом сервере приложений поднят MySQL и между ними настроена Master-slave репликация. Необходимо собирать статистику по количеству просмотров каждой новостной статьи (шаг - 10 минут) и выводить ее в панели управления. Нужно учитывать, что при просмотре статьи происходит обращение только к локальному серверу БД. Опишите как бы вы подошли к решению данной задачи.
Мой ответ: В таком случае можно организовать отдельные хранилища на каждом сервере, куда будут попадать количества просмотров за последние 10 минут. Раз в 10 минут скрипт на Master сервере может собирать эту статистику с других серверов, складывать и записывать данные в свою БД, после этого данные о посещениях на других серверах обнуляются. Хранилище можно организовать с помощью какого-либо NOSQL решения (предпочтительно), либо файлами, в общем зависит от возможностей сервера.
1. В БД MySQL есть 2 таблицы (фотографии и комментарии к ним):
CREATE TABLE `photos` (
`photo_id` int(11) NOT NULL,
`photo_title` tinytext NOT NULL,
PRIMARY KEY (`photo_id`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251;
CREATE TABLE `comments` (
`comment_id` int(11) NOT NULL AUTO_INCREMENT,
`photo_id` int(11) unsigned NOT NULL,
`user_id` int(11) unsigned NOT NULL,
`comment_text` text NOT NULL,
PRIMARY KEY (`comment_id`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251;
Напишите SQL-запрос, который выведет список фотографий, с указанием количества комментариев, отсортированные в порядке убывания их количества, у которых меньше 5 пользователей-комментаторов.
Мой ответ:
Код:
SELECT photos.photo_id, count(comments.photo_id) as comments_count
FROM photos
JOIN comments ON photos.photo_id=comments.photo_id
GROUP BY photos.photo_id
HAVING COUNT(DISTINCT comments.user_id)<5
ORDER BY comments_count DESC
Мой ответ: setrawcookie, setcookie(), напрямую отправить через header()
3. Какова алгоритмическая сложность (в О-нотации) функции strlen($s) в PHP? Прокомментируйте свой ответ.
Мой ответ:Я не очень хорошую теоретическую подготовку имею, поэтому могу сказать что по моему алгоритмическая сложность данной функции является зависимостью от длины строки $s
4. Имеется переменная $url содержащая адрес веб-страницы и вызов preg_match($regexp, $url, $matches). Какое значение переменной $regexp приведет к тому, что в $matches будет 2 элемента, причем второй элемент будет содержать только домен?
Мой ответ: Примерно такое: '|^(?:http://)([^/]+)|i
5. Какой паттерн по смыслу ближе всего к принципу действия «триггеров» в базе данных? Прокомментируйте свой ответ.
singleton
abstractfactory
observer
adapter
decorator
Мой ответ: Паттерн observer, т.к. он тут единственный паттерн поведения, суть которого в возможности изменять свойства одного зависимого объекта при изменении другого. Примерно так же действуют триггеры, позволяя выполнять какое-либо действие при изменении таблицы.
6. Вам нужно хранить большой массив идентификаторов пользователей в noSQL хранилище. А потом проверять входит ли произвольно указанный идентификатор в этот массив. В каком формате вы сохраните данные?
$userIds = array(userId1, userId2, userId3, ...)
или
$userIds = array(userId1 => true, userId2 => true, userId3 => true, ...)
или
$userIds = "userId1,userId2,userId3,..."
или другой вариант
В чем плюсы/минусы каждого из форматов? Каким образом вы будете проверять вхождение (пример PHP кода)?
Мой ответ: Второй вариант предпочтительнее, т.к. в данном случае поиск по массиву можно осуществлять по ключам массива, что как правило быстрее чем в первом случае, где нужно будет совершать поиск по всем значениям массива. Третий вариант вовсе не массив, а строка, поиск нужно осуществлять по строке, что гораздо медленнее поиска в массиве, к тому же изменение данных в строке (если понадобится) будет сделать гораздо сложнее.
$hasUser = array_key_exists($userId,$userIds ); или isset(userIds[$userId])
7. Есть новостной сайт, с нагрузкой до 20000 запросов в минуту. Запросы равномерно распределяются по 5 серверам приложений. Данные хранятся на отдельном MySQL сервере, а на каждом сервере приложений поднят MySQL и между ними настроена Master-slave репликация. Необходимо собирать статистику по количеству просмотров каждой новостной статьи (шаг - 10 минут) и выводить ее в панели управления. Нужно учитывать, что при просмотре статьи происходит обращение только к локальному серверу БД. Опишите как бы вы подошли к решению данной задачи.
Мой ответ: В таком случае можно организовать отдельные хранилища на каждом сервере, куда будут попадать количества просмотров за последние 10 минут. Раз в 10 минут скрипт на Master сервере может собирать эту статистику с других серверов, складывать и записывать данные в свою БД, после этого данные о посещениях на других серверах обнуляются. Хранилище можно организовать с помощью какого-либо NOSQL решения (предпочтительно), либо файлами, в общем зависит от возможностей сервера.