Недавно мне довелось побывать на встрече участников проекта FreeCodeCamp в Сан-Франциско. Если кто не знает, Free Code Camp — это сообщество, нацеленное на изучение JavaScript и веб-программирования. Там один человек, который готовился к собеседованиям на позицию фронтенд-разработчика, попросил меня подсказать, какие вопросы по JavaScript стоит проработать. Я немного погуглил, но не смог найти подходящего списка вопросов, на который я бы мог дать ссылку и сказать: «Разбери эти вопросы и работа твоя». Некоторые списки были близки к тому, что мне хотелось найти, некоторые выглядели очень уж простыми, но все они были либо неполными, либо содержали вопросы, которые вряд ли кто станет задавать на реальном собеседовании.

image

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

Я буду добавлять и редактировать ответы на эти вопросы здесь. Если у вас возникнет желание что-нибудь дополнить или улучшить — буду рад вашим пулл-реквестам.

Вопросы разбиты на несколько разделов:

  • Теория.
  • Программирование.
  • Отладка.
  • Проектирование систем.

Итак, вот мои вопросы.

Теория


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

  1. Что такое нотация «О-большое» и как ей пользоваться?
  2. Что такое DOM?
  3. Что такое цикл событий?
  4. Что такое замыкание?
  5. Как работает прототипное наследование и чем оно отличается от классической модели наследования? (По моему мнению, это не особенно полезный вопрос, но многим нравится его задавать.)
  6. Как работает ключевое слово this?
  7. Что такое всплытие событий и как работает этот механизм? (Мне этот вопрос тоже не нравится, но его часто задают на собеседованиях.)
  8. Опишите несколько способов обмена данными между клиентом и сервером. Расскажите, не вдаваясь в подробности, о том, как работают несколько сетевых протоколов (IP, TCP, HTTP/S/2, UDP, RTC, DNS, и так далее).
  9. Что такое REST и почему эта технология популярна?
  10. Мой сайт тормозит. Расскажите о шагах по его диагностированию и исправлению. Опишите популярные подходы к оптимизации, и расскажите о том, когда их следует использовать.
  11. Какими фреймворками вы пользовались? Каковы их сильные и слабые стороны? Почему программисты пользуются фреймворками? Проблемы какого рода решают фреймворки?

Программирование


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

?Простые задания


  1. Реализуйте функцию isPrime(), которая возвращает true или false, указывая, является ли переданное ей число простым.

    isPrime(0)                          // false
    isPrime(1)                          // false
    isPrime(17)                         // true
    isPrime(10000000000000)             // false

  2. Реализуйте функцию factorial(), которая возвращает факториал переданного ей числа.

    factorial(0)                        // 1
    factorial(1)                        // 1
    factorial(6)                        // 720

  3. Реализуйте функцию fib(), возвращающую n-ное число Фибоначчи.

    fib(0)                              // 0
    fib(1)                              // 1
    fib(10)                             // 55
    fib(20)                             // 6765

  4. Реализуйте функцию isSorted(), которая возвращает true или false в зависимости о того, отсортирован ли переданный ей числовой массив.

    isSorted([])                        // true
    isSorted([-Infinity, -5, 0, 3, 9])  // true
    isSorted([3, 9, -3, 10])            // false

  5. Создайте собственную реализацию функции filter().

    filter([1, 2, 3, 4], n => n < 3)    // [1, 2]

  6. Создайте собственную реализацию функции reduce().

    reduce([1, 2, 3, 4], (a, b) => a + b, 0) // 10

  7. Реализуйте функцию reverse(), которая обращает порядок следования символов переданной ей строки. Не пользуйтесь встроенной функцией reverse().

    reverse('')                         // ''
    reverse('abcdef')                   // 'fedcba'

  8. Создайте собственную реализацию функции indexOf() для массивов.

    indexOf([1, 2, 3], 1)               // 0
    indexOf([1, 2, 3], 4)               // -1

  9. Реализуйте функцию isPalindrome(), которая возвращает true или false в зависимости от того, является ли переданная ей строка палиндромом (функция нечувствительна к регистру и к наличию в строке пробелов).

    isPalindrome('')                                // true
    isPalindrome('abcdcba')                         // true
    isPalindrome('abcd')                            // false
    isPalindrome('A man a plan a canal Panama')     // true

  10. Реализуйте функцию missing(), которая принимает неотсортированный массив уникальных чисел (то есть, числа в нём не повторяются) от 1 до некоего числа n, и возвращает число, отсутствующее в последовательности. Там может быть либо одно отсутствующее число, либо их может не быть вовсе.

    Способны ли вы добиться того, чтобы функция решала задачу за время O(N)? Подсказка: есть одна хорошая формула, которой вы можете воспользоваться.

    missing([])                         // undefined
    missing([1, 4, 3])                  // 2
    missing([2, 3, 4])                  // 1
    missing([5, 1, 4, 2])               // 3
    missing([1, 2, 3, 4])               // undefined

  11. Реализуйте функцию isBalanced() которая принимает строку и возвращает true или false, указывая на то, сбалансированы ли фигурные скобки, находящиеся в строке.

    isBalanced('}{')                      // false
    isBalanced('{{}')                     // false
    isBalanced('{}{}')                    // true
    isBalanced('foo { bar { baz } boo }') // true
    isBalanced('foo { bar { baz }')       // false
    isBalanced('foo { bar } }')           // false

