Сказ о том, как я собеседование в Яндекс запорол

Я искал новую работу. Обновил профиль на hh. И вдруг, через неделю, меня пригласили в яндекс! На вакансию разработчик интерфейсов внутренних сервисов.

Требования мне подходили, единственное разочарование было в знании XSLT. Поговорив с hr, узнал что должность касается разработки админки на шаблонизаторе-велосипеде от яндекса. Что же, подумал я, минус большой, но терпимый. Серьёзная контора, интересные задачи. Что же, вполне возможно меня возьмут под свое уютное гнездышко!

Получив ссыль на задание, я приступил выполнять его через неделю. Да, у меня были дела поважнее ;-)
1.Напишите функцию, принимающую в качестве аргумента массив числовых значений и возвращающую уникальные элементы этого массива.
Хм. Подумал я, садясь за Dev-tools. Написал обычную функцию, ничего лишнего.

function uniq(){
  var c=[],
      e,
      d,
      b = this.length;
      
      for( e = 0; e < b; e++ ) {
        for( d = e + 1; d < b; d++ ) {
          if( this[e] === this[d] ) {
            d =++ e;
          }
        }
        c.push( this[e] );
      }
      return c
    }

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

2. Изменится ли внешняя переменная someFlag? Объясните результат.
var someFlag = 0;
function foo() {
  if (true) {
    someFlag = 1;
  } else {
    var someFlag = -1;
  }
  return someFlag;
}
foo();

Итог. Вот это ЭПИК Фейл! Вообще не думая, я тупо копирнул код в консоль, получив в итоге ответ 1. Всякое бывает.

3. Напишите функцию перемножения чисел, которая вызывается следующим образом: multiply(a)(b).

Придя в мир web-dev'a от десктопных C# проектов, я сначала подумал, что это будет очень сложно. Сразу вспоминались делегаты и пр. К счастью, js это ещё и функциональный язык и я вовремя вспомнил что в нём можно возвращать результат в виде функции.

function multyply(a) {
  return function temp(b) {
    return a * b;
  }
}

Итог. Вот это по-настоящему задание мне понравилось. Но как видно, я опять забыл добавить проверку на число. Фейл.

4. Какие способы передачи данных без перезагрузки страницы вы знаете?
Для меня знакомы лишь 3 технологии: ajax, websocket, webrtc. Но чтение документации socket.io показало мне еще пару-тройку устаревших механизмов, вроде long-pooling и comet.

5. Задание для верстальщиков
Это самое сложное задание. Здесь без Photoshop'a никуда. Откуда ещё копировать CSS-ый код?

5.1. Сверстайте контрол оценки и показа рейтинга
http://jsfiddle.net/hr8wK/
Итог. Нет обработки кликов на js, семантически неверная разметка.

5.2. Сверстайте прогресс-бар
http://jsfiddle.net/rCSBu/3
Итог. Пытаясь добавить все префиксы браузеров я забыл добавить w3c свойство!

5.3. Сверстайте кнопку
http://jsfiddle.net/CJmhU/1
Итог. Нет EventListener'a.

5.4. Сверстайте список из иконок
Тут нет нареканий

5.5. Сверстайте текст
http://jsfiddle.net/r3VkB/2
Итог.  Еле победил свой перфекционизм. Сверстал через таблицы. Кое-где выбрал неправильный полуторный пробел.

Epic fail. От себя добавлю - никогда не публикуйте свои задания в 12 часов вечера! Подождите до середины дня. Покажите код своему знакомому прогеру, или скиньте на форум - пускай поругают. Не торопитесь и все будет ок. Читайте-перечитывайте задания. Делайте чуть больше написанного. И тогда вас возьмут. Наверное...

Советую к прочтению:
Используем Construct 2 в больших проектах