Тест Fizz-Buzz - это вопрос на собеседовании, призванный помочь отфильтровать 99,5% кандидатов на вакансию программистов, которые не могут запрограммировать свой выход из мокрого бумажного пакета. (Wiki.c2.com)

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

Напишите программу, которая печатает числа от 1 до 100.
Но для кратных трех выведите «Fizz» вместо числа, а для кратных пяти выведите «Buzz».
Для чисел, кратных трем и пяти, выведите «FizzBuzz».

1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, FizzBuzz...

Довольно просто, не правда ли? Что ж, на самом деле это может быть сложнее, чем вы думаете!
Каждый язык программирования предоставляет свой собственный способ и инструменты для решения такого рода проблем ... но как мы можем измерить навыки с такой простой задачей?
Это важно. задавать сверхсложные вопросы о параллельном программировании, алгоритмах, теории типов, теории графов…?

Конечно, это важные темы, и их обязательно нужно проверить, но, возможно, вы захотите проверить только его навыки разработчика при отборе кандидата. И здесь на помощь приходит вопрос о FizzBuzz:

  1. Множество возможных подходов.
  2. Каждый разработчик должен пройти этот простой тест.
  3. Это поможет вам понять стиль программирования и подход кандидата.
  4. Как он работает под давлением?
  5. Он заботится о ремонтопригодности? Чистый код? Масштабируемость?

FizzBuzz в JavaScript

Что ж, это не самое чистое решение ... но оно работает!
Пока кандидат пишет приведенный выше код, вы сможете понять кучу вещей:

  1. Он просто пишет быстрое и грязное решение?
  2. Он думает о написании чистого и поддерживаемого кода?
  3. Он начинает что-то планировать на будущее, когда требования могут измениться?
  4. Он пытается произвести на вас впечатление своим языком и логическими знаниями?

В приведенном выше примере ответы могут быть ... да, нет, нет, нет.
Итак, теперь вы можете спросить кандидата, почему он пишет несколько console.log утверждений? Представьте, что вы собираетесь добавить новую супер-классную библиотеку ведения журналов в свое программное обеспечение ... вам нужно заменить четыре console.log оператора!

Ок, отлично! Еще работает! Но по-прежнему существует большая проблема с ремонтопригодностью.
Что, если мы захотим добавить больше управляющих структур? Допустим, мы хотим напечатать «Foo», когда число кратно 7, и «Bar», если оно кратно 11…

Плохая, плохая, плохая идея… Например, теперь мы получили 21, что он должен печатать и «Foo», и «Fizz»… но он печатает только «Fizz»! Поэтому мы должны добавить больше управляющих структур ... которые невозможно поддерживать.

Еще один интересный вопрос: «Почему вы используете несколько операторов else if, которые проверяют простое числовое значение? Есть ли лучшая альтернатива?

switch/case на помощь! Но у нас все еще есть проблема масштабируемости и ремонтопригодности! Давайте исправим это:

Большой! Итак, теперь, если вы хотите добавить еще одно условие к своему оператору switch/case, вы можете просто найти минимальное общее кратное и протестировать его с текущим числом i. Задача решена!

Но теперь ... давайте усложним задачу. Как бы вы подошли к той же проблеме без использования циклов?

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

Оператор распространения + Метод карты, и вот мы здесь! Мы сильно изменили нашу реализацию с самого начала, а?

Давайте проанализируем приведенный выше код:

  1. Кандидат придерживался концепции DRY (Не повторяйся).
  2. Кандидат знает, как легко создать массив с нуля, используя функцию ES6 (Оператор распространения).
  3. Кандидат знает, как работает метод карты и чего ожидать в качестве возвращаемого значения. Может, он знает, что такое Функтор? Это может быть отличный вопрос.
  4. Кандидат решил избежать рекурсии, возможно, зная, что JavaScript имеет много проблем с рекурсией?
  5. Последняя реализация возвращает значение. Таким образом, он не записывает какое-то значение в консоль в первый раз, а объединяет массив значений в строку. Если мы попросим его удалить операцию join, у нас будет суперпроверенный массив значений.

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

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

Итак, это наши тесты! Давайте посмотрим, как кандидату следует провести рефакторинг своего кода:

Большой! Что мы знаем сейчас?

  1. Кандидат разбирается в модульной системе CommonJS.
  2. Мы видим, что он использует некоторые функции ES6, так что, может быть, он знает о модульной системе ES6? Отличный вопрос.
  3. Кандидат по-прежнему уважает концепции DRY.
  4. Код можно сопровождать, тестировать и безопасно. Отличная работа!

Если вы хотите поиграть с этим кодом, я сделал небольшую песочницу с тестами, доступными здесь: https://repl.it/@micheleriva/Jest-FizzBuzz.

Заключение

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

Мы можем многое узнать о программисте, пока он решает эту простую проблему: заботится ли он о чистом коде? Ремонтопригодность? Масштабируемость? Модульность? Тестирование? Я уже упомянул пять огромных тем!

Что еще можно понять от программиста, когда ему дана такая простая задача?

📝 Прочтите этот рассказ позже в Журнале.

👩‍💻 Просыпайтесь каждое воскресное утро и слушайте самые интересные истории недели в области технологий, которые ждут вас в вашем почтовом ящике. Прочтите информационный бюллетень« Примечательно в технологиях .