?Задания средней сложности


  1. Реализуйте функцию fib2(). Она похожа на функцию fib() из предыдущей группы заданий, но поддерживает числа вплоть до 50. Подсказка: используйте мемоизацию.

    fib2(0)                               // 0
    fib2(1)                               // 1
    fib2(10)                              // 55
    fib2(50)                              // 12586269025

  2. Реализуйте функцию isBalanced2(). Она похожа на функцию isBalanced() из предыдущей группы заданий, но поддерживает три типа скобок: фигурные {}, квадратные [], и круглые (). При передаче функции строки, в которой имеются неправильные скобочные последовательности, функция должна возвращать false.

    isBalanced2('(foo { bar (baz) [boo] })') // true
    isBalanced2('foo { bar { baz }')         // false
    isBalanced2('foo { (bar [baz] } )')      // false

  3. Реализуйте функцию uniq(), которая принимает массив чисел и возвращает уникальные числа, найденные в нём. Может ли функция решить эту задачу за время O(N)?

    uniq([])                              // []
    uniq([1, 4, 2, 2, 3, 4, 8])           // [1, 4, 2, 3, 8]

  4. Реализуйте функцию intersection(), которая принимает два массива и возвращает их пересечение. Можете ли вы добиться того, чтобы функция решала эту задачу за время O(M+N), где M и N — длины массивов?

    intersection([1, 5, 4, 2], [8, 91, 4, 1, 3])    // [4, 1]
    intersection([1, 5, 4, 2], [7, 12])             // []

  5. Создайте реализацию функции sort(), которая сортирует числовой массив за время O(N?log(N)).

    sort([])                              // []
    sort([-4, 1, Infinity, 3, 3, 0])      // [-4, 0, 1, 3, 3, Infinity]

  6. Реализуйте функцию includes(), которая возвращает true или false в зависимости от того, встречается ли переданное ей число в переданном ей отсортированном массиве. Может ли функция решить эту задачу за время O(log(N))?

    includes([1, 3, 8, 10], 8)            // true
    includes([1, 3, 8, 8, 15], 15)        // true
    includes([1, 3, 8, 10, 15], 9)        // false

  7. Реализуйте функцию assignDeep(), которая похожа на Object.assign(), но выполняет глубокое объединение объектов. Для того, чтобы не усложнять задачу, можно исходить из допущения, что объекты могут содержать только числа и другие объекты (в них не может быть массивов, строк, и так далее).

    assignDeep({ a: 1 }, {})              // { a: 1 }
    assignDeep({ a: 1 }, { a: 2 })        // { a: 2 }
    assignDeep({ a: 1 }, { a: { b: 2 } }) // { a: { b: 2 } }
    assignDeep({ a: { b: { c: 1 }}}, { a: { b: { d: 2 }}, e: 3 })
    // { a: { b: { c: 1, d: 2 }}, e: 3 }

  8. Реализуйте функцию reduceAsync(), которая похожа на функцию reduce() из группы простых заданий, но работает с функциями, возвращающими promise-объекты, каждый из которых должен быть разрешён до перехода к следующему.

    let a = () => Promise.resolve('a')
    let b = () => Promise.resolve('b')
    let c = () => new Promise(resolve => setTimeout(() => resolve('c'), 100))
    await reduceAsync([a, b, c], (acc, value) => [...acc, value], [])
    // ['a', 'b', 'c']
    await reduceAsync([a, c, b], (acc, value) => [...acc, value], ['d'])
    // ['d', 'a', 'c', 'b']

  9. Реализуйте функцию seq(), пользуясь тем же подходом, что и при работе над функцией reduceAsync(). Эта функция должна принимать массив функций, которые возвращают promise-объекты, и разрешать их один за другим.

    let a = () => Promise.resolve('a')
    let b = () => Promise.resolve('b')
    let c = () => Promise.resolve('c')
    await seq([a, b, c])                  // ['a', 'b', 'c']
    await seq([a, c, b])                  // ['a', 'c', 'b']

?Сложные задания


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

  1. Реализуйте функцию permute(), которая возвращает массив строк, содержащий все пермутации заданной строки.

    permute('')             // []
    permute('abc')          // ['abc', 'acb', 'bac', 'bca', 'cab', 'cba']

  2. Создайте самостоятельную реализацию функции debounce().

    let a = () => console.log('foo')
    let b = debounce(a, 100)
    b()
    b()
    b() // только этот вызов должен вызывать a()

  3. Реализуйте класс LinkedList, не используя встроенные массивы JavaScript ( [] ). Ваш LinkedList должен поддерживать лишь 2 метода: add() и has().

    class LinkedList {...}
    let list = new LinkedList(1, 2, 3)
    list.add(4)                           // undefined
    list.add(5)                           // undefined
    list.has(1)                           // true
    list.has(4)                           // true
    list.has(6)                           // false

  4. Реализуйте класс HashMap, не используя встроенные объекты JavaScript ( {} ) или функцию map(). Вам дана функция hash(), которая принимает строку и возвращает некое число. Эти числа, в основном, уникальны, но возможна и ситуация, когда двум разным строкам соответствуют одинаковые числа.

    function hash (string) {
      return string
        .split('')
        .reduce((a, b) => ((a << 5) + a) + b.charCodeAt(0), 5381)
    }

    Ваша реализация HashMap должна поддерживать лишь 2 метода: get() и set().

    let map = new HashMap
    map.set('abc', 123)                   // undefined
    map.set('foo', 'bar')                 // undefined
    map.set('foo', 'baz')                 // undefined
    map.get('abc')                        // 123
    map.get('foo')                        // 'baz'
    map.get('def')                        // undefined

  5. Реализуйте класс BinarySearchTree. Он должен поддерживать 4 метода: add(), has(), remove(), и size().

    let tree = new BinarySearchTree
    tree.add(1, 2, 3, 4)
    tree.add(5)
    tree.has(2)                           // true
    tree.has(5)                           // true
    tree.remove(3)                        // undefined
    tree.size()                           // 4

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

    let tree = new BinaryTree
    let fn = value => console.log(value)
    tree.add(1, 2, 3, 4)
    tree.bfs(fn)                          // undefined
    tree.inorder(fn)                      // undefined
    tree.preorder(fn)                     // undefined
    tree.postorder(fn)                    // undefined

Отладка


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

  1. Необходимо, чтобы этот код выводил в лог hey amy, но он выводит hey arnold. Почему?

    function greet(person) {
      if (person == { name: 'amy' }) {
        return 'hey amy'
      } else {
        return 'hey arnold'
      }
    }
    greet({ name: 'amy' })

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

    for (var i = 0; i < 4; i++) {
      setTimeout(() => console.log(i), 0)
    }

  3. Необходимо, чтобы этот код выводил в лог doggo, но он выводит лишь undefined.

    let dog = {
      name: 'doggo',
      sayName() {
        console.log(this.name)
      }
    }
    let sayName = dog.sayName
    sayName()

  4. Попытка вызова метода bark() объекта Dog вызывает ошибку. Почему?

    function Dog(name) {
      this.name = name
    }
    Dog.bark = function() {
      console.log(this.name + ' says woof')
    }
    let fido = new Dog('fido')
    fido.bark()

  5. Почему функция isBig() возвращает именно такой результат?

    function isBig(thing) {
      if (thing == 0 || thing == 1 || thing == 2) {
        return false
      }
      return true
    }
    isBig(1)    // false
    isBig([2])  // false
    isBig([3])  // true

Проектирование систем


Если вы не уверены, что знаете, что такое «проектирование систем», сначала почитайте это.

