Привет. Хочу поделиться историей из жизненного опыта. Несколько месяцев назад я записался на платные курсы по изучению языка программирования JavaScript в прекрасном городе Минск. Потратил около недели времени на подробное изучение отзывов о каждой из компаний на рынке, сравнивал цены на услуги и местоположение относительно моего дома. Наконец, выбрав «достойного» кандидата, направился к ним в офис для заключения договора. В общем, прошел я начальный инструктаж, получил расписание занятий и содержание всего курса и с радостью приступил к делу.
Курс был довольно качественный, преподаватели имели реальный опыт разработки на production проектах и очень старались объяснить максимально просто различные аспекты языка, но это история не об этом…
В конце двух месяцев занятий c частотой 4 дня в неделю по 4 часа, каждый студент обязан был пройти контрольный тест в виде 80 вопросов по предмету с множеством вариантов ответов. Компания обещала при условии успешной сдачи тестирования помочь трудоустроится в крупную компанию нашего города на позицию JavaScript Developer. Очень заманчиво.
Вот пример вопроса:
- Что выведет команда console.log() ?
(function() {
var x = 1;
function x() {};
console.log(x);
})();
И несколько вариантов ответа, оформленные примерно так:
На рисунке черные квадраты — это checkboxes. Вариантов ответов на все 80 вопросов может быть от 1 до всех, что есть в списке вариантов.
Я, как прилежный ученик, тут же бросился отвечать на них. Однако, остановившись на 3-4 вопросе, мне захотелось узнать, как работает эта система. Пролистав в самый низ страницы, я нажал кнопку «Done» и увидел следующее: все вопросы, на которые были даны неверные ответы — а это все оставшиеся без моих ответов — стали подсвечены красным цветом. Появилась красивая рамка и изменился background-color у родителя элемента вопроса. «О, валидация!», — подумал я и начал выяснять, как же она работает.
Открыл, в общем, FireBug, обновил страницу и нажал кнопку «Done» еще раз. Я увидел, что запрос на сервер не отправился, то есть валидация сугубо клиентская работает в данный момент. Затем я открыл список JavaScript файлов, которые подключены к странице (там, кстати, использовался Backbone + RequireJS), и нашел модуль под названием «validation.js».
Сперва я отправился на unminify.com, мне нужно было привести код к нормальному состоянию. После прочтения кода я нашел метод «validate» со следующим содержанием:
/*здесь был код с такой вот логикой*/
$(".questions").each(function(i,e){
var a = [];
$(e).find(":checkbox").each(function(index,elem){
if($(elem).val() % 31 == 0) {
/*все окей, ответ как минимум правильный*/
} else {
/*все плохо, ответ неверный*/
a.push(index);
}
});
if (!a.length) {
/*значит все ответы на вопрос правильные, вызываем функцию correctAnswer();*/
} else {
/*был как минимум один неверный ответ, вызываем функцию wrongAnswer();*/
}
});
Далее посмотрел html-разметку всех чекбоксов:
<input class="ui-element-checkbox" type="checkbox" name="answer" value="2561">
Так вот, замечательное число в атрибуте «value» и было ключём к правильным ответам теста. Не трудно догадаться, что запрос на сервер будет выполнен только в том случае, если выбраны только правильные ответы.
Я написал небольшой скрипт, который пробегался по всем вопросам, в каждом конкретном вопросе находил элементы checkbox, брал их значение и делил на 31; если остаток 0 – выставляем атрибут ‘checked’ в true, если нет — идем дальше:
var parent = $(".questionnaire-text");
var answers = parent.find(".answers[data-type='checkboxes']");
answers.each(function(index,elem){
var checkboxes = $(elem).find(":checkbox");
checkboxes.each(function(i,e){
if ($(e).val() % 31 === 0) {
$(e).attr("checked","checked");
}
});
});
Через мгновение увидел все правильные ответы на абсолютно все 80 вопросов теста. Я с радостью нажал кнопку «Done» и- о, чудо — в FireBug увидел отправленный запрос на удаленный сервер учебного центра, на который получил ответ с поздравлением об успешной сдаче теста на 100%.
Естественно, я не хотел быть уличенным в мошенничестве во время сдачи теста, поэтому посидел еще минуток 20-25 тихонько за компьютером, прежде чем сообщить куратору о готовности.
Сразу скажу, никто кроме меня на 100% не сдал этот тест. В общей сложности только 3 человека, включая меня, сдали тест положительно на более чем 75%. Остальные ребята не набрали и 50% правильных ответов.
После успешного окончания курсов я прошел собеседование в одну из компаний города Минска на должность JavaScript Developer, но мысль о той хитрости во время сдачи теста не давала мне покоя. В один прекрасный день я пришел в тот самый учебный центр и все им рассказал. Мне выразили благодарность за честность и подарили волейбольный мячик.
Вот такая история. Хочу посоветовать всем не боятся исследовать неизвестные области и постоянно находить легкие пути для решения трудных задач. Спасибо за внимание.
P.S. Приведенные примеры кода лишь частично описывают реальный функционал. Также история не моя личная, а моего очень хорошего друга, который попросил остаться инкогнито.
Автор: Pepsilike