Моя компания собирается нанять .NET разработчики. Мы работаем на различных платформах .NET: ASP.NET, Compact Framework, Windowsforms, Web Services. Я хотел бы составить список / каталог хороших вопросов, своего рода минимальный стандарт, чтобы увидеть, имеют ли кандидаты опыт. Итак, мой вопрос:
Какие вопросы как вы думаете, стоит ли хороший Программист .NET сможет ответить?
Я бы также рассматривал это как контрольный список для себя, чтобы увидеть, где мои собственные недостатки (Здесь очень много...).

* ОБНОВЛЕНИЕ: мы хотим прояснить, что мы не тестируем только знания .NET, и что возможности решения проблем и общие навыки программирования для нас даже более важны.





Знайте разницу между ссылочными типами и типами значений.
Знайте, что события хранятся в виде жестких ссылок (т.е. не забудьте отменить регистрацию событий, иначе приложение вызовет утечку памяти).
Строки неизменны.
Вот некоторые из них, которые я использовал для фильтрации программистов, претендующих на работу программистами на C#:
В чем разница между ссылочным типом и типом значения?
Объясните интерфейс IDisposable, для какой конструкции языка C# он требуется и как вы его реализуете.
Какое исключение вы выбрасываете, если в качестве аргумента методу, который имеет контракт, не допускающий пустых значений для этого параметра, передается значение NULL?
@Joshua, ArgumentNullException у вас не получилось.
Возможно, это не то, что вы хотите услышать, но я бы рекомендовал не сосредотачиваться на узких технологиях, а на общем программировании и навыках решения проблем. Хорошие разработчики могут быстро выучить все, что вы хотите.
Я, например, не сторонник Compact Framework, поэтому могу провалить ваше собеседование, если вы пойдете в этом направлении. Но если бы мне нужно было его использовать, я мог бы провести небольшое исследование и сразу же приступить к делу.
В книге Джоэла, Умный и добивается цели, есть отличные советы по найму разработчиков, и есть большие интересные разделы о том, какие вопросы следует задавать. Я очень рекомендую это.
Может быть, часть процесса найма должна стать проблемой в Cardspace или чем-то, на что они никогда не обращали внимания !!
Может быть, но есть проблема исследования, поэтому я думаю, что это может быть несправедливо. Мне больше интересно увидеть, как они думают о проблемах, и, возможно, увидеть, как они кодируют что-то абстрактное, чтобы я мог узнать, говорят ли они код изначально или нет.
Если бы я мог выбрать примерно двух человек, которые оба обладают общими навыками программирования и решения проблем, по практическим соображениям я ДОЛЖЕН выбрать одного с лучшими знаниями и опытом в .NET.
Конечно, знание .NET, но когда дело доходит до более узких технологий, я думаю, вы можете пойти с программистом, обладающим навыками решения проблем.
Сплаттне: Это правда, но по моему опыту, при проведении интервью не всегда можно встретить хотя бы одного действительно невероятного разработчика!
Чем больше вы узнаете, тем быстрее вы узнаете, что наш мозг работает следующим образом. Если разработчик не знает каких-то «узких технологий», это может означать, что он многому не научится.
Да, всем нам нужно знать тонны «узких технологий». Но на всех, кого мы знаем, есть группа, о которой мы не знаем (обычно потому, что они нам не нужны). Я говорю, что вы не хотите упускать великого разработчика из-за незнания SharePoint, потому что очень скоро он может стать вашим лучшим парнем по SharePoint.
Что такое нить?
Что такое GC?
Я всегда сам искал навыки межличностного общения - это не каламбур. Так что хороший объектно-ориентированный дизайн, разработка через тестирование, хороший многоязычный (программирование) опыт и общий ум (и, я полагаю, умение делать дела!).
У интеллектуального разработчика не должно возникнуть проблем с изучением отдельных технологий, которые вам необходимо знать, даже если он никогда раньше не обращал на них внимания - поэтому я бы не стал слишком беспокоиться о конкретных вопросах, касающихся WCF / компактной структуры и тому подобного.
Я бы попросил их написать код - лучший способ узнать, что они знают и как работают. Кто угодно может запомнить ответ на вопрос «В чем разница между ссылочным типом и типом значения?»
Пятно на. Задавать наизусть вопросы - значит создавать проблемы. Компания, в которой я работаю, задает старый вопрос технаря, но в основном он: у меня есть эти проблемы, вот доска, и расскажи, как бы вы их решили. Страшно, но эффективно.
... но если вы не решите их так, как ожидает интервьюер, вы проиграете.
@gbjbaanb иногда. Но в таком случае вы все равно не захотите там работать. Помните, вы тоже берете интервью у компании. Я знал несколько компаний, которые не прошли собеседование!
Еще несколько:
Каковы ограничения сборки мусора.
Знайте о финализаторах и IDisposable.
Помните о пуле потоков и о том, когда его использовать.
Если вы работаете с приложениями с графическим интерфейсом, имейте в виду, что графический интерфейс Windows является однопоточным.
Используйте foreach (я вижу, что многие люди делают MoveNext и т. д.)
Я не знал, поэтому посмотрел ограничения сборки мусора.
Мне задали хорошие вопросы:
Было бы интересно посмотреть, что придумает кандидат, и вы наверняка узнаете немало о том, как он / она использует фреймворк.
Я с парнями, которые ищут способности решать проблемы, а не то, что вы можете найти и запомнить из «101 топовых вопросов и ответов на собеседовании по .NET».
Чтобы привести себя в пример, я склонен «знать» вещи, которые мне нужно использовать изо дня в день. Я часто забываю (а позже мне приходится снова искать) то, что использую редко.
Если бы ты хотел сбить меня с толку на интервью, это было бы очень легко.
Тем не менее, я спроектировал и закодировал большую часть инфраструктуры для системы, которая использует идентичные уровни бизнес-объектов и данных для своих воплощений WinForms и ASP.NET, и наша кодовая база является надежной и достаточно многоразовой, чтобы мы могли поддерживать и разрабатывать 20+ по-разному настроенные версии веб-сайта, а также увеличивающееся количество (в настоящее время 5) приложения WinForms ...
... с командой разработчиков из двух человек.
Раньше я работал в команде техническим руководителем, и моя работа включала в себя довольно много рекрутинга и собеседований. Моя самая вопиющая ошибка заключалась в том, что я нанял человека, который знал о технологиях, которые мы использовали, больше, чем все мы вместе, включая меня, и я считал себя экспертом. Он все знал ...
... кроме того, как писать код, который либо отвечал требованиям, либо мог быть понят любым, кроме него самого. Когда я в конце концов убедил премьер-министра не продлевать контракт, все, что он написал, пришлось переписать.
Разумно структурируйте интервью ...
Это действительно интересное наблюдение. У нас была противоположная ситуация: небольшая группа разработчиков, которые знали меньше, чем другие, но которые убедили руководство, что они знают больше. Они предложили класс абстракции данных, который, как я утверждал, был невозможен (меня критиковали за то, что я не был «командным игроком»).
-продолжается - после 4 месяцев работы по "работе скунса" они представили команде .... свои документы о переводе в другой отдел - и НЕТ кода. Остальной команде пришлось собрать осколки.
Итог: мне действительно нравится ваше наблюдение о том, что конкретное знание конструкций кодирования не является гарантией способности создавать работающее программное обеспечение, отвечающее потребностям клиентов.
Я думаю, что если бы я брал интервью у кого-то, кто имел опыт работы с LINQ, я бы, возможно, просто попросил его объяснить LINQ. Если они могут объяснить отложенное выполнение, потоковую передачу, интерфейсы IEnumerable / IEnumerator, foreach, блоки итераторов, деревья выражений (в любом случае для бонусных баллов), то они, вероятно, справятся с остальным. (По общему признанию, они могут быть «нормальными» разработчиками и еще не «получить» LINQ - я действительно думаю о случае, когда они утверждали, что знают LINQ достаточно, чтобы сделать это справедливым вопросом.)
В прошлом я задавал несколько из уже перечисленных вопросов и еще несколько:
Да, я хотел увидеть такой ответ. Хороший кандидат на то, чтобы быть принятым. Кто-нибудь лучше?
@splattne: не говори глупостей, это ответ Джона Скита, так что просто прими его. Это неизбежно.
Я как раз собирался сказать ... черт ... ты не сомневаешься в Ските!
Это гораздо лучший ответ, чем принятый. Это поможет вам понять, обладает ли кто-то глубокими знаниями в области предполагаемого опыта, а также изучить языковые функции, охватывающие довольно широкий диапазон.
+1 Я также считаю, что основы должны быть прочными, как ты и предлагал, Джон.
LINQ - мой любимый вопрос на собеседовании, потому что его можно применить к любому варианту разработки (xml, база данных, ваниль), и он показывает, насколько кто-то заинтересован в изучении новых вещей и выборе лучших инструментов для работы, даже если эти инструменты кажутся сначала немного сложнее.
Этот ответ превосходит штаны «создайте свой собственный связанный список,« анализируйте HTML с помощью регулярного выражения »или« Как много вы знаете о сборке, GAC и т. д. », Потому что он касается инструментов и концепций, которые вы бы собственно использую во время разработки. Также необходимо доскональное знание LINQ. Я видел много случаев на этом сайте, когда люди пытались развернуть свою собственную версию Union Distinct и Concat для коллекций, потому что они не понимают LINQ.
Кто такой Джон Скит?
Или лучше: вы Джон Скит? ;-)
это действительно хороший вопрос для позиций C#. Учитывая, что Джон Скит теперь владеет stackoverflow / google, ищет связанные с C#. Если вы не знаете, кто он, значит, вы либо Джон Скит, либо не программируете на C#.
Не обижайся на Джона Скита, но я думаю, что Рик Страл чаще появляется с ответами по тем типам проблем, с которыми я сталкиваюсь ...
@ [Эндрю Текен]: Я покажу проценты на этом ;-) google для "Rick Strahl" дает 38 500 просмотров, "jon skeet" дает 144 000. Кроме того, Рик Страл не публикует сообщения на ТАК КАК.
оба парня великолепны в том, что они делают ... наша выгода.
Это немного изменчивый вопрос, и на самом деле вы не должны полностью отвечать на него сейчас, но вы должны иметь возможность ответить, когда это необходимо:
«Что предлагает платформа .NET для выполнения задачи X?»
Или более конкретно:
«Включает ли платформа .NET объект, выполняющий X?»
Например, недавно я потратил несколько часов на разработку объекта, оптимизированного для хранения массива логических значений и работы с ним, например, выполнения НЕ, ИЛИ, ИСКЛЮЧАЮЩЕЕ ИЛИ, И для сбора всех значений и т. д. Это было не так. До тех пор, пока я не закончил писать все свои модульные тесты и настраивал их для обеспечения максимальной производительности, я понял, что мой объект «BoolArray» уже существует в платформе .NET под именем «BitArray».
На этот вопрос может быть сложно ответить, поскольку во многих случаях лучший ответ о том, какой объект / помощники использовать, - это тот, который вы не знаете или полностью понимаете. Каким прекрасным был бы мир .NET, если бы каждый действительно знал хотя бы о простом StringBuilder, базовом инструменте, который может значительно повысить производительность.
Мартин Фаулер предпочитает навыки дизайна, а не знания платформы. С другой стороны, вы можете задать вопрос, который покажет знание шаблонов проектирования и платформы .NET, например:
Я предлагаю узнать о блогах, которые они читают регулярно, и о личных проектах по программированию, над которыми они работали, поскольку это покажет их желание учиться и страсть к программированию.
Я бы не стал задавать вопросы типа "знаю кое-что из учебника", а скорее задам кое-какие хитрые вещи вроде:
Они не уверены на 100%, в зависимости от человека, которого я могу их спросить:
Также я бы спросил его, как он / она узнал свои вещи и что он / она читает (какие блоги, книги).
Нет, правда. Наверное, есть очень простые вопросы, на которые самые умные люди в мире не знают ответов. Не потому, что они тяжелые, а просто потому, что просто не сталкивались с этим. Вы должны смотреть на весь пакет и навыки разработчика, а не на то, могут ли они ответить на произвольный вопрос.
Если вопрос достаточно прост, чтобы на него можно было ответить одним или двумя короткими предложениями, достаточно просто сказать тому, кто не знает. Вам следует искать их понимание концепций и способности рассуждать, а не их способность отвечать на вопросы, на которые «должен уметь ответить каждый .NET-разработчик».
Я предлагаю несколько вопросов сосредоточиться на понимании концепций программирования с использованием dotnet, таких как
В чем разница между управляемой и неуправляемой средой? GC плюсы и минусы JIT за и против Если нам нужно разработать приложение X, можем ли мы использовать dotnet? Почему? (это определит, как он видит сеть)
Я предлагаю также написать небольшие методы и попросить его переписать их с большей производительностью, используя лучшие классы dotnet или стандартные способы. Также напишите некорректные методы (с точки зрения любых), логические или что-то еще и попросите его исправить их.
Я поклонник следующих вопросов в дополнение к некоторым из уже упомянутых вопросов:
Честно?
"Что такое .NET?"
Если они могут дать вам четкий ответ о том, что такое .NET, а что нет, как он используется, из каких элементов он состоит и т. Д ... Если они могут убедить вас, что знают, что это такое, то скорее всего они знаю это довольно хорошо.
Дело в том, что многие люди действительно не знают, что такое .NET. Даже те, кто пишет для него программы.
«Какой из ASP: какие элементы управления вы бы использовали в производстве и почему?»
Это быстро скажет вам, действительно ли ваш объект когда-либо создавал и поддерживал большой проект достаточно долго, чтобы его сожгли DataGrids и LinkButtons, или он все еще находится в фазе перетаскивания «научитесь за 21 день».
(ответ: asp: Repeater, asp: PlaceHolder, asp: Literal и asp: Content)
Еще несколько:
Я думаю, что это не должны быть просто вопросы, я знаю нескольких парней, которые великолепны, когда вы берете интервью у них, но как только они доберутся до сути, они станут слишком перфекционистами, я бы сказал, что они плохо кодируют задачу.
Однажды я проходил собеседование, и мне понравился подход, когда первый работодатель дал мне техническую анкету, которую нужно было заполнить за 30 минут. Если один из них добьется успеха, его вызовут на 1-часовое интервью, охватывающее вопросы о суждении личности и поиске характера, а также технические жаргоны.
Затем меня попросили разработать трехстраничное веб-приложение за 6 часов. Ограничения, накладываемые на приложение, грамотно охватывают основные аспекты разработки приложения, такие как небольшой ERD, Layerd Design, согласованность пользовательского интерфейса, контролируют конкретные проблемы, такие как использование переключателей в GridView и выборка и отображение типов изображений из БД на веб-странице, разработка одного алгоритма, безопасность, шифрование, хеширование, представление данных и манипулирование ими.
Затем на следующий день последовало 30-минутное обсуждение разработанного приложения, охватывающее узкие места в производительности, а также улучшения в дизайне и используемых алгоритмах. И 1-часовой дополнительный тест для улучшения вашего алгоритма, разработанного на предыдущем шаге с определенным условием.
Так что это заняло довольно много времени, но таким образом вы можете быть уверены, что человек, которого вы нанимаете, знает хотя бы те концепции, которые необходимы хорошему разработчику.
Это интересно, и я рискую получить отрицательное голосование за то, что высказал свое мнение, поскольку я родился глухим, поэтому для того, чтобы задать такой вопрос, потребовалось бы больше усилий для передачи моих мыслей лично.
Честно говоря, я бы не стал читать слишком много типичных вопросов, поскольку основная парадигма - «Насколько хорошо вы можете озвучивать свои мысли и понимание?», это действительно то, что ищет интервьюер. Общение всегда является моей самой большой слабостью из-за того, что я есть, и довольно легко могу расстроиться.
Было бы идеально иметь знания и быть всезнайкой, но, к сожалению, есть некоторые вещи, которых я не знаю, но не бояться, если вы действительно не знаете ответа и признаете это, а не блефуете. через это. Если бы интервьюер задал мне вопрос, подобный одному из вышеперечисленных, в котором я не был бы уверен или неправильно понял / неверно истолковал вопрос, я бы сказал это заранее, что лично может смущать, но я научился справляться с этим.
Вы были бы удивлены, узнав, сколько людей на самом деле блефуют и блефуют, метафорически выражаясь словами, что в конце дня их поймают со спущенными штанами.
Мои 2 цента, С наилучшими пожеланиями, Том.
Я бы предпочел задать ему проблему и попросить его решить ее, используя возможности .net, которые вы знаете, и почему вы думаете, что это лучшее решение.
Это позволит раскрыть почти все возможности кандидата с точки зрения технических, аналитических навыков и навыков решения проблем, а также его подход к решению проблемы.
Мой код обычно выдает исключение NullReferenceException.