1. Расскажите о реализации виджета автозавершения вводимого пользователем текста. Данные для автозавершения загружаются с сервера. Рассмотрите клиентскую и серверную части системы.

  • Как бы вы спроектировали клиентскую часть системы, которая поддерживает следующие возможности:

    • Получение данных с применением серверного API.
    • Вывод результатов в виде дерева, когда у элементов могут быть родительские и дочерние элементы, то есть, подсказки автозаполнения — это не обычный плоский список.
    • Поддержка, помимо обычных текстовых фрагментов, элементов разных типов: флажков, радиокнопок, иконок.

  • Как выглядит API компонента?
  • Как выглядит серверное API?
  • Какие соображения, касающиеся производительности, нужно учитывать для того, чтобы виджет работал в режиме реального времени, выводя подсказки по мере ввода данных пользователем? Есть ли здесь какие-нибудь пограничные случаи (например, когда пользователь вводит текст быстро при медленном сетевом соединении)?
  • Как бы вы спроектировали сетевую подсистему и серверную часть высокопроизводительного решения такого рода? Как организовали бы взаимодействие клиента и сервера? Как данные хранятся на сервере? Как всё это масштабируется для поддержки больших объёмов данных и большого количества клиентов?

2. Расскажите о реализации сервиса, подобного Twitter, описав клиентскую и серверную части (этот вопрос бессовестно украден у моего друга Майкла Ву).

  • Как твиты загружаются с сервера и выводятся в пользовательском интерфейсе?
  • Как, при обновлении твитов, обновляется лента? Как клиентская часть приложения узнаёт о появлении новых твитов?
  • Как выполняется поиск по твитам? Как организован поиск по автору? Расскажите о том, как спроектирована база данных, серверная часть приложения и API.

Итоги


Надеемся, эти вопросы пригодятся и тем, кто собирается на собеседования, и тем, кто их проводит. А если вы не относитесь ни к тем, ни к другим, полагаем, вопросы помогут вам поддерживать себя в хорошей программистской форме.

Вот, кстати, ещё несколько мест, куда можно заглянуть, если вам хочется попрактиковаться: The Algorithm Design Manual, задачи с соревнований CodeJam, репозиторий keon/algorithms. А вот — несколько ресурсов, которые будут полезны JS-разработчикам: JavaScript Allonge, You Don’t Know JS, Effective JavaScript.

Уважаемые читатели! Если у вас есть на примете вопросы, которые, по вашему мнению, стоит добавить в этот список (или если вы обнаружите ошибку) — расскажите нам и напишите автору этого материала.
Поделиться с друзьями
-->

Комментарии (117)


  1. Akuma
    31.07.2017 16:32
    +10

    Собеседование для фронтенд-разработчика на JavaScript


    Как-то вы под конец скатились совсем не во фронтенд.

    Как выглядит серверное API

    Как бы вы спроектировали сетевую подсистему и серверную часть

    Расскажите о том, как спроектирована база данных, серверная часть приложения и API


    1. pm_wanderer
      31.07.2017 18:35
      +9

      Вероятно HR думают, что фронтенд — это от слова «передовик»)
      Ну типа все знает и все умеет, как передовик производства в СССР)


  1. vlreshet
    31.07.2017 17:17
    +36

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

    Ну серъёзно, в каких условиях реально нужен программист который на собеседовании, с ходу, напишет бинарное дерево и три поиска к нему? Это же нормальная такая задача


    1. gibson_dev
      31.07.2017 19:11

      После вот таких вот программистов начинается css on js и так далее) Все таки устройтсво дома и стилей знать то надо, а не только js


      1. enload
        01.08.2017 13:07
        -1

        можете, пожалуйста, пояснить, в чем проблема с cssinjs? Вы же не имеете в виду инлайн-стили?


  1. Zet_Roy
    31.07.2017 17:17
    +3

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


    1. Defersa
      31.07.2017 18:41
      +2

      Ну легкие и средние задачи делаются с пол пинка, в сложных все как не странно сложнее)


      1. Odrin
        01.08.2017 12:07

        Ну не знаю, debounce и LinkedList — банальщина, да и HashMap тоже. А вот писать свой quicksort без гуглежа как-то лениво.


  1. Marwin
    31.07.2017 17:27
    +34

    каждый раз, когда читаю такие типичные вопросы для собеседований, думаю, что не так в том софте, что я писал последние лет 15. Не спорю, аналогов ПО уровня ядра линукса я не делал, но и калькуляторами назвать те клиент-серверные системы с тысячами онлайн клиентов у меня язык не повернется. Но при этом 99,99% кода — это ведь банальные вызовы методов фреймворка (я пишу на C#) и вычисления вида c=a+b. Максимум необычности за последние годы — это приход linq выражений ну и традиционная возня с мультипоточностью.


    А все эти "реализуйте 100500 способ сортировки пузырьком" вместо родного метода Sort() — имхо совсем мало говорят о ценности человека в командной работе, его энтузиазме и желании у вас работать. Любой может на досуге подтянуть себя в теоретической базе, если будет чувствовать себя лохом среди сильных коллег, было бы желание.
    Не то, чтобы я против того, чтобы программист знал на 5+ теорию, но в современном мире, где ПО устаревает быстрее, чем успевает написаться ТЗ под него — важны немного другие качества. А для гуру место разве что в проектах потипу маткада или там драйверов видеокарт, где на счету каждая ассемблерная инструкция


  1. zenkz
    31.07.2017 17:33
    +1

    В целом подборка полезная и интересная.
    Немного комментариев по вопросам:
    — Не понравились вопросы вида «Реализуйте sort или indexOf». Реализация велосипедов для встроенных в язык методов не является типовой задачей разработчика, и поэтому многие даже опытные разработчики могут показать себя не с лучшей стороны. Если вы хотите проверить понимание работы таких методов, то лучше перенесите их в теорию и вместо «напишите» попросите «рассказать», как бы кандидат реализовал такой метод.
    — Понравились вопросы про отладку — такие вопросы позволяют найти хороших кандидатов. Но обращайте внимание не на результат, а на ход мыслей кандидата. Иногда даже если кандидат не справился с задачей из-за небольшого пробела в знаниях (например не знает формулу или какую-то особенность языка), то ход мыслей может выъявить хорошего разработчика.


  1. Santana
    31.07.2017 17:38
    +10

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


    1. pm_wanderer
      31.07.2017 19:37
      +11

      Авторы этого списка вопросов — freeCodeCamp. Занимаются обучением новичков за донат и продажей бумажных сертификатов. Естественно в их интересах составить этот список таким образом, чтобы ученики не расслаблялись и конвертировались на платные курсы к менторам из ближнего круга. Типичный инфобизнес, короче)


      1. necelentano
        01.08.2017 13:07
        -1

        Вы хотя бы узнайте что такое freeCodeCamp, а то ваш комментарий похож на типичное «экспертное» мнение.
        p.s.
        Собственно он им и является.


        1. pm_wanderer
          01.08.2017 14:15
          +1

          Если сущность выглядит как утка, крякает как утка и летает как утка, то очевидно что это утка)
          Я не верю в добрых самаритян, которые бесплатно тратят свое время на обучение новичков.
          Qui prodest?


          1. necelentano
            01.08.2017 14:27
            -1

            freeCodeCamp — это open source проект. Его созданием и развитием занимаются, в том числе, бывшие ученики.
            Там есть страница доната, но мне интересно где вы нашли плату за сертификаты?
            В крайнем случае можно просто прочитать на wiki — что такое freecodecamp.


            1. pm_wanderer
              01.08.2017 15:10

              Это вроде как стандартная практика. У w3school например эта услуга платная.
              Сейчас посмотрел в интернете и не нашел бумажного варианта этого документа. Видимо в этом пункте я ошибся. Признаю.


              1. AndreyNagih
                01.08.2017 15:39
                +3

                w3school — это ловкие люди, паразитирующие на аббревиатуре w3c.
                Не надо к ним ходить, и тем более, что-то покупать у них.
                Пользуйтесь MDN, caniuse и другими свободными источниками.


                1. pm_wanderer
                  01.08.2017 15:47

                  Я знаю о их недостатках. Качество материала там не очень, но у них можно быстро посмотреть в табличном виде подзабытые особенности некоторых html тегов или css свойств. На MDN оно порой не очень удобно организовано.


                  1. AndreyNagih
                    02.08.2017 06:54

                    Я для этих целей использую htmlbook.ru или его продолжение webref.ru.
                    Там и материал полнее и актуальнее.


              1. dlf42
                01.08.2017 15:46

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


                1. pm_wanderer
                  01.08.2017 15:52

                  Явно платных нет. Однако во многих open source проектах тоже нет платных услуг по добавлению фич. Но это всегда можно обговорить с маинтейнерами и профинансировать ускоренное их внедрение, либо получить более расширенную консультацию по решению своих проблем с продуктом.


  1. vasIvas
    31.07.2017 17:41
    +1

    Я впервые слышу о нотации О-большое. Что это такое?


    1. k12th
      31.07.2017 17:47
      +1

      1. Eldhenn
        31.07.2017 18:00
        +1

        Да, но это «математические обозначения для сравнения асимптотического поведения функций». А что такое «нотация О-большое» в программировании?


        1. k12th
          31.07.2017 18:02

          тьфу, да что такое со мной:( простите. Вот:
          https://habrahabr.ru/post/196560/
          https://ru.wikipedia.org/wiki/%D0%92%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0


          Ну и в общем, гуглится по "о большое сложность алгоритма".


          1. Eldhenn
            31.07.2017 18:07

            Может, так и надо задавать вопрос? «Что вы знаете о сложности алгоритмов, о классах сложности?» Потому что вопрос «нотация такая-то» в собеседовании «программиста-разработчика на технологии такой-то» вызывает несколько иные ассоциации.

            PS Я прекрасно знаю про O-большое, про курс математического анализа, где оно вводится, про нужность его для разработки форм отчётности.


            1. k12th
              31.07.2017 18:11

              Не ко мне вопрос:)


              Если честно, я очень плохо разбираюсь в этой нотации, но у меня ассоциации в сочетании со словом "собеседование" совершенно однозначные.


        1. zenkz
          31.07.2017 22:59
          -3

          Интересно.
          Я подумал, что речь идёт об O-Data, O-Auth и т.д. Короче завалил бы я это собеседование…
          И да. Никогда в жизни не приходилось сталкиваться ни с такими вопросами, ни с такими заданиями в реальной зазработке. Так что фирмы с такими собеседованиями сами себе злобные буратины.


  1. hssergey
    31.07.2017 17:48
    +7

    … а потом человек, успешно прошедший собеседование будет просто верстать формочки для интернет-магазина…


    1. Yeah
      31.07.2017 18:28
      +20

      Нельзя сверстать нормальную формочку без знания о "нотации О большое"


  1. ShamanR
    31.07.2017 18:05
    +1

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


  1. fynivx
    31.07.2017 18:09
    +17

    Куча вопросов по алгоритмам и ни одного по качеству кода.
    Как же вопросы по паттернам, по SOLID, по тестированию, по командной работе, по каким-нибудь заковыристым особенностям JS, которых в нем воз и маленькая тележка?

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


    1. ankh1989
      01.08.2017 09:41
      +2

      Все эти паттерны и заковыристые особенности JS точно также бесполезны, имхо. Типичная задача в совеременной ИТ конторе выглядит как то так: вот есть такая непонятная фигня и вот три каких то тулзы и пара фреймворков написанных на странных диалектах языков похожих на си и джаву, и из них за два месяца надо собрать вот такой прототип который не стыдно будет показать, а там уже допилим если взлетит. Времени на паттерны обычно нет.


  1. pm_wanderer
    31.07.2017 18:56
    +5

    Когда я ищу себе человека, я задаю ему лишь 3 вопроса:
    1) Почему значение вновь созданной переменной равно undefined? (теория)
    2) Как написать делегирование обработки клика на кнопке для структуры элементов типа ul > li > button > «some content» (практика)
    3) React это библиотека или фреймворк? Почему так, а не иначе? (критическое мышление)

    Потом слушаю ответы и наблюдаю ход мысли. В целом этого достаточно, чтобы составить первичное мнение о человеке. Все остальное покажет практика.

    PS:
    Писать код на бумажке не заставляю)


    1. ankh1989
      01.08.2017 09:46

      На третий вопрос я бы не смог ничего внятного ответить. Хз что это. Экосистема наверно. И да, я один из тех кто пишет этот реакт :)


      1. pm_wanderer
        01.08.2017 12:06

        Там все дело в инверсии управления)


        1. Odrin
          01.08.2017 12:29

          Вы о том, что у библиотеки мы вызываем ее методы, а фреймворк вызывает наши методы?


          1. pm_wanderer
            01.08.2017 13:04

            Именно так)


            1. grossws
              01.08.2017 13:15

              Т. е. библиотека дёргающая callback'и уже фреймворк? А фреймворк, который настраивается и запускается из условного main — уже библиотека? Смело.


              1. pm_wanderer
                01.08.2017 13:53

                Не совсем. Callback можно передать методу библиотеки, но мы сами решаем когда вызывать этот метод. Например объект XMLHttpReques. Пока мы явно не сделаем ajax запрос, переданный в него callback будет висеть и ждать внутри свойства этого объекта. В случае с фреймворком, он сам решает что и когда должно произойти, следуя своей внутренней логике. Нам остается лишь предоставить колбэки и ждать пока система их сама вызовет.

                Да и первоначальный вопрос был больше о React, который очевидно не библиотека, в классическом смысле этого слова, и явно не просто view. Однако многие люди склонны верить тому что написано, а не тому что видят.

                О тонкостях в настраивании фреймворков внутри main судить не берусь, ибо не совсем понял как это должно работать)


                1. grossws
                  01.08.2017 14:49

                  У почти любого фреймворка есть какие точки входа/процедуры инициализации. В том же react вы рано или поздно должны сделать ReactDOM.render, чтобы подцепить компонент к реальному dom'у. Примерно такая же ситуация часто и в других языках, где рано или поздно надо вызвать точку входа в конкретный фреймворк.


                  Иногда этот кусок уже написан и про него не нужно париться: java war в сервлет-контейнере/аппсервере, spring boot приложение (с некоторой натяжкой, один static метод с одним аргументом там таки дёрнуть надо), rails и многие другие.


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


                  1. pm_wanderer
                    01.08.2017 15:25

                    Я лично руководствуюсь фразой Мартина Фаулера:

                    Inversion of Control is a key part of what makes a framework different to a library. A library is essentially a set of functions that you can call, these days usually organized into classes. Each call does some work and returns control to the client.

                    A framework embodies some abstract design, with more behavior built in. In order to use it you need to insert your behavior into various places in the framework either by subclassing or by plugging in your own classes. The framework's code then calls your code at these points.


                    Вообще в IT очень много сложных вещей, которым тяжело дать однозначное определение. Тот же паттерн MVC: одна и та же схема взаимодайствия компонентов у Майкрософт называется MVP, однако Эппл считает тоже самое истинным MVC. Нам остается лишь принимать сторону того, кого считаем авторитетом в исследуемом вопросе. Главное не устраивать крестовых походов)


                    1. grossws
                      01.08.2017 15:29

                      Тогда моё восприятие плюс-минус совпадает с тем, что утверждает Fowler. В частности, второй абзац вашей цитаты по сути про навязывании архитектурного решения.


                      1. pm_wanderer
                        01.08.2017 15:40

                        И там кстати он акцентирует внимание на том, что это одна из ключевых особенностей, но не единственная. Тем самым оставляя пространство для маневров и существования иных мнений. Я считаю что при взаимодействии в команде желательно иметь рядом тех людей у которых почитаемые авторитеты в мире разработки ПО по большей части совпадают с вашими. Это разрешает многие вопросы о code style, паттернах, best practices и т.д.


            1. Odrin
              01.08.2017 13:33

              React.createElement, React.createFactory, React.cloneElement — React библиотека?
              componentWillMount, componentDidMount, shouldComponentUpdate, render — React фрэймворк?

              И это касается не только React.


              1. pm_wanderer
                01.08.2017 13:58

                Ничто не мешает фреймворкам иметь статические методы. Как минимум, там должен быть метод типа init().


    1. ankh1989
      01.08.2017 09:49
      +1

      По первому вопросу. Там наверно есть какой то умный ответ, но почти наверняка оно undefined лишь потому что когда то у Брендана Айка не было времени (как обычно) и он что то там нахреначил с пометкой TODO, а оно так и осталось, а потом уже поздно было менять потому что много чего бы поломалось.


      1. oxidmod
        01.08.2017 10:15

        А не потому что инициализация и присвоение раздельны? Можно инициализировать, но не присвоить никакого значения.


        1. ankh1989
          01.08.2017 20:30
          +2

          Вы ищете скрытый смысл и суть там где этого нет. Брендан когда то почесал в затылке и решил что будет undefined, а могло быть null. Теперь это стандарт чтобы не портить обратную совместимость. Вот и всё.


      1. pm_wanderer
        01.08.2017 12:25

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


    1. AnneSmith
      01.08.2017 13:07
      +2

      хороший список, чтобы не тратить время на интервью с вами :)


    1. OlegTar
      01.08.2017 16:58
      +1

      1) и почему?


    1. Louter
      04.08.2017 14:10

      Зануда-мод скажет, что Реакт это идея, нормативы, а вот ReactJS…


  1. bo883
    31.07.2017 19:22

    попробую пройти данный опросник, будет забавно узнать.


  1. Lofer
    31.07.2017 19:40
    -4

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

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

    Мыши продолжают хрустеть кактусом, в надежде что получится текилла :)


    1. stardust_kid
      01.08.2017 11:18
      +2

      Еще один все понял


      1. Lofer
        01.08.2017 16:49

        А можно пояснить Ваш посыл?


        1. zavvla
          07.08.2017 14:39

          У нас есть 12 стандартов, давайте сделаем 1 универсальный — компания А
          У нас есть 13 стандартов, давайте сделаем 1 универсальный — компания B
          У нас есть 14 стандартов, давайте сделаем 1 универсальный — Lofer


          1. Lofer
            07.08.2017 22:36

            Понятно :) Вопрос универсальности я не ставил, и не понятно откуда Вы его придумали.

            У нас есть 14 стандартов, давайте сделаем 1 универсальный — Lofer

            Ну давайте посмотрим эволюцию ECMA-262. Let добавили с более адекватным поведением, class добавили. На мой взгляд — двигаются в сторону «как у всех», а поскольку сделали TypeScript, который еще более «как у всех» и webAccembly шустро распихали по основным движкам, видимо не достаточно быстро JS двигается в сторону «как у всех»


  1. altai2013
    31.07.2017 20:28
    +5

    Какой-то институтский список вопросов от теоретиков программирования. Мне бы показалась довольно странной компания, которая на собеседовании фронтендера задаёт подобные вопросы. С реальной работой все эти вопросы никак не связаны, за исключением раздела «найдите ошибку».
    Супруга проходила собеседование в прошлом месяце. Два этапа: на первом просили выполнить тестовое задание с AngularJS, на втором этапе в скайпе просили рассказать о себе и своём опыте работы. Всё, никаких бинарных деревьев, O больших и серверного API.


  1. oleg_gf
    31.07.2017 23:44
    +1

    Первый встречный вопрос — сколько мне заплатят за прохождение этих тестов? )))


    1. Antelle
      31.07.2017 23:58

      Хорошо заплатят. Но будут ещё и другие тесты.


  1. Duke565
    01.08.2017 08:07

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


    1. andreysmind
      01.08.2017 10:19

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


      1. egoserg
        01.08.2017 13:50

        А в итоге стартап не злетает.
        Но код, как у кота яйца.
        :-)


      1. tema_sun
        01.08.2017 15:25

        Точно. Там где я работаю за деньги куча спагетти и костылей. Но оно работает и приносит деньги. А мой идеальный проект живет только на моем локальном сервере, потому что «надо еще немного подкрутить» =)


  1. jehy
    01.08.2017 09:08

    А мне понравился список. Мне часть из этих вопросов задавали, ответил без особых проблем. Правда, брали на тимлида по бэкенду.


  1. andreysmind
    01.08.2017 10:15
    +4

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


  1. retran
    01.08.2017 12:59
    +2

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


    1. raveclassic
      01.08.2017 13:37
      +2

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


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


      1. retran
        01.08.2017 14:13

        Там нету задач, для которых требуется помнить какие-либо сложные алгоритмы. Если человек помнит базовые принципы бинарного поиска, бинарного дерева и знает что такое рекурсия — то бинарное дерево и квиксорт он напишет. И механизм разрешения коллизий придумает, если просто знает что такое хэш-функция. А если не помнит… Это не «не помнит», это «не знает». Он просто не потратил за всю свою карьеру два-три вечера чтобы разобраться с простейшей базой (которую надо знать, даже если в работе он использует готовые библиотеки. Потому что абстракции текут). Тогда пусть говнокодит в другом месте, ни программировать ни учиться он просто не умеет, и пригоден только для решения типовых сценарных задач.


        1. PerlPower
          02.08.2017 23:21
          -1

          image


    1. OpieOP
      01.08.2017 14:16

      Даже если прочтешь эту книжку, то все равно все это забудешь через год-два по причине неиспользования.


      1. retran
        01.08.2017 14:23

        Ни разу не встречал человека забывшего базовые вещи.


        1. grossws
          01.08.2017 14:50

          Забудет даже то, что не знал. Как студенты регулярно забывают на экзаменах.


          1. Free_ze
            03.08.2017 14:05

            Кажется, они как раз вспоминают то, что никогда не знали.


        1. Lofer
          01.08.2017 17:11
          +1

          Ни разу не встречал человека забывшего базовые вещи.

          Базовые для кого?
          Пошел я как-то пообщаться пару лет назад. И спрашивают у меня «а скажите нам, а что такое SOLID для архитектуры ?» Я честно сказал не знаю, потому что этот SOLID у меня ни с чем не ассоциировался, только на переферии сознания мелькнуло «что-то знакомое». Пришел я домой и начал читать что такое SOLID? И где-то минут через 10 вспомнил! Читал я расшифровку этого SOLID лет 5..7 назад, но поскольку эти принципы и так использовались по отдельности и под другими названиями и ничего нового не давало, то в голове просто не запомнилось, а мозг решил не запоминать «мусор».
          И вот вопрос: ты не знаешь как проектировать/писать софт или не знаешь как расшифровывается SOLID? Да и сейчас мозг просто отказывается это запоминать.
          Я не вижу в этой ситуации ни одной выйгравшей стороны.
          Сейчас плодится столько разной фигни делающие весьма схожие вещи, но под разными названиями что мозг просто заполнен всяким шлаком. А если учесть, то у тебя есть еще и текущий проект(ы) со своей предметной областью, то это все превращается в какой-то сюрреализм.


          1. retran
            01.08.2017 17:48
            +3

            Перечитайте задачи. Речь о совершенно базовых вещах — бинарный поиск, обход бинарного дерева, рекурсивная сортировка. Это есть в ЛЮБОЙ книжке по базовым алгоритмам. Вы этим пользуетесь каждый день, когда используете, например, ассоциативные массивы или индексы в базах данных. Это вещи которые с листком бумажки и ручкой объясняются за несколько минут и потом не забываются, потому что они слишком простые чтобы их забыть и вы их начинаете видеть их везде. Даже если какие-то детали забываются — с тем же листком бумажки они восстанавливается за минуты, если вы хотя бы один раз в жизни написали руками этот несчастный бинарный поиск.

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

            UPD. И да, если человек придет на собеседование и не сможет рассказать про бинарный поиск — у меня возникнут очень большие сомнения в его способности программировать. Именно программировать, а не собирать что-то по туториалу из кусочков кода. Потому что очень сложно научиться программировать и пройти мимо настолько базовых вещей.


            1. Lofer
              01.08.2017 18:26

              Вы этим пользуетесь каждый день, когда используете, например, ассоциативные массивы или индексы в базах данных

              Серьезно? :) а почему именно бинарное дерево?
              А давайте сразу все эти индексы?
              • B-tree indexes
              • B-tree cluster indexes
              • Hash cluster indexes
              • Global and local indexes
              • Reverse key indexes
              • Bitmap indexes
              • Function-based indexes
              • Domain indexes

              потому что они слишком простые чтобы их забыть и вы их начинаете видеть их везде.
              Человеку с молотком везде мерещатся гвозди? :)
              Сколько раз в жизни Вы реализовали свой индекс для поиска? сколько раз в жизни Вы просчитали цену этого алгоритма и сравнили с другими алгоритмами для всех сценариев? или выбирали из готовых согласно рекомендаций «прозводителя»?
              если вы хотя бы один раз в жизни написали руками этот несчастный бинарный поиск.

              У меня было пару преподавателей информатики, которые еще с 60-х годов работали на вычислительных машинах (лет 30...35 опыта работы от ламповых шкафов до Intel Pentium). Ни разу не помню, что бы заостряли внимание на бинарных деревьях как на таковых, зато отлично вбили в голову как анализировать алгоритмы и оптимизировать их исходя из поставленных задач и доступных ресурсов. «Этот несчастный бинарный поиск» проходил просто как один многих наглядных примеров. Учили создавать и опимизировать, а не тупо пользовать.
              Есть разница между заполнить таблицу умножения и просто уметь умножать :)
              Вы требуете «таблицу уможение», а не умения умножать :)
              За эту науку им благодарен безмерно, а не за алгоритмы как таковые.


              1. retran
                01.08.2017 19:11

                Последний раз я писал свой индекс два месяца назад. Но, соглашусь, это специфика задач.


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


  1. First_Spectr
    01.08.2017 13:07

    Неплохо было бы представить решение задачек, я кое как их решил, но интересно как это сделать красиво.



  1. isawillbenice
    01.08.2017 13:07

    Как работает прототипное наследование и чем оно отличается от классической модели наследования? (По моему мнению, это не особенно полезный вопрос, но многим нравится его задавать.)

    Кто-нибудь может привести примеры отличий? Мне в голову приходит только то, что в прототипном наследовании можно добавлять методы динамически


    1. Lofer
      01.08.2017 17:16

      Как работает прототипное наследование и чем оно отличается от классической модели наследования? (По моему мнению, это не особенно полезный вопрос, но многим нравится его задавать.)

      Кто-нибудь может привести примеры отличий? Мне в голову приходит только то, что в прототипном наследовании можно добавлять методы динамически

      Как по мне, так это похоже на ручную сборку таблицы функций «руками» в момент исполнения, вместо компилятора.


  1. orangeShadow
    01.08.2017 13:07
    +2

    Вот, что хочется сказать насчет задач, вот делаю я их все на таких ресурсах как codewars, hackerrank, и т.д Но это все тогда когда моя голова чиста и хочет нагрузиться, но дай мне эти вопросы в обстановке интервью, я буду на них смотреть как баран на новые ворота, и так даже пару раз бывало. Самое обидно, что в действительности эти знания реально не нужны в 80 процентах случаев. И я честно говоря, не понимаю зачем задавать все эти вопросы на интервью, создайте тестовое задание, приближенное к реалиям вашей фирмы дайте срок человеку, и если он его выполнит успешно это будет ответ на вопрос как он программирует, на крайний случай задайте вопросы по его коду, а это вся теория, блин, я ее забыл больше за 10 лет, чем многие знали, потому как голова забита текущими проблемами


  1. vt4a2h
    01.08.2017 14:58

    Интересно читать комментарии вроде: «я Senior Angular Developer и такие задачи оторваны от практики и вообще оскорбляют мои религиозные чувства...», «да это только студенты помнят...», «да уже же всё давно реализовано...» и т.п.
    Я может быть сейчас скажу очевидную вещь, но эти задачки просто проверяют способность человека думать и решать проблемы. Большую часть из них вообще можно оторвать от конкретного языка программирования. Ты можешь, например, забыть какие-то свойства красно-чёрных деревьев, но их всегда уточнить в том числе и на собеседовании. Грубо говоря, никто (окей-окей, зануды, почти никто) на собеседовании не хочет проверить помнишь ли ты число пи до n-ного знака, интереснее знаешь ли ты что это и зачем, и сможешь ли при необходимости использовать. Ход твоих мыслей, варианты решения, вопросы которые ты задаёшь — это реальная ценность таких собеседований. Причём, максимальная оторванность от технологий и языков — это плюс. Технологии меняются, и человек с соответствующим уровнем инженерной культуры и мышлением без труда в них разберётся.
    Вопрос только в том, кто нужен компании: обезьяна для решения бизнес задач, которая гуглит и копипастит или разработчик. Пока абстракция не потекла или страничка не начала загружаться два часа (потому что кто-то написал 6 вложенных for'ов :)) и рендеринг тормозить, можно говорить, что базовые знания не нужны, но вот когда это случится, знания очень даже пригодятся. Я при этом не хочу сказать, что гуглить это плохо, не думать и не понимать при этом, вот что гораздо хуже.
    И ещё раз, это не просто какая-то ненужная в 99% случаев теория. Это фундаментальные знания, которые формируют тебя как профессионала и влияют на твоё мышление.


    1. Calc
      01.08.2017 15:31

      обезьяна для решения бизнес задач, которая гуглит и копипастит или разработчик.

      ну тут явно вопрос в цене.
      За одну сумму при таких задачах, я просто встану и уйду с собеседования, за интересную зарплату, буду сидеть и вспоминать всю теорию.
      Как сказал человек выше, я за 10 лет забыл больше, чем знают текущие разработчики. Вопрос в цене.


      1. vt4a2h
        01.08.2017 15:59

        Компенсация напрямую зависит от ваших знаний. Т.е. пока люди не узнают что вы реально можете и насколько это соотносится с теми задачами, которые они хотят с вашей помощью решить, я уверен, что они вам не предложат существенную сумму.
        Никто же не скажет: «решишь вот эти базовые задачки, и мы тебе будем платить 10k USD net в месяц». Нормальная компенсация предполагает, что либо у вас есть репутация и вы известный спец, либо вам придётся доказывать, что вы чего-то стоите и вас прогонят через 2-3 собеседования (в лучшем случае), первым из которых будут те самые задачи, которые описали выше. Это разумно, что если у человека нет базовых знаний, то дальше он не пойдёт.


      1. retran
        01.08.2017 16:05
        +2

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


        1. Calc
          01.08.2017 16:07
          -1

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


          1. vt4a2h
            01.08.2017 16:16
            +1

            Решать или не решать — это ваше право и ваш выбор.
            Как проверять вашу профпригодность — выбор работодателя.

            А теория учится за время испытательного срока.

            Какую теорию вы имеет ввиду?

            Мне кажется, что мы отклонились от темы.


        1. SoulAge
          03.08.2017 13:22

          Он его использует в той или иной степени каждый день, все-таки. А вот типичный электрик может его и не знает. Ну то есть он помнит из школы что-то невнятное про «сила тока прямо пропорциональна напряжению и обратно пропорциональна сопротивлению», но не понимает природы закона и его физической сути.
          Зато он знает какие провода с какими соединять нельзя.

          Я вот, к сожалению, уже не помню некоторых замечательных пределов или известных интегралов. И, не уверен, что смогу в стрессовой ситуации посчитать детерминант матрицы. Но знаю, что за полчаса разберусь и все вспомню, если будет доступ к источнику знаний, так как вспоминать гораздо проще чем учить. Вопрос к топику только один — можно ли пользоваться интернетом, как в жизни или все «рожать» из головы?


          1. retran
            03.08.2017 14:54
            +1

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


    1. maximpechenin
      01.08.2017 15:46

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


      Всё-таки у каждой области есть своя специфика. Я вот имею высшее образование в области Информационных Технологии, в школе был олимпиадником по математике и программированию, занимал призовые места на областных соревнованиях. В общем теоретически подкован. Уже 6 лет работаю в области веб-разработки и вот хоть убейте не могу представить, как я прихожу в гейм-девелопмент и «без труда в нём разбираюсь».

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


      1. vt4a2h
        01.08.2017 16:09

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


        1. maximpechenin
          01.08.2017 17:15

          Перечитал ваш комментарий, возможно я не правильно понял ваш посыл. Я с вами в целом согласен, однако далеко не всем компаниям хоть сколько-то важны эти самые фундаментальные знания именно в контексте найма фронтенд-разработчика. Не кидайте в меня камнями, это не мое мнение, это факт. Я работал на крупном проекте в качестве фронтенд-разработчика, в команде был человек «из глубинки». У него были серьезные прогалы в знаниях школьной математики, которые всплыли за год ровно один раз. И с ним не было проблем до или после этого, он писал хороший код, который было приятно читать и легко поддерживать. И его не уволили с пометкой «отучиться в школе ещё раз».


  1. Xtray
    01.08.2017 22:55

    А где ответы-то, гуглить что ли?)


  1. vdonich
    01.08.2017 23:21
    +1

    Не представляете, сколько людей сыпется на банальном «загрузить и выполнить N js-файлов по порядку»


  1. RubaXa
    02.08.2017 16:56
    +1

    Тут многие говорят, что задачи «простые», нуну:



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


    1. Defersa
      02.08.2017 17:32

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


      1. RubaXa
        02.08.2017 17:38
        -2

        Так я и говорю, что не понимаю, зачем мне ответ в виде говнокода?! Что он должен мне показать? Если хочется понять, знает-ли человек про рекурсию, ну так спросите его про неё, даже про виды можно поговорить.


        Деревья? Не вопрос, есть DOM, чем не дерево и так далее.


        1. Defersa
          02.08.2017 17:49
          +1

          Ну вопрос про какие-то минимальные знания в математике и алгоритмизации (знание простых чисел, чисел фибоначчи, разных видов деревьев) + умение писать. Этот «говнокод» может и нафиг никому не нужен, но умение человека применить какие то теоретические знания в практике по другому не выявить. Ты можешь знать в теории много чего умного, но какой от этого толк, если применить не можешь?


        1. Lofer
          02.08.2017 18:44

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

          • Что такое цикл Карно ?
          • расчитайте трения качения колес вашей машины ?
          • Нарисуйте фронт детонации от свечи в двигателях машин ?
          • Чем отличается двигатель из чугуна, стали, аллюминия, керамики ?
          • Что такое двигатель внутреннего сгорания, внешнего сгорания ?
          • Соберите паровую машину из зажигалки зиппо, пружинки от шариковой ручки и корпуса металлического карандаша ?

          Ага, не знаешь! Как ты тогда собираешься водить такси или трактор?

          Вот как-то же без этого мозгоклюйства решили проблему в остальном мире, и права признают выданные в другой стране, и медицину и еще много чего.
          А тут какое-то мерянье професионалов «на вес и в ширину»… Как прием в средневековую гильдию :)


        1. Antelle
          02.08.2017 20:22

          1. может ли человек решить задачу простым способом за вменяемое время
          2. объяснит ли код, если задать вопрос
          3. что скажет о вычислительной сложности своего решения
          4. в каких случаях будет его применять и что будет учитывать, принимая решение
          5. расскажет ли, где и как можно оптимизировать
          6. сможет ли ответить на вопрос, когда оптимизировать а когда не надо
          7. если всё хорошо, можно спросить про edge-кейсы и посмотреть, как отреагирует на сложные случаи вроде переполнения стека или очень больших чисел

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


          1. RubaXa
            02.08.2017 20:34
            -1

            фибоначчи, прочтые числа, сортровка, О(n)… ясно, понятно.


          1. zenkz
            02.08.2017 20:54

            Алгоритмы — это хорошо, но нужно говорить не об абстрактных алгоритмах, вроде простых числел, фибоначчи и т.д., а о практических вариантах их применения. Т.е. ответ на вопрос «Как вы организуете очередь в многопоточном приложении» в 100 раз важнее умения написать сортировку или поиск в дереве. Я бы старался придерживаться соотношения 20%/80% в теории и практических заданиях. А практические задачи бы брал из бизнеса, а не из науки.


            1. Antelle
              02.08.2017 21:02

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


            1. bjornd
              03.08.2017 11:20

              Спрашивать у среднестатистического фронтендера «Как вы организуете очередь в многопоточном приложении» бессмысленно, к front-end'у этот вопрос имеет точно меньше отношение чем простые числа и бинарные деревья. Еще варианты? Брать же практические задачи из бизнеса проблематично, потому что уходит много времени на упрощение и формулировку требований. Задачи из статьи уже сформулированы, все определения с ними связанные описаны в wikipedia.


              1. zenkz
                03.08.2017 16:47
                +1

                Про очереди согласен — это для бекэнда вопрос. Просто привёл его для примера.
                Но для фронтэнда тоже полезных вопросов много:
                — Как правильно использовать кэширование браузера?, Как его отключить?
                — Плюсы и минусы использования CDN?
                — Как можно ускорить время загрузки страницы?
                — Основные виды атак на сайт и как от них защититься
                — С какими проблемами браузерной совместимости сталкивались и как решали?
                — Нужно написать интерфейс для существующих WebAPI сервисов за максимально короткий срок, но с возможностью масштабирования в будущем. Какие технологии выберите? Объясните почему…

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

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


  1. devlato
    07.08.2017 14:34

    Считаю, что алгоритмы знать полезно и решать такие задачи нужно уметь, но после прочтения статьи возник вопрос — зачем человеку, который всё это знает, идти в типичную шарагу шлёпать формы? Иными словами, имеет смысл всё это спрашивать, если компания может предложить задачи, которые заинтересуют такого человека, иначе он же отупеет к херам или уйдёт.


  1. Opaspap
    09.08.2017 04:21

    Ни одного вопроса про асинхронное выполнение. Ни одного вопроса про SPA (включая service workers и подобные вещи) это собеседование не на фронтенд.


  1. Opaspap
    09.08.2017 04:31

    Или вот банальный вопрос:

    назовите хотя бы один случай, когда использование document.write()
    может быть необходимо


    1. bjornd
      09.08.2017 08:59

      ответ:

      Не могу, потому что нет такого случая. Все что можно реализовать с помощью document.write — можно реализовать с помощью других средств во всех браузерах моложе 8 лет. Если вы собираетесь поддерживать браузеры старше 8 лет — я лучше пойду.

      Вы еще спросите что делает css-свйоство hasLayout.


      1. raveclassic
        09.08.2017 11:54

        я лучше пойду

        так и было :)


      1. Opaspap
        09.08.2017 18:34

        Про старые браузеры маргинальный случай и я его не имел ввиду (замена currentScript полагаю?), и нет, кое что сделать нельзя другими средствами, стоит вспомнить что именно делает этот метод. Я конечно никогда такую чушь не спрашиваю, но если кандидат ответит таким образом, то он действительно лучше пойдет.


        1. bjornd
          09.08.2017 19:58

          то он действительно лучше пойдет

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

          О, судя по всему это вопрос из раздела «викторины («Какая функция библиотеки X обладает особенностью Y?»)» соседней статьи.


  1. raveclassic
    09.08.2017 11:54

    del