Комментарии 158
Можно передавать в Парижскую палату мер и весов как эталон задачи, которая не подойдет для собеседования.
Вот говоришь ты такой: «Нам для БД нужно два сервера, master и hot standby».
А тебе в ответ: «У нас будет только один сервер».
А ты: «Ok, давайте развернем standby в виртуалке на том же сервере. Так еще и количество ядер удвоится».
Все довольны. Занавес =)
Как то страшно и радостно, что уровень джуниоров так вырос (или это частный случай?)
Людей обычно «ломают» не вопросами, рабочей обстановкой.
Но тут в вопросах по .Net явный перекос в теоретику. В отличие от SQL, например. Некоторые пункты могут вообще ни разу не встретиться за годы разработки.
И если человек ответил на все вопросы, то тут два варианта:
- У него есть 10 лет опыта в разноплановых проектах на C#.
- Он заучил справочник перед собеседованием.
И в случае собеседования на джуна / мидла ответ очевиден :)
MVVM — это тоже MVC--костыль к WPF и Силверлайт (или WPF это костыль к MVVM — это дискуссионный вопрос).
Event и delegate — опять таки чисто .NET мозгокрутка. В Жабе делгатов нет, а в С/C++ вместо этого дотнетовского зоопарка хватает обычного теплого и лампового указателя. Да и вообще вопрос холиварный ИМХО
Ну использую я синглтон, обсервер, адаптер. Так я их использовал и до того как они стали паттернами. Но чтобы объяснить чем фасад отличается от адаптера, мне надо в вики слазать. Мне можно уйти?
Хотя сеньоров больше по практике гоняют. Что сделал, что не сделал. А вот такой проблемы у вас не было. Была? И как решали? Что правда так? А мы-то почти без извращений обошлись…
Проблема паттернов в том, что их настолько раздули до состояние «божественности», что многие их пихают куда-то только можно, что порой приводит не к решению проблем, а к их росту в кратном размере.
Всему свое место.
Да, для упрощения общения и оформления кусков кода, похожих на паттерн, соответствующим образом, чтобы при чтении чужого кода возникало меньше вопросов.
> А сотрудники которые «всё понимают, а сказать не могут» явно востребованы меньше.
То есть сотрудник, которые использует термины «прокладка»/«прокси», «враппер» вместо «фасад», «адаптер» востребован меньше? А термин «шаблонный класс» для программиста на С++ вообще означает совсем другое, а не паттерн.
Вы путаете с «шаблонным методом». Паттерна «шаблонный класс» не сущестует.
От этого суть моего комментария не меняется. Вот шаблонный метод:
template <class T>
void DoSomething(const std::vector<T> &data);
А называть паттерн «шаблонным методом», а не классом, у меня язык не поворачивается, потому что он представляет собой класс, а не отдельный метод.
Сама суть паттернов в том, чтобы иметь общепринятые названия. А общепринятое название — шаблонный метод.
> потому что он представляет собой класс, а не отдельный метод
Больше половины паттернов представляют собой класс, но от этого они не называются «класс». Потому что их название отражает не их реализацию в коде, а их суть. И суть паттерна «шаблонный метод» в том, чтобы иметь шаблон метода, где под шаблоном понимается заготовленная реализация с переопределяемыми шагами.
Может смысл в том что на junior-а и изучить насколько хорошая память и знает теорию?
К примеру в вопросах по sql попался кластеризированный индекс, это же не про sql как таковой а про mssql(в oracle это будет ibdex organazed table), причём же тут .net платформа?
И в принципе проработав много лет с .net можно с половиной тем не встретится :)
причём же тут .net платформа?Юольшинство вакансий на .NET это Asp.NET, по крайней мере, субъективно выглядит так. Автор, похоже, тоже на эти выкансии пробовался. Ну а там где asp.net там почти всегда mssql. Вот и вся история.
Если на теорию отвечает — значит читал, разбирался, помнит. По хорошему можно ещё допвопросы задавать на предмет догадается ли как это применить. Но доп вопросы ещё придумать надо ))))
Трижды проходил собеседования на позицию Sr.Firmware Engineer в компаниях Tesla, Apple и в каком-то стартапе. Нигде не было задач на логику типа вагонов и монет с носками. В стартапе только были задания на знание школьной математики и физики. Их задают, когда нормальных вопросов для интервью придумать не могут?
Не проходил собеседования в Tesla / Apple, но проходил в других больших компаниях, и советую книжку "Cracking the Coding Interview by Gayle Laakmann McDowell". Автор работала в Google, Microsoft, и Apple, и вопросы в больших компаниях в основном очень похожи.
Если что, то собеседовали человека ко мне и под мою задачу, а она за компанию пошла…
С другой стороны может и правильный подход
Неправильный. Крупные компании, в основном, задают такие вопросы на этапе phone screen / skype interview, потому что они не могут позволить себе возить к себе в офис всех за свой счет, и им нужно отсеять 90%. Они отсеивают тех ребят, которые умеют быстро за ограниченное время решать сложные логические задачи.
В небольшой компании в таких вопросах смысла нет, гораздо лучше спросить то, с чем необходимо иметь дело в работе (особенности языка, паттерны, boxing / unboxing, итд).
Это вот как раз может отсеять 90% кандидатов, если требования на позицию высокие (если нет, то можно брать всех подряд).
Конкретно в моем случае, еще 90% отсеивалось после моего увлекательного рассказа что здесь надо делать и через какой мир боли придется пройти. Но тут правда действительно задача для супер-героев.
Но это все если позиция действительно сложная. Если что-то простое, то можно всех подряд брать, а про boxing и unboxing человек может потом и в MSDN прочитать для общего образования. Потом все равно по какой-то магической причине у человека который рассказывал на собеседовании про boxing/unboxing но все равно пишет:
Point pt = new Point();
Console.WriteLine(pt);
Что в принципе нифига не смертельно.
Или
int i = 10;
ArrayList arrlst = new ArrayList();
arrlst.Add(i);
int j = (int)arrlst[0];
Хотя ArrayList наверное никто не использует уже… на самом деле .NET в этом плане несколько более дружелюбный. Это вот в Жабе можно испытать батхерт от Long и long например.
А что не так с первым кодом? Да, там есть боксинг, но накладные расходы на него пренебрежимо малы по сравнению со стоимостью вызова `Console.WriteLine`, а усложнять читаемость кода явным вызовом `pt.ToString()` не хочется.
Много вопросов по железу т.к. позиция Firmware Engineer то проверяют есть ли хоть базовые понятия о том, как работает электроника.
Вызвать инструкцию POPCNT через интринсик компилятора. Такой ответ принимается?
Ответ то примется, но сразу возникнет уточняющий вопрос, как это будет работать на ARM, MIPS, Power, C2000 и т.д. Обычно хотят видеть вот это:
v && !(v & (v — 1));
В смыле v & (v - 1) == 0
?
Ну так это тоже что и я написал. Только, в начале, принято аргумент проверить не равен ли он нулю.
А ведь это даже не песочница, — приветствую тебя, Хабрахабр образца 2017 года! O tempora, o mores!
Открытый вопрос. Работник с малым опытом, но крепкими знаниями, которого уже не надо учить — это мидл или нет? Полгода на проекте и будет у него опыт.
Разделение условное. И, думаю, вполне толкового новичка можно ставить на мидл позицию, если он умеет обраться с людьми.
Недавно искал работу на должность Middle JS разроботчка. Разместил резюме на сайте поиска работы и мне, однажды, позвонили из одной американской компании (украинский отдел). Дали ссылку на вакансию, там было написано, что требуемый опыт работы 3 года, в то время как у меня всего 2. Думаю ладно, может число с неба взяли. Выполнил задание, прошел тех. собеседование. Через пару дней ответили, что я понравился украинскому отделу, но конечное решение принимает американский, и там думают, что 2 года это мало, поэтому отказ.
Сам я по этому поводу не сильно расстроился, т.к. уже был оффер, плюс в тестовом задании ножно было использовать, для меня, стэк, что хорошо для развития.
Но вообще, лучше переспрашивать в подобных случаях.
Про 80% не удивительно, удивительно, что не 100. Такие вопросы и джуниорская зп.
Зарплата вовсе не способностями определяется, а скорее стажем. Часто видел откровенно посредственных сеньоров и даже принципалов как и выдающихся джуниоров.
Опыт тоже денег стоит, можно решить сложную задачу а можно знать где лежит решение которое уже протестированно и проверено временем.
С решением же логических задачек вообще непонятно. Уже давно известный факт, что умение их решать говорит лишь о умении решать логические задачи. Не более того. Сильно сомневаюсь, что это хоть как-то относится к профилю хоть одной компании.
Может быть кто-то знает ответы на эти вопросы. Зачем это все?
По поводу логических задачек. Они славятся тем, что нужно «догадаться». Если ты не догадался, то однозначно не решил. К тому-же такие задачки как с носками и монетками вообще неоднозначны. Скажем решил человек задачку положив половину монеток в каждый из носков, а потом запихнул носок в носок. Решил? Да. Но если мы говорим о программисте, то лучше будет если он ее не решит. Потому, что на практике массив и массив с вложенным массивом не одно и то же. Вот и думай теперь хорошо, что он решил или нет.
Хотите задачку? Дайте математическую. Для примера. Найти наименьшее натуральное число сумма цифр которого равна 40. Вроде бы ничего сложного. Правда? Но при этом вы проверите как хорошо соискатель знает основы математики, исчисления, как хорошо ориентируется за что отвечает каждый разряд. Начнет-ли он хаотично метаться или пойдет равномерно. Будет использовать прямой перебор или будет, к примеру, использовать максимальное число в каждой разрядности. Решил? Молодец! А 42? И тут могут быть несколько сценариев от мгновенного ответа до повторения части вычислений. Хотите устроить стресс-тест? Не вопрос. Предложите решить эту же задачу с помощью программы. На любом другом языке. Сейчас мало кто требует только один язык. Наверняка в резюме будет Python, а может быть что-то из модного типа Lisp или Haskell. Предложите ему ноут с Linux. Логинитесь в консоль и отдаете. Безусловно нужного языка быть не должно. Мало того, что вы мгновенно узнаете правду ли он написал по поводу администрирования, так еще и узнаете как он себя поведет в экстренной ситуации. Даже если соискатель действительно не первый раз видит Linux он как минимум должен попросить пароль. И даже если первый- не беда. Пусть признается, что нужна помощь и ее стоит оказать и посмотреть как себя поведет дальше и как он решит задачу. Как минимум можно использовать традиционный путь или функциональный подход. Не знаю как вам, а лично мне так нравится куда больше. Во всяком случае намертво заклинить не должно. А потерять перспективного кандидата только потому, что он не умеет монетки по носкам раскладывать — глупо.
Найти наименьшее натуральное число сумма цифр которого равна 40
Так как система счисления не указана, ответ 4041. ("40" это одна цифра)
Кстати, если не подойдёт 41-ричная, всегда есть палочная. В ней сумма цифр натурального числа всегда равна самому числу. ;)
Возможно потому, что знание теории computer science и типов данных (вроде всяких односвязных-двусвязных списков, двоичных деревьев итд) не имеет отношения к прикладному программированию, только если вы не разрабатываете свой ЯП или свою базу данных.
И человек может это знать, только если у него в университете был CS101 (чего в российских реалиях ожидать глупо), либо если он готовился к собеседованиям по книгам.
А вот что такое Boxing/Unboxing при разработке на C# знать надо, но джуниорам не знать это простительно.
Я не считаю, что не нужно знать основных алгоритмов. Хотя-бы иметь о них представление — очень хорошо. Но что бы прям жить без них было нельзя- большое преувеличение.
Если джун не знает списков, это, конечно, не приговор, но как минимум это заставляет задуматься, а чем же он занимался в техникуме/колледже/институте и даёт повод задать дополнительные вопросы.
Допустим я не знаю как устроен связанный список. Я только знаю его «свойства».
За свою многолетнюю практику такого не встречал. Ещё сложнее представить джуниора, которые узнал свойства, умеет их анализировать и применять, но не знает откуда они взялись. Тем нем менее, знаете свойства — хорошо, значит уже что-то значете об списках и, возможно, сможете правильно их использовать по назначению.
Связанные списки мы проходили на первом курсе колледжа. Это обязательная программа на специальность программиста. В госстандарте это первый год обучения специальности, неважно среднетехническое это образование или высшее. Если их в программе нет, то и госдиплом вряд ли в таком учебном заведении можно получить. Разве что «оператор ЭВМ».
Ну так и интегратор средней руки это не работа мечты для крутого студента.
Когда меня заставляли собеседовать народ, то на джуниора я обычно спрашивал в какие игры играет, какой сорт виски предпочитает, ну можно было спросить опционально про какие-нибудь общие понятие ООП, чтоб совсем несерьезно не выглядеть.
А вот решение тестовых задачи и/или ссылки на свой какой-нибудь код — по-моему единственная эффективная по которой можно хоть как-то оценить человека.
Так же хочется отметить тот факт, что в своем резюме я указал, что занимаюсь олимпиадным программированием и это очень положительно повлияло на ход многих собеседований. Меня просили рассказать, что это такое. Меня удивило, что большинство интервьюверов не знали про такое движение в программировании.
Угу и задают вопросы:
Вы находитесь в пустом поезде...
Внезапно это как раз олимпиадная задачка…
Чойт меня не покидает ощущение, что люди совсем не знают кого хотят набрать, может я постарел и засиделся?
Но это вообще олимпиадная задачка: олимпиадники обычно знают решение, прочие — как повезет, но сходу догадается не каждый, тем более за ограниченное время собеседования, можно еще и яркой лампой в лицо в упор светить и проводить собеседование в комнате без окон для создания более дружелюбной атмосферы…
Но с другой стороны эта задачка не из воздуха — есть такая штука как «кольцевой(циклический) список» — вот и ходи по нему бесконечно, т.к. хрен его знает где начало, а где конец :-)
С монетками — делим по полам, и один носок вставляем в другой…
Присваиваем n=0. Включаем свет, идем вперед на 2^n шагов, выключаем везде свет по пути, идем 2^n шагов назад, если свет в вагоне выключен, значит 2^n больше или равен числу вагонов (и значит, что больше нет вагонов со светом), включаем, считаем, пока не упремся в вагон со светом, возвращаем посчитанное, иначе увеличиваем n и goto 2. Решение честно вычитано где-то в параллельном потоке трепа.
нужно создать упорядоченную последовательность «включенных» и «выключенных» вагонов при этом откатываться назад и проверять не достигли ли мы конца стека вагонов. И желательно поменьше бегать.
1) включаем свет в первом. ****1****
2) двигаем направо выключая свет в двух справа. Затем заходим в следующий и включаем там.*****100*****
3) возвращаемся по изученным вагонам следим чтоб не произошло изменений 2 темных 1 светлый ***000100***
4) идем налево и оставляем 3 вагона темными и в следующем за ним включаем свет *111110001001111**
5) в итоге мы с каждой итерацией увеличиваем последовательность упорядоченных светлых или темных вагонов и при этом проверяем на ошибки прежние «записи» и при обнаружении ошибки понимаем что кольцо замкнулось. Там уже проще вычислить через сумму чисел до числа равного количеству итераций до ошибки плюс число вагонов в «участке с ошибкой».
С поездом же совсем просто, проходишь по кругу, всё включаешь потом выключаешь и считаешь. Или я чего-то не понимаю? Единственная видимая засада — надо знать, что вагоны ограничены определённым количеством, теоретически их же м.б. миллиард/триллион, без ограничения сверху задача не имеет решения.
Все же есть много новичков пишущих s1+s2+s3+s4+s5 в цикле. Есть и много людей требующих любую конкатенацию из двух строк заменять стрингбилдером или string.Format.Без сомнения. Я имел в виду, что лучше задать вопрос «строки — это ref или value type». Чаще всего говорят ref. Потом спрашиваешь, «а почему же они не изменяемые»? И кто такой StringBuilder? Если уже в этом контексте кандидат упомянет интернирование — честь ему и хвала, но на практике моих собеседований такого не происходило :) Может не те джниоры приходят? А «те» только в Москве?
Пройдя 5 собеседований, я выяснил такую вещь: чем позитивнее и свободнее ведешь себя на собеседовании, тем легче и быстрее онао проходит.
— Привет, чувак. Ты что-ли тут самый крутой техдиректор-всех-эректор?
— Спасибо. До свидания.
14 секунд. Весело. Быстро. Рекорд.
PS. А по фразе действительно так. Ищут/ищем же людей, которые не будут меньжеваться на работе. А если товарищ уже на собеседовании зажат и вопроса про промис стремается… Нужен такой, даже если потея ответит правильно? )
Реально, хреново видимо джниорам, кто шарп выбрал. Если там такие джуниоры, то миддлы там наверно вообще какие-то полумифические нереальные типы, чьё прикосновение может исцелять безнадёжных больных.
А с поездом решение может кто-то точно сказать? Я вижу так: проходим по всем вагонам, отключаем везде свет, дальше включаем в одном и идем по кругу до него, включая свет в остальных. Получается круг пройти 2 раза.
Ссылка на комментарий
Хм… интересно, есть топ вопросов работодателю на собеседовании? )
Да, и действительно, а почему бы не проверить уровень работодателя встречными задачами? )) А то может придётся работать на тугодума)
Мне скоро тоже предстоят собеседования на позицию junior .net developer. Прочитал статью, и выпал в осадок, осознав, что ещё не готов, особенно касаемо паттернов и sql. Потом почитал комменты и как то отлягло)))
Вы правы, asp.net developer. Просто мыслью комментария было не это.
ЗЫ Звучит, будто желание узнать область работы — это признак плохого HR'а (=
Чаще же всего, что на десктопах, что на мобилках в базу просто кешируется ответ от сервера.
ЗЫ. либо вы там лишнюю частицу «не» увидели, либо я не знаю. «не уподобляться» и «уточнять» — однородные сказуемые.
«Давайте не уподобляться и уточнять» == «Давайте уточнять, а не уподобляться»
Слыхал, что в некоторых компаниях бывают специальные БД-разработчики, абстрагирующие всю работу с DAL через хранимки, но на практике такого не встречал.
Суть дела не изменится, даже если нагородить прослоек.
Гнать SQL по сети, а уж тем более делать «жирный джойн» на клиенте идея очень плохая.
Вот и остается, что SQL нужен бекендерам и ASP.Net-чикам.
Вот еще раз, нахрена «жирные джойны» на клиентах?
Вот и я думаю, откуда вы взяли это?) Джойны на сервере, в хранимках. А хранимки должен кто-то писать. Этот «кто-то» должен получать зарплату. Почему бы не писать их самому разработчику, что клиент пишет?) И дешевле выйдет, и лишнее звено коммуникации уйдет.
Почему не фигачить дополнительный REST-сервис? А зачем это делать, если для своих внутренних нужд можно обойтись шаренной сборкой?) Больше кода — больше багов, больше систем — больше интеграции, больше API-тестов и прочих сложностей с поддержкой. Не нужно множить сущности и втыкать веб-стек там, где в нем нет нужды.
Ну пробелов по sql не так много, можно покрыть, с паттернами наверное поможет только практика
Включаем в исходном вагоне свет. Идем в одну из сторон до тех пор, пока не встретим вагон со светом, попутно считая количество пройденных вагонов. Примем число пройденных вагонов за c. Выключаем в этом вагоне свет. Возвращаемся в обратную сторону на c шагов, чтобы оказаться в изначальном вагоне. Если свет в вагоне выключен, то число вагонов в поезде c, алгоритм завершен. Если свет в вагоне включен, то опять идем в произвольную сторону до первого вагона с включенным светом, считая вагоны.
Частный случай — 1 вагон. Включаем свет. Выходим из вагона в соседний и оказываемся в изначальном вагоне. c = 1. Выключаем свет. Возвращаемся на 1 вагон назад. Оказывамся в вагоне с выключенным светом => кол-во вагонов равно 1.
Асимптотическая сложность алгоритма:
O(n²) — везде свет включен;
Ω(n) — свет включен только в изначальном вагоне.
Для улучшения вычислительной сложности (не асимптотической) можно использовать не один вагон с включенным светом, а паттерн, например, из трех вагонов (включен, выключен. включен) и при нахождении такого же паттерна возвращаться назад на c вагонов и проверять.
Возьмем n = 2²⁰, тогда в худшем (и лучшем тоже) случае надо будет пройти (1+2+4+8...+2²⁰)*2 вагонов, чтобы убедиться, что мы выключили свет везде. Умножение на 2 — это проход туда и обратно. После чего надо сделать один полный проход с подсчетом. Количество слагаемых в скобках — lg(n). Каждое из слагаемых можно грубо принять за n (асимпотика же ¯\_(ツ)_/¯). Т.е. мы 2*lg(n) раз прошли n вагонов, чтобы убедиться в том, что обошли весь поезд + 1 раз прошли n вагонов для подсчета. Получается O(n*(1+2*lg(n))) или O(n*lg(n)).
Справедливости ради нижний асимптотический предел сложности такой же как и верхний с точностью до константы Ω(n*lg(n)) ⇒ Θ(n*lg(n)). А это может значить, что на больших и очень разреженных составах (почти везде свет выключен) алгоритм «в лоб» может работать лучше.
Для меня было неожиданностью, что меня пригласили работать практически все компании (80%), в которых я проходил собеседование.
То есть из-за некомпетентности собеседующих большинство компаний остались с… носом!
Спрашивается - что не так так эти компании делали, что упустили нужного им программиста?
По вопросам прошелся, вроде ничего страшно нету. Более-менее понимаю (а что нет немного подтяну), только с sql пока не стыкался совсем.
Для себя (в Киеве), хотелось бы найти что-то что где можно применить знания со своей основной на данный час специальности (сертификованый инженер-землеустроитель, CAD/GIS, геодезия).
Как я проходил собеседования на позицию Junior .Net Developer