Как произвести на меня впечатление на собеседовании

За последние несколько лет я опросил десятки кандидатов на должности, связанные с JavaScript. За это время я выделил несколько ключевых областей, которые кажутся довольно хорошими показателями общего уровня владения языком, и я сосредотачиваюсь на них в основном исключительно в своих технических собеседованиях.

Прежде всего, этот пост о том, чего ожидать от собеседования со мной. Но это также касается того, как проводить техническое интервью с кандидатами на JS и какие области предлагают лучшее соотношение сигнал / шум.

Это не тест

Самое важное, что я стараюсь подчеркнуть на любом техническом собеседовании, - это то, что я не провожу тест. Что меня действительно интересует, так это использование вопросов как инструмента для облегчения разговора о коде.

Поэтому, если я прошу вас написать функцию memoize (), я действительно хочу дать нам отправную точку для разговора о функциях и замыканиях высшего порядка. Меня действительно не волнует, сможете ли вы написать эту функцию в уме. Вместо этого я действительно ищу, сможете ли вы прийти к решению с небольшим руководством и понимаете ли вы лежащие в основе концепции.

Если вы застряли в пути, попросите помощи. И если вы категорически не знаете ответа, это тоже нормально. Я постараюсь объяснить это, и мы вместе поработаем над другим примером.

Одна из самых впечатляющих вещей, которую вы можете сделать на собеседовании, - это узнать что-то новое, а затем применить это. Это позволяет мне увидеть, как вы думаете о проблемах, и усвоить новую информацию.

В любом случае, суть в том, что ничего не знать - это нормально.

Доски

Кажется, что в наши дни во время собеседований очень много тревожат по поводу работы с доской. Каждые пару недель я вижу в Hacker News статью о том, какая это ужасная устаревшая практика.

И по большей части я согласен.

Тем не менее, если вы проведете у меня собеседование, вам следует ожидать, что вы войдете в комнату с белой доской на стене. И вы должны ожидать, что мы им воспользуемся.

Доски отлично подходят для быстрых примеров. Если я спрошу вас, что такое IIFE или как написать троичное выражение, я надеюсь, что вы сможете записать это на доске. Или, может быть, я напишу функцию на доске и спрошу вас, какое возвращаемое значение имеет определенный набор аргументов.

Чего я не буду никогда сделать - и что, по моему мнению, является основной причиной опасений по поводу использования интерактивной доски, - это попросить вас написать на доске какую-нибудь большую функцию из 20 строк. Это неестественно, это медленно, и, честно говоря, мне все равно довольно сложно читать ваш код таким образом.

Фреймворки и библиотеки

Плевать.

Как разработчики JavaScript, мы используем сторонний код весь день, каждый день. В интерфейсе есть jQuery, Underscore, Backbone, Ember, Angular, React, Moment, D3, Bluebird, THREE и еще миллион других. С Node на npm сейчас около 166 000 пакетов.

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

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

Просто меня это не особо беспокоит.

Замыкания и функции первого класса

Очень важно. Я ожидаю, что все, с кем я беседую, будут очень довольны этими концепциями.

Вот типичный пример, который я могу показать кандидату:

// write a function called `partial` that makes 
// the following snippet work
function add( a, b ) {
  return a + b;
}
var add5 = partial( add, 5 );
add5( 4 ); // 9

Если это вызывает впечатление оленя в свете фар, я мог бы направить дискуссию следующим образом:

«Хорошо, похоже, partial () принимает два аргумента. Один - это функция, а другой - число ».

Обычно это приводит нас, по крайней мере, к этому моменту:

function partial( fn, num ) {
}

"Большой. И partial () должен возвращать функцию, потому что мы присваиваем ее возвращаемое значение add5, а затем вызываем add5 () ».

partial( fn, num ) {
  return function() {
  };
}

"Прохладный. Это основная идея. Итак, если add5 - это функция, которую возвращает частичное, и она ожидает число в качестве аргумента, куда это денется? »

Обычно в этом месте загорается лампочка.

partial( fn, a ) {
  return function( b ) {
    return fn( a, b );
  };
}

Опять же, дело здесь не в том, что вы можете сделать это без какой-либо помощи (хотя это здорово, и это то, что я ожидал бы от более старшего кандидата). На что я действительно надеюсь, так это на то, что вы сможете добиться этого, немного руководствуясь указаниями.

Прототипное наследование

Это определенно та область, которая имеет тенденцию отделять младших разработчиков от более старших, хотя, на мой взгляд, это должен знать каждый, претендующий на роль JS.

Вот проблема, которую я могу задать кандидату:

// make a class called `Square` that inherits from 
// `Rectangle` and satisfies the following snippet
function Rectangle( width, height ) {
  this.width = width;
  this.height = height;
}
Rectangle.prototype.area = function() {
  return this.width * this.height;
};
// your code here
var square = new Square( 4 );
square.area(); // 16
Square.prototype.area === Rectangle.prototype.area; // true

Если вам это кажется чуждым, я настоятельно рекомендую освежить в памяти прототипное наследование. Это действительно не так сложно, как только вы освоитесь, и это чрезвычайно мощная и важная функция JavaScript.

О, и вот ответ:

function Square( length ) {
  Rectangle.call( this, length, length );
}
Square.prototype = Object.create( Rectangle.prototype );

Что это такое?

Вероятно, в JS нет другой функции с более низким соотношением простоты и путаницы, чем ключевое слово this. Фактически вы можете узнать все об этом за час, но многие разработчики JS никогда этого не делают.

Вы должны знать, как работают Function # call () и Function # apply (). Они абсолютно необходимы для написания JS на высоком уровне, и их очень легко понять.

Это низко висящий фрукт.

Асинхронный

Еще один важный вопрос, особенно если вы подаете заявку на работу, где будете использовать Node.

Вот вопрос, который я мог бы задать:

// write a function called `shout` that accepts
// a string and a callback function, and uses
// `exclaim` and `yell` to transform its input
function exclaim( value, fn ) {
  setTimeout(function() {
    fn( value + '!' );
  }, 100 );
}
function yell( value, fn ) {
  setTimeout(function() {
    fn( value.toUpperCase() );
  }, 100 );
}
shout( ‘hello’, function( shouted ) {
  console.log( shouted ); // ‘HELLO!’
});

Опять же, это действительно то, что я ожидаю, что каждый кандидат на JS будет доволен. Если вы собираетесь дать интервью для выступления на JS, и вы не знакомы с этим, бросьте то, что вы делаете, и потратьте некоторое время на практику. Это так важно.

О, и решение этой проблемы:

function shout( value, fn ) {
  exclaim( value, function( exclaimed ) {
    yell( exclaimed, fn );
  }); 
}

Вопросы-трюки

Лично не фанат.

В тех редких случаях, когда я все-таки задаю хитрый вопрос, я назову его заранее, и мне будет все равно, если вы пропустите «уловку». В таких случаях я действительно пытаюсь начать разговор, например:

"Не совсем. Помните, переменные в JavaScript поднимаются… »

«На самом деле это ReferenceError. Вы понимаете, почему? "

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

Продвинутый материал

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

На этом этапе собеседования я обычно довольно уверен, что кандидат понимает язык от среднего до продвинутого, и мои цели на собеседовании начинают немного меняться.

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

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

Я мог бы попросить вас использовать Object.defineProperty или написать функцию карри. Может быть, поговорим о обещаниях или рекурсии.

Это вещи, о которых вы на самом деле не должны знать, но поскольку у вас есть базовые знания, мне нужно задавать такие вопросы, чтобы лучше понять, насколько продвинутый Ты.

Думайте об этом как о дополнительном зачете. Это возможность произвести на меня впечатление. Все, о чем мы сейчас говорим, по сути, является просто бонусным материалом.

Запоминание

Это своего рода сложная область, и я немного противоречу.

Я ожидаю, что специалист по JS старшего уровня знает сигнатуры аргументов для Array # splice () или Function # bind ().

В то же время я никогда не работал в офисе без подключения к Интернету, а поиск информации в MDN занимает около 20 секунд.

Я никогда не опрашиваю кандидатов по таким вещам, потому что это не кажется мне особенно важным. Тем не менее, если в ходе нашего собеседования я понимаю, что вы не знаете, как использовать обычный метод, такой как Array # push (), это довольно хороший показатель того, что вы не писали JS очень долго.

Вкратце: изучите наиболее часто используемые материалы, но не думайте, что вам нужно запоминать всю спецификацию EcmaScript.

Задавать вопросы

Если вы уберете только одно из этого поста, пусть будет это:

Если вы чего-то не знаете или не уверены, спросите меня.

Незнание чего-либо - проблема с очень простым решением. Гораздо труднее исправить недостаток интеллектуального любопытства.

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

Нам всем есть чему поучиться, в том числе и мне. Моя цель всегда заключалась в том, чтобы нанять людей, которые понимают этот факт и искренне заинтересованы в изучении нового и становлении более сильными инженерами.

Я нанимаю

Вам нравится это гипотетическое интервью? Вы в районе Бостона?

Отправь мне электронное письмо и приходи работать над сумасшедшими сверхсекретными вещами в Project Decibel.

Размещено в Hacker News