Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
но возможно действительно искали человека, способного решать такие задачи без любимой IDE
Из инструментов, по большому счёту, был блокнот.Из соображений секретности, безопасности и недоступности по сети?
/src, куда смонтрирована кластерная файловая система, сколько тех исходников знает только Господь Бог и сисадмин (известно только что терабайтов там много, но петабайт, вроде как, пока нету). Как несложно догадаться никакого Windows/i386 нет и не планируется, собирается всё командой, условно, build (тоже где-то в облаке), общаться с программой можно через встроенный в неё web-сервер (сама программа при этом работает, опять-таки, в облаке — там где её поднимет условная команда run). Не так давно думали что делать с тем, что в кое-каких системах упёрлись в старое древнее ограничение в 2GiB кода в одной библиотеке под Linux'ом.почему данная ситуация считается стрессовой?
Если в голове есть представление алгоритма, то описать его псевдокодом или js не должно составлять труда.Но в том-то и проблема, что для нахождения алгоритма (элемнтарного, тривиального алгоритма) потребовалось больше суток! Это, я извиняюсь, вообще как, нормально?
быстро
Обстановка и условия для решения задачи
Меня попросили решить данную задачу с использованием, своего рода, онлайн блокнота, где мой собеседник накидал задание и наблюдал за тем как я набиваю мое решение
под наблюдением
в не комфортных для разработчика условиях
Собеседование подразумевает ограниченность по времени
Под психологическим давлением — еще и к говнокоду, на который тратится много времени
Это вы про «блокнот»?Это про наблюдение.
Если судить по вашим комментариям, вы вряд ли это поймёте
Не буду говорить за всех, но я могу за 10 минут набросать костяк скрипта, а потом ещё неделю его обрисовывать проверками, рефакторить, тестить и читать логи.И каждый день будете показывать как идут дела, правильно?
А могу и исписать полтора бумажных блокнота алгоритмами, связями, крайними ситуациями требующими уточнений и за неделю показать пару моделей, контроллеры к ним и десяток представлений, сделанных по быстрому, для тестов.Та же самая ситация и здесь. Вы можете писать код прямо «в онлайн блокноте» или на бумажке, обсуждать его вслух или добавлять комментарии. Но к комцу собеседования код должен быть. Работающий, желательно.
Процесс работы? а что такое «процесс работы»?
А могу и исписать...
попытка проверить умение человека вообще программировать
которая буквально «убила» автора обсуждаемой статьи
Если бы то же решение было выдано в первые пять минут прямо на собеседовании… то никакого «накала страстей» и не было бы
По-моему, это чисто социальный скилл.Да (точнее, психологический).
С умением решать задачи ничего общего не имеющее.Ну как… Утверждение слишком сильное, из разряда «никогда», поэтому вынужден сказать «нет». В общем-то IRL нужда в подобных навыках иногда всплывает, и мера их нужности зависит от специфики места работы.
static void Connect(Node x){
Connect(x,new List<Node>(),0);
}
static void Connect(Node x,List<Node> rightLine,int level){
if(x==null) return;
if(level==rightLine.Count){
rightLine.Add(x);
}else{
rightLine[level].neighbor=x;
rightLine[level]=x;
}
Connect(x.left,rightLine,level+1);
Connect(x.right,rightLine,level+1);
}
как решение задач в реальном времени и демонстрация этого процесса зрителям. Меня не беспокоит лажа или откровенно глупые решения, как это не беспокоит игровых стриммеров.
Игровой стриммер не будет демонстировать свою игру, если он играет в эту игру в первый раз в жизни
обычно те кого не беспокоит глупые решения и лажа в собственном коде
Игровой стриммер не будет демонстировать свою игру, если он играет в эту игру в первый раз в жизни
Профессионал сначала оттачивает навыки до совершенство
Если в такой ситуации его отсеивают, то можно почти точно сказать, что в этом конкретном случае он не подходит, несмотря на всю мудрость задним умом.

