0

Вопросы на собеседовании программист c

Содержание

Самые популярные и задаваемые вопросы на собеседованиях .Net разработчика.

Общие вопросы

В чем разница между интерфейсно-ориентированным, объектно-ориентированным и аспектно-ориентированным программированием?

Аспектно-ориентированное

Аспектно-ориентированное програмирование базируется на изучении того сколько и каких компонент или частей требуется для взаимодействия с системой. Основным для АОП является взаимодействие этих элементов.

Интерфейсно-ориентированное

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

Объектно-ориентированное

Объектно-ориентированное программирование основывается на понятиях абстракции, инкапсуляции, полиморфизма и наследования. Классы реализуют эти концепции для построение объектов, контролирующих или реализующих систему.

Абстракция позволяет уменьшить связывание между компонентами пердоставляя дополнительный слой между ними, для того чтоб один объект не зависил от того, как другой реализуюет свои бизнес-правила. (Интерфейсы, слои) Отличная штука, если вы хотите изолировать части системы так, чтоб их изменение или замена не стали проблеммой для работы системы в целом.

Инкапсуляция позволяет работать абстракции пряча детали реализации класса от вызывающих его. (Публичные и приватные поля)

Наследование позволяет базовым(родительским) классам содержать общую функциональность и передавать ее всем своим классам-потомкам. Класс Figure(фигура) может иметь поле цвет, которое будет унаследовано его классами-потомками Square(квадрат) или Circle(круг).

Полиморфизм позволяет реализовывать одноименные публичные методы, позволяя различным классам выполнять различные действия при одном и том же вызове. То есть объекты классов Square и Circle могут отображаться(реализовывать метод render) поразному несмотря не то, что они оба подклассы Shape, метод render определен в Shape. (Overriding)

Что такое CLR? Что такое IL? Что такое CLS?

CLR ("Common Language Runtime", "общеязыковая исполняющая среда") – это компонент .NET Framework, основной задачей которого является управление интерпретацией и исполнением кода IL. CLR отвечает за изоляцию памяти приложений, проверку типов, безопасность кода, преобразование IL в машинный код.

IL (Intermediate Language) – код, содержащий набор инструкций, не зависящих от платформы. Иными словами, после компиляции исходного кода он преобразуется не в код для какой-то определенной платформы, а в промежуточный код на языке IL.

CLS ("Common Language Specification", общеязыковая спецификация) – это набор правил, следуя которым разработчики достигают бесконфликтной работы во всех языках .NET.

Что такое managed code?

Управляемый код (managed code) – это код, работающий в среде CLR. Содержит метаданные, в которых находится информация для среды выполнения – о типах, членах и ссылках, используемых в коде.

Что такое assembly?

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

Что такое приватные и совместные сборки?

Сборки (assembly) бывают двух типов – приватные (private), которые использует только само приложение, и совместные (shared), использующиеся набором приложений. При приватных сборках приложение изолируется от внешнего воздействия программ и операционной системы, отпадает необходимость заботиться об уникальности имен в глобальном пространстве имен. Чтобы сделать сборку совместной, ее необходимо специальным образом собрать и присвоить ей строгое шифрованное имя.

Что такое assembly manifest?

Манифест сборки (assembly manifest) – это внутренняя часть сборки, которая позволяет ей быть самоописанной. Assembly manifest позволяет идентифицировать сборку, указывает файлы, которые включаются в реализацию сборки, описывает типы и ресурсы, используемые в сборке, указывает зависимости от других сборок, а также набор прав доступа, которые необходимы сборке для корректной работы. Эта информация используется во время выполнения для разрешения ссылок, проверку корректности версий, проверку целостности загруженных сборок.

В чем разница между понятиями namespace и assembly?

Namespace (пространство имен) является логическим соглашением, используемым во время разработки, в то время как assembly (сборка) устанавливает область видимости имени в процессе выполнения.

В чем различие между Value Type и Reference Type?

Value Type находятся в стеке, а Reference Type в куче.

Когда объект удаляется сборщиком мусора?

Объект удаляется сборщиком мусора, когда на него не остается ссылок.

