Вопросы, на которые должен отвечать каждый хороший разработчик .NET?

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

Какие вопросы, как вы думаете, должен хороший <.NET > программист .NET?

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

alt text

* UPDATE: он хочет четко указать, что мы не тестируем только знания .NET, и что возможности решения проблем и навыки общего программирования еще важнее для нас.

Ответ 1

Основные вопросы:

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

  • Создайте собственный класс связанного списка без использования встроенных классов.
  • Создайте собственный класс hashtable без использования встроенных классов.
  • Напишите класс, представляющий двоичное дерево. Напишите метод, который перемещает все узлы дерева.
  • Напишите метод для выполнения двоичного поиска в массиве без использования встроенных методов.
  • Нарисуйте схему базы данных для блога. Каждый пользователь имеет только один блог, каждый блог имеет много категорий, в каждой категории много сообщений, и каждый пост может принадлежать более чем одной категории. Попросите вашего заявителя написать запросы, чтобы вывести определенную информацию.

Далее найдите технические ноу-хау:

  • (Обработчики событий) Создайте класс с помощью специального обработчика событий, создайте другой класс, который подключается к настраиваемому обработчику событий.
  • (XML) Загрузите XML-документ и выберите все узлы со свойствами x, y и z.
  • (Функциональное программирование) Создайте функцию, которая принимает другую функцию в качестве параметра. Функция Map или Fold работает очень хорошо для этого.
  • (Отражение) Напишите функцию, которая определяет, имеет ли класс определенный атрибут.
  • (Regex) Напишите регулярное выражение, которое удаляет все теги из блока HTML.

Ни один из этих вопросов не является особенно трудным для опытного программиста на С#, и они должны дать вам представление о ваших сильных сторонах. Вы также можете захотеть работать в нескольких вопросах/образцах кода, которые используют конкретные шаблоны проектирования.

[Изменить для пояснения]:

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


Q: Когда в последний раз кто-то использовал летучие или слабые ссылки?

A: Когда я даю технические интервью, я смотрю, понимает ли человек высокоуровневые и низкоуровневые функции .NET. Летучие и слабые ссылки - это две низкоуровневые функции, предоставляемые .NET. Даже если эти функции не используются часто на практике, ответы на эти вопросы чрезвычайно раскрывают:

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

  • Хорошее понимание слабых ссылок показывает, что человек знает об интимных подробностях сборщика мусора и о том, как он решает, когда освобождать память. Конечно, вы могли бы спросить кандидатов "как работает сборщик мусора", но спрашивать о слабых ссылках дает гораздо лучший, более продуманный ответ.

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


Q: Почему кому-то нужно реализовать собственную хэш-таблицу или связанный список?

А:Я не подразумеваю, что класс словаря уступает или что люди должны катить свою хэш-таблицу. Это основной вопрос, который проверяет, имеет ли человек минимальное представление о структурах данных. То, что эти вопросы проверяют на: минимальное понимание.

Вы узнаете об этих хэш-таблицах и связанных списках в первый день Data Structures 101. Если кто-то не может писать хэш-таблицу или связанный список с нуля, тогда у них есть огромный пробел в их технических знаниях.


Q: Почему эти вопросы так грубо ориентированы?

A: Поскольку заголовок этого потока - это "вопросы, которые должен знать любой хороший разработчик .NET". Каждый разработчик .NET начинает свою карьеру, записывая красные приложения, а 90% всех людей, занимающихся разработкой приложений, зарабатывают на жизнь, связаны с бизнес-приложениями.

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

Ответ 2

Я нашел эти списки на Scott Hanselman blog:

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

Независимые от платформы .NET-вопросы

ASP.NET

Ответ 3

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

Я, например, не являюсь участником Compact Framework, поэтому я мог бы пропустить ваше интервью, если бы вы пошли в этом направлении. Но если бы мне нужно было это использовать, я мог бы сделать некоторые исследования и перейти прямо.

Joel book, Smart и Gets Things Done, имеет большой совет для найма разработчиков, и есть большие сочные разделы о типах вопросов для просить. Я очень рекомендую.

Ответ 4

Я думаю, что если бы я брал интервью у кого-то, у кого был опыт LINQ, я бы просто попросил их объяснить LINQ. Если они могут объяснить отложенное выполнение, потоковое вещание, интерфейсы IEnumerable/IEnumerator, foreach, блоки итератора, деревья выражений (для бонусных точек, в любом случае), то они, возможно, справятся с остальными. (По общему признанию, они могут быть "хорошими" разработчиками, а не "получать" LINQ еще - я действительно думаю о случае, когда они заявили, что знают достаточно LINQ, чтобы сделать его справедливым.)

В прошлом я задал несколько из уже перечисленных вопросов и несколько других:

  • Разница между ссылочными и значениями типов
  • Передача по ссылке vs pass по значению
  • IDisposable и финализаторы
  • Строки, неизменность, кодировка символов
  • Плавающая точка
  • Делегаты
  • Дженерики
  • Невозможные типы

Ответ 5

