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


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

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

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

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


Answers



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

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

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

Затем найдите конкретные технические ноу-хау:

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

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

[Изменить для уточнения] :

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

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

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

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

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

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

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

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

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

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

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

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




Я нашел эти списки в блоге Скотта Хансельмана :

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

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

ASP.NET




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

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

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




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

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

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



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

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

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

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

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

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

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

Стройте свои интервью с умом ...




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




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

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

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




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

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

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




Честно?

«Что такое .NET?»

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

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




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

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




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

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

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




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

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



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




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

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

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

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




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

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

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




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

Что такое GC?




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

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

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

«Включает ли .NET framework объект, который делает X?»

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

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




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

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

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




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

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



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

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

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

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

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




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

  1. Частичные классы. И его ограничения?
  2. Запечатанные классы
  3. Как локализация может быть выполнена в .NET?
  4. Подключение к базе данных
  5. Различные файлы конфигурации
  6. Делегаты против событий
  7. Неуправляемый доступ к dll
  8. Размышления
  9. Общие классы
  10. Самый горячий в .NET 3.5
  11. Структуры тестирования устройств, которые вы использовали.



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

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

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

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

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




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

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

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

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

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

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




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

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

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

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

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




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

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








Tags