Как собеседовать джуниоров
От: vsb Казахстан  
Дата: 10.03.22 21:10
Оценка: 14 (2) +2 :)
Приходится мне собеседовать ребят, нужно нанять несколько человек. Джуниоры-мидлы. Особо за ними смотреть некому, поэтому нужно, чтобы писали что-то адекватное, прям нянчиться ресурсов нет.

Я себя вспоминаю, когда первый раз устраивался на работу на 3 курсе. Знал весь стандарт С++ (ну не заучивал, конечно, но по любому вопросу был способен найти раздел). Мог на шаблонах написать факториал. Отлично знал все обычные возможности. Занимал места на олимпиадах в школе, поэтому проблем с алгоритмами, по крайней мере не навороченными не испытывал. На собеседовании меня спрашивали, как написать максимально эффективный TCP-сервер в линуксе, ответ про select не удовлетворил, хотели про epoll услышать, спрашивали, как с select организовать многопоточную обработку запросов. Дали довольно сложную задачу по WinAPI, которую я писал часов 16 на выходных и в итоге сделал.

На собеседованиях я сейчас первым делом даю задачу — написать на JS функцию isPalyndromic(n) — проверить, является ли число палиндромом в десятичной записи. Предполагаемое решение — преобразовать число в строку и сравнить символы. Ожидается, что кандидат знает основы JS (как число в строку преобразовать), умеет писать хоть какой-то код, умеет писать циклы, понимает, что такое массивы. Ну и вообще умеет читать формально поставленную задачу и преобразовать её в программный код. Мой идеальный джуниор должен построить m без преобразования в строку (перевернутая n) и вернуть return n === m (эффективное и с какой-то точки зрения изящное алгоритмически решение без выделения лишней памяти). По факту из трёх кандидатов пока ни один не справился. Один сказал, что они такое не проходили, один написал что-то вроде if (n == 707) console.log("true") else console.log("false") с кучей синтаксических ошибок, один сидел 15 минут и написал только объявление функции. При этом у всех в резюме там технологий насувано — и реакты и фреймворки всякие, и какие-то слова невтемные (что значит технология https в резюме?).

Собеседования или по зуму, тогда через codeshare.io код, я сразу говорю, чтобы писал в чем удобно и копировал результат, или вживую, тогда даю ноутбук с vscode/jetbrains по вкусу.

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

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

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

У меня в целом нет вопросов, как собеседовать человека, у которого 15 лет опыта. С таким я просто общаюсь по его проектам, даю вопросы вроде с какими БД вы сталкивались, как бы подобрали нужную для проекта, ну в общем вопросы больше архитектурного плана. Но с человеком, который цикл не может написать, какая тут архитектура.

Продолжать ли в том же духе?

Кстати многие приходят в возрасте за 30. Работали на несвязанной с программированием работе, потом начали что-то сами изучать и тд.

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

Я предполагаю, что можно просто программировать, вызывая функции, склеивая их как-то там, и на задачу, где этого не хватает, просить помощь. Но разве будет польза от такого программиста?
Отредактировано 10.03.2022 21:13 vsb . Предыдущая версия . Еще …
Отредактировано 10.03.2022 21:12 vsb . Предыдущая версия .
Отредактировано 10.03.2022 21:11 vsb . Предыдущая версия .
Re: Как собеседовать джуниоров
От: bnk СССР http://unmanagedvisio.com/
Дата: 10.03.22 21:37
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>На собеседованиях я сейчас первым делом даю задачу — написать на JS функцию isPalyndromic(n) — проверить, является ли число палиндромом в десятичной записи. Предполагаемое решение — преобразовать число в строку и сравнить символы. Ожидается, что кандидат знает основы JS (как число в строку преобразовать), умеет писать хоть какой-то код, умеет писать циклы, понимает, что такое массивы. Ну и вообще умеет читать формально поставленную задачу и преобразовать её в программный код. Мой идеальный джуниор должен построить m без преобразования в строку (перевернутая n) и вернуть return n === m (эффективное и с какой-то точки зрения изящное алгоритмически решение без выделения лишней памяти). По факту из трёх кандидатов пока ни один не справился. Один сказал, что они такое не проходили, один написал что-то вроде if (n == 707) console.log("true") else console.log("false") с кучей синтаксических ошибок, один сидел 15 минут и написал только объявление функции. При этом у всех в резюме там технологий насувано — и реакты и фреймворки всякие, и какие-то слова невтемные (что значит технология https в резюме?).


То есть, вот что-то такое что ли не могут написать?

isPalyndromic = (n) => `${n}` === `${n}`.split('').reverse().join('');

Тогда это как-то совсем тоскливо IMHO. Я бы искал дальше.

vsb>В итоге даю тестовое задание (написать сайт в котором будет логин, логаут и профиль с одним полем, фронт+бэк, для меня эта задача на полчаса, если не торопиться), и они так и исчезают.


IMHO тут "полчаса, если не торопиться" если делать из шаблона типа командой. В общем зависит от того, на какой базе ты это собираешься делать. Если на ассемблере например, то это будет заметно дольше

vsb>Лично я считаю, что у программиста обязана быть крепкая база. Он должен понимать, что такое переменная, функция, цикл, условие, рекурсия, должен быть знаком с арифметическими операциями, остатком от деления.

vsb>Блин, пишу и самому смешно, в общем уровень третьего класса средней школы. Но мои ожидания обманываются или я что-то не понимаю.

Может денег сильно мало предлагаешь?
Re[2]: Как собеседовать джуниоров
От: vsb Казахстан  
Дата: 10.03.22 22:14
Оценка: +1
Здравствуйте, bnk, Вы писали:

bnk>То есть, вот что-то такое что ли не могут написать?


bnk>
isPalyndromic = (n) => `${n}` === `${n}`.split('').reverse().join('');


За такой код я сразу синьора бы дал Такой код и я не напишу, по крайней мере с первого раза и без чтения MDN-а.

bnk>Тогда это как-то совсем тоскливо IMHO. Я бы искал дальше.


vsb>>В итоге даю тестовое задание (написать сайт в котором будет логин, логаут и профиль с одним полем, фронт+бэк, для меня эта задача на полчаса, если не торопиться), и они так и исчезают.


bnk>IMHO тут "полчаса, если не торопиться" если делать из шаблона типа командой. В общем зависит от того, на какой базе ты это собираешься делать. Если на ассемблере например, то это будет заметно дольше


Стэк жаваскрипт, то бишь на сервере node.js, предлагается использовать express, но в целом мне пофиг, на клиенте обязательно React. Никакой базы и тд, тупо захардкоденные в переменной юзеры. Два эндпоинта на login/edit profile, две странички, так же на login/edit profile, три кнопки — login/save profile/logout, ну это по минимуму. Просто посмотреть, что человек самые основы веба знает.

bnk>Может денег сильно мало предлагаешь?


Судя по другим вакансиям — примерно по рынку. Местному, конечно, с мировым тягаться не можем. Может и в этом проблема.
Отредактировано 10.03.2022 22:17 vsb . Предыдущая версия . Еще …
Отредактировано 10.03.2022 22:15 vsb . Предыдущая версия .
Re: Как собеседовать джуниоров
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 11.03.22 01:09
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Продолжать ли в том же духе?


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

Так же хочу сказать что наблюдал ситуацию как твоя, когда мы интернов искали. Пока искал для Autodesk, было почти как ты говоришь, с огромным трудом находили нормальных перебрав кучу кандидатов. Сейчас для Motional ситуация другая, и почти все кандидаты классные. Я веду к тому, что всех хороших выбирают интересные компании, которые делаю что-то прорывное по современным меркам. Остальным остаётся только запастись терпением и выбирать из того что есть.
Re: Как собеседовать джуниоров
От: AndyCyp США  
Дата: 11.03.22 02:50
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Приходится мне собеседовать ребят, нужно нанять несколько человек. Джуниоры-мидлы. Особо за ними смотреть некому, поэтому нужно, чтобы писали что-то адекватное, прям нянчиться ресурсов нет.


это где такая печаль?
Re[3]: Как собеседовать джуниоров
От: Lazytech Ниоткуда  
Дата: 11.03.22 02:54
Оценка: +1
Здравствуйте, vsb, Вы писали:

bnk>>То есть, вот что-то такое что ли не могут написать?

bnk>>
isPalyndromic = (n) => `${n}` === `${n}`.split('').reverse().join('');


vsb>За такой код я сразу синьора бы дал Такой код и я не напишу, по крайней мере с первого раза и без чтения MDN-а.


Шутить изволите? Такой код даже я напишу без проблем, хотя на джуна едва ли тяну...
Re[3]: Как собеседовать джуниоров
От: AndyCyp США  
Дата: 11.03.22 02:54
Оценка: 3 (1)
Здравствуйте, vsb, Вы писали:


bnk>>
isPalyndromic = (n) => `${n}` === `${n}`.split('').reverse().join('');


vsb>За такой код я сразу синьора бы дал Такой код и я не напишу, по крайней мере с первого раза и без чтения MDN-а.


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

В целом я тиснул у кого то на этом же форуме хорошую классификацию:

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

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

* Джуниор — человек без опыта или с минимальным опытом. За ним нужен надзор, обучение. Можно давать какие-то совсем простые задачи, к которым у остальных не доходят руки. Джуниора можна отдать в качества помощника синьору, который будет его менторить и давать задачи из своей зоны ответственности.

"
Re: Как собеседовать джуниоров
От: LaptevVV Россия  
Дата: 11.03.22 04:22
Оценка:
Такая картина уже давно.
Мне мои выпускники не один раз рассказывали то же самое...

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

Так-то оно так.
Но еще в 2014 году стэковерфлоу проводил опрос, в котором было выявлено, что около 50% действующих программистов не имеют базового ИТ-образования.
Опрошено 26000 программистов
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Как собеседовать джуниоров
От: Lazytech Ниоткуда  
Дата: 11.03.22 04:50
Оценка: +1 :)
Здравствуйте, vsb, Вы писали:

vsb>На собеседованиях я сейчас первым делом даю задачу — написать на JS функцию isPalyndromic(n) — проверить, является ли число палиндромом в десятичной записи. Предполагаемое решение — преобразовать число в строку и сравнить символы. Ожидается, что кандидат знает основы JS (как число в строку преобразовать), умеет писать хоть какой-то код, умеет писать циклы, понимает, что такое массивы. Ну и вообще умеет читать формально поставленную задачу и преобразовать её в программный код. Мой идеальный джуниор должен построить m без преобразования в строку (перевернутая n) и вернуть return n === m (эффективное и с какой-то точки зрения изящное алгоритмически решение без выделения лишней памяти). <...>


При наличии запрета на преобразование числа в строку решение вполне себе тривиальное, хотя one-liner'ом, наверное, уже не обойтись. Ниже привожу свое громоздкое решение.
  JavaScript Inside
function getNumDigits(num) {
    let num2 = num;
    let count = 0;
    
    while (num2 > 0) {
        num2 = Math.floor(num2 / 10);
        count++;
    }
    
    return count;
}

function isPalyndrome(n, m) {
    console.log('=========================================');
    console.log('n =', n);
    console.log('m =', m);
    const numDigitsN = getNumDigits(n);
    const numDigitsM = getNumDigits(m);
    
    if (numDigitsN !== numDigitsM) {
        console.log('The two numbers are of different length.');
        return false;
    }
    
    let n2 = n;
    let m2 = m;
    
    // n - from right to left
    // m - from left to right
    
    let n3;
    let nDigit;
    
    let m3;
    let mDigit;
    
    let divisor = 10 ** (numDigitsM - 1);
    // console.log('divisor =', divisor);
    
    for (let i = 0; i < numDigitsN; i++) {
        n3 = Math.floor(n2 / 10);        
        nDigit = n2 - 10 * n3;
        console.log('nDigit =', nDigit);
        
        mDigit = Math.floor(m2 / divisor);
        console.log('mDigit =', mDigit);
        
        if (nDigit !== mDigit) {
            console.log('The two digits are not equal.');
            return false;
        }
        
        m2 -= mDigit * divisor;
        divisor /= 10;

        n2 = n3;
    }
    
    console.log('It is a palyndrome indeed!');    
    return true;
}

console.log(isPalyndrome(1352, 2531)); // true
console.log(isPalyndrome(999, 998)); // false
console.log(isPalyndrome(1, 2)); // false
console.log(isPalyndrome(12345, 54321)); // true
Отредактировано 11.03.2022 4:50 Lazytech . Предыдущая версия .
Re[2]: Как собеседовать джуниоров
От: vsb Казахстан  
Дата: 11.03.22 05:02
Оценка: 11 (2) +1
Ну я бы так написал:

function isPalyndromic(n) {
  let n1 = n;
  let m = 0;
  while (n1 !== 0) {
    m = m * 10 + n1 % 10;
    n1 = Math.floor(n1 / 10);
  }
  return n === m;
}
Отредактировано 11.03.2022 5:03 vsb . Предыдущая версия . Еще …
Отредактировано 11.03.2022 5:02 vsb . Предыдущая версия .
Отредактировано 11.03.2022 5:02 vsb . Предыдущая версия .
Re[3]: Как собеседовать джуниоров
От: Lazytech Ниоткуда  
Дата: 11.03.22 05:09
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Ну я бы так написал:


vsb>
vsb>function isPalyndromic(n) {
vsb>  let n1 = n;
vsb>  let m = 0;
vsb>  while (n1 !== 0) {
vsb>    m = m * 10 + n1 % 10;
vsb>    n1 = Math.floor(n1 / 10);
vsb>  }
vsb>  return n === m;
vsb>}
vsb>


Я, помимо нагромождения кода, вдобавок по невнимательности решил задачу не для одного числа, а для двух.
Re: Как собеседовать джуниоров
От: prakop  
Дата: 11.03.22 08:23
Оценка:
> Как собеседовать джуниоров
Да как хочется, так и собеседуйте.
Толковых ребят полно, но к вам они не попадают, поэтому вопрос стоит переформулировать на "Как найти толковых джуниоров", т.к. кажется, что проблема именно в этом.
Всё потому, что большинство толковых ребят уже расхватали крупные компании по стажировкам, а у мелкой компании нет ни имени, ни денег. Я когда-то тоже занимался тем же в маленькой конторе и ответ тут один — ждать. За 2 года двух очень талантливых ребят наняли (через пару лет они свалили, конечно, — один в JB, другой за бугор), но тут есть вероятность не дождаться вообще, да КПД по человеку в год не всем подходит.
Re: Как собеседовать джуниоров
От: Lloret  
Дата: 11.03.22 10:13
Оценка:
vsb>Я предполагаю, что можно просто программировать, вызывая функции, склеивая их как-то там, и на задачу, где этого не хватает, просить помощь. Но разве будет польза от такого программиста?

Будет, тому кто и склеить из готовых не может, а таких на глобусе процентов сильно за 80, ибо комп — это колдунство.
Re[2]: Как собеседовать джуниоров
От: RonWilson Россия  
Дата: 11.03.22 11:43
Оценка:
Здравствуйте, Lazytech, Вы писали:


L>При наличии запрета на преобразование числа в строку решение вполне себе тривиальное, хотя one-liner'ом, наверное, уже не обойтись. Ниже привожу свое громоздкое решение.


это человек заслужил тарелку пельменей!
Re: Как собеседовать джуниоров
От: elmal  
Дата: 11.03.22 12:05
Оценка:
Здравствуйте, vsb, Вы писали:

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

