
На днях разминался JavaScript тестом от компании Atlassian. Так как данного теста нет в публичном доступе – поделюсь информацией. Для прохождения необходимо написать запрос в компанию и тогда вам вышлют специально созданную ссылку, которая ведет на домен interviews.atlassian.net.
Тест состоит из 4х секций:
- выбор правильного варианта (Multiple Choice)
- код (Code)
- сочинение (Long Answer)
- бонус (Bonus)
Итак подробно по секциям:
Выбор правильного варианта
Довольно примитивная секция. Сложность заключается только в том, что большая часть вопросов и ответов имеют длинную формулировку. Раздел состоит из 10ти вопросов:
Вопрос№1: Автоматическое приведение типов (Automatic Type Coercion)
Почему true > null?
(Прим.:К сожалению, не сохранил оригинала ответов для данного вопроса.)
Вопрос№2: Приведение типов (Type Coercion)
Предполагается что вы анализируете ввод геокоординат. Вам нужно преобразовать строку в число, сохраняя знак и десятичную часть, но вы хотите отобразить ошибку в случае, когда пользователь ввел неверные данные. Какой из перечисленных методов подходит лучше всего?
- parseFloat(x)
- +x
- ~~x
- new Number(x)
Вопроc№3: DOM: Doctype
На что влияет doctype в HTML документе?
- он объявляет пространство имен(name space), которое будет использоваться для элементов документа по умолчанию
- браузер проверяет(validate) документ базируясь на его определении
- он определяет тип парсера браузера, который будет использован для разбора HTML исходника
- он предотвращает отрисовку неверных элементов браузером
- он будет причиной браузерной ошибки, в случае обнаружения неверного элемента
Вопрос№4: setTimeout и clearTimeout
Какие значения будут у resultA и resultB после выполнения следующего кода?
- код будет выполняться вечно
- недостаточно информации, чтобы дать точный ответ
- resultA: 8, resultB: 8
- resultA: 8, resultB: 32
- resultA: 8, resultB: 2
Вопрос№5: “Atloogle and Atlipedia” (да, такое оригинальное название, а на самом деле посвящен асинхронным AJAX вызовам )
Следующий код крепит обработчик событий на поле ввода “search”. Пользователь может вводить текст, который пошлет AJAX запрос на поисковый движок “Atloogle”. Но ответы от “Atloogle” содержат только заголовок – недостаточно информации для нашего вебсайта – и мы запрашиваем дополнительную информацию о каждом результате еще одним AJAX запросом из онлайн энциклопедии названной “Altipedia”.
Поступил отчет о том, что наш код имеет очень странную проблему, когда пользователь вводит текст с разной скоростью. С какими проблемами может сталкиваться пользователь?
- сервер Altipedia перегружен большим количеством запросов
- описание с Altipedia не показывается на странице, когда пользователь вводит текст быстро
- предыдущие результаты поисковых запросов Altipedia отображаются вместо текущих
- описания с Altipedia для текущего поискового запроса отображаются перед тем как запросом на Altoggle
Вопрос№6: Делегирование обработчиков событий (Delegated Event Handlers)
Принимая то, что вы используете jQuery 1.6 или новее, в каком случае вы используете live и die методы?
- чтобы упростить обработчики событий, когда мы имеем дело с контентом, добавляемым на страницу динамически
- только в случае мобильной разработки с touch событиями
- никогда, использую delegate/undelegate (или on/off, если доступно) вместо
- в больших документах или глубоко внутри DOM
Вопрос№7: Регулярные выражения (Regular Expressions)
Допустим что вам необходимо найти подстроку окруженную двойными ковычками, такую как “test“, “te\st” и “”, но не ““” и не “\“. Какое из следующих регулярных выражений будет наиболее подходящим для этого задания?
- /”.*”/g
- /”[^”\\]*(?:\\[\S\s][^”\\]*)*”/g
- /”(?:\\?[\S\s])*?”/g
- /”([^”\\]*(“|\\[\S\s]))+/g
Вопрос№8: Рендеринг и перерисовка (Rendering: Reflow)
Чтение какого из свойств DOM элемента может привести к перерисовке (reflow) страницы браузером:
- innerHTML
- offsetParent
- scrollTop
- style
Вопрос№9: Тестирование (Writing JavaScript for Testability)
Какие из предложенных ниже примеров кода наиболее тестируемые, используя понятия стабов(stubs) и моков(mocks)?
Вопрос№10: Повторение в маштабируемости (Repetition at Scale)
Какая из реализаций “odds” наиболее быстрая и маштабируемая (т.е. выполнимая для больших значений n)
function odds(n, p) {
var acc = 1;
for (var i = 0; i < n; i++) {
acc *= (n - i) / (p - i)
}
return acc;
}
function odds(n, p) {
if (n == 0) {
return 1;
} else {
return (n / p) * odds(n - 1, p - 1)
}
}
var odds = (function () {
var odds1 = function (n, p, acc) {
if (n == 0) {
return acc;
} else {
return odds(n - 1, p - 1, (n / p) * acc);
}
}
return function (n, p) {
return odds1(n, p, 1)
}
}());
на этом заканчивается секция тестов “выбрать правильный вариант” и начинается
Код
Секция состоит из 4х вопросов и требует уже написания нескольких строк кода.
Вопрос№1: Конвертация массива (Array Conversion)
У вас есть массив значений, напишите функцию transoform таким образом чтобы она возвращала массив функций, каждая из которых при вызове возвращает значение, т.е.:
var a = ["a", 24, { foo: "bar"}];
var b = transform(a);
a[1]; //24
b[1](); //24
Вопрос№2: Делегирование событий (Event Delegation)
На странице есть такой код:
$(".user").bind("mouseenter", fnShowUserHover);
Переделайте этот код используя делегирование, таким образом чтобы обработчик события срабатывал также на элементах добавляемых после инициализации страницы.
Вопрос№3: Вызов метода в нужном контексте (THIS.IS.ATLASSIAN)
На странице код:
function initiateMadness(){
var sparta = {
name: "Sparta"
};
function madness(){
alert("THIS. IS. " + this.name.toUpperCase() + ".");
}
document.onclick = makeMesseger(madness, sparta);
}
initiateMadness();
Напишите функцию такую функцию makeMesseger, чтобы при клике на документ выдало “THIS. IS. SPARTA.”
Вопрос№4: Добавление задержки для обработчика события (Delayed Event Refactor)
Представим что у нас есть функция handScroll, которая должна вызываться при скроле:
$(window).scroll(handleScroll);
Как мы можем переделать этот код, чтобы метод вызывался только после 200 миллисекунд после того как пользователь закончит прокручивать страницу?
Сочинение (Long Answer)
в данном разделе было 3 вопроса обо всем и ни о чем:
- Опишите основные направления что происходило с веб-приложениями последние 2-3 года. Как вы думаете эти изменения повлияли на продукты Atlassian?
- Подумайте о продукте/инструменте, который вы используете ежедневно( социальную сеть, ваш почтовый клиент). Почему вы предпочли его другим альтернативам? Как по вашему мнению можно было бы улучшить данный продукт?
- Напишите о своих основных достижениях и о том чем бы вы могли быть полезны компании Atlassian.
Бонус (Bonus)
Тут было сказано, что front-end разработчикам часто приходится сталкиваться с разбором кода на стороне сервера, поэтому вот вам вопрос на JAVA. Вопрос из себя представляет код, в котором реализован Singleton. И нужно сказать что может быть плохого в этом коде.
Если выкинуть секцию сочинений, то тест не должен занять больше часа.