Непонятно, как объёмная работа может исключить фактор стресса.1. Вы пишете код в комфортной для себя обстановке, у вас есть возможность показать себя и учесть всё необходимое по ТЗ.
И вообще, полчаса — это уже много? Ой, он начал зевать, у меня всё плохо?
Приведу пример, который сам встречал не раз. Кандидат проходит интервью в двух разных компаниях из одной отрасли… В компании Б дали задание на пару дней, которое кандидат спокойно сделал дома и полностью удовлетворил требования работодателя.
Зачем рисковать потерей кандидата, если можно дать объемную задачу?Вы так говорите, как будто потеря кандидата — это катастрофа. Ну потеряем мы сколько-то, проблем-то. Если оставшихся хватает — всё в порядке, если нет — подходы нужно менять…
Смотреть за процессом решения задачи — очень плохая практика.
Понимание того, что тебя оценивают по заведомо не готовому коду, не дает сосредоточиться на поиске решения.
как человек думает, какие решения он принимает, и почему он их отбрасывает.А зачем это работодателю? Разве всё в конечном счёте не сводится к тому, чтобы работа была выполнена? Есть другие, более продуктивные (на мой взгляд, конечно) критерии оценки работы, нежели количество рассмотренных решений и причины их отбрасывания.
А зачем это работодателю?
Разве всё в конечном счёте не сводится к тому, чтобы работа была выполнена?
Есть другие, более продуктивные (на мой взгляд, конечно) критерии оценки работы, нежели количество рассмотренных решений и причины их отбрасывания.
В частности, глядя за процессом, можно пытаться оценить, какие вещи человек будет учитывать в повседневной работе, а какие — нет.Разве код сам не расскажет, что было учтено, а что нет? А если есть сомнения, почему не спросить: «Что вы думаете по поводу X вот здесь?»
Нет, для таких вещей аутсорсеры есть.Что дополнительно требуется от собственных разработчиков, сотрудников?
Разве код сам не расскажет, что было учтено, а что нет?
А если есть сомнения, почему не спросить: «Что вы думаете по поводу X вот здесь?»
Что дополнительно требуется от собственных разработчиков, сотрудников?
Эти вопросы как раз (а) занимают много времени и (б) их можно задавать только после завершения кода.(а) Найм нового сотрудника — это серьёзное вложение, и будет очень странно, если у компании не окажется времени на вопросы. (б) Верно. В том и суть: дать кандидату задачу, назначить дедлайн и позволить решить её в комфортной обстановке, результат обсудить.
Преемственность.Очень хороший поинт. Тогда выполненная работа плюс соответствие требованиям проекта (code style, покрытие тестами и т.п.)?
Найм нового сотрудника — это серьёзное вложение, и будет очень странно, если у компании не окажется времени на вопросы.
Тогда выполненная работа плюс соответствие требованиям проекта (code style, покрытие тестами и т.п.)?
(а) Найм нового сотрудника — это серьёзное вложение, и будет очень странно, если у компании не окажется времени на вопросы.Закон Паретто никто не отменял. Из нашей статистики: на 100 кандидатов редко когда больше 2-3 будущих сотрудников. Говорить с каждым из них по многу часов — это элементарно дорого. Особенно с учётом того, что большая их часть программировать не умеет от слова «совсем». Потому хочется сделать «первычный отсев» максимально дешевым.
(б) Верно. В том и суть: дать кандидату задачу, назначить дедлайн и позволить решить её в комфортной обстановке, результат обсудить.Это уже потом, когда процетов 80-90 кандидатов отсеяны. Если задача большая и сложная, то и смотреть на неё приходится долго. Это дорого.
struct leaf {
public:
int value;
leaf* right;
leaf* left;
leaf* neighbor;
leaf(int v, leaf* r, leaf* l) :
value(v), right(r), left(l), neighbor(nullptr) {};
};
void find_neighbors(leaf* node, std::stack<leaf*> & stack)
{
if (node == nullptr) {
return;
};
if (!stack.empty()) {
node->neighbor = stack.top();
stack.pop();
};
find_neighbors(node->right, stack);
find_neighbors(node->left, stack);
stack.push(node);
return;
}
Не сравнивайте две совершенно разные ситуации.С чего это они вдруг совершенно разные? Если вы идёте устраиваться на работу, то вы вдруг становитесь интровертом и начинаете дрожать как осиновый лист, но когда вам нужно встретится с представителями другой команды и «продать» вашу идею — то вы прям становитесь «мистером уверенность»? Странная логика.
нужно встретится с представителями другой команды и «продать» вашу идею — то вы прям становитесь «мистером уверенность»
которая обязательно должна быть дополнена умением этот код «продать»
Собеседование — это само по себе большой стресс для интроверта (которыми, в большинстве своем являются программисты)
в любой стрессовой ситуации на проекте отправлять программеров домой всем отделом?
str.reverse!Очевидно, что человек на более высокую должность должен все это лучше знать.К сожалению многим — неочевидно. Не знаю как это работает, но такое ощущение, что во многих компаниях тимлид под которым работают человек 10-15 кода не пишет вообще, только «общее направление» задаёт.
Вы видимо никогда не бывали ни в той ни в другой ситуациях
а ты в это время стараешься уловить как она реагирует на каждую строчку
Man «состояние потока», man «интроверт».
И вообще в повседневной работе парное программирование, когда другой разработчик смотрит, как ты пишешь код — обычная практика. Профессионал не имеет права относится к этому как к стрессу.
Видно, что автор творческий человек.Откуда видно? Из собеседования — нифига не видно. До тривального, простейшего, практически очевидного решения он дополз на следующий день. Это — творчество? Я вас умоляю.
А компания, похоже, искала человека, натасканного на типовые задачи.Нет. Она искала человека, который не будет делать косяков в простых задачах. Это не одно и то же.
А зачем вашим кандидатам работать у вас, если они могут спокойно себе писать O(N3) код и получать большИе деньги.Вот и я думаю: а с чего это кандидаты ломятся в Apple, Google, Microsoft, Yandex и тому подобные компании, где «изуверские собеседования», а не зашибают «больши́е деньги» своим O(N3) кодом в каких-нибудь конторах «Рога и Копыта»?
А таких, которые платят меньше и мучают тупыми вопросами на собеседованиях — пруд пруди.Ну если они как-то существуют и как-то работников всё-таки находят, значит не так и мало они платят, да?
Но подход к обработке массивов мне кажется проще, чем к обработке деревьев.
сейчас в вебе можно замечательно обходиться без работы с деревьями и вообще структурами данных сложнее массива
Мил человек, если вам удобнее обрабатывать массивы алгоритмами для деревьев, я ничего против не имею, от меня вам чем чего надо?
Мне не приходится обрабатывать сложные древовидные структуры, только списки, где for и foreach максимум второго уровня вложенности хватает за глаза.
Скорее наоборот — человек не зашоренный стандартными решениями совершенно точно не сможет решить задачу сразу… — он над ней должен подумать
Абсолютно не понимаю когда обсуждая знания и опыт человека в одном языке программирования просят решить задачу на другом…
Вот то, как он будет думать, и представляет интерес для проводящего собеседование.
После этого хочется спросить: а вы деньги будете платить за то как он будет думать или за решение которое он в итоге сгенерит?
Так что не всегда нужно устанавливать стандарты на то как человек думает
работодатель должен понять что он платит за результат
просто потому что человек одаренный возможно обратит свое внимание на другой аспект решаемой задачи, или на другой способ (который возможно вы уже посчитали как неэффективный)… и скорее всего то что он будет делать сперва будет жутко не эффективным и не правильным! (потому что человек ищет СВОЙ ПУТЬ)… возможно он придет к избитому решению, но он в отличие от многих других будет искать еще!!!
и много пытались проанализировать у автора статьи?
я так понял что его пытались натолкнуть на решение которое было известно (подсказывая)
опять таки- для решения вопроса о профессиональных качествах — есть испытательный срок
все остальное чем обычно занимается HR
2) Абсолютно не понимаю когда обсуждая знания и опыт человека в одном языке программирования просят решить задачу на другом… — это примерно тоже самое как нанимая учителя по русскому языку его на собеседовании попросят правильно расставить языки препинания в предложении написанном на китайском… — вроде как понятно что знания есть, значит должен разобраться… — но что таким образом проверяют ?!
void Connect(Node x){
while(x!=null){
Node newStart=null,y=null;
while(x!=null){
if(x.left!=null) y=addNode(x.left,y,ref newStart);
if(x.right!=null) y=addNode(x.right,y,ref newStart);
x=x.neighbour;
}
x=newStart;
}
}
Node addNode(Node x,Node y,ref Node start){
return start==null ? start=x : y.neighbour=x;
}
int dx=abs(targetX-sourceX);
int dy=abs(targetY-sourceY);
int p=max((dx+1)/2,max((dy+1)/2,(dx+dy+2)/3);
if((p+dx+dy)%2!=0) p++;
if(dx+dy==1 || (dx==2 && dy==2)) p+=2;
return p;
-А доска ограничена или бесконечна?
-Нет.
Что проверяется в этом случае? Что есть «problem solving skills»? Способность решать проблемы в случае факапа?Способность решать простые задачи без закладывания «бомб».
А про сложные алгоритмы — будут ли в вашей компании при реальной работе сидеть за спиной и смотреть на экран разработчика?Где вы тут увидели «сложный алгоритм»? Ту на выбор полдюжины алгоритмов — и все элементарны просто как не знаю что.
Не будут — тогда дайте задачу на дом и пусть он спокойно роется на stackoverflow и в гугле. То же самое он будет делать и на работе.Вот этого и боятся. Задачи подобного уровня не должны искаться «на stackoverflow и в гугле». Наоборот — человек должен выдавать приличный ответ сходу (хотя бы такой, как в решении номер 3) и дальше его можно уже обсуждать. Например спросить: «да, потребление памяти у вас тут приемлемо, но можно ли сделать лучше?».
На собеседованиях я никогда не давал задания написать код на бумажке длиннее трех строк. Это не было нужным.Извините, но… не верю.
Умного человека видно сразу.Фиг. Есть куча кандидатов готовых рассуждать о толкостях блокировки в Java или ещё о чём-нибудь подобном, но неспособных написать цикл так, чтобы чего-нибудь не потерять.
Код написать по алгоритму сможет любой.Поделитесь травой, а? Которой вы откуриваете 90% кандидатов, которые на это не способны? Всем легче станет, чесслово.
человек должен выдавать приличный ответ сходу (хотя бы такой, как в решении номер 3) и дальше его можно уже обсуждать.
Кто сегодня пишет свои собственные реализации красно-черных деревьев?
Кто сегодня пишет свои собственные реализации красно-черных деревьев?Эк вы меня уели. Нет, красно-чёрных деревьев я давненько не реализовывал, признаюсь. А вот изменение алгоритмов от списков к массивам с аренами-аллокаторами — это пожалуйста. И задачки подобные обсуждаемой тут (и их адаптация под не слишком «удобные» структуры данных, которые, зато более «Cache-Friendly» — это наше всё.
Вы попробуйте подобный алгоритм поставить на поток, да и к чему?К тому, что если у вас есть несколько миллиардов пользователей, то вы вполне можете выделить десяток программистов для того, чтобы снизить затраты на обслуживание одного из них на один цент в год — и это будет выгодно.
есть несколько миллиардов пользователей
Вы никогда не начинаете писать кода и лишь потом напильником встраивать математическую модель.Почему нет? Для большей части кода математическая модель столь проста, что вы берёте всем известные числа, делаете простую прикидку — и понимаете есть тут пресловутый цент или нету.
Если он не написал или ошибся — это ничего не значит.Если ошибся — не проблема. Не ошибается тот, кто ничего не делает. Но если он за час не решил задачу, которую, в общем-то, нужно решать за пару минут… то это о чём-то да, говорит, да? Иногда это говорит о том, что связь была отвратительная и кандидат просто не слышал ваших подсказок. Но не всегда же!
А значит ценность проверки невелика.Совершенно верно. Мы же решаем не вопрос где ставить запятую в известном выражении «казнить нельзя помиловать», а и всего лишь вопрос: «стоит ли вот этого кандидата вот прямо сейчас брать на работу». Если это была случайная оплошность — ну придёт кандидат через год-два. Или не придёт. В любом случае это — не конец света!
Проще распечатать несколько вариантов готового кода и дать ему с просьбой прокомментировать подход или найти ошибки.Большинство кандидатов будут потеть столь же усердно, но о кандидате вы узнаете меньше.
Но если он за час не решил задачу, которую, в общем-то, нужно решать за пару минут…Откуда в вас столько снобизма? Аж противно читать. При том, что, кажется, уже каждый 4-ый комментарий в этом топике ваш. Вы так самоутверждаетесь что-ли? Да, это не самая сложная задача, но и не самая простая. Да, человек, который с подобным почти не сталкивается в реальной работе, вполне может затупить. А вы уже счёт на минуты повели.
Меня смутил только лишь снобизм. Следуя вашим словам, получается, что автор вообще никуда не годен, раз не может решить за 2 дня задачу, на которую вам потребовалось бы всего 2 минуты.
Следуя вашим словам, получается, что автор вообще никуда не годен, раз не может решить за 2 дня задачу
Если работа как-то связана с навыками в алгоритмах, и от соискателя требуется понимание алгоритмов, структур данных и соображайка в этом деле, то почему нет.Любая работа в большой компании всегда связана с алгоритмами и структурами данных. Про одну сторону я уже говорил. Но есть и другая. Если вы засунули O(N2) «не по делу» в сайтик с маленьким интеренет-магазином, то вы можете превратить тысячу в миллион, а десять тысяч — в сто миллионов. При быстродействии современных компьютеров в миллиарды операций в секунду «это» будет тормозить, но работать.
А вот если вы сделаете это с миллиардом пользователейДык, ну а кто левого человека, просто так, пустит в проект с миллиардной посещаемостью? К чему этот оторванный от реальности пример? Понятное дело, что и вакансии на web-программистов друг от друга отличаются. Зачем вы всех под одну гребёнку? Ясное дело, что в Twitter и в «Веб-студия: Рога и Копыта» возьмут разных людей. Первым нужны спецы, вторым они противопоказаны.
Если вы засунули O(N2) «не по делу» … «это» будет тормозить, но работать.Очень часто именно это и требуется. Точнее не так: только на это и хватает бюджета.
Любая работа в большой компании всегда связана с алгоритмами и структурами данныхМне всегда казалось, что чем крупнее штат, тем меньше требований к отдельному винтику. Но в больших компаниях я никогда не работал (и работать не хочу, если честно). Могу ошибаться.
Очень часто именно это и требуется. Точнее не так: только на это и хватает бюджета.Возможно. Но:
Примерно месяц назад со мной связался охотница за головами из одной крупной софтверной компании.Большая компания редко когда предполагает копеечный бюджет.
Мне всегда казалось, что чем крупнее штат, тем меньше требований к отдельному винтику.Не «меньше требований». Меньше «возможностей для контроля».
Дык, ну а кто левого человека, просто так, пустит в проект с миллиардной посещаемостью?А откуда, как вы думаете, берутся люди, которые пишут код в таких проектах? Их что — на гидропонике выращивают?
Зачем вы всех под одну гребёнку?Не «зачем», а «почему». Потому что так проще и дешевле.
мне кажется давать реализовать какую-нить дейкстру или еще какой-нить алгоритм, до которого люди доходили десятилетиями сходу на 40 минут это перебор для кандидатов.Вы это серьёзно? Вот прямо так? А ничего, что на изобретение дробей ушли тысячелетия? А ничего, что о матане всего лишь лет 400 назад никто и не догадывался? Прикажите теперь кандидатов, не умеющих складывать дроби и рассуждать в терминах O большого на работу брать?
Нет же набора в команду постоянно кучи народа, обычно нужно 1-2 человека.Вы плохо себе представляете процедуру набора. Набор идёт постоянно — просто потому, что для того, чтобы взять 1-2 человек нужно просмотреть от 50 до 200 кандидатов. Просмотреть такое количество кандидатов 5-6 людьми (типичный размер команды) нереально, потому отбор ведут далеко не только члены той команды где вы будете работать.
Может, в процессе этой недели выяснится, что с ним не уживается полкоманды, а на собеседование это былоб невозможно уловить.А чего тут за неделю изменится? Если даже вновь нанятый за эту неделю не только успеет освоить процесс сборки, но и, о боги, чего-то сочинит (невероятное везение, кстати: если на прохождение всех стадий и доведение первого кода до влития в репозиторий уходит месяц, то это у нас считается черезывачайно быстро)… по этим двум строчкам кода о чём-то судить вряд ли получится.

Однако то, что такая практика принята почти во всех крупнейших софтверных компаниях (Микрософт, Гугл, Яндекс точно), указывает на то, что что-то в этом есть. Все-таки не дураки там рулят HR-отделами.
Сорри, но сам пострадал из-за таких людей — больной вопрос.Оно и чувствуется.
Слишком часто на моей памяти это убивало хорошие решения.Простите, но… откуда вы знаете, что предлагаемые вами решения были хорошими?
А за фразу «если уж Гугл/Яндекс так делает, значит это хорошо» — я бы предлагал сразу ставить вопрос о соответствии человека должности (особенно руководящей).Почему вдруг? Если что-то делает [Известная компания], то это — однозначно не самое плохое решение. Оно может быть и не самым лучшим тоже (когда-то то, что делали IBM и Digital было эталоном, а то, что делают Гугл/Яндекс было «чем-то странным»), но оно точно не самое плохое. Уж по крайней мере какую-никакую, но обкатку оно прошло, можно говорить об эффективности.
Если что-то делает [Известная компания], то это — однозначно не самое плохое решение
У Google и других больших компаний было достаточно много не взлетевших или неудачных технологий.Совершенно верно. И именно это позволяет вам сказать, что один тот факт, что Google использует (или не использует) какую-то технологию не говорит о том, что она является лучшим выбором. Я сам лично наблюдал как и Microsoft и Google делали очевидные глупости с выбором технологий.
Я работал, например, в Motorola 10 лет назад в золотые годы ее телефонов. Я видел изнутри достаточно плохих решений на уровне компании.Которые привели-таки компанию к краху, да. Причём случилось это не 10 лет назад, «сыпаться» Motorola начала раньше — но и здесь нужно скорее говорить о том, что метрики оценки работы внутри компании стали плохо работать (это объективный факт, иначе краха бы не случилось), а не о том, что стали принимать худших рабоников (скорее уходить начали лучшие).
О, давно не было плача о собеседованиях на Хабре.
Однако то, что такая практика принята почти во всех крупнейших софтверных компаниях (Микрософт, Гугл, Яндекс точно), указывает на то, что что-то в этом есть. Все-таки не дураки там рулят HR-отделами.
Звучит несколько некорректно, на мой взгляд. Автор описал свой опыт, живым языком, но называть это «плачем» я бы не стал. Если это не с целью унижения автора, конечно.
А что если кандидат написал неоптимальное решение только потому, что боялся за отведенное время еще больше облажаться с правильным?А он об этом сказал? А что он ответил после этого? А после разъяснений?
Он может это сказать, конечно (я решил вот так, но это неоптимально, лучше было сделать через вон тот способ), но какой в этом для вас смысл если вам нужен именно код, а не разговоры?Тут уже много говорилось: если у вас подход «есть задача, нужно решение», то вам сотрудник не нужен совсем, отдаёте задачу «на сторону» и всё.
Что если он не помнит (ну вот не помнит, перепутал на нервах) какая из двух библиотечных функций оптимальнее в данном случае, а посмотреть в гугле не может?Вот именно поэтому мы тут обсуждаем задачку, которая гугления не требует, не так ли?
Что если у него нет, как в нормальных привычных условиях, возможности написать и запустить тесты для проверки?Много вы видели тестов способных отличить O(N2) реализацию от O(N)?
Вариант «попросить подсказку» я все-таки предпочту не рассматривать, поскольку для большинства кандидатов, мне кажется, это равносильно признанию «не знаю» и они стремятся этого избежать всеми способами.Наоборот: это тот вариант, с которого нужно начать!
Неплохо оценивает, если по статье судить.
Ну это сугубо ваше мнение, опрос показывает что оно идет в разрез с большинством.Большинством собеседующих? Или большинством тех, кто хочет устроиться на работу?
1. Вы не знаете что такое обход в ширину, потому что не поняли сразу, что это задача на обход в ширину. Только к третьему решению вы начали использовать очередь.
Вы не умеете оценивать время работы алгоритмов
2.2. потому что ваше второе решение работает за О(2^h) где h — это высота дерева.Тут право я не совсем понял почему.
Во втором решении вы меняете представление дерева, но не учитываете стоимость нового представления в вашей оценке потребляемой памяти.
Как же это плохая задача, если с помощью нее за такое короткое время можно показать огромные пробелы в вашем знании базовых алгоритмов и оценке их сложности?В том то и дело, что упражнение называется, не упражнением на знание теории алгоритмов и оценке их сложности а упражнением на умение решать проблемы.
В том то и дело, что упражнение называется, не упражнением на знание теории алгоритмов и оценке их сложности а упражнением на умение решать проблемы.Вы не поверите, но это упражнение является упражнением на умение решать проблемы. Про том условии, конечно, что вы информатику computer science, а не умение работать в Ворде!) знаете в приличном объёме.
знающие инфрматику (теория алгоритмов, теория информации и прочее) и её не знающие.
Т.е. насколько я понял для вас люди знающие информатику это люди способные решать типовые задачки оторванные от всяких реалий.Да, конечно. Но вы забываете что это — только первый этап.
Ну а все остальные это вордо-отличники, знания которых никому не интересны.Почему же сразу «никому»? Кому-то другому, в другой компании, на другой позиции — да, они могут быть и интересны. В Google или Microsoft — нет.
Да, конечно. Но вы забываете что это — только первый этап.
Надо посмотреть сможет ли он в реалиях находить подобные задачи и
В Google или Microsoft — нет.
Microsoft, хм, подождите ка минутку, эта не та ли компания что продолжает нас радовать выпусками шарпоинта, отсутствием нормальной файловый системы и прочими плюшками?Эта та компания которая в борьбе с BeOS, GEOS и прочими всякими IRIX взяла и просто-таки уничтожила всех конкуретнов. Осталась парочка на десктопе и горсточка на сервере. Причём и там и там присутствует (кроме творения Microsoft) ещё только лишь одна система — которую при этом пилят «всем миром» (всякие Kolibri и ReactOS уж позвольте не учитывать — это хобби, а не коммерческие системы, совсем другая категория).
Осталась парочка на десктопе и горсточка на сервере. Причём и там и там присутствует (кроме творения Microsoft) ещё только лишь одна система — которую при этом пилят «всем миром» (всякие Kolibri и ReactOS уж позвольте не учитывать — это хобби, а не коммерческие системы, совсем другая категория).
у Microsoft файловая система не идеально
Сумеете сделать лучше — сможете рассказывать про «отсуствие файловой системы и прочие плюшки»
И вот чтобы так суметь — и проводятся подобные собеседования.
Что конечно же не отменяет главного факта, что для многих людей интервью это стресс. А программирование это совершенно не стрессовое занятие, даже наоборот это drive, а не стресс.
не зная алгоритмов обхода бинарного дерева их практически невозможно придумать самому за 10 минут. Собственно, как и формулы мат. анализа и даже вещи гораздо проще. Если вы их не знаете, не изучали в школе или просто забыли, изобрести их самому невозможно.
Мне не очень понятен ваш сарказм про «шаблоны на вордпресс натягивать». Грамотно натягивать шаблоны на вордпресс — это тоже нужно уметь, это тоже работа, за которую, между прочим, платят неплохие деньги.
Что не отменяет того факта, что если мне будет нужно, я зайду в гугл и за пол часа — час вспомню, что там к чему.
А вы в школе изучали алгоритмы обхода бинарного дерева? Клевая школа, наверное.В классах с углублённым изучением информатики (да и математики, обычно) такое изучается в обязательном порядке.
Далеко не все айтишники учились в институтах по профилю своей текущей работы. А если и учились, то часто выслушивали бредовые лекции от старых преподавателей, которые и один доллар на современном рынке не заработают. Есть разные вузы, it depends.Да какая разница работодателю — учили вы это в ВУЗе, школе, или сами на досуге сели и Кормана проштудировали?
Да нифига, как показывает практика программист посмотрит вокруг что и как и сделает как надо, почитает две три умных книжки, набьет пару шишек и все.Не всё. Всё — это если у вас острая нехватка кандидатов. А если их хватает, то зачем брать человека, который ещё не читал умных книжек и только лишь, возможно, прочитает их в будущем?
На самом деле эта задача вообще нифига не скажет вам о программисте кроме того что в данной конкретной ситуации он решить ее не смог(если не решил).Это если давать её в таком виде, в каком тут многие предлагают: типа «иди куда хочешь, решай как хочешь». В противном случае можно смотреть как человек реагирует на подсказки и тому подобное.
Ну а если он набрался глубоких знаний за последние 5 собеседований(например прочитал книгу) то вы большой идиот что упустили на первом собеседовании такого человека и нихрена эта ваша система набора не работает.Ваши слова имели бы какой-то вес, если бы на одного кандидата «набравшегося глубоких знаний за последние 5 собеседований» не приходилось несколько десятков таких, которые и после сотни собеседований пышут негодованием и кричат «да, конечно, я могу… если только книжку почитаю… и если ещё на несколько собеседований схожу», а сами по прежнему не могут развернуть список и провязать дерево.
import itertools
class Node:
def __init__(self, d, l=None, r=None):
self.data = d
self.left = l
self.right = r
self.next = None
def __str__(self):
return 'Node: {} Next: {}'.format(self.data, self.next)
def link_tree(tree_root):
def link_layer(roots):
items_layer = filter(None, itertools.chain(*[(root.left, root.right) for root in roots]))
items_layer.append(None)
for (cur, n) in zip(items_layer[:-1], items_layer[1:]):
cur.next = n
return items_layer[:-1]
cur_roots = [Node(None, tree_root)]
while cur_roots:
cur_roots = link_layer(cur_roots)
def prin_tree(root):
if root:
print root
prin_tree(root.left)
prin_tree(root.right)
tree = Node(1, Node(2, Node(4)), Node(3, Node(6), Node(7)))
link_tree(tree)
prin_tree(tree)
link_layer внутри link_tree многим не нравится, к примеру), но само понимание задачи — налицо. И даром, что язык не самый подходящий для обсуждения вопросов сложности и потребления памяти, их понимание у соискателя — явно имеется. Есть повод для дальнейших разговоров.void ConnectNeighbors(Node[] neighbors)
{
while(neighbors.Any())
{
for(int i=0; i< neighbors.Length-1; ++i)
neighbors[i].Neighbor = neighbors[i+1];
neighbors = neighbors
.SelectMany(n=>new []{n.Left, n.Right})
.Where(n=>n!=null)
.ToArray();
}
}
Ну как минимум в строчке присваивания массива. Массив передан по значению, следовательно все ссылочные изменения внутри метода локальны.
Не говоря про то, что входные данные — корень дерева, а у вас какой-то массив.
Заведующий лабораторией, тех. дир. двух разных успешных фирм.Количество людей в этих фирмах? С точностью до порядка хотя бы? Тысяча сотрудников, десять тысяч, сто?
если ваш стартап имеет «за душой» хотя бы пару миллионов пользователейВ мелких конторах — да, могут позволить себе носиться с «крутейшими уникумами» (да и то — чревато: разозлите вы такого громкими разговорами, он хлопнет дверью некому будет выдавать «результат»), в крупной же — это право нужно заслужить. Обычно — приводом хорошего, достаточно большого, коллектива и/или достаточного количества пользователей.
Такие вещи не прощаются в основном в армииАрмия — это крайний случай. Это, в некотором смысле, компания на миллион человек. Но да, это вы верно подметили: чем больше в компании народу, тем меньше она склонна подстраиваться под хотелки работников.
И вашем воображенииДа, но в конечном-то итоге моё вооражение выливается в оценку «брать/не брать».
Node.{
leftmost = left || right
isLeft = parent.left == this
neighbor lazy = parent ?. (( this.isLeft ? rigth : Nil) || neighbor ?. leftmost ) || Nil
}
nextItem(Node) = _ . ( leftmost || neighbor || parent)
for(var item = root; item; item = nextItem(item));Оригинал кода задания был сделан на псевдо C#, но я предпочитаю javascript.
class Node
{
int data;
Node left;
Node right;
Node neighbour;
public Node (int data)
{ this.data = data; left = null; right = null; neighbour = null;}
public Node CreateLeft (int data)
{ var newNode = new Node(data); this.left = newNode; return newNode;}
public Node CreateRight (int data)
{ var newNode = new Node(data); this.right = newNode; return newNode;}
public int ConnectAllNeighbours()
{
int links = 0;
if (left != null && right != null)
{
left.neighbour = right;
links++;
}
if (left != null) links += left.ConnectAllNeighbours();
if (right != null) links += right.ConnectAllNeighbours();
return links;
}
}
1-> Nil
/ \
2-> 3-> Nil
Здесь у нас корень — элемент №1. У него есть два ответвления — левое и правое. Они завязаны к корню, но не между собой (изначально).
У каждого элемента есть один сосед, который указывается на схеме как «находится справа». По логике моего кода будет такой процесс:
1) Создается элемент 1
2) Для элемента 1 создается и привязывается как левый элемент 2
3) Для элемента 1 создается и привязывается как правый элемент 3
4) Элемент 1 знает, что для левого элемента 2 элемент 3 является соседом и он проставляет эту связку.
не свяжет left.right с right.left. А по условию, должен
Вы хотите, чтобы код был написан за разумное время, чтобы он работал достаточно быстро, или чтобы его смогла поддерживать вся команда? Выберите любые два требования.
Сможет ли «вся команда» поддерживать какую-нибудь модификацию, скажем, алгоритма Укконена, или какого-нибудь QR-алгоритма?
Проблема в том, что для «всей команды» (включая тимлида) код останется таким же непонятным.
Это уже не проблема. Мы уменьшили басфактор вдвое — ну и хорошо. Уменьшать дальше неэффективно? Не будем.
Умение писать код проще всего проверяется написанием кода, чесслово.
Умение устно описать алгоритм и умение его рализовать — это разные умения.
Мы встречали кучу сеньоров (Senior Engineer), которые не просто не умели написать код, а как бы даже гордились этим: «да, я уже два год код не пишу, а вы хотите, чтобы я тут дерево обходил?»…
вам дано задание сделать систему, которая могла бы искать оптимальный маршрут в транспортной сети города с учетом пересадок и т.п. (по аналогу гугл мапс). Опишите без всякого кода как бы её реализовывали» [...] тут не требуется писать код или придумывать хитрые алгоритмы,
Для начало, подумает ли кандидат что такое оптимальный маршрут с точки зрения пользователя (наиболее быстрый, с меньшим кол-вом пересадок, самый дешевый, с наименьшим ожиданием транспорта на остановки), учтет что в реальной жизни оптимальный маршрут в час пик будет совсем другим, или если пользователь собирается выйти в 10 вечера транспорт по самому идеальному маршруту он будет ждать до утра.
Потом, если кандидат скажет, что для данной задачи он знает замечательную библиотеку Васи Пупкина, которая отлично ищет идеальный путь в графе, а он просто оптимизирует её для учета пересадок, расписаний транспорта и стоимости проезда — это тоже будет корректным решением.
Это, на минуточку, задача аналитика, а не программиста.
Если вы думаете, что предметная область построения маршрутов для общественного транспорта всем хорошо известна, то вы зря так думаете.
от программиста ожидают выполнения бизнес-анализа
Мне она тоже совершенно неизвестна
в задаче не требуется ничего кроме как умения думать.
А вот знания алгоритма Дийкстры умения подумать не покажет.
Не хотите, задач с предметной областью, спросите у программиста, занимающийся интеграцией, как бы он писал интеграцию с определенным сервисом, как обрабатывал данные, ошибки и т.п., по шагам, просто с размышлениям, использовал ли он бы базы и orm или работа в памяти, как бы парсил, каким образом получал бы данные с сервиса. Если это senior программист, а не просто кодер, это будет сразу видно.
От опытного программиста ожидают умения думать, а не тупо кодировать по паттернам.
Тогда откуда вы знаете про час пик, или про то, что транспорт может не ходить в определенное время?
Очень опасно подменять умение думать умением додумывать.
И некоторые вещи проще «видеть» в коде (пусть и псевдо), нежели на пальцах объяснять.
А вы не в курсе, что в вашем городе бывает час пик или о том что транспорт не ходит круглые сутки?
элементарные знания жизни в городе есть у всех.
Нет, просто прежде чем додумывать, нужно задать вопрос, а так ли это на самом деле.
можно дать комп, IDE и возможность гуглить с простой задачей из тех что встречаются в работе постоянно. А через полчаса-час посмотреть какой код у кандидата получился в результате. Это будет честнее и проще, чем смотреть как кандидат копипастит из памяти алгоритм быстрой сортировки, который выучил специально перед собеседованием.
Я могу быть не в курсе. Например, если я последний раз пользовался общественным транспортом пять лет назад. Или если я из другой страны.
для этого уже надо додумать, что в задаче что-то не указано.
И вполне можете забыть, что совсем элементарное вроде как в Java найди вхождение подстроки в строку. [...] Может быть вы в инете никогда инет магазин не видели, а тут вам задание сделать реализацию личного кабинета в инет магазине…
Да, а когда аналитик дает вам требования надо додумать, что будет «если человек сажающий деревья заболеет».
Отсеивать людей из-за отсутствия жизненного (не профессионального) опыта, конечно, можно, но это никак не связано с их профессиональными качествами.
Если человек предложит, например, сделать мобильное приложение, которое будет собирать данные разных пользователей, а потом с помощью машинного обучения выдавать прогнозы на появление пробок/аварий/ремонтов другим пользователям — это другое решение, показывающее большую креативность.
При таком ответе следующий вопрос будет про что-то более конкретное с его реальными обязанностями по написанию кода
знания алгоритмов на память как раз в реальной работе не всякому программисту нужны
а когда нужны ему достаточно открыть инет.
И вы всерьёз предлагаете описать систему, которая это учитывает, на собеседовании, без подготовки?
Не уверен, хороший senior всегда должен быть немного аналитиком, немного архитектором, немного тимлидом, немного тестером.Абсолютно верно. Но вначале он должен быть хорошим программистом. А всё остальное — уже потом. Это плюшки, которые могут повысить или пониить оценку немного туда-сюда.
вначале он должен быть хорошим программистом. А всё остальное — уже потом
То же самое с технологиями, описать как на каком-то Фреймворке будешь что-то делать даже очень приблизительно крайне сложно без реального знания Фреймворка.И вот тут-то собака и порылась. И прорыла серьёзный такой водораздел между малыми и большими компаниями.
А вот придумать хотя бы очень примерное решение конкретной рабочей задачи с которой ему придется работать, пусть без всякого кода, человеку «не в теме» почти невозможно и это сразу видно.Так никто ж ведь «не в теме» (по крайней мере первые пару месяцев), в этом и проблема!
И прорыла серьёзный такой водораздел между малыми и большими компаниями.
В большой же компании — куча своих фреймворков! С которыми за пределами компании никто не работает! И их вам в любом случае придётся осваивать.
Месье, ваши problem solving skills не на высоте, или как я провалил одно собеседование