Я с парнями, которые ищут возможности решения проблем, а не то, что вы можете найти и запомнить из "101 лучших интервью .NET Qs и As".

Чтобы привести себя в качестве примера, я стараюсь "знать" то, что мне нужно использовать изо дня в день. Я, как правило, забываю (а потом придется пересматривать) вещи, которые я использую редко.

Если бы вы хотели меня опробовать в интервью, было бы очень легко.

Тем не менее, я архивировал и кодировал большую часть инфраструктуры для системы, которая использует идентичные уровни бизнес-объектов и данных для своих WinForms и воплощений ASP.NET, а наша кодовая база является надежной и многократно используемой для того, чтобы мы могли поддерживать и разрабатывать 20+ различных настроенных версий веб-сайта, а также увеличивать число (в настоящее время 5) приложения WinForms...

... с командой разработчиков из двух.

Раньше я работал в команде как технический руководитель, и моя работа включала в себя довольно много рекрутинга и интервью. Моя самая захватывающая ошибка заключалась в найме парня, который знал больше о технологии, которую мы использовали, чем все остальные из нас, включая меня, и я считал себя экспертом. Он все знал...

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

Структура ваших интервью мудро...

Ответ 6

Кто такой Джон Скит?

Ответ 7

Хорошие вопросы, которые мне заданы,

  • Как вы думаете, хорошо ли .NET?
  • Как вы думаете, что плохо для .NET?

Было бы интересно посмотреть, что будет у кандидата, и вы наверняка узнаете немного о том, как он/она использует фреймворк.

Ответ 8

Я всегда искал бы мягкие навыки - ни каламбур не предназначался. Настолько хороший дизайн OO, разработка, основанная на тестах, хороший многоязычный языковой фон и круговая общая умность (и, возможно, все, что я делаю).

У интеллектуального разработчика не должно быть никаких проблем с изучением отдельных технологий, которые вам нужны, чтобы они знали, даже если они никогда не смотрели на них раньше, поэтому я не стал бы слишком беспокоиться о конкретных вопросах вокруг среды WCF/compact и т.п..

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

Ответ 9

Честно?

"Что такое .NET?"

Если они могут дать вам четкий ответ о том, что такое .NET и что это не так, как он используется, какие элементы он состоит и т.д. Если они могут убедить вас, что они знают, что это такое, тогда Скорее всего, они хорошо это знают.

Дело в том, что многие люди действительно не знают, что такое .NET. Даже те, кто пишет для него программы.

Ответ 10

Нет, действительно. Есть, вероятно, очень простые вопросы, о которых самые умные люди в мире не знают ответов. Не потому, что они трудны, а просто потому, что они просто не сталкивались с этим. Вы должны смотреть на весь пакет и на умение разработчика, а не на то, могут ли они ответить на произвольный вопрос.

Если вопрос достаточно лёгкий, чтобы ответить в короткое предложение или два, достаточно просто рассказать кому-то, кто этого не знает. Вы должны искать их понимание концепций и возможностей рассуждений, а не их способность отвечать на вопросы "каждый разработчик .NET должен иметь возможность ответить".

Ответ 11

Знайте разницу между ссылочными и значениями типов.

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

Строки неизменяемы.

Ответ 12

Мартин Фаулер предпочитает навыки проектирования над знаниями платформы. С другой стороны, вы можете задать вопрос, который покажет знание шаблонов проектирования и платформы .NET следующим образом:

  • Назовите шаблоны и принципы проектирования, которые вы знаете, и как они используются в .NET Framework?

Ответ 13

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

Ответ 14

Вот некоторые из них, которые я использовал для фильтрации программистов, претендующих на работу в качестве программистов на С#:

Какая разница между ссылочным типом и типом значения?

Объясните интерфейс IDisposable, для которого требуется конструкция языка С# и как вы его реализуете.

Какое исключение вы бы выбрали, если null передан в качестве аргумента методу, который имеет контракт, который не допускает значения NULL для этого параметра?

Ответ 15

"Какой из ASP: какие бы элементы управления вы ни использовали в производстве и почему?"

Это быстро скажет, действительно ли ваш объект когда-либо строил и поддерживал большой проект достаточно долго, чтобы его обжегся DataGrids и LinkButtons, или он все еще находится в режиме перетаскивания "научи себя в течение 21 дня".

(ответ asp: Repeater, asp: PlaceHolder, asp: Literal и asp: Content)

Ответ 16

Что такое поток?

Что такое GC?

Ответ 17

Это немного переменный вопрос, и на самом деле не тот, на который вы должны быть в состоянии ответить полностью, но один из них должен быть в состоянии ответить, когда это необходимо:

"Что предлагает платформа .NET для выполнения задачи X?"

Или более конкретно:

"Включает ли среда .NET объект, который выполняет X?"

Например, я недавно потратил несколько часов на разработку объекта, который оптимизирован для хранения массива логических элементов и работает на нем, например, с помощью коллекции NOT, OR, XOR, AND, для установки всех значений и т.д. Только после того, как я закончил писать все свои модульные тесты и настроил их для лучшей производительности, я понял, что мой объект "BoolArray" уже существует в платформе .NET под именем "BitArray".

Это может быть трудным ответить, поскольку много раз лучший ответ на вопрос о том, какой объект/помощники использовать, тот, который вы не знаете или не понимаете полностью. Насколько замечателен мир .NET, если бы все знали о простом StringBuilder, базовом инструменте, который может увеличить производительность значительных сумм.

Ответ 18

Я не стал бы задавать эти вопросы "знать что-нибудь из учебника", но, скорее, попросить некоторые вещи, такие как:

  • Что делает цикл foreach в простом С#? (Ожидая, чтобы он написал цикл итератора.)
  • Что такое синглтон?
  • Пусть он/она разбирает строку в Datetime (ожидая, что он/она будет использовать TryParse вместо try/catch)
  • Реализовать синглтон, стратегию и шаблоны команд
  • Дайте ему/ей Refactor часть кода для тестирования. Ожидая, что он/она будет абстрагировать внешние сервисы от тестируемого подразделения и реализовать свой собственный тестовый двойной сервис (без каких-либо насмешливых рамок).

Это не на 100% уверен, в зависимости от человека, которого я могу спросить:

  • пусть он/она защищает метод от нулевого ввода (ожидая, что он/она будет использовать несколько возвратов для уменьшения вложенности)
  • Как работает инициализатор объекта (ожидая, что он/она напишет безопасное по потоку назначение)

Также я бы спросил его, как он/она узнал его/ее материал и что он/она читает (какие блоги, книги).

Ответ 19

Я предлагаю некоторые вопросы сосредоточиться на понимании концепций программирования с использованием dotnet, например

В чем разница между управляемой и неуправляемой средой? Преимущества и недостатки GC JIT плюсы и минусы Если нам нужно разработать приложение X, мы можем использовать dotnet? (это будет определять, как он видит dotnet)

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

Ответ 20

В дополнение к некоторым из уже упомянутых вопросов я поклонник следующего:

  • Какой делегат?
  • Что такое домен приложения?
  • Когда вы используете ключевое слово lock?
  • Являются ли стандартные классы коллекций коллекций потоками безопасными?
  • Какой метод расширения?
  • Какая разница между XmlDocument и XmlReader?
  • Как вы читаете настройки конфигурации из файла конфигурации приложения?

Ответ 21

Еще несколько:

  • Частичные классы. И его ограничения?
  • Запечатанные классы
  • Как локализация может быть выполнена в .NET?
  • Подключение к базе данных
  • Различные конфигурационные файлы
  • Делегаты против событий
  • Неуправляемый доступ к dll
  • Размышления
  • Общие классы
  • Самый горячий в .NET 3.5
  • Структуры модулей тестирования, которые вы использовали.

Ответ 22

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

Чтобы быть тупым, я действительно не стал бы читать слишком много типичных вопросов, поскольку основополагающая парадигма гласит: "Насколько хорошо вы можете озвучивать свои мысли и понимание?", это именно то, что ищет интервьюер. Общение всегда является моей самой большой слабостью из-за моего пути, и я могу легко расстроиться.

Было бы идеально иметь знание и быть ноу-хау, но, к сожалению, есть некоторые вещи, которые я не знаю, но не бояться, если вы на самом деле не знаете ответа и признаете это а не блефует через него. Если бы интервьюер задал мне вопрос, как один из вышеперечисленных, я не был бы уверен в неправильном понимании/неправильном толковании вопроса, я бы сказал это заранее, что может быть лично смущенным, но научился справляться с этим.

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

Мои 2центы, С наилучшими пожеланиями, Том.

Ответ 23

Еще несколько:

Каковы ограничения сбора мусора.

Знайте о финализаторах и IDisposable.

Помните о пуле потоков и о том, когда его использовать.

Если вы выполняете приложения с графическим интерфейсом - имейте в виду, что графический интерфейс Windows является однопоточным.

Использовать foreach (я вижу много людей, которые делают MoveNext и т.д.)

Ответ 24

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

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

Затем меня попросили разработать трехстраничное веб-приложение через 6 часов. Ограничения, наложенные на приложение, были наглядно отражены на главном аспекте разработки приложений, таких как небольшая ERD, Layerd Design, UI Consistency, контролирует определенные проблемы, такие как использование кнопок Radio в GridView и выборка и отображение типов изображений из БД на веб-странице, безопасность, шифрование, хеширование, представление данных и манипуляции.

Затем на следующий день последовали 30-минутное обсуждение разработанного приложения, охватывающего узкие места производительности и улучшения в разработке и использовании алгоритмов. И 1 час дополнительного теста, чтобы улучшить алгоритм, разработанный на предыдущем шаге, с конкретным условием.

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

Ответ 25

Я предпочел бы дать ему проблему и попросить его решить ее, используя функции .net, которые вы знаете, и почему вы считаете, что это лучшее решение.

Это позволит взломать практически все возможности кандидата с точки зрения технических, аналитических и навыков решения проблем, а также его подход к решению проблемы.