Что такое Code Access Security (CAS)?

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

Что такое attribute?

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

Как обеспечить использование именованных параметров в конструкторе атрибута?

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

Здесь передается 1 позиционный параметр — строка "Kernel32" и 2 именованных параметра, которые устанавливают открытые поля CharSet и SetLastError в значения CharSet.Auto и true соответственно.

Читайте также:  Дата выхода чемпионов league of legends

В чем различие между Finalize и Dispose?

Dispose – обеспечивает явный контроль над ресурсами, используемыми объектом, а Finalize – неявный, используемый сборщиком мусора.

Что такое Boxing и Unboxing?

Упаковка (boxing) позволяет преобразовать размерный тип в ссылочный. При упаковке объекта размерного типа происходят следующие действия:

  1. Выделяется память в управляемой куче.
  2. Совершается копирование полей размерного типа в память, которая была выделена в куче.
  3. Возвращается адрес объекта.

Некоторые компиляторы автоматически создают IL-код, необходимый для упаковки объекта размерного типа. Процесс извлечения адреса полей из упакованного объекта называется распаковкой (unboxing). Распаковка не является полной противоположностью упаковке. В отличие от упаковки при распаковке не происходит никакого копирования. Однако обычно вслед за распаковкой следует копирование полей, поэтому обе операции (распаковка и копирование) являются противоположностью операции упаковки. Приведем пример использования упаковки и распаковки.

Упаковка и распаковка/копирование снижают производительность приложения как в плане замедления, так и в расходе дополнительной памяти, поэтому нужно стараться минимизировать создание кода, в котором происходят операции упаковки и распаковки/копирования.

Что такое GAC?

GAC — это глобальный кэш сборок. В нем хранятся совместно используемые сборки. Обычно это каталог С:WindowsAssemblyGAC. Этот каталог имеет определенную структуру, в котором хранятся подкаталоги, имена которых сгенерированы по определенному алгоритму. В GAC можно поместить только сборки со строгими именами. Для того, чтобы поместить сборку в GAC, используют специальный инструмент GACUtil.exe, который знает всю внутреннюю структуру GAC и может генерировать имена подкаталогов надлежащим образом. Регистрировать в GAC сборки необходимо для того, чтобы избежать конфликтов имен сборок. Приведем пример: две компании выпустили сборку и назвали ее одним именем Calculus. Если мы скопируем эту сборку в каталог, в котором уже находится сборка с таким же именем, то мы затрем сборку, которая ранее могла использоваться каким-то приложением. Это приложение с новой сборкой теперь работать не сможет. Решением этой проблемы будет регистрация этих двух сборок в GAC, в котором для каждой будет создан отдельный каталог.

Какие типы можно использовать в предложении foreach?

Массивы, коллекции. Классы в которых реализован интерфейс System.Collections.IEnumerable.

В чем различие между классом и структурой?

Для С# классы System.Object, System.Exception, System.File-Stream и System.Random — это ссылочные типы (память выделяется из упр. кучи). В свою очередь размерные типы в документации называются структурами (structure) и перечислениями (enumeration). Например, структуры System.In132, System.Boolean, System.Decimal, System.TimeSpan и перечисления System.DayOfWeek, System.10.FileAttributes и System.Drawing.FontStyle являются размерными типами (хранятся обычно в стеке потока, но могут быть встроены в ссылочные типы).

Что означает модификатор virtual?

При наследовании класса. Данный метод м.б. переопределен в производных классах с помощью ключевого слова override.

Чем отличается event от delegate?

Delegate – это по сути указатель на функцию.

В С# модель издатель — подписчик, где класс публикует событие, которое он может инициировать, и любые классы могут подписаться на это событие. Метод, вызываемый при возникновении события, определяется делегатом

Может ли класс реализовать два интерфейса, у которых объявлены одинаковые методы? Каким образом?

Поддерживает ли C# множественное наследование?

С# поддерживает множественное наследование в виде наследования от класса и нескольких интерфейсов, или просто от нескольких интерфейсов.

Но не поддерживает наследование от нескольких классов.

Кому доступны переменные с модификатором protected на уровне класса?

Наследуются ли переменные с модификатором private?

Да, но они не являются доступными.

Опишите модификатор “protected internal”

Члены с таким модификатором доступны классам, находящимся в той же сборке и унаследованным от данного класса.

Назовите класс .NET, от которого наследуются все классы?

Что обозначает термин immutable (неизменяемый)?

Это значит, что данные, хранящиеся в переменной, не могут быть изменены. При этом заметьте, что значение переменной может быть изменено – путём отказа от использования старых данных, которые могут быть изменены. Оригинальные данные остаются в памяти, а новые значения создаются вновь, в новой области памяти. Пример тип String.

Какая разница между классами System.String и System.Text.StringBuilder?

Данные, хранящиеся в классе System.String и есть неизменяемые (immutable). Класс System.StringBuilder разрабатывался так, чтобы над изменяемой строкой можно было проделать множество операций. То есть при каждой операции над объектом класса System.String происходит перенос данных в новую область памяти, что влияет на производительность программы.

Какое преимущество использования класса System.Text.StringBuilder перед System.String?

Класс StringBuilder более эффективен в случае работы с большим количеством строк. Объекты класса System.String неизменяемы, поэтому при каждом изменении строки создаётся новый объект в памяти.

Можно ли хранить разные типы данных в объекте класса System.Array?

Объясните разницу между System.Array.CopyTo() и System.Array.Clone()?

Первая операция осуществляет глубокое копирование массива, а вторая – поверхностное. Поверхностное копирование массива копирует только сами элементы объекта класса Array, независимо от того являются они ссылочными или значимыми типами. Копирования объектов, на которые ссылаются ссылочные типы не происходит. Ссылки в новом объекте класса Array указывают на те же объекты, что и ссылки в оригинальном массиве Array. Глубокое копирование копирует как элементы класса Array, так и объекты, на которые они явно или неявно ссылаются.

Как отсортировать элементы массива в убывающем порядке?

Нужно вызвать метод Sort(), а затем метод Reverse().

As, is – что это, как применяется?

If(o is Employee)<

Читайте также:  Заработок на создании сайтов на wordpress

Employee e = (Employee) o;

Проверка типа осущ., 2-ды. По этому в CLR

Employee e = o as Employee;

Вопросы по классам

Какой синтаксис используется для указания класса родителя в C#?

После имени класса наследника нужно поставить двоеточие и указать имя базового класса. Пример:

Можно ли запретить наследование от своего собственного класса?

Да. Для этого служит ключевое слово “sealed”.

Можно ли разрешить наследование класса, но запретить перекрытие метода?

Да. Указываем класс как public, а метод как sealed.

Что такое абстрактный класс?

Это класс, объект которого не может быть создан. Такой класс должен иметь класс-наследник с реализацией абстрактных методов. Абстрактный класс – это фактически чертёж нормального класса без реализации.

В каком случае вы обязаны объявить класс абстрактным?

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

Что такое интерфейс класса?

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

Почему нельзя указать модификатор видимости для методов интерфейса?

Потому что все они должны иметь модификатор public, который и установлен по умолчанию.

Можно ли наследовать от нескольких интерфейсов?

Назовите отличия между интерфейсом и абстрактным классом?

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

Назовите различия между структурами и классами.

Для С# классы System.Object, System.Exception, System.File-Stream и System.Random — это ссылочные типы (память выделяется из упр. кучи). В свою очередь размерные типы в документации называются структурами (structure) и перечислениями (enumeration). Например, структуры System.In132, System.Boolean, System.Decimal, System.TimeSpan и перечисления System.DayOfWeek, System.10.FileAttributes и System.Drawing.FontStyle являются размерными типами (хранятся обычно в стеке потока, но могут быть встроены в ссылочные типы).

В чем разница между абстрактными и виртуальными классами? Между виртуальными и абстрактными методами?

Абстрактный класс это класс, содержащий хотя бы один метод (abstract).. Виртуальный метод имеет реализацию и м.б. переопределен в производном классе. Абстрактный метод не имеет реализацию, только описание метода, который д.б. реализован в производных классах.

Dispose(), Finalize() – что это за методы, как используются в .NET?

Используются для освобождения ресурсов. Применяя метод Dispose, вы должны обеспечить неявную очистку методом Finalize. Если программисту не удалось вызвать метод Dispose, использование метода Finalize предотвращает постоянную утечку ресурсов.

Для чего в .NET используется конструкция using(…)<…>? Причем тут IDisposable?

Значение Using непосредственно связано с интерфейсом IDisposable. Интерфейс IDisposable представляет нам возможность быстро освободить общие ресурсы, не полагаясь на автоматический сборщик мусора (garbage collector). Конструкция Using позволяет вызывать метод Dispose автоматически, как только нужный объект выйдет за блок Using.

Вопросы по методам и свойствам

Назовите явное имя параметра, передаваемого в метод set свойства класса?

value. Тип этого параметра определяется типом свойства.

Что обозначает ключевое слово “virtual” для метода или свойства?

То, что метод или свойство может быть перекрыто.

Чем перекрытый метод отличается от перегруженного метода?

При перекрывании метода мы изменяем его поведение в классе наследнике. Перегрузка метода просто приводит к использованию другого метода с тем же именем внутри класса.

Можно ли объявить перекрытый метод статическим, если перекрываемый метод не является статическим?

Нет. Сигнатура виртуального метода должна остаться постоянной, кроме замены ключевого слова virtual на ключевое слово override.

Вопросы по сборкам

Что такое «сопутствующая сборка» (satellite assembly)?

Сборки, помеченные определенными региональными стандартами, называются сателлитными сборками

Какая наименьшая исполнимая единица в .NET?

Что происходит в памяти при упаковке и распаковке значимого типа?

При упаковке экземпляра размерного типа происходит следующее.

  1. В управляемой куче выделяется память. Ее объем определяется длиной размерного типа и некоторыми накладными расходами, позволяющими этому размерному типу стать настоящим объектом. Этими накладными расходами являются указатель на таблицу методов и индекс SyncBlocklndex.
  2. Поля размерного типа копируются в память, выделенную только что в куче.
  3. Возвращается адрес объекта. Этот адрес является ссылкой на объект; размерный тип превратился в ссылочный.
Читайте также:  Горячие клавиши скрыть строки в excel

Распаковка не является точной противоположностью упаковки.

Она состоит только в получении указателя на исходный.

размерный тип (поля данных), содержащийся в объекте. И никакого копирования при распаковке (в отличие от упаковки). Однако обычно вслед за распаковкой выполняется копирование полей, поэтому в сумме обе эти операции являются отражением операции упаковки

Посоветуйте интересные вопросы программисту С++, что бы оценить его знания?

Вот несколько вопросов, которые задаю я на интервью:

1. Виртуальные функции — что это и зачем?
2. Виртуальный деструктор — что это и зачем?
3. Что предпочтительней, наследование или инкапсуляция? в каких случаях и почему?
4. Есть такие волшебные слова: мьютекс и волотайл, о чем речь?
5. Чем отличается процесс от потока?

  • Вопрос задан более трёх лет назад
  • 21746 просмотров

Моно добавить пару вопросов про шаблоны. К примеру, такой.
Есть объявление
templatevoid f( T arg )
<
printf( "general call" );
.
>

template<>
void f( long arg )
<
printf( "explicit call" );
.
>

и вызов
int i = 0;
f( i );

Что будет вызвано?

Вместо int и long можно использовать указатели на класс и его предок; константный и неконстантный указатели.

template
void f( T arg )
<
printf( "general call" );
.
>

template<>
void f( long arg )
<
printf( "explicit call" );
.
>

Прошу прощения, одна из скобок сломала сообщение…

Что предпочтительней, наследование или инкапсуляция? в каких случаях и почему?

Какой-то странный вопрос. Может имелось ввиду наследование и делегирование?

Я завалил несколько человек тупым вопросом — чем отличаются virtual функции от pure virtual.
Ещё про mutable можно спросить — про эту штуку мало кто знает.
Ну, ещё по stl погонять, основы знать надо! Типа, что быстрее справится с такой-то задачей: vector или map? Области применимости и т.п.

«5. Чем отличается процесс от потока?» — это скорее вопрос на общую компьютерную грамотность, типа «Чем отличается процессор от системного блока?», который нам на информатике в школе задавали.

Часто, при собеседовании кандидатов на позиции программистов, сосредотачиваются на технических вопросах, типа «Зачем нужен виртуальный деструктор?», предлагают разобрать какую-нибудь кусочек кода с хитрым синтаксисом, который редко встречается в реальной жизни, или просто дают тестовое задание. В результате какой-нибудь студент-олимпиадник может отлично пройти интервью, а человек с 10 годами работы нет. Между тем, далеко не факт, что студент, начитавшийся книжек, будет эффективно работать, а не тратить время на рассказы неразумному начальству «как правильно программировать» и разработку очередного красивого четырехколесного велосипеда.

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

Список моих вопросов при собеседовании программистов ниже:

  1. Попросить рассказать о разрабатываемом ранее продукте, зачем он и для чего/кого. Если человек реально работал над проектом, то он должен хорошо понимать зачем он, кто его пользователи и т.п.
  2. Что сделал на прошлых местах работы? В резюме часто просто пишут про проект целиком. Возможно, соискатель разрабатывал его архитектура и писал ядро, а может просто нарисовалAboutдиалог.
  3. Какая была роль в команде? Чем занимались другие люди? Интересно узнать, как человек видит себя в проекте и команде.
  4. Какие были процессы разработки? Общий вопрос для начала, чтобы понять направление дальнейшего диалога.
  5. Были ли требования к продукту? Откуда они брались? Были ли аналитики, product manager и т.п.? Оценка умения работать по требованиям, а не городить отсебятину по принципу «я лучше знаю».
  6. Кто осуществлял декомпозицию больших задач на подзадачи? Сразу понятно, какая роль была на прошлой работе.
  7. Кто оценивал трудозатраты по задачам? Часто ли ошибались? Выясняем опыт разработчика в оценке задач, если такого опыта нет, то это не очень хорошо.
  8. Использовались ли Unit Tests? На мой взгляд это полезная практика, уменьшающая число багов. Хорошо, если кандидат ее использовал. К сожалению, часто приходится слышать на собеседовании ответ: «Да я хотел использовать, но времени на написание тестов никогда не выделяли.»
  9. Были ли ночные билды, ночные прогоны автотестов? Показывает, что разработка была не совсем коленочная. Скорее всего, есть привычка не ломать сборку своими коммитами.
  10. Мнение о той или иной процедуре в процессе разработки. Интересно послушать мнение о процессах. Если ответ в стиле: «Начальство самодуры, только мешают работать со своими кодревью», то имеет смысл задуматься &#128578;
  11. Были ли процедуры code review? Приходилось ли быть ревьювером? Если ревьювером быть не приходилось, это показатель не самого высокого уровня.
  12. Использовалась ли система контроля версий? Была ли разработка отдельных фичей в отдельных ветках? Если не использовали совсем, то какой-то совсем анахронизм. Если все делали в одной ветке, то можно предположить проблемы с мержами в будущем и боязнь использования веток.
  13. Что такое TDD? Не все такой подход одобряют, но можно задать кандидату вопрос: «Почему это хорошо это или плохо?»
  14. Были ли процедуры типа Gated check-in, проверка собираемости или тестов при коммитах? Дает понять насколько зрелый процесс разработки был на прошлом месте работы соискателя.
  15. На собеседовании имеет смысл спросить соискателя про отношение к «шаблонам по Александреску» и подобным стили программирования. ПринципKISSникто не отменял &#128578;
  16. Что сам кандидат спросит про работу и процесс в конторе? Показывает заинтересованность в работе, что реально интересует кандидата в новой работе. Некоторым важен процесс разработки, некоторым продукт, некоторым график работы, а есть такие, которым на все пофиг, лишь бы взяли.

Все новости сайта в telegram канале: @pmlife_ru

admin

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *