Основные вопросы включают в себя:
Я думаю, что обычно это помогает вашим кандидатам выполнить простое упражнение по кодированию, такое как:
- Напишите свой собственный класс связанного списка без использования встроенных классов.
- Напишите свой собственный класс хеш-таблиц без использования встроенных классов.
- Напишите класс, который представляет двоичное дерево. Напишите метод, который пересекает все узлы дерева.
- Напишите метод для выполнения двоичного поиска в массиве без использования встроенных методов.
- Нарисуйте схему базы данных для блога. У каждого пользователя есть только один блог, у каждого блога есть много категорий, у каждой категории есть много сообщений, и каждое сообщение может принадлежать более чем одной категории. Попросите вашего кандидата написать запросы, чтобы получить конкретную информацию.
Далее ищем конкретные технические ноу-хау:
- (Обработчики событий) Создайте класс с пользовательским обработчиком событий, создайте другой класс, который подключается к пользовательскому обработчику событий.
- (XML) Загрузите документ XML и выберите все узлы со свойствами x, y и z.
- (Функциональное программирование) Создайте функцию, которая принимает другую функцию в качестве параметра. Функция Map или Fold работает очень хорошо для этого.
- (Отражение) Напишите функцию, которая определяет, имеет ли класс определенный атрибут.
- (Regex) Напишите регулярное выражение, которое удаляет все теги из блока HTML.
Ни один из этих вопросов не является особенно сложным для опытного программиста C #, и он должен дать вам хорошее представление о конкретных преимуществах ваших кандидатов. Вы также можете поработать над несколькими вопросами / примерами кода, в которых используются конкретные шаблоны проектирования.
[Изменить для уточнения] :
Кажется, многие люди не понимают, почему я задаю такие вопросы. Позвольте мне коснуться комментариев нескольких людей (я не цитирую напрямую, а перефразирую):
В: Когда в последний раз кто-то использовал летучие вещества или слабые ссылки?
О: Когда я даю технические интервью, я смотрю, понимает ли человек возможности высокого и низкого уровня .NET. Волатильность и слабые ссылки - это две низкоуровневые функции, предоставляемые .NET - даже если эти функции редко используются на практике, ответы на эти вопросы чрезвычайно показательны:
Хорошее понимание летучих данных демонстрирует, что человек понимает, как оптимизации компилятора изменяют правильность кода, как потоки сохраняют локальные копии общего состояния, которые могут быть не синхронизированы в любой момент времени, и минимально осознает некоторые сложности многопоточного кода ,
Хорошее понимание слабых ссылок показывает, что человек знает об интимных подробностях сборщика мусора и о том, как он решает, когда освободить память. Конечно, вы могли бы спросить кандидатов «как работает сборщик мусора», но вопрос о слабых ссылках дает гораздо лучший, более вдумчивый ответ.
.NET является довольно абстрактным языком, но у звездных разработчиков почти всегда есть глубокое понимание CLR и низкоуровневых деталей времени выполнения .NET.
В: Зачем кому-то нужно реализовывать свой собственный хеш-лист или связанный список?
A: Я не имею в виду, что класс Dictionary хуже, или что люди должны создавать свои собственные хэш-таблицы. Это основной вопрос, который проверяет, имеет ли человек минимальное понимание структур данных. Вот что проверяют эти вопросы: минимальное понимание.
Вы узнаете об этих хеш-таблицах и связанных списках в первый день Структуры данных 101. Если кто-то не может написать хеш-таблицу или связанный список с нуля, то у него огромный пробел в технических знаниях.
Q: Почему эти вопросы так грубо ориентированы?
A: Потому что заголовок этой темы: «Вопросы, которые должен знать каждый хороший разработчик .NET». Каждый .NET-разработчик начинает свою карьеру с написания «крутых» приложений, и 90% всех людей, занимающихся разработкой приложений, зарабатывают на жизнь бизнес-приложениями.
Я думаю, что вопросы тестирования людей на знание бизнес-приложений уместны в большинстве случаев, если вы не ищете разработчиков в очень специфических нишах, таких как разработка компилятора, разработка игрового движка, доказательство теорем, обработка изображений и т. Д. ,