Вопросы на собеседовании по 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 соответственно.
В чем различие между Finalize и Dispose?
Dispose — обеспечивает явный контроль над ресурсами, используемыми объектом, а Finalize — неявный, используемый сборщиком мусора.
Что такое Boxing и Unboxing?
- Выделяется память в управляемой куче.
- Совершается копирование полей размерного типа в память, которая была выделена в куче.
- Возвращается адрес объекта.
Что такое GAC?
GAC — это глобальный кэш сборок. В нем хранятся совместно используемые сборки. Обычно это каталог С:\Windows\Assembly\GAC. Этот каталог имеет определенную структуру, в котором хранятся подкаталоги, имена которых сгенерированы по определенному алгоритму. В 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 – что это, как применяется?
С помощью оператора as программа пытается преобразовать выражение к определенному типу, при этом не выбрасывает исключение. В случае неудачного преобразования выражение будет содержать значение null.
Выражение o is Employee проверяет, является ли переменная o объектом типа Employee.
Операторы приведения типов.
If(o is Employee) <
Employee e = (Employee) o;
>
В чем разница между throw ex; и throw; ?
- throw повторно выбрасывает исключение (re-throw), которое было обнаружено, и сохраняет трассировку стека (путь к источнику исключения).
- throw ex генерирует одно и то же исключение, но сбрасывает трассировку стека на метод, где делается throw ex.
Как работает return в try-catch-finally?
Алгоритм приблизительно такой:
- Выполняется код перед оператором return;
- Выражение в return оценивается
- Выполняется finally блок
- Возвращается результат, посчитанный на шаге 2
Рассмотрим следующий код:
Что мы получим на экране?
почему так? Мы не меняли результат который был получен на шаге 2, мы изменили значение свойства ссылочного типа, но не меняли сам объект
Если мы перепишем блок finally следующим образом:
то получим в ответ
Если мы проделаем это с value type, результат будет тем же. Т.е в блоке finally нельзя изменить возвращаемый объект, но можно менять свойства объекта.
Вопросы по классам
Какой синтаксис используется для указания класса родителя в C#?
После имени класса наследника нужно поставить двоеточие и указать имя базового класса. Пример:
Можно ли запретить наследование от своего собственного класса?
Можно ли разрешить наследование класса, но запретить перекрытие метода?
Да. Указываем класс как public, а метод как sealed.
Что такое абстрактный класс?
Это класс, объект которого не может быть создан. Такой класс должен иметь класс-наследник с реализацией абстрактных методов. Абстрактный класс – это фактически чертёж нормального класса без реализации.
В каком случае вы обязаны объявить класс абстрактным?
- В том случае, если класс является наследником абстрактного класса, но не все методы базового класса перекрыты и имеют реализацию.
- В том случае, если хотя бы один метод класса является абстрактным.
Что такое интерфейс класса?
Интерфейсы, как и классы, определяют набор свойств, методов и событий. Но, в отличие от классов, они не содержат их реализации. Интерфейсы реализуются классами и определяются как самостоятельные сущности.
Почему нельзя указать модификатор видимости для методов интерфейса?
Потому что все они должны иметь модификатор 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)?
Сборки, помеченные определенными региональными стандартами, называются сателлитными сборками
Как пройти первое собеседование C#?
Вы прошли онлайн-курсы по C#, закончили какой-либо технический вуз, где практиковали программирование на этом языке или прошли стажировку в крупной компании, но вас не приняли работу в штат. А может быть вы одаренный самоучка. В любом случае, если вы в поиске первой работы C# программистом, то эта статья для вас. Давайте попробуем разобраться как пройти первое собеседование эффективно и получить достойный оффер.
Примечание: ниже, пункты помеченные * желательно выполнять регулярно. Для таких пунктов неплохо завести повторяющуюся задачу в вашем любимом менеджере задач.
Немного о том, как я нашел свою первую работу C# программистом. Будучи студентом в 2011 году я повинуясь стадному инстинкту начал искать работу. Откликался на все вакансии, которые только мог. Иногда меня приглашали на собеседования. Тогда традиционные грейды еще не были так распространены, а профессия программиста еще не была такой хайповой как сейчас. Моя задача была зацепиться — ведь это первая постоянная работа. На собеседованиях я жутко фэйлил, но при этом даже не осознавал своей глупости. Да, мой путь был долог и тернист, приходилось выслушивать насмешки со стороны интервьюеров. Но в итоге я нашел компанию, в которой получил все необходимое для начинающего программиста. После этого я прошел и провел еще под сотню собеседований — и представляю как этот процесс устроен как с точки зрения нанимателей, так и собеседуемого. Я делал много ошибок: в составлении резюме, при прохождении технического интервью, в live coding сессиях и в разговорах о зарплате. Со временем стал лучше понимать, что такое soft-skills и почему они так важны для разработчика. В итоге, накопил опыт, научился играть по правилам, хотя и не скажу, что мне они нравятся. Держите инструкцию в которой я собрал исследование рынка вакансий C#, мой личный опыт и опыт моих коллег. От программиста программисту, без воды. Здесь не будет советов «пройдите курс, прочтите книгу и вернитесь к этому через полгода» — ограничимся месяцем подготовки.
Есть куча статей о том, как написать идеальное резюме. Я остановлюсь на самом важном и на том, чего не нашел в других источниках. Первое, что нужно понимать, в мире вакансий .NET доминирует backend направление. В большинстве вакансий требуется ASP.NET стэк, базы данных (чаще MS SQL) и ORM (чаще Entity Framework). Поэтому, в первую очередь будем прокачивать эти компетенции. Кроме того, при поиске будем ориентироваться на Junior позиции и вакансии без указанного грейда с требуемым опытом работы до 2-х лет.
Если у вас еще нет резюме, то скорее его заведите. Также, не лишним будет завести аккаунт в LinkedIn. Его важность увеличивается многократно, если в будущем вы планируете искать работу с релокацией.
Требования к основным параметрам резюме для программиста довольно скромные: фамилия и имя, должность. Ваше фото по желанию. Можете указать зарплатные ожидания, чтобы отсеять неадекватные предложения. Если вы думаете, что ваш возраст может стать помехой для трудоустройства программистом, то и год рождения можно опустить. Например, если вы устраиваетесь будучи студентом — могут возникнуть вопросы про военный билет, или вам за 60 — а команда сплошь из молодых.
У вакансий на позицию Junior-разработчика часто есть минимальные требования к релевантному опыту. Одним из фильтров по которому проводится отбор вакансий является опыт работы программистом. Обычно это чуть меньше года: источник. Как же быть если опыта нет совсем, а очень хочется получить приглашение на ценное собеседование?
Вспомните любой свой опыт как-либо связанный с IT. Любые стажировки, написание курсовых за деньги, участие в научном проекте. Лучше такой опыт, чем никакого. Если же вам нечего вспомнить, то есть еще 2 варианта: ложное место работы и freelance.
Первый вариант, однозначно, рискованный и грязный. Вы указываете место, на котором никогда не работали, и которого, возможно не существует вообще. Сейчас, при такой распространенности удаленной работы для программистов сослаться на неизвестную IT компанию из другого города несложно. Вы должны быть хорошо подкованы в C# и представлять как устроен современный процесс разработки. Попросите знакомого программиста описать его рабочие задачи и обязанности и составьте на основе его рассказа легенду. Посмотрите открытые резюме разработчиков с опытом работы. В них они описывают, что входит в их круг обязанностей и какие технологии они применяли. Вы должны выучить легенду и может быть даже отрепетировать ее рассказ.
Во втором варианте, вам необязательно работать во freelance целый год. Вы можете зарегистрироваться на какой-либо бирже фриланса и взять 1-2 небольших проектах (до месяца) за копеечную ставку. Бывают краткосрочные проекты, в которых нужно что-то доработать или пофиксить — даже, если у вас не получилось сделать, вы получите опыт и понимание, как работать во фрилансе — это поможет вам в случае вопросов об опыте на собеседовании. Возможно это займет больше времени, но этот вариант гораздо более ценный и, кроме прочего, может вас неплохо прокачать.
В любом из этих вариантов вам придется кратко заполнить перечень ваших обязанностей, достижения и технологии с которыми вы работали. Никто не ждёт от программиста простыни текста в резюме, но дежурные 1-2 предложения это необходимый минимум для описания предыдущего места работы.
HR фильтруют резюме в том числе и по навыкам. Чем больше навыков в вашем резюме совпадает с навыками вакансии, тем больше шансов, что вас пригласят на собеседование. Мы проанализировали более 5000 вакансий, выявили самые востребованные навыки C# разработчика и некоторые интересные закономерности. К примеру, такие навыки как стрессоустойчивость, коммуникабельность и многозадачность редко встречаются в вакансиях. Поэтому не стоит ими злоупотреблять. Оценить их по-настоящему сложно, а в работе программиста они играют не первую роль.
Поставьте на первое место ваши технические навыки. Не спешите думать, что если вы начинающий программист, то значит у вас нет никаких востребованных навыков. Еще как есть, причем именно базовые навыки чаще прочих указываются в вакансиях. Вот краткий список базовых навыков, которыми вы скорее всего обладаете и смело можете вписать их в свое резюме:
- C#
- .NET Framework
- MS Visual Studio
- SQL
- git
- ООП
- Английский язык
- LINQ
- XML
Конечно же, не стоит ограничиваться только навыками, востребованными на рынке. Если у вас есть опыт работы с Delphi, или в вашем ВУЗе преподавали Fortran, то добавьте их в навыки. Это лишь сделает ваше резюме более уникальным и возможно заинтересует интервьюеров на техническом собеседовании.
На марафоне Карьера C# программиста вы получите топ 50 востребованных навыков на рынке вакансий C#. Из этого набора мы собирем мощный скилл-сет в резюме для начинающего разработчика. Большая часть всех вебинаров — это практика. В ходе вебинара по прокачке резюме каждый участник подмечает частые ошибки в резюме и адаптирует свое резюме под рынок вакансий.
Важно понимать, что в зависимости у разных компаний разные требования к высшему образованию и знанию английского. Например для окологосударственных компаний, банков, наукоемких позиций и крупных аутсорс компаний высшее образование достаточно важно. Для аутсорс компаний, позиций с релокейтом знание английского языка имеет большую роль. Преувеличивать уровень английского языка смысла нет — компании, которые заинтересованы в наличии у вас, например B1, обязательно проверят ваш уровень на собеседовании. В графе «О себе» часто указывают какой-нибудь краткий текст, где перечисляют свои хобби и разностороннюю жизнь вне работы. Не забудьте здесь написать про вашу страсть к программированию с ранних лет и что программирование это тоже ваше хобби — работодатели это любят. Сюда неплохо также добавить ссылку на GitHub (GitLab). О них подробнее поговорим ниже.
Банальный, но важный шаг. Ваш отклик означает, что вы уже заинтересованы в вакансии и ваши шансы с хорошим резюме увеличиваются. При этом, если у вас есть персональный рейтинг вакансий, то начинайте с наименее приоритетных для вас — таким образом вы получите опыт на собеседованиях, в которых вы менее заинтересованы, а отказ не сильно вас расстроит.
Вам позвонила девушка HR, рассказала про вакансию. На этом этапе иногда проводят проверку на адекватность — обычно с этим проблем не возникает. И вот она приглашает вас пройти техническое собеседование. В эпоху удаленки это в 90% случаев онлайн — Zoom, Skype, Google meet. Вы договариваетесь о времени беседы. Что дальше?
Этот шаг может показаться лишним. Но, во-первых — это хорошая привычка. Все-таки важное мероприятие, будет обидно, если вы про него забудете. А приложение календаря вам вежливо напомнит. Во-вторых, если у вас будет много предложений, то вам будет проще назначить новое собеседование без конфликтов с уже имеющимися в календаре. В идеале подключите сервис бронирования временных слотов (например, Calendly) и определите график прохождения собеседований. Отправляйте HR ссылку на ваш Calendly и они сами выберут удобный и для вас и для них слот — это удобно и показывает вашу организованность.
Собеседование началось. Вы поздоровались, вежливые HR и ее коллеги рассказали какую-то вводную часть, обозначили план собеседования и задали первый традиционный вопрос: «Расскажите о себе и своем опыте».
Что делать, если вы жутко волнуетесь до состояния кома в горле? Волноваться на собеседовании — это совершенно нормально. Все опытные разработчики проходили через этот этап. Оценивающая сторона не ожидает, что вы будете излучать уверенность — HR и интервьюеры готовы к стеснительным джунам. Если волнение вас сильно сковывает, то лучше всего често об этом сказать вашим собеседникам: «Это мое первое собеседование, поэтому я сильно волнуюсь». Это хороший психологический прием — вы честны со всеми, в том числе и с самим собой, а ваши собеседники начинают относиться к вам более снисходительно.
Цель первых собеседований — пройти их наиболее эффективно, а не ответить на все вопросы правильно. Даже если не знаете ответ на вопрос, попробуйте предположить. А в случае, если ваш ответ неверный, не постесняйтесь уточнить у интервьюера: «А почему?». Правильный ответ интервьюера в стрессовой ситуации мозг запомнит лучше, чем повторение при подготовке к собеседованию. Планируйте собеседования в порядке от наименее интересной вакансии к наиболее интересной, таким образом отказ будет восприниматься проще. Рынок труда в IT переполнен предложениями, поэтому при должной подготовке без приглашений вы не останетесь.
Для того, чтобы волнение не раскачало вас окончательно необходимо подготовиться не только к вопросам, но и к самому ходу собеседования. Это избавит вас от лишнего стресса, ведь мозг будет воспринимать собеседование как что-то знакомое, что идет по плану. Типичный план собеседования примерно такой:
- Знакомство
- Опыт и рассказ кандидата о себе
- (Опционально) Тестирование
- Теоретические вопросы
- (Опционально) Задание на live coding
- Рассказ интервьюеров о проекте и должности
- Прощание
Самая сложная часть любого отбора программистов — это проверка знаний и навыков. Их могут проверить с помощью тестирования, live-coding сессий, вопросов по теории, тестового задания. Скрининг ваших знаний по C# или тестирование могут провести еще до собеседования, даже по телефону. Для Junior позиций редко проводят более одного собеседования. Типичное собеседование длиться 1-1.5 часа. В интернете часто можно найти записи онлайн собеседований. Посмотрите такие записи — по ним вы можете понять как это выглядит со стороны и придаст вам больше уверенности.
Не зазорно будет его зачитать, если вы сильно волнуетесь или боитесь что-то забыть. Таким образом, будет проще пережить начальное волнение и адаптация к собеседованию пройдет плавнее. Если же вы хотите рассказать о себе «без бумажки», но при этому ничего не забыть, то вместо целой истории напишите только ключевые пункты — и сверяйтесь с ними по ходу рассказа.
Вы рассказали о себе и своем опыте. HR вежливо попросила перейти к техническим вопросам. Самая пугающая часть собеседования для начинающих программистов. И самая важная часть отбора кандидатов. Ведь именно от того, как вы ответили на вопросы по теории будет зависеть предложат вам оффер или нет. Поэтому стоит подойти к вопросам со всей серьезностью. В интернете циркулирует огромное количество вопросов для собеседований по C#. Интервьюеры тоже не гнушаются использовать типовые вопросы на собеседовании. Более того, вы заметите, что 80% всех вопросов в той или иной форме повторяются из собеседование в собеседование.
Обычно все вопросы делятся на области знаний из мира .NET. Даже если вы не знаете ничего про многопоточность и асинхронность в .NET, то посмотрите хотя бы основные определения и какие есть классы. Это вряд ли прибавит вам знаний, но вы сможете наметить план своего дальнейшего обучения и подмечать часто-встречающиеся вопросы по той или иной теме. Кроме того, чем меньше незнакомых слов на собеседовании вы услышите, тем меньше стресса испытаете. Мы составили mind map из наиболее востребованных компетенций на основе наиболее часто встречающихся навыков в вакансиях, которые необходимо знать начинающему в первую очередь.
Вопросы для Junior позиций обычно не такие сложные. Однако, для калибровки вашей «весовой категории», вам могут задать вопросы и посложнее. Старайтесь запоминать и потом записывать все вопросы, которые вам задавали. В особенности те, на которые вы не знаете ответа. Это ваши пробелы и повод почитать статью или книгу по теме.
Вопросы на собеседовании можно разделить на:
- Закрытые — подразумевается короткий и быстрый ответ. Например: «где хранится static class — в куче или стэке?»
- Открытые — подразумевается ответ в виде небольшого рассказа. Обычно, что-то типа «расскажите в чем отличися IQueryable от IEnumerable» или просто «расскажите, что вы знаете о сборщике мусора в .NET».
- Вопросы с кодом — что выведет данный кусок кода. Часто для Junior позиций здесь можно встретить хитрые вопросы связанные с наследованием, модификаторами new/override, из более сложных — код с race condition.
Специально для марафона Карьера C# программиста мы собрали огромную базу вопросов из собеседований по C# и .NET с разделением по областям и типам. Вы можете попробовать проверить свои знания на автоматически сгенерированном тесте из закрытых вопросов здесь. На основе ответов мы делаем рекомендации по дальнейшему развитию и даем вам необходимые материалы по темам, которые нужно подтянуть. Для этого есть большая подборка полезных материалов в виде статей книг и видео по каждой из областей .NET.
В IT считается естественным постоянное саморазвитие и обучение. Примите этот факт. Интервьюеры часто спрашивают: «какие книги или статьи вы прочитали или читаете?» Если вы не начали читать ни одной книги, то самое время начать. К моменту первого собеседования начните читать хотя бы Рихтера и обязательно попробуйте некоторые примеры кода оттуда — так вы лучше запомните теорию. Таким образом на собеседовании вы сможете смело заявить, что «я читаю книгу X». Кроме того, вы можете целиком прочитать какую-нибудь статью по .NET подходящую для вашего уровня и также заявить: «последнее, что я читал это статья Y». Возможно, вам покажется, что вы преувеличиваете свою начитанность, но ведь вы не соврали? А для интервьюера данный факт звучит солидно — вы действительно занимаетесь саморазвититем.
«Давайте немножко покодим. » — пробормотал интервьюер.
Live coding сессия — это проверка практических навыков программирования и умения решать алгоритмические задачи. Вам дают задание, цель которого продемонстрировать ваши навыки программирования и ход мыслей в процессе его решения. Посмотрите каким прекрасным может быть live coding.
Задания могут быть самые разные: как алгоритмические задачи, типа «переверни строку», так и задания на рефакторинг «посмотрите, что можно в этом коде улучшить». Кроме самого процесса решения, часто вас будут просить комментировать вслух ваше рассуждение — признаюсь, для меня самого это пытка. Цель такого рассуждения — это понять ход ваших мыслей, находитесь ли вы на верном пути. Даже если вы не решили задачу до конца, но шли в верном направлении в своих рассуждениях, то это 80% успеха.
Live coding может проводиться 2-мя способами:
-
(или другой инструмент для code sharing)
- своя IDE + шаринг экрана
Подготовиться лучше к обоим вариантам.
Во-первых как следует изучите IDE, в которой вы работаете. Скорее всего в ней есть возможности, упрощающие разработку, о которых вы еще не знаете.
Во-вторых откройте онлайн сервис для шаринга кода (типа codeshare.io) и попробуйте написать там код, поизучайте его возможности. Это от силы займет у вас 10 минут, но избавит от лишней неизвестности на собеседовании.
Кроме инструмента в котором вы пишете код, вам пригодятся:
-
— сервис, где вы можете потренироваться в решении задач на любом языке программирования, в том числе C#. О нем чуть ниже. — удобный онлайн инструмент для декомпиляции C# кода. На собеседованиях любят спрашивать: во что декомпилируется тот или иной кусок кода. Введите туда lock, using, async/await конструкции и убедитесь на практике, что они из себя представляют после компиляции. — онлайн-компилятор .NET. Также удобный инструмент для проверки гипотез и решения задач, когда нет желания заводить новый проект в MS Visual Studio. — здесь вы можете потренироваться в решении SQL задач. Как я уже говорил, на рынке C# вакансий доминирует backend позиции, поэтому без SQL никуда.
Если вы ни разу до этого не решали алгоритмические задачи и не обладаете природной склонностью к такому роду занятий, то первые задачи будут идти особенно тяжело. Поэтому выбирайте для начала самые простые. Ограничивайте себя по времени в решении задач. Делайте несколько попыток. Если не получается вы можете посмотреть решение. Для этого вовсе необязательно покупать Premium аккаунт, многие решения задач можно найти в интернете.
Начните с этой подборки задачек для собеседований. Среди них вы найдете задачи разного уровня, но в той или иной форме они часто попадаются на live coding сессиях. А вот гайд про то, как использовать leetcode наиболее эффективно.
Не забудьте также про задачи на написание SQL запросов. Обычно это задачи на select запросы. Для Junior позиций они чаще несложные. Но недооценивайте такие задачи раньше времени. Лучше попробуйте их сначала на практике. На sql-ex.ru вы получите схему БД и набор задач для этой схемы с разным уровнем сложности.
В отличие от вопросов по .NET, алгоритмы — гораздо менее предсказуемая тема для собеседования. Могут вообще не спросить, или спросить что-то абсолютно другое. Поэтому в алгоритмах стоит ориентироваться на фундаментальные знания. Алгоритмы вставки, поиска и сортировки, рекурсия и оценка сложности. Примерно такой перечень возможных вопросов и связанных с ними задач, который я рекомендую иметь в виду при собеседовании на Junior’а. Используйте это как начальный вектор для обучения в теме алгоритмов.
Знаю, что многих пугает оценка алгоритмов через термины «О большое». Если вас попросили оценить написанный алгоритм, то стоит знать 2 вещи:
- Запомните оценки сложности базовых алгоритмов (вставки, поиски, сортировки) через О большое
- Изучите смысл О большого и арифметические операции с ним и вы поймете как посчитать итоговую сложность комбинации алгоритмов
Неплохая статья со сравнением сложности различных алгоритмов.
Для начала убедитесь, что вы умеете работать с git. Самый интересный интерактивный учебник по git. Рекомендую для начала пройти 2 главы: «Основы» и «Введение и Push & Pull — удалённые репозитории в Git».
В интернете циркулирует большое количество тестовых заданий от разных компаний. Вы можете испытать себя, решив одно из них. Начните с наиболее простого. Если у вас есть знакомый программист, попросите его оценить ваше решение. Попробуйте исправить его и снова получите обратную связь. Как только ваше задание будет достаточно хорошим, выкладывайте его на GitHub (GitLab). Несомненным плюсом будет наличие тестов, правильная структура папок и настроеный CI/CD.
Во-первых, вы получаете полезный опыт в решении тестового задания и навык работы с GitHub. Во-вторых, в будущем вы сможете сослаться на созданный репозиторий, если у вас попросят примеры кода. В-третьих, таким образом вы развиваете свой GitHub аккаунт.
На марафоне Карьера C# программиста мы на практике разбираем инструменты для помощи в live coding, решаем задачи по C# и SQL все вместе и в группах. Разбираем важность и способы развития GitHub (GitLab) аккаунта и конечно же его прокачиваем на практике. Мы подготовили домашнее задание для каждого вебинара. И на всех вебинарах мы разбираем вопросы, которые возникли в ходе решения.
После технического собеседования с программистами, может быть разговор о будущей зарплате с HR. И здесь стоит быть предельно спокойным. Даже если вам кажется, что вы завалили собеседование, не стоит сразу занижать планку зарплатных ожиданий. Речь идет о вашем будущем на несколько месяцев, а то и лет. Поэтому давайте разберем, чем стоит руководствоваться при обсуждении зарплаты.
Soft-skills это навыки, которые нельзя измерить объективными числовыми характеристиками. К примеру, тяжело оценить насколько вы коммуникабельны. Возможно у вас уже хорошо развитые soft-skills. Например, вы работали в сфере, где soft-skills важны, или вы студент активист и командный игрок. В таком случае, не забывайте про ваши преимущества. Давайте посмотрим на список самых востребованных soft-skills и что они означают:
- Аналитическое мышление — способность синтезировать вывод из множества фактов. При решении бизнес-задач у вас будет много требований и вам реализовать их все в одном решении.
- Работа в команде — дружелюбность, отзывчивость и взаимовыручка. Вы не боитесь спросить помощи и готовы помочь другим.
- Любопытство — как мотивация к обучению. Задавая вопросы о будущей работе на собеседовании.
- Time management — в эпоху удаленки особенно важный навык. Показывает вашу огранизованность и умение держать work-life balance.
Список можно продолжить, но это тема отдельной статьи. Подумайте, обладаете ли вы каким-либо из этих навыков? Если да, то не забудьте мысленно прибавить себе ожидаемую зарплату.
Если вы хорошо подготовились и считаете, собеседование прошло успешно — это самый лучший способ обрести уверенность и просить приятную для вас сумму. Хороший способ оценить свою стоимость — это получить несколько офферов и посчитать среднее. Но эта опция будет доступна вам не сразу. На первых собеседованиях очень тяжело ориентироваться в зарплатных ожиданиях: «а не продешивили ли вы, или не попросили ли слишком много?» Поэтому стоит начинать с вакансий, где указана вилка. Так по-крайней мере вы поймете нижнюю и верхнюю границу. Просите больше среднего по вилке, а то и больше верхней границы. При этом адекватно оценивайте свои знания и отталкивайтесь от средних значений на рынке вакансий. Для РФ диапазон зарплат Junior’а на момент написания статьи: 30 — 100 тысяч рублей. Просите озвучить сумму «на руки». Никаких gross или эффективных оплат труда. Это только вас запутает.
Еще больше советов о том, как получить достойную сумму в оффере мы подготовили в марафоне Карьера C# программиста. В финальном вебинаре мы сделали уникальный текстовый квест, в котором вам предстоит помочь своему коллеге получить максимально выгодный оффер. В этом квесте мы еще раз пройдемся по всем этапам отбора кандидатов на позицию программист C#.
- Резюме
- Проверьте основные параметры
- Добудьте себе опыт работы
- Укажите востребованные навыки
- Заполните образование, языки и «О себе»
- * Откликайтесь на вакансии
- Техническое собеседование
- Запланируйте собеседование в календаре
- Не накручивайте себя
- Не бойтесь отказов
- Ознакомьтесь с типичным планом собеседования
- Подготовьте рассказ о себе заранее
- Изучите ответы на вопросы по C# и .NET
- * Прочитайте статью по .NET
- Live coding
- Попробуйте инструменты для работы с live coding
- * Решите задачу с leetcode и sql-ex
- Изучите базовые алгоритмы и «О большое»
- * Решите тестовое задание и выложите его на GitHub
- Разговор о зарплате
- Вспомните про свои soft-skills
- Знайте себе цену и просите больше
Мы подготовим вас к собеседованию C# в короткие сроки. Прокачаем резюме и GitHub, научим в live coding и разберем популярные вопросы на собеседовании. Записаться на бесплатный вводный вебинар, где вы можете задать все интересующие вас вопросы можно на сайте марафона:
Марафон расчитан и на тех, кто уже имеет опыт собеседований, но хотел бы освежить свои знания и узнать оптимальный путь прохождения всех этапов отбора. Это не онлайн-курс C#, для тех, кто уже обладает базовыми знаниями C# и навыком программирования.
46 вопросов на собеседовании по C++ от ведущих IT компаний
Если вы готовитесь к собеседованию в команде разработчиков программного обеспечения, которая регулярно использует C ++, лучшее, что вы можете сделать, — это попрактиковаться в вопросах, которые вы, скорее всего, увидите.
Когда вы работаете над этими проблемами, убедитесь, что вы имитируете среду собеседования: сядьте в тихом месте, говорите вслух, работая над вопросом, и рассчитайте время.
Просмотрите этот список из 46 вопросов для собеседований по C ++ от реальных технологических компаний и ознакомьтесь с нашими советами, чтобы вы могли дать наилучшее интервью.
- Вопрос Accenture — Различия между классом и структурой в C ++.
- Вопрос Infosys — что делает функция Friend в C ++?
- Вопрос ACI Worldwide — в чем разница между вектором и массивом?
- Вопрос Accenture — каковы спецификаторы доступа в C ++?
- Вопрос IBM — что такое функция main () в C ++? Можем ли мы запустить программу без основного метода?
- Вопрос 23andMe — Что такое наследование в объектно-ориентированном программировании?
- Вопрос Intel. У вас есть поток бесконечных запросов (например, поисковые запросы Google в реальном времени, которые вводят люди). Опишите, как вы могли бы найти хорошую оценку в 1000 выборок из этого бесконечного набора данных, а затем написать для него код.
- Infosys вопрос — Вам дается список номеров. Когда вы дойдете до конца списка, вы вернетесь в начало списка (круговой список). Напишите наиболее эффективный алгоритм поиска минимального числа в этом списке. Найдите любой заданный # в списке. Числа в списке всегда увеличиваются, но вы не знаете, где начинается круговой список, например: 38, 40, 55, 89, 6, 13, 20, 23, 36.
- Вопрос Google — если у вас есть 1 миллион целых чисел, как бы вы их эффективно отсортировали? (измените конкретный алгоритм сортировки, чтобы решить эту проблему)
- Вопрос Adobe — напишите код для переворота строки.
- Как C ++ работает с конструкторами и деконструкторами класса и его дочернего класса?
- Вопрос Adobe: создайте механизм быстрого кэширования хранилища, который, учитывая ограничение на объем кэш-памяти, будет гарантировать, что только наименее использованные элементы будут отбрасываться при достижении кэш-памяти при вставке нового элемента. Он поддерживает 2 функции: String get (T t) и void put (String k, T t).
Начнем с разъяснений
Получив вопрос, подумайте и задайте уточняющие вопросы 15–30 секунд, прежде чем сразу перейти к проблеме. Хотя существует ограничение по времени, вы не должны слишком торопиться. Вот некоторые примеры этих вопросов: «Разрешено ли повторение?» или «Вы хотите вернуть перестановки или комбинации?»
Покажи то, что знаешь
Во время работы заранее предоставляйте информацию о том, что вы делаете, чтобы интервьюер увидел, что вы имеете твердое представление о предмете. Хотя кодирование может занять некоторое время, выгода компенсирует это.
Сделайте контекстные утверждения
Контекстные утверждения — еще один способ показать положительный сигнал. Если вы аргументируете принимаемые решения, вы можете изменить восприятие вашей работы интервьюером. Это может помочь вам, если вы ошиблись, потому что это дает интервьюеру понимание того, о чем вы думали.
Задайте совместные вопросы, чтобы получить помощь
Пока вы работаете над вопросом собеседования, вы можете достичь точки, когда вам понадобится помощь. Вместо того, чтобы просить «подсказки», что не нравится некоторым интервьюерам, попробуйте дать предысторию вашей проблемы и спросить интервьюера, могут ли они помочь вам вести вас по правильному пути. Например, вы можете сказать: «Мои предположения — это X и Y, я подумываю сделать Z. Но я борюсь с решением [проблемы]». Вы также можете спросить: