?

Log in

No account? Create an account
о двоичных деревьях и не только - Поклонник деепричастий [entries|archive|friends|userinfo]
Anatoly Vorobey

[ website | Website ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Links
[Links:| English-language weblog ]

о двоичных деревьях и не только [июл. 25, 2018|11:04 pm]
Anatoly Vorobey
[Tags|, ]

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

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

Это был ответ "стоя на одной ноге", теперь уточняющая расширенная версия. Возможно, дело не совсем в IQ, а в определенных его компонентах, позволяющих удерживать в голове много соединенных друг с другом деталей, тщательно их обдумывать, и приходить к неочевидным априори решениям. Абстрактная манипуляция и визуализация, возможно с каким-то чисто-компьютерным уклоном (потому что есть супер-умные люди, у которых просто вот не складывается с программированием). Работодателям это нужно, потому что несмотря на то, что 90% ежедневной работы программиста это не включает, те 10%, которые включают, играют гигантскую роль в общей эффективности и успешности работы. С другой стороны, кандидат на интервью может успешно болтать за микросервисы и скрам, но если его попросить распечатать двоичное дерево уровень за уровнем, он не может удержать в голове достаточно деталей и продумать алгоритм. Это реально происходит, и часто. В его работе ему никогда не нужно будет печатать двоичное дерево уровень за уровнем, но нужно будет принимать решения, сходные по сложности применения интеллекта. Как это проверить в формате интервью за 45 минут? Вот придумали спрашивать про уровень за уровнем (это просто пример, не замыкайтесь на нем).

Второй, тоже важный аспект - добросовестность (conscientiousness). Большие компании не скрывают, чего они ожидают от кандидатов, часто сами посылают примеры вопросов и тем, которые надо знать; эти темы никто не помнит как следует через год-два после окончания вуза, поэтому их надо вспоминать, повторять, щелкать простые задачки на написание кода, чтобы не тормозить во время интервью. Если кандидат этим манкирует, это тот вид сигнала, который процесс интервью как раз и должен отлаживать (потому что интеллект и добросовестность вместе лучше всего коррелируют с успехом на рабочем месте). Иногда кандидат все равно проходит за счет гениальности и великолепной памяти; тогда добросовестность может повалить его позже уже во время работы - или нет. Много лет назад я летел на интервью в Гугл, и не собирался особо повторять алгоритмы и структуры данных, думая примерно так: "я хороший программист, и знаю то, что мне нужно для работы. Я знаю, что они хотят, чтобы кандидаты помнили все про двоичные деревья; что-то я помню, а другое специально повторять не буду. Если им этого недостаточно, ну и ладно." Буквально в день отлета, за час до отъезда в аэропорт, я передумал, забежал в магазин и купил том Кормена (знающие знают). Штудировал его в полете и следующий день и вечер перед интервью. Во время пяти интервью на следующий день в двух местах мне пригодилось это штудирование. Вообще-то у меня плохо с добросовестностью и аккуратностью, но это тот случай, когда я их проявил - в последний возможный момент - и, возможно, не прошел бы процесс интервью без этого.

Ну как - ложный цинизм или азбучные истины?
СсылкаОтветить

Comments:
Страница 1 из 3
<<[1] [2] [3] >>
[User Picture]From: tandem_bike
2018-07-25 08:19 pm
both....
(Ответить) (Thread)
[User Picture]From: tandem_bike
2018-07-25 08:24 pm
CLR is overrated, IMHO. it got undue hype, while "data structures in pascal" 10 years before - delivered the same algorithm teaching without the gilded noodle.


interviews are also overrated.

people may interview well then turn out to be assholes or ignoramuses.
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: ilya_dogolazky
2018-07-25 08:20 pm
ты можешь успешно "болтать за скрам", ну хотя бы пять минут?
(Ответить) (Thread)
[User Picture]From: avva
2018-07-25 08:24 pm
Ну прямо так без подготовки меня хватит на минуту-две, и то любой скрамщик распознает, что это фейк.

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

(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: riazanovskiy
2018-07-25 08:38 pm
Думаю, часть про IQ лишняя (мне, например, как неспециалисту, сложно понять, что именно меряет тест IQ), но это и не важно. Просто корпорации выяснили, что умение решать короткие олимпиадные задачи коррелирует с успешностью работы программиста.

(хотя я был бы рад, если бы вы написали развёрнуто, почему именно нельзя давать тесты)
(Ответить) (Thread)
[User Picture]From: friendlystrnger
2018-07-25 08:54 pm
потому что так _проще_ проводить интервью! ;)

в идеале надо конечно давать сложную разностороннюю задачку и следить как кандидат её решает (результат не так важен как процесс), но для этого надо как минимум такого же умника в интервьюеры, а у того и так есть чем заняться (плюс время на всех соискателей=$$$), вот и выкручиваются...
(Ответить) (Parent) (Thread)
From: once_for_all
2018-07-25 08:41 pm

Все правильно.

(Ответить) (Thread)
[User Picture]From: whichferdinand
2018-07-25 08:41 pm
По-моему, это все правда, но как-то слишком сложно.

Правда, что способность писать алгоритмы коррелирует с IQ и т.п., но IQ собственно в основном и нужен (редко), чтобы писать и имплементировать алгоритмы.

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

(Ответить) (Thread)
[User Picture]From: vladimir000
2018-07-25 09:13 pm
(Не читая комменты)

А еще этоможет быть расклад "изем под фонарем". То есть, для работы нам этот аспект деятельости и не нужен - но зато он хорошо алгоритмизируется, выглядит соответствующим job description и просто радует шлаз HR. А поскольку кандидатов на место (считая только тех, которые кашу не испортят) у нас все равно больше одного - то давайте их спрашивать об этом.

Помните анекдот про стажера, с тоской глядящего на стопку резюме на позицию, и опытнорго сотрудника, выкидивающего верхнюю половину стопки со словами "ну ты же не думаешь, что нам нужны неудачники?" А если заодно можно оформить это как формальные процедуры -так совсем хорошо.
(Ответить) (Thread)
From: ext_1745607
2018-07-25 09:15 pm
Вы все правильно написали. Но.
Для разработчика имхо это все вторично. Самое важное это умение решать проблемы. Не искусственные на интервью, а реальные технические проблемы на рабочем месте. Они к бинарным деревьям редко отношение имеют. И к IQ тоже. То есть среднего бывает вполне достаточно.
Ну и наоборот, и высокого IQ, и умения решать деревья бывает недостаточно для хорошего разработчика. К сожалению, мне еще не встречались тесты или методы, позволяющие быстро отличить "решателя проблем" от балабола, который умеет только деревья инвертировать.

Кстати не только балаболы. Бывают и хорошие математики, которые прекрасно решают сложные алгоритмические проблемы, а вот сделать хороший софт у них уже не так хорошо получается. Разные это умения.
(Ответить) (Thread)
From: ald1976
2018-07-25 09:21 pm
Так математики и не должны делать софт. Тем более те, кто "решает сложные алгоритмические проблемы".

Они должны ставить задачи программистам.

И программисты тоже не обязаны быть универсалами.
(Ответить) (Parent) (Thread)
[User Picture]From: botya
2018-07-25 09:16 pm
На русском Хабре это самая популярная тема обсуждений - собеседования и вообще вопросы найма. Значит, это является болевой точкой, ситуация кажется странной многим.

В прошлом году у меня было порядка 35 очных интервью (два раза менял работу) плюс ещё столько же по телефону. Моё мнение: значительная часть интервьюеров не понимает, о чём спрашивать программиста, поэтому спрашивает олимпиадные задачи. Выявить успешного человека, который будет работать и приносить пользу, такими методами весьма трудно.
(Ответить) (Thread)
[User Picture]From: spamsink
2018-07-25 10:39 pm
Я сам интервью давно не проходил, зато очень много проводил. Меня не интересует, сколько там разных хитрых алгоритмов с разной хитрой сложностью человек заучил.
Это 30 лет назад было полезно, чтобы человек не пытался изобретать велосипеды и не бегал за каждым алгоритмом в библиотеку, а сейчас гугл, rosettacode.org и пр. есть у всех.

Меня интересует, какой он инженер.

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

Инженеров оказывается минимум. Так, например, едва ли один из дюжины догадывается реализовать указанный предикат, согласно которому требуется менять массив, в виде отдельной функции, или спросить, надо ли это, или прокомментировать, что пишет предикат в явном виде ради краткости. Ну и прочие лулзы присутствуют в ассортименте.
(Ответить) (Parent) (Thread) (Развернуть)
From: ald1976
2018-07-25 09:18 pm
Если к чему-то можно подготовиться, пару часов почитав книжку, то, точно также, можно за пару часов прокачать этот скилл при реальной работе, если вдруг понадобится.

Поэтому это не про добросовестность, а про натасканность и трюки на собеседованиях.

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

Впрочем, за вычетом явно патологических кандидатов, найм на работу - всегда покупка кота в мешке. При любой системе отбора кандидатов.
(Ответить) (Thread)
[User Picture]From: joann
2018-07-26 10:07 am

Пара часов «изучить с нуля» и пара часов на «повторить и вспомнить» это таки разные пара часов)

(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: webface
2018-07-25 09:26 pm
Любого кто не понимает зачем спрашивать про двоичные деревья я-бы отправил провести интервью с парой десятков человек. Ответ сразу же будет очевиден.
(Ответить) (Thread)
From: ald1976
2018-07-25 09:30 pm
А нельзя предварительно провести письменный машинно-проверяемый идиотен-тест с этими двумя десятками?

И тех 5 человек, что останутся, уже интервьюировать по-человечески?
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: nlothik
2018-07-25 09:28 pm
КМК, всё это зависит от того, что конкретно должен делать программист.

Если писать что-то прорывное, чего раньше никто не писал -- то да, хорошо знать структуры данных, алгоритмы, и т.д.

А если писать приложения под телефон -- то на кой всё это? Какая разница, как именно реализован sort() в Java.Collections? Хорошо они там реализован. Значительно важнее умение им пользоваться, а не умение изобрести колесо.
(Ответить) (Thread)
[User Picture]From: tandem_bike
2018-07-25 09:43 pm
вот несогласна. у меня уникальный (где-то!) опыт - я в юном возрасте без всякой подготовки была заставлена выучить фортран сама-сама и на нем писать код для моего диплома. ну выучила, считала что "програмирую". а потом училась на следующую степень действительно программировать, причем с легендарным Ричи тоже, он был "выездным профессором" (дико взыскательным, требовательным) и давал курс по керниган и ричи. ну и другиеязыки кроме паскаля и Ц учила, в том числе даже ассемблер заставили. басы-шмасы. разница огромная между человечком который сам себя нагамадрилил писать код, и человечком которому преподали системы, компиляторы, ассемблер, датаструктуры, алгоритмы и так далее.
это совсем другой уровень.
каждый собаке, каждый кошке может писать на HTML всякие аппы и прочую хуйню. но это НЕ кодер. образование не диплом. диплом не нужен, но образование незаменимо.
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: kray_zemli
2018-07-26 03:35 am
Я слышал такое объяснение. Работодателям нужны не творца, а в меру туповатые исполнительные серые мышки. И лучше всего оценивать кандидатов исходя из опыта работы и достижений на предыдущих местах. Но как быть, если кандидат только что окончил колледж и ещё нигде не работал? Тогда давайте проверим, насколько хорошо он зазубрил то, что в этом колледже преподают. Хорошо зубрит — будет исполнительным.
(Ответить) (Thread)
[User Picture]From: 1st_noiz
2018-07-26 03:45 am
Считаю что результаты задач на алгоритмы часто переоцениваются. Главное это задавать задачи наиболее приблеженные к будующей работе. Как часто нужно писать собственный алгоритм сортировки на позиции фронтенд разработчика? Знать какие алгоритмы есть, какая сложность примерно - да, писать алгоритм сортировки на доске без ошибок - нет.

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

Конечно есть позиции больше связанные с алгоритмами, но если посмотреть рынок вакансий, большинство из них не требуют этого.
(Ответить) (Thread)
[User Picture]From: justbulat
2018-07-31 03:30 pm
у вас, как и у многих, неверное представление - это задачи не на запоминание готовых алгоритмов, а на умение реализовать незнакомые, хоть и не очень сложные (ну что там за час можно сделать)

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

(скопировал свой ответ https://avva.livejournal.com/3133988.html?thread=136641572#t136641572 )

что касается ваших вопросов - они слишком велики для того, чтобы написать к ним код в течении часа, и вообще - это так называемые архитектурные задачи, которые стандартно задают всем с опытом (и чем выше позиция - тем больше вес этой части интервью)
(Ответить) (Parent) (Thread)
[User Picture]From: roman_kr
2018-07-26 03:45 am
Логично.
(Ответить) (Thread)
[User Picture]From: blainemono
2018-07-26 05:21 am
По мне так лучше деревья, чем когда с порога начинают спрашивать про битовую арифметику - как-то больше уважения к потенциальному работодателю испытываешь.

Или как у меня друга спросили - "часто ли вы используете в работе виртуальные указатели?"

(это оказалось про указатель не таблицу виртуальных функций, очень важный вопрос на знание идиотской терминологии)
(Ответить) (Thread)
(Удалённый комментарий)
Страница 1 из 3
<<[1] [2] [3] >>