Именно. Юниор на то и юниор, что у него нет ни черта практики. Ну а раз нет практики, то гонять нужно по теории. То есть должен без проблем написать обход дерева вширину, легко уметь написать сортировку, прекрасно должен уметь оценивать сложность алгоритмов, знать как находить кратчайший путь в графе. Ну и должно быть понимание как это все внутри работает, что такое стек, что такое куча и т.д. Хотя бы должно у тебя сложиться понимание, что у человека есть какие то остаточные знания по всему этому, что он в институте не только водку пьянствовал и всякую траву курил, но и учебник открывал. Возьмешь человека без этого — скорее всего ОЧЕНЬ сильно придется пожалеть. По крайней мере знаю одного, взяли его после курсов каких то. Так вот, при попытке работать и выдавать результат товарищь, реально свихнулся, при попытке наверстать упущенное не спал ночами, что то там переклинило, у него пошли потом галлюцинации вроде прозрачного розового единорога, начал жрать таблетки, в результате чего вообще мыслительная активность жестко подавлялась — короче писец.
Re[3]: Как собеседовать джуниоров
От: Lazytech Ниоткуда  
Дата: 11.03.22 12:49
Оценка:
Здравствуйте, RonWilson, Вы писали:

RW>это человек заслужил тарелку пельменей!


Признаю, решил совсем не ту задачу, притом решение неважное.
Re[4]: Как собеседовать джуниоров
От: RonWilson Россия  
Дата: 11.03.22 12:51
Оценка:
Здравствуйте, Lazytech, Вы писали:

L>Здравствуйте, RonWilson, Вы писали:


RW>>это человек заслужил тарелку пельменей!


L>Признаю, решил совсем не ту задачу, притом решение неважное.


Да и пельмени не с мясом, а с соей...
Re[2]: Как собеседовать джуниоров
От: Sharov Россия  
Дата: 11.03.22 14:08
Оценка:
Здравствуйте, Lazytech, Вы писали:

L>function isPalyndrome(n, m) {


Через mod и div если речь о числах самый оптимальный по памяти способ. Но только такие задачи предполагают
одно число на вход, т.е. 1234321 или 123321, а не два.
Кодом людям нужно помогать!
Re[3]: Как собеседовать джуниоров
От: Lazytech Ниоткуда  
Дата: 11.03.22 14:31
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Через mod и div если речь о числах самый оптимальный по памяти способ. Но только такие задачи предполагают

S>одно число на вход, т.е. 1234321 или 123321, а не два.

Спасибо, учту на будущее.
Re: Как собеседовать джуниоров
От: Gradiens  
Дата: 11.03.22 15:22
Оценка: 15 (1)
Здравствуйте, vsb, Вы писали:

vsb>Приходится мне собеседовать ребят, нужно нанять несколько человек. Джуниоры-мидлы. Особо за ними смотреть некому, поэтому нужно, чтобы писали что-то адекватное, прям нянчиться ресурсов нет.


vsb>Я себя вспоминаю, когда первый раз устраивался на работу на 3 курсе. Знал весь стандарт С++ (ну не заучивал, конечно, но по любому вопросу был способен найти раздел). Мог на шаблонах написать факториал. Отлично знал все обычные возможности. Занимал места на олимпиадах в школе, поэтому проблем с алгоритмами, по крайней мере не навороченными не испытывал.


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


vsb>У меня в целом нет вопросов, как собеседовать человека, у которого 15 лет опыта. С таким я просто общаюсь по его проектам, даю вопросы вроде с какими БД вы сталкивались, как бы подобрали нужную для проекта, ну в общем вопросы больше архитектурного плана. Но с человеком, который цикл не может написать, какая тут архитектура.


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


vsb>Продолжать ли в том же духе?

Ну, если результаты не устраивают — боюсь, надо метод поменять.

Мой любимый метод с код-ревью очень клево работает.
И его можно задавать всем.

Если это джун — я ожидаю, что он скажет, что 7 входящих параметров — это перебор.
Если миддл — ожидаю рассказа, как декомпозировать этот код, как поиспользовать DI чтобы код стал тестируемым.
Если синьор — то ожидаю, что он обратит внимание на потокобезопасность, на то, что алгоритмическая сложность кода сильно попорчена. Ну и, понятно, сможет рассказать как надо и почему.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.