Вопросы на собеседовании для Senior C# / .NET Developer
Здравствуйте, меня зовут Artem Polishchuk и я пишу на С# с 2012 года. Я как проходил, так и проводил множество собеседований. В этой статье я собрал полный список вопросов и тем которые я задавал и мне задавали на собеседовании. В этой статье будет собрано все то, что должен знать хороший Senior C# / .NET разработчик с уклоном к web разработке и современному стеку с ASP.NET Core. Хочу сразу сказать, что если вы интервьюер и собираете список вопросов для собеседования в вашу компанию, не берите этот список за чистую монету, тк кандидаты скорее всего тоже будут мониторить данный список и будут его использовать как базу для подготовки. Следовательно если вы готовитесь к собеседованиям как кандидат, используйте эту статью как подготовительную базу и обзор разных топиков которые нужно подтянуть перед собеседованием. Так как эта статья большой труд, прошу указывать автора и ссылку на оригинал, если вы будете использовать ее где-то у себя. Также репост приветствуется, спасибо 🙂.
Прежде чем мы перейдем к основному блюду, хочу порекомендовать "начать с стартеров" и заглянуть в мои прошлые статьи которые могут помочь вам подготовиться к собеседованию лучше:
- Вопросы на собеседовании по C#
- RoadMap для .NET Core разработчиков
- Как правильно проходить технические интервью
- Антипаттерны в программировании и проектировании архитектуры
- Чеклист для разработчиков по подготовке к техническому собеседованию
Все ответы на вопросы я поделю на 3 подкатегории:
- 📌 Must - Senior C# / .NET обязан знать
- 🎓 Should - Senior C# / .NET должен знать
- 👨🏫 Could - будет плюсом, если Senior разработчик знает
Так же в этих подкатегориях могут быть указаны дополнительные вопросы которые смогут вам подготовиться лучше (или же если вы интервьюер "прощупать" кандидата)
Ну а теперь перейдем к самим вопросам 🤓
📚 Общие вопросы по .NET
Множество вопросов с этой категории было описано в этой статье, по-этому ниже будут только те вопросы которых нет в ней.
Что такое managed и unmanaged resources в .NET?
Этот вопрос нужно понимать разницу и желательно привести примеры таких ресурсов, если вспомните еще пару нюансов как с ними работать будете в фаворе 🤓.
📌 Must:
- Managed ресурсы – это ресурсы для очистки которых используется Garbage collector.
- Unmanaged ресурсы – ресурсы которые не очищаются сборщиком мусора и их нужно явно очищать после выполнения кода, который их использовал, например: работа с файлом, работа с бд и тд.
🎓 Should:
- Использование
IDisposable
и конструкции using для очистки unmanaged ресурсов, как основной подход для работы с такими ресурсами.
👨🏫 Could:
- Зачем использовать безопасный дескриптор System.Runtime.InteropServices.SafeHandle вместо финализатора
- Зачем нужен метод DisposeAsync() который добавили в C# 8, что возвращает и в каких случаях может быть полезен возвращая значение
ValueTask
Что такое Garbage Collector и как он работает?
К сожалению мало Senior разработчиков "новой закалки" читают и разбираются в подобной теории🥺. Как по мне это очень важный вопрос и рекомендую вам его изучить.
📚 Ресурсы для изучения:
- Куда ж без статьи на msdn
- Хорошая статья где понятным языком описывают принцип работы и поколения в GC - https://habr.com/ru/company/clrium/blog/464169/
- Еще одна статья заслуживающая вашего внимания - https://habr.com/ru/company/clrium/blog/463293/
- Оптимизация сборки мусора в высоконагруженном .NET сервисе
- Принципы работы Garbage collection
📌 Must:
- Фазы сборки мусора:
- Маркировка (mark phase).
- Чистка (sweep phase).
- Сжатие (compact phase).
- Понимать почему именно 3 поколения в GL, а не 2, 1 или N и зачем нужны поколения.
- Понимание, что такое Large object heap и зачем он нужен.
🎓 Should:
- Как мы можем сконфигурировать сборщик мусора для конкретного приложения?
- Какие отличия сборки мусора в режиме сервера (SVR GC) и в режиме рабочей станции (WKS GC)
👨🏫 Could:
- WeakReference
- в чем нюанс работы Finilize с GC, почему Finalization queue замедляет работу?
- Методы
GC.SuppressFinalize(this)
,GC.Collect()
Как работает Equals в C#?
На самом деле очень легкий вопрос, который не составит труда изучить прочитав статью ниже 👇
📚 Ресурсы для изучения: Equals() и как работает сравнение типов в C#
📌 Must:
- Как работает сравнение типов через
Equals()
и==
в Reference Type - Как работает сравнение Value типов через Equals
🎓 Should:
- Сравнение с помощью вспомогательных классов и интерфейсов (
IEqualityComparer
,IStructuralEquatable
,IComparable
)
👨🏫 Could:
- Правила реализации метода Equals и оператора равенства (==). Каким правилам следовать, можете найти в статье для изучения, которую я привел выше
Жизненный цикл Value-type объекта
Многие, кто таки добрался до GC и прочитал статьи как он работает на этом останавливается 🙈. Забывая, что еще есть и Value типы и их жизненный цикл.
📌 Must:
- Scope функции, когда и при каких условиях очищается данные переменных которые хранятся в стеке
- Когда Value type хранится в стеке, а когда в heap.
- Что работает быстрее структура или класс, когда что лучше использовать?
Делегат в C#
📌 Must:
- Все что описано в этой статье.
🎓 Should:
- Multicast делегат
В чем разница между ключевыми словами new и override при переопределении метода класса?
На самом деле джун вопрос, ответ на который многие Senior'ы позабыли )
📚 Ресурсы для изучения: Использование ключевых слов "Override" и "New"
📌 Must:
Модификатор override
расширяет метод virtual
базового класса, а модификатор new
скрывает доступный метод базового класса.
пример который дает понимание как это работает:
namespace OverrideAndNew
{
class Program
{
static void Main(string[] args)
{
BaseClass bc = new BaseClass();
DerivedClass dc = new DerivedClass();
BaseClass bcdc = new DerivedClass();
// The following two calls do what you would expect. They call
// the methods that are defined in BaseClass.
bc.Method1();
bc.Method2();
// Output:
// Base - Method1
// Base - Method2
// The following two calls do what you would expect. They call
// the methods that are defined in DerivedClass.
dc.Method1();
dc.Method2();
// Output:
// Derived - Method1
// Derived - Method2
// The following two calls produce different results, depending
// on whether override (Method1) or new (Method2) is used.
bcdc.Method1();
bcdc.Method2();
// Output:
// Derived - Method1
// Base - Method2
}
}
class BaseClass
{
public virtual void Method1()
{
Console.WriteLine("Base - Method1");
}
public virtual void Method2()
{
Console.WriteLine("Base - Method2");
}
}
class DerivedClass : BaseClass
{
public override void Method1()
{
Console.WriteLine("Derived - Method1");
}
public new void Method2()
{
Console.WriteLine("Derived - Method2");
}
}
}
Что такое exception handling? Опишите как вы строите error handling у вас в проекте и какой best practice?
📌 Must:
- try-catch-finaly
throw ex;
vsthrow;
🎓 Should:
- Избегать throw`инг эксепшина где это возможно.
- throw'айте эксепшн вместо возврата кода ошибки
👨🏫 Could:
- Используйте .NET предопределенные типы эксепшинов
- При создании своего кастомного эксепшина, называйте класс Name
Exception
Типы данных, коллекции и структуры данных в .NET
📚 Ресурсы для изучения:
- Dictionary в .NET
- Как правильно выбрать коллекцию в .NET
- Сравнение коллекций в .NET
- О большое: что это такое, почему это важно, и почему это не важно
- Исходный код Linq
Какие коллекции в .NET вы знаете,в чем их разница, скорость операций, структуры данных?
📌 Must:
- Big O notation
- Разница между
Array,
List
- Какая разница между
List<KeyValuePair<T1, T2>>
иDictionary<T1, T2>
? - Какая структура данных используется под капотом у
List?
- С какими коллекциями можно использовать Linq?
- Оператор
yield
🎓 Should:
ConcurrentDictionary, BlockingCollection, ConcurrentQueue, ConcurrentStack
: в чем их отличие от обычных коллекций?- Что такое
LinkedList
, для каких задач он может быть нужен? - Скорость операций вставки, чтения, поиска разных типов коллекций таких как:
List, LinkedList, Dictionary, Hashset, Queue, Stack, SortedDictionary, SortedList, SortedSet
- Практический опыт работы и понимание принципа работы следующих типов коллекций:
List, LinkedList, Dictionary, Hashset, Queue, Stack, Set, ConcurrentDictionary, ConcurrentQueue, ConcurrentStack
- Как реализованы основные методы Linq под капотом, такие как:
First, Where, Count, OrderBy, Distinct, Contains, GroupBy
👨🏫 Could:
- Что такое graph, tree? Представлены ли они какими-то классами в .NET? Для каких задач на практике они могут пригодиться?
- Immutable коллекции.
Dictionary
Очень немногие отвечают на собеседовании на эти вопросы, хотя все используют Dictionary. А вы как думаете, должны ли это все знать Senior'ы 🤔?
📌 Must:
- Какая структура данных используется под капотом у
Dictionary
? - Как работает
Dictionary
, почему он работает быстрее чемList
? - Что такое коллизии в
Dictionary
, как он умеет с ними работать?
🎓 Should:
- Зачем равномерно распределять значения хэш-кода по диапазону целых чисел?
- Требования к ключу Dictionary
👨🏫 Could:
- Какие типы блокировок бывают в
ConcurrentDictionary?
- При каких операциях используются
Volatile.Read, Volatile.Write, Monitor.Enter, Monitor.Exit
? - Какой механизм используется для реализации ConcurrencyLevel в
ConcurrentDictionary
?
⛓️ Асинхронность и параллелизм в .NET
Глава в которой плавают почти все, в том числе и я, рекомендую уделить особое внимание на изучение этого аспекта. Пригодиться не только во время собеса что б сорвать +$500, но и на практике 🧂.
Расскажите что знаете про асинхронность. Для чего нужны и как работают конструкции Async await, какие типы операций лучше выполнять асинхронно?
📚 Ресурсы для изучения:
- Async/await в C#: концепция, внутреннее устройство, полезные приемы
- Использование async и await в C# — лучшие практики
- .NET async/await in a single picture
- ConfigureAwait FAQ
- Когда следует использовать ValueTask<T>?
📌 Must:
- Какие операции лучше выполнять синхронно, а какие асинхронно (CPU bound vs IO bound)
ConfigureAwait(false)
vsConfigureAwait(true)
vs без использованияConfigureAwait
.- Контекст синхронизации
- В каких случаях может пригодиться
ValueTask
? - Что такое
CancellationToken
?
🎓 Should:
- Что такое background и foreground thread в c#.
- По умолчанию таски запускаются в background или foreground mode? Как запустить первый и второй тип таски?
- Во что разворачивается компилятором конструкция
await
? - Task.Run и WaitAll используют тот же пул потоков?
👨🏫 Could:
Task.Factory.StartNew(action, TaskCreationOptions.LongRunning)
как способ запускать долгосрочные задачи.- Зачем нужен класс
AsyncLocal
Расскажите с чем сталкивались и с чем работали в параллельном программировании разрабатывая .NET приложения
📚 Ресурсы для изучения:
📌 Must:
- Почему при CPU Bound лучше не использовать
async-await
, но можно использоватьParallel.For(), Task.Run()
? - Зачем нужен
ThreadPool
? - Понимание механизма каким образом поток берется с тредпула и возвращается туда обратно
- Знать как работает и зачем нужен
Monitor
- Понимать как работает
Semaphore
иSemaphoreSlim
Parallel.Invoke
,Parallel.For
иParallel.ForEach
🎓 Should:
- Понимание зачем нужен класс
Interlocked
и очень желателен опыт работы с ним. - Понимание принципа работы PLINQ и основных его методов
- Опыт работы и понимание как реализованы под капотом Concurrent коллекции в .NET
👨🏫 Could:
AsyncLocal
vsThreadLocal
AsyncLock
- Структура
SpinLock
- Класс
Barrier
- PLINQ
ParallelMergeOptions
- Почему
source.AsParallel().Where().ForAll(...)
будет более предпочтительным, чемParallel.ForEach(source.AsParallel().Where(), ...)
. - MapReduce
Что такое deadlock? Как нужно писать код, чтобы избежать возможные deadlock'и
📌 Must:
Granular Locks (как это реализовано в SQL или ConcurrentDictionary)
🎓 Should:
- Использовать таймауты для lockов, например:
if(Monitor.TryEnter(obj, new TimeSpan(0, 0, 1))
{
try
{
body
}
finally
{
Monitor.Exit(obj);
}
}
Channel
📚 Ресурсы для изучения:
- What's the Difference between Channel and ConcurrentQueue in C#?
- System.Threading.Channels — высокопроизводительный производитель-потребитель и асинхронность без аллокаций и стэк дайва
🎓 Should:
UnboundedChannelOptions
AllowSynchronousContinuations
— Представим, что мы писали в заполненный канал. Соответственно, операция прерывается, поток освобождается, а продолжение будет выполнено по завершению на новом потоке из пула. Но если включить эту опцию, продолжение выполнит тот, кто разблокирует операцию, то есть в нашем случае читатель.SingleReader
— указывает, что будет использоваться один потребитель. Опять же, это позволяет избавиться от некоторой лишней синхронизации;SingleWriter
— то же самое, только для писателя;
BoundedChannelOptions
AllowSynchronousContinuations
— то же что и уUnboundedChannelOptions
SingleReader
— то же что и уUnboundedChannelOptions
SingleWriter
— то же что и уUnboundedChannelOptions
Capacity
— количество вмещаемых в канал записей. Данный параметр также является параметром конструктора;
FullMode
Wait
— ожидает освобождения места для завершения асинхронной операцииDropNewest
— записываемый элемент перезаписывает самый новый из существующих, завершается синхронноDropOldest
— записываемый элемент перезаписывает самый старый из существующих завершается синхронноDropWrite
— записываемый элемент не записывается, завершается синхронно
👨🏫 Could:
- Свойства и методы
ChannelReader
иChannelWriter
- В чем разница между
Channel
иConcurrentQueue
?Channel<T>
не Enumerable- В
Channel
нетуPeak
метода
🤸 Паттерны
"Обожаю" когда начинают спрашивать на собесах все паттерны, какое их к-во и что каждый означает и книжные определения. Мне кажется более правильный подход спросить какие паттерны и в каких случаях девелопер чаще всего использовал на практике, какие задачи решают эти паттерны. Тем не менее давайте обсудим ниже, что необходимо знать из "паттернов" Senior C# разработчику.
📚 Ресурсы для изучения:
- GoF паттерны
- Статьи с шаблонами проектирования
- Статьи про архитектуру ПО
- MV-паттерны для проектирования веб-приложений
- Каталог паттернов для архитектуры корпоративных приложений (PoEAA)
- CQRS и Event Sourcing
- SOLID принципы
- GRASP принципы
- Антипаттерны в программировании и проектировании архитектуры
Расскажите какие принципы и антипаттерны в программировании вы знаете
Принципы и антипаттерны возможно даже важнее паттернов 🤪
📌 Must:
- Senior .NET обязан знать все SOLID принципы
- Don’t Repeat Youself (DRY)
- Keep It Simple, Stupid! (KISS)
- You Ain’t Gonna Need It (YAGNI)
🎓 Should:
- Все GRASP принципы
- Все антипаттерны из статьи приведенной выше
👨🏫 Could:
- Release Equivalence Principle (REP)
- Сommon Closure Principle (CCP)
- Сommon Reuse Principle (CRP)
- Acyclic Dependencies Principle (ADP)
- Stable Dependencies Principle (SDP)
- Stable Abstractions Principle (SAP)
Какие паттерны проектирования вы знаете и использовали на практике?
Да, несмотря на то, что я не люблю спрашивать все паттерны у синьора, он должен их знать, что б на планнинге или при общении с коллегами, мост, прокси или стратегия у него вызывало сразу картинку паттерна в голове и зачем он нужен.
📌 Must:
- Senior обязан знать все GoF паттерны и на какие категории они делятся (порождающие паттерны, структурные паттерны, поведенческие паттерны)
- Зачем нужно использовать паттерны, что это нам дает?
🎓 Should:
- Senior должен уметь объяснить GoF паттерны простыми словами, лучше даже на реальных примерах из жизни.
👨🏫 Could:
Какие архитектурные паттерны вы знаете?
Senior уже очень близок к Solution Architect роли, поэтому важно уже знать и понимать pros и cons архитектурных паттернов.
📌 Must:
- SoA vs Microservices
- MVC
- MVVM
- Client-server pattern
- Broker pattern
🎓 Should:
- Layered pattern
- Event-bus pattern
- Master-slave pattern
👨🏫 Could:
- DDD
- PoEAA паттерны
- Pipe-filter pattern
- CQRS & EventSourcing
- Peer-to-peer pattern
- Interpreter pattern
Какие Deployment паттерны вы знаете?
Необязательный вопрос, по-этому и нет must секции, но я считаю, что senior должен уметь сетапить пайплайны и деплоить код, а следовательно должен знать какие деплоймент паттерны бывают.
🎓 Should:
- Rolling Deployment
- Canary Deployment
- Blue/Green Deployment
👨🏫 Could:
- Multi-region deployment pattern
- Multi-tenant deployment pattern
- Dark Launches и Feature Toggles
🏦 Базы данных
SQL
Куда ж .NET девелопер и без SQL 😊
📚 Ресурсы для изучения:
- Уровени изолированности транзакций
- Нормализация баз данных
- 14 вопросов об индексах в SQL Server, которые вы стеснялись задать
- Offline Concurrency паттерны
Что такое cte в SQL, какие usecases для cte вы знаете?
📌 Must:
- Common Table Expression — общие табличные выражения, их еще называют конструкциями с WITH. Фактически это создание временных таблиц, но существующих только для одного запроса, а не для сессии.
- CTE можно использовать для рекурсивных вызовов
🎓 Should:
- Материализация выражений при использовании CTE (pros, cons)
- В чем разница между View и CTE?
В чем разница между WHERE и HAVING в SQL?
📌 Must:
- WHERE используется движком на момент выборки, а
HAVING
работает уже с сгруппироваными строками. К примеру если нам нужно выбрать юзеров где минимальное значение после группировки 3, нам нужно использоватьHAVING
, Если же нам нужно отсеять юзеров значение колонки которых равно или больше/меньше чего-то, то тут будем использоватьWHERE
Транзакции в SQL
Советую изучить этот вопрос детальнее, очень сильно пригодиться на практике, даже если вы юзаете ORM.
📌 Must:
- Знать такое ACID и CAP.
- Проблемы параллельного доступа с использованием транзакций и уровни изоляции транзакций в SQL Server (
READ UNCOMMITTED
|READ COMMITTED
|REPEATABLE READ
|SNAPSHOT
|SERIALIZABLE
). - В чем разница между Optimistic и pessimistic lock.
🎓 Should:
- Команды:
COMMIT, ROLLBACK, SAVEPOINT, SET TRANSACTION
- EF Core инициализация транзакции (явно/неявно)
👨🏫 Could:
DISTRIBUTED TRANSACTION
vsTRANSACTION
Масштабирование SQL баз данных
Если у вас не возникало проблем с масштабированием на проекте, проверьте его пульс, возможно он мертв ⚰️
📌 Must:
- Шардинг
- Вертикальное масштабирование
🎓 Should:
- Использование подхода разделения БД на Leader & Follower (master-slave)
👨🏫 Could:
- Shard прокси
- Прокси-сервер кластера
Индексы в SQL
Куда ж без индексов, ни один собес не проходит без таких вопросов 🙂
📌 Must:
- Понимать в чем разница кластерного от некластерного индекса
- Некластерные индексы: составной индекс, уникальный индекс и покрывающий индекс
🎓 Should:
- Понимать каким образом индекс облегчает поиск
- Какие минусы индексов
👨🏫 Could:
- Что такое fill factor в индексе, зачем он нужен?
- В чем разница между кластерным индексом и покрывающим при условии что мы добавили все колонки таблицы в него?
Нормализация БД
📌 Must:
- Зачем нужна нормализация БД
- 1-3 нормальные формы БД
- Зачем и когда нужно денормализировать базу?
🎓 Should:
- Нормальная форма Бойса-Кодда
- 4-6 нормальные формы БД
SQL Full-text search
Незаслуженно обделенный вниманием индекс, считаю, что это один из первых индексов которых нужно учить.
📚 Ресурсы для изучения:
🎓 Should:
- Full-text index
CONTAINS/CONTAINSTABLE
FREETEXT/FREETEXTTABLE
👨🏫 Could:
- Понимание как выглядит и где храниться в памяти full-text index
- Full-text batching issues
- Full-text index Master merge issue
- Как использовать Full-text search в Entity Framework Core?
Оконные функции (OVER)
📚 Ресурсы для изучения:
Оконные функции в SQL — что это и зачем они нужны
📌 Must:
- Оконные функции не изменяют выборку, а только добавляют некоторую дополнительную информацию о ней. Можно сказать, что SQL сначала выполняет весь запрос (кроме сортировки и limit), а уже потом считает значения окна. В этом ее отличие от
GROUP BY
, который группирует данные сокращая к-во строк.
🎓 Should:
- PARTITION BY
- ORDER BY
👨🏫 Could:
- ROWS/RANGE
Stored Procedure, Function, Temporary Tables
📌 Must:
- Понимать в чем разница между temporary table и table variable
🎓 Should:
- Понимать в чем разница между stored procedurой и функцией
👨🏫 Could:
- Типы темповых таблиц:
- Table variables (
DECLARE @t TABLE
) видны только тому коннекшину, которое его создает, и удаляются при завершении батча или хранимой процедуры. - Local temporary tables (
CREATE TABLE #t
) видны только тому коннекшину, которое его создает, и удаляются при закрытии коннекшина. - Global temporary tables (
CREATE TABLE ##t
) видны всем и удаляются, когда все соединения, которые на них ссылаются, закрываются. - Tempdb permanent tables (
USE tempdb CREATE TABLE t
) видны всем и удаляются при перезапуске сервера.
Какие типы JOIN'ов вы знаете?
📌 Must:
Table scan, index scan и index seek
📌 Must:
- Table Scan - просмотр всех строк таблицы. Не применяется, если у таблицы есть кластерный индекс
- Clustered Index Scan - просмотр всех строк таблицы (кластерный индекс это и есть таблица, а не копия данных таблицы) Просмотр может быть упорядоченным, т.е. в порядке ключа индекса, либо неупорядоченным - в порядке размещения страниц индекса в БД.
- Index Scan - то же самое, что и Clustered Index Scan, только просматривается некластерный индекс.
- (Clustered) Index Seek - поиск в индексе по ключу. Может быть точечным, т.е. ищется одна строка. А может сканироваться диапазон ключей - так называемый Range Scan.
NoSQL
Какие типы NoSQL баз данных бывают? Какие NoSQL бд вы знаете?
📚 Ресурсы для изучения:
Deep dive into NoSQL: A complete list of NoSQL databases
🎓 Should:
Типы NoSql баз данных:
- Wide Column Stores/Column Family databases:
- Document Store
- Key Value / Tuple Store
- Graph Databases
- Multimodel Databases
- Object Databases
- Grid & Cloud Database
- XML Databases
- Multidimensional Databases
- Multivalue Databases
👨🏫 Could:
- Wide Column Stores/Column Family databases:
- Hadoop / HBase
- Cassandra
- Amazon SimpleDB
- Document Store
- MongoDB
- Elastic Search
- RavenDB
- Key Value / Tuple Store
- Amazon DynamoDB
- Azure Table storage
- Redis
- Aerospike
- Oracle NoSQL Database
- Graph Databases
- Neo4J
- Infinite Graph
- Dgraph
- Apache Giraph
- Trinity
- BrightstarDB
- Multimodel Databases
- ArangoDB
- OrientDB
- Object Databases
- Versant
- db4o
- Objectivity
- HSS Database
- Grid & Cloud Databases
- Oracle Coherence
- GridGain
- GemFire
- XML Databases
- eXist
- BaseX
- Sedna
- Multidimensional Databases
- globalsdb
- Intersystems Cache
- MiniM DB
- DaggerDB
- Multivalue Databases
- U2
- TigerLogic PICK
- Reality
Назовите преимущества и недостатки NoSQL
📌 Must:
- Отсутствие схемы. При проектировании SQL базы, мы определяем архитектуру хранилища, это позволит посмотреть на систему с высоты птичьего полета, в NoSQL нету четких схем, а значит никто не гарантирует, что каждый разработчик не будет менять "архитектуру хранилища" как ему вздумается.
- Возможность хранения больших объемов неструктурированной информации.
- Лучшее масштабирование по сравнению с SQL БД (поддержка peer-to-peer, master-slave, shards)
🎓 Should:
- Многие NoSQL решения имеют ограниченную функциональность, т.к решают определенные задачи. Поэтому для работы с такими базами данных не требуется глубоких знаний SQL-запросов. Это сильно снижает входной порог для начала работы с NoSQL хранилищами.
- Более простые технологии запросов в NoSQL позволяют совершать меньше ошибок.
- Слабая поддержка транзакций на уровне БД (MongoDB к примеру с 4.0 уже поддерживает транзакции)
👨🏫 Could:
- Как один из недостатков: привязка к конкретной NoSQL базе, при использовании SQL, можно менее болезненно перейти на другую SQL базу, а в NoSQL это будет сделать намного труднее (если вы не используете ORM который строит все запросы за вас и поддерживает несколько NoSQL баз.
- Транзакции в NoSQL, как поддерживать целостность бд и что такое eventual consistency?
- Скорость записи и чтения в NoSQL по сравнению с SQL БД.
Какие типы индексов в MongoDB вы знаете?
📚 Ресурсы для изучения:
https://docs.mongodb.com/manual/indexes/
📌 Must:
- Single Field Indexes
- Multikey Index — это индекс, который создается для поля массива и используется для индексации содержимого, хранящегося в массиве.
- Text Index
- Wildcard Index
🎓 Should:
- Hashed Indexes
- Свойства индекса: TTL индекс, уникальный индекс, partial индекс,
👨🏫 Could:
- Геопространственный индекс ( 2dsphere Indexes, 2d Indexes)
- Hidden Indexes
- Sparse Indexes
Транзакции в MongoDB
📚 Ресурсы для изучения:
- https://docs.mongodb.com/manual/core/transactions/
🎓 Should:
- Transactions and Read Concern:
local, majority, snapshot
- Transactions and Write Concern:
w: 1
,w: "majority"
Из чего состоит ObjectID в MongoDB?
Пример того как выглядеть ObjectID: 507f1f77bcf86cd799439011
👨🏫 Could:
- 4-байтовое значение timestamp
- 5-байтовое случайное значение
- 3-байтовый incrementing counter, инициализированный случайным значением
Что такое GridFS в Mongo?
👨🏫 Could:
Для хранения и получения файлов которые более 16 MB, таких как изображения, видеофайлы и аудиофайлы, используется GridFS. По умолчанию он использует две коллекции fs.files
и fs.chunks.
🎨 ORM
Кто ты без ORM? А с ORM ты senior, знаток SQL, индексов, наследования в базах данных и построения сложных запросов (irony).
Что такое ORM?
📌 Must:
- Object-relational mapping (ORM) - это технология, позволяющая запрашивать и обрабатывать данные из базы данных с использованием объектно-ориентированной парадигмы.
🎓 Should:
- Использование ORM решает проблему парадигмы «несоответствия», которая гласит о том, что объектные и реляционные модели не очень хорошо работают вместе. Реляционные базы представляют данные в табличном формате, в то время как объектно-ориентированные языки представляют их как связанный граф объектов.
В чем преимущества ORM?
📌 Must:
- Работа с СУБД в объектно-ориентированном стиле.
- DRY: Через ORM модель проще обновлять, поддерживать и повторно использовать.
- Многий функционал доступен с "коробки", в отличие от написания запросов собственноручно.
🎓 Should:
- В большинстве случаев вам не нужно писать SQL запросы.
- ORM очень хорошо подходит для ООП языков.
В чем недостатки ORM и когда ее лучше не использовать?
📌 Must:
- Сложнее трейсить ошибки и сами sql запросы, чем прямой вызов процедур.
- Потенциально ORM может не оптимально формировать SQL запросы, что будет влиять на производительность запросов.
🎓 Should:
- ORM зачастую работает медленее, чем SQL Stored Procedures или даже прямые запросы в базу.
- Порог входа может быть выше, если на проекте используется не популярная ORM.
- Когдау вас нет никаких связей 1-to-1, 1-to-many или many-to-many, нет особо смысла использовать ORM.
- Если ваша база данных будет иметь хранимые процедуры в качестве интерфейса, нет особого смысла использовать ORM.
В чем разница между IQueryable и IEnumerable при работе с Entity Framework?
📚 Ресурсы для изучения:
📌 Must:
Основное отличие между этими интерфейсами в том, что IEnumerable
работает со всем массивом данных, а IQueryable
с отфильтрованным. IEnumerable
получает все данные на стороне сервера и загружает их в память а затем позволяет сделать фильтрацию по данным из памяти. Когда делается запрос к базе данных, IQueryable
выполняет запрос на серверной стороне и в запросе применяет фильтрацию.
🎓 Should:
IEnumerable
хорошо подходит для работы с данными в памяти (списки, массивы).IQueryable
лучше работает с запросами к базе данных.IQueryable
поддерживает произвольные запросы (используя CreateQuery и метод Execute).IEnumerable
не поддерживает произвольные запросы.
👨🏫 Could:
IQueryable
поддерживает отложенное выполнение (Lazy Evaluation).- Extension methods, работающие с
IQueryable
принимают объекты выражения (expression tree). - Extension methods, работающие с
IEnumerable
принимают функциональные объекты.
В чем разница между Eager loading и Lazy Loading в EF?
📌 Must:
- Eager loading позволяет указать в запросе какие связанные данные нужно загрузить при выполнении запроса. EF будет транслировать
Include()
вJOIN
, таким образом будет выполнен всего 1 запрос к БД. - Lazy loading предполагает неявную автоматическую загрузку связанных данных при обращении к навигационному свойству.
- Lazy Loading может сильно притормаживать при определенных условиях. Так же вызывать n+1 проблему при попытке выполнения дополнительных запросов.
Какие компоненты архитектуры Entity Framework вы знаете?
📚 Ресурсы для изучения:
📌 Must:
- Entity Data Model
- LINQ to Entities
- Entity SQL
- Object Service
- Entity Client data provider
- ADO.Net Data Provider
Из чего состоит Entity Data Model (EDM)?
Не могу сказать что это must-have вопрос, но если вы зададите и человек ответит, значит глубоко изучал вопрос )
👨🏫 Could:
- Conceptual Model
- Mapping
- Storage Model
Какие 3 подхода для организации взаимодействия Entity Framework с базой данных существуют?
📌 Must:
- Code-First
- Model-First
- Database-First
Какие Entity States поддерживаются в Entity Framework?
🎓 Should:
- Added
- Deleted
- Modified
- UnChanged
- Detached
Что такое миграция и как ее выполнить в Entity Framework?
📌 Must:
- Миграция позволяет вносить изменения в базу данных при изменениях моделей и контекста данных. Она автоматически обновляет схему базы данных при изменении вашей модели без потери существующих данных или других объектов базы данных.
- Есть два вида миграции: автоматическая миграция, и миграция на основе кода.
Как можно хэндлить проблемы с параллелизмом в Entity Framework?
👨🏫 Could:
- Это можно с помощью включения оптимистической блокировки с помощью следующего кода:
modelBuilder.Entity<Author>()
.Property(a => a.RowVersion)
.IsConcurrencyToken()
.ValueGeneratedOnAddOrUpdate();
Какие существуют типы наследования в Entity Framework?
📚 Ресурсы для изучения: Наследование в EF
🎓 Should:
- Наследование в Entity Framework аналогично наследованию классов в C #. В Entity Framework вы можете смапить иерархию наследования с одной или несколькими таблицами базы данных в зависимости от ваших задач.
- EF поддерживает три типа наследования:
- Table-per-Hierarchy (TPH)
- Table-per-Type (TPT)
- Table-per-Concrete-Type (TPC) (не поддерживается в EF Core)
EF Core поддерживает транзакции?
📚 Ресурсы для изучения: Транзакции
📌 Must:
- Каждый раз, когда вы вызываете
SaveChanges()
для вставки, обновления или удаления данных в базе данных, эта операция оборачивается в транзакцию. Таким образом, вам не нужно явно открывать транзакции.
🎓 Should:
- Так же вы можете обернуть блок кода в транзакцию с помощью конструкции
using var transaction = context.Database.BeginTransaction();
Для того чтобы закоммитить транзакцию, потом нужно выполнитьtransaction.Commit();
- Как выполнить транзакцию для нескольких контекстов
👨🏫 Could:
- Что такое Savepoints и как их использовать в EF Core?
- Что такое external DbTransactions?
💬 Messaging
Что такое AMQP?
📚 Ресурсы для изучения: AMQP
🎓 Should:
- Знать в чем отличия Queue от Topic
- Что такое Exchanges в протоколе AMQP
👨🏫 Could:
- Типы Exchanges (Direct, Fanout, Topic, Headers, System) и зачем они нужны?
- Жизненный цикл (соеденения, подписки, очереди, Exchanges)
Что такое Azure Service Bus, в чем разница между Service Bus и обычной Queue?
📌 Must:
- Service Bus это шина сообщений.
- Service Bus поддерживает: очереди (Queue), разделы (topic) и очередь недоставленных сообщений (Dead-letter queue). В отличие от обычной очереди, которая не содержит этого
🎓 Should:
- В чем разница между
ReceiveAndDelete
иPeekLock
.
В чем отличие Kafka от Service Bus или другого брокера сообщений?
Не смотря на то, что кафку юзают как систему для обмена сообщениями, у нее нет концепции очередей, ее называют commit log.
📌 Must:
- Kafka – Это распределенный журнал фиксации изменений, по скольку там развертывается кластер узлов, как для устойчивости к ошибкам, так и для масштабирования.
- Реплицированный, поскольку сообщения обычно реплицируются на нескольких узлах (серверах).
- Журнал фиксации изменений, потому что сообщения хранятся в сегментированных, append-only log'ах, которые называются разделами (topic). Эта концепция является уникальной особенностью кафки.
🎓 Should:
- Каждая партиция в кафке предоставляет собой файл. Который гарантирует очередность сообщений в рамках одной партиции.
👨🏫 Could:
- Какие задачи позволит решить Kafka? как бы вы выбирали что использовать, кафку или Service Bus?
- Как отправлять большие сообщения с помощью Kafka?
🎛️ Микросервисы
Какие способы коммуникации между микросервисами вы знаете?
📌 Must:
- HTTP call
- Message Broker (AMQP)
🎓 Should:
- SignalR (Web sockets)
- gRPC
👨🏫 Could:
- MQTT — Message Queue Telemetry Transport
- STOMP — Simple Text-Oriented Messaging Protocol
- Service Mesh
Как реализовать атомарность транзакции между несколькими микросервисами?
📚 Ресурсы для изучения:
- Saga pattern
- Шпаргалка по миграции монолита на микросервисы
- Шаблоны проектирования Cloud-based и микросервисных приложений
📌 Must:
- Saga pattern + eventual consistency
- MassTransit + Saga
🎓 Should:
- Correlation id + обеспечение атомарности с помощью меседж брокера. По сути разновидность самописной саги.
Какие паттерны для микросервисов вы знаете?
📌 Must:
- Circuit Breaker
- Saga pattern
- Sidecar
- Database per Service
🎓 Should:
- CQRS & EventSourcing
- DDD
- Shared Database per Service
- Proxy паттерн
- Chain of Responsibility
👨🏫 Could:
- Strangler Pattern
- Bulkhead Pattern
- API Gateway
- Branch Pattern (Микс от Aggregator и Chain паттернов)
- External Configuration
- Service Discovery Pattern
Как обеспечить security микросервисов?
📚 Ресурсы для изучения:
- Secure .NET microservices web applications
- Microservices Security- How To Secure Your Microservice Infrastructure?
🎓 Should:
- API Gateways
- Service discovery и ограничение доступа к сервисам
- OAuth
Какие способы хостинга микросервисов вы знаете?
🎓 Should:
👨🏫 Could:
- Docker swarm
- Rancher
- Azure Service Fabric
🧪 Тестирование
Какие Test Frameworks вы знаете и использовали на практике?
📌 Must:
- MSTest
- NUnit
- xUnit
Какие вспомогательные библиотеки вы знаете и использовали для написания тестов?
📚 Ресурсы для изучения:
📌 Must:
- FluentAssertions
- Moq
- NSubstitute
🎓 Should:
- BDDfy
- Selenium / Atata
- WebApplicationFactory
- TestServer
👨🏫 Could:
В чем разница между Integration и Unit тестами?
📌 Must:
- При интеграционных тестах мы используем реальные модули системы (БД, сервис и тд), а не "моканую" версию.
🎓 Should:
- Интеграционный тест показывает какой конкретно функционал не работает (регистрация, покупка товара и тд), но при этом не покажет конкретное место модуля где проблема. С этим поможет юнит тест, по-этому важно иметь хорошее покрытие юнит тестами, но в случае когда система большая, а тестами покрывать все нет времени, интеграционные тесты могут быть выходом, пока все не будет покрыто unit тестами.
В чем разница между Dummy, Fake, Stubs, Spies, Mocks объектами?
📌 Must:
- Dummy — это объекты, которые передаются в методы, но на самом деле не используются. В основном, это параметры методов (если конечно, они не влияют в тесте на то, что мы хотим проверить). Иногда это просто NULL
- Fake — объекты, которые имеют внутреннюю реализацию, но обычно она сильно урезанная и их нельзя использовать в продакшине. Memory database хороший пример Fake объекта.
- Stubs — предоставляют стандартные ответы на вызовы, сделанные во время теста, обычно не отвечая ни на что, кроме того, что запрограммировано для теста.
- Spies — это Stubs, которые также записывают некоторую информацию в зависимости от того, как они были вызваны. Одной из форм этого может быть сервис электронной почты, который записывает, сколько сообщений было отправлено.
- Mocks — объекты, заранее запрограммированные с ожиданиями, которые формируют спецификацию вызовов, которые они ожидают получить. Проверки соответствия ожиданиям проводятся через вызовы к Mock-объекту.
🖧 Сетевое взаимодействие и протоколы
TCP/IP
📚 Ресурсы для изучения:Основы TCP/IP для будущих дилетантов
👨🏫 Could:
- Достаточно почитать статью из ресурсов для изучения и на базовом уровне понимать как работает TCP/IP
HTTP
📚 Ресурсы для изучения:
📌 Must:
- Структура HTTP-сообщения
- Список классов кодов состояния HTTP. Для чего каждый из классов используется (1хх, 2хх, 3xx, 4xx, 5xx)
- Методы
GET, POST, PUT, DELETE, OPTIONS
🎓 Should:
- Методы:
HEAD, PATH
- Если HTTP не имеет состояния, как способы есть для обмена сообщениями, с помощью которых сервер сможет идентифицировать юзера? (Token, Cookies)
👨🏫 Could:
- Методы:
CONNECT, TRACE
WebSockets
Каковы особенности веб-сокетов?
🎓 Should:
- Веб-сокет обеспечивает two-way communication через одно TCP-соединение.
- С помощью него возможна Read-Time коммуникация между веб серверами и клиентами
Какие основные Web Socket API events?
📌 Must:
- Open
- Close
- Error
- Message
Что такое Short polling и Long polling?
👨🏫 Could:
- Short polling - это техника, когда клиент проверяет сервер повторно, например, каждые 500 мс.
- Long polling - сервер получает запрос, но не отвечает на него, пока не получит новые данные из другого запроса. Как это работает?
- Запрос отправляется на сервер.
- Сервер не закрывает соединение, пока у него не возникнет сообщение для ответа.
- Когда появляется сообщение – сервер отвечает на запрос, отправляя ответ.
- Браузер немедленно делает новый запрос.
Что такое HATEOAS, в чем его основная идея?
🎓 Should:
- REST-клиент обращается к фиксированному URL получая список возможных экшинов над ресурсами.
- HATEOAS позволяет развиваться независимо клиенту и серверу. Клиенту не нужно знать заранее типы ресурсов и механизмы взаимодействия с ним, через сервер.
Что такое CORS?
📚 Ресурс для изучения: CORS
📌 Must:
- Cross-Origin Resource Sharing (CORS) — механизм, использующий дополнительные HTTP-заголовки, чтобы дать возможность агенту пользователя получать разрешения на доступ к выбранным ресурсам с сервера на источнике (домене), отличном от того, что сайт использует в данный момент.
- Для инициации Cross-origin запроса браузер клиента добавляет в HTTP запрос Origin (домен сайта, с которого происходит запрос). Например, страница http://www.a.com/page.html пытается получить данные со страницы http://www.b.com/cors.txt.
🎓 Should:
- За проверку CORS заголовков отвечает браузер. Именно он отклоняет запрос, если он не прошел CORS политики.
- Политики проверяются с помощью
OPTIONS
запроса.
HTTP cache
📚 Ресурсы для изучения:
Какие типы HTTP кэшей вы знаете?
📌 Must:
- Private cache
- Public cache
- Shared cache
Что такое ETag?
🎓 Should:
- ETag является идентификатором, значение которого прямо зависит от состояния загружаемого клиентом ресурса.
- Сервер може использовать ETag как идентификатор кэша для понимания нужно ли отдавать новые данные на клиент или можно вернуть 304 код.
Как использовать HTTP-based кэш для Action в ASP.NET Core?
📌 Must:
- С помощью ResponseCacheAttribute
🎓 Should:
- Так же можно использовать Response Caching Middleware
Load Balancer
📚 Ресурсы для изучения:
- Балансировка нагрузки: основные алгоритмы и методы
- Как работают балансировщики нагрузки на примере AWS
- Введение в современную балансировку сетевой нагрузки и проксирование
Что такое Load Balancer?
📌 Must:
- Балансировщик нагрузки принимает входящий сетевой трафик от клиента. Основываясь на некоторых критериях этого трафика, отправляет эти сообщения на один из нескольких бэкенд-серверов
🎓 Should:
- Балансировщик нагрузки может работать на 3х уровнях OSI: прикладной, транспортный, сетевой.
Какие алгоритмы распределения нагрузки вы знаете?
🎓 Should:
- Round Robin
- Least Connections
- Sticky Sessions
- Client-side random load balancing
👨🏫 Could:
- Weighted Round Robin
- Weighted Response Time
- Улучшенные варианты Least Connections (Locality-Based Least Connection Scheduling и Locality-Based Least Connection Scheduling с Replication Scheduling)
- Destination Hash Scheduling и Source Hash Scheduling
- Fixed Weighting
В чем разница между Load Balancer L4 и L7?
📌 Must:
Балансировщики 4 уровня общаются на транспортном уровне OSI. А 7го соответственно на прикладном уровне OSI
🎓 Should:
Layer 4 Load Balancing
- Плюсы:
- Идеально подходит для простой балансировки нагрузки на уровне пакетов.
- Поскольку он не учитывает данные, он работает быстро и эффективно.
- Более безопасный, потому что пакеты не читаются. В случае взлома данные никто не увидит.
- Использует NAT
- Поддерживает только одно соединение между клиентом и сервером с NAT, поэтому ваш балансировщик нагрузки может обслуживать максимальное количество TCP-подключений.
- Минусы:
- Не поддерживает балансировку нагрузки на основе содержимого
- Должен быть sticky. Как только соединение установлено, оно переходит к одному бекенд серверу. Все пакеты, поступающие в это соединение, отправляются на один сервер. Следующее соединение затем выберет другой сервер на основе алгоритма.
Layer 7 Load Balancer
- Плюсы:
- Предлагает интеллектуальную маршрутизацию на основе URL-адреса
- Обеспечивает кеширование
- Физический протокол HTTP (HTTP/1 или HTTP/2).
- Логический HTTP-протокол (headers, body data, и trailers).
- Протокол обмена сообщениями (gRPC, REST, и т.д.).
- Минусы:
- Более дорогой
- Требуется расшифровка трафика
- Что касается безопасности, вы должны поделиться своим сертификатом с балансировщиками нагрузки. Если злоумышленник получает доступ к балансировщику нагрузки, он автоматически получает доступ ко всем вашим данным.
- Его прокси-сервер создает несколько соединений - клиент-прокси / прокси-сервер - поэтому вы ограничены максимальным TCP-соединением на вашем балансировщике нагрузки.
REST
📚 Ресурсы для изучения:
Какие требование к RESTful сервису?
📌 Must:
- Client-server architecture
- Отсутствие состояния (stateless)
- Кэширование
- Uniform interface
- Layered system
🎓 Should:
- Richardson Maturity Model
👨🏫 Could:
- Так же занимательно, как возник термин REST, один из создателей http Рой Филдинг описал его в своей диссертации.
Какие HTTP методы используются в REST?
📌 Must:
- GET: запрашивает ресурс по URL-адресу запроса. Может быть закэширован локально или на сервере.
- POST: используется для создания ресурса
- PUT: обновляет по URL ресурса
- DELETE: удаляет ресурс по URL ресурса
- OPTIONS: указывает, какие методы поддерживаются.
- HEAD: возвращает метаинформацию по request URL.
Какие реализации RPC протокола вы знаете?
👨🏫 Could:
- gRPC
- JSON-RPC
OAuth2
Что такое OAuth?
📌 Must:
OAuth (Open Authorization) – это открытый стандарт аутентификации и авторизации на основе токенов. OAuth позволяет third-party сервисам таким как Facebook, использовать информацию учетной записи конечного пользователя, не раскрывая пароль пользователя.
Что такое JWT token?
JSON Web Token, bearer token, access token как его только не называют 😉
📌 Must:
- JWT-токен состоит из трех частей: Header, Payload, Signature. Они разделяются точкой.
🎓 Should:
- Header - объект JSON, который содержит информацию о типе токена и алгоритме его шифрования
- Payload - объект JSON, который содержит данные, нужные для авторизации пользователя
- Signature - строка, которая создается с помощью secret'а, Header'a и Payload'a. Эта строка служит для верификации токена
Как инвалидировать JWT токен в ASP.NET?
На самом деле волшебного метода нет, так как сам алгоритм построен с коробки на принципах stateless, следовательно никак проверить и сделать этого нельзя, но конечно есть хаки, о которых и поговорим ниже 😉
📌 Must:
- Если нас взломали или нам срочно нужно сделать невалидными токены юзеров мы можем поменять secret который валидирует токены, это гарантирует, что старые токены перестанут работать у всех юзеров
- Refresh token + короткое время жизни токена. Этот способ также позволит управлять этим процессом и добавить доп проверку на этапе рефреш токена, для определенных юзеров.
🎓 Should:
- Более топорный способ это повесить глобальный фильтр который будет проверять специфических юзеров за критерием и отсеивать их.
Веб серверы
📚 Ресурсы для изучения:
Какие веб серверы поддерживает ASP.NET Core по умолчанию?
📌 Must:
- Kestrel server
- HTTP.sys
- IIS
Kestrel vs. HTTP.sys
🎓 Should:
Kestrel имеет следующие преимущества перед HTTP.sys:
- Лучшая производительность и использование памяти.
- Кроссплатформенность.
- Гибкость, он разработан и исправлен независимо от ОС.
- Программный порт и настройка TLS
- Расширяемость, позволяющая использовать такие протоколы, как PPv2, и альтернативные транспорты.
Http.Sys работает как shared kernel mode со следующими функциями, которых у Kestrel нет:
- Port sharing
- Kernel mode windows authentication. Kestrel поддерживает только аутентификацию в пользовательском режиме.
- Быстрое проксирование через передачу очереди
- Прямая передача файлов
- Response caching
🌐 ASP.NET Core
Так и вижу вашу реакцию: ну наконец-то под конец статьи поговорим про C# вопросы на собеседовании 😀
Что такое middleware в ASP.NET Core?
📌 Must:
В ASP.NET Core middleware – это классы C#, которые могут обрабатывать HTTP-request'ы и respons'ы. middleware умеет:
- Захэндлить входящий HTTP-запрос путем создания HTTP-ответа.
- Обработать HTTP-запрос, изменить его и передать другой middleware на обработку.
- Обработать исходящий HTTP-ответ, изменить его и передать либо другому middleware, либо веб-серверу ASP.NET Core.
🎓 Should:
middleware можно разделить на такие типы:
- Content-Generating Middleware - Для отправки ответа прямо внутри middleware. Такие middleware никогда не переходят к следующей по цепочке.
- Short-Circuiting Middleware – так называют middleware, которые не всегда переходит к следующей Middleware, а по какому-то условию возвращают ответ прямо внутри себя.
- Request-Editing Middleware – так называют middleware, в которых нам нужно отредактировать запрос.
- Response-Editing Middleware – так называют middleware, в которых нам нужно отредактировать ответ.
В чем разница между app.Use и app.Run при добавлении middleware?
📌 Must:
app.Use
позволяет вызывать следующую middleware в pipelineapp.Run
не вызывает следующую по списку middleware
🎓 Should:
app.Run
также не принимает на вход параметрnext
Что такое SignalR, как он работает?
📚 Ресурсы для изучения:
📌 Must:
- SignalR - это абстракция над соединением. Это дает вам две модели программирования через это соединение (хабы и persistent коннекшины)
🎓 Should:
SignalR имеет несколько встроенных "транспортов":
- WebSockets
- Server Sent Events
- Forever Frame
- Long polling
👨🏫 Could:
- WebSocket - единственный транспорт, который устанавливает настоящее двустороннее persistent соединение между клиентом и сервером. Однако WebSocket поддерживается только IIS 8 или выше, а также современными версиями Internet Explorer, Google Chrome и Mozilla Firefox.
- В то время как Server Sent Events, Forever Frame и Long polling, все три работают по one-way коннекшину и поддерживаются большинством браузеров.
Что такое Attribute routing в ASP.NET Core?
📌 Must:
Attribute routes применяются к контроллерам и action'ами напрямую, а не указываются глобально.Пример маршрутизации атрибутов:
[Route("Accounts/{id}")]
public ActionResult GetAccount(int id) { … }
В чем разница между ConfigureServices и Configure в ASP.NET Core?
📌 Must:
- ConfigureServices – мы используем тогда, когда нам нужно добавить сервисы и использовать их через интегрированный DI, как пример мы можем добавить EntityFramework в ConfigureServices и юзать его в дальнейшем инджектя через конструктор.
- Configure – мы используем для настройки middleware. По сути мы управляем HTTP реквест пайплайном внутри configure метода.
Что такое wwwoot?
📌 Must:
- В ASP.NET Core все статические ресурсы, такие как CSS, JavaScript, изображения хранятся в папке wwwroot
🎓 Should:
- Имя этой папки можно изменить с помощью UseWebRoot, к примеру:
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseWebRoot("CustomFolderName")
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<MyStartup>()
.Build();
host.Run();
}
В чем разница между services.AddTransient, service.AddScoped и service.AddSingleton в встроеном DI ASP.NET Core?
📌 Must:
- Transient: при каждом обращении к сервису создается новый объект сервиса. Т.е если в рамках одного реквеста у вас будет несколько обращений к сервису, он будет создан несколько раз
- Scoped: для каждого запроса создается свой объект сервиса. То есть если в течение одного запроса есть несколько обращений к одному сервису, то при всех этих обращениях будет использоваться один и тот же объект сервиса.
- Singleton: объект сервиса создается при первом обращении к нему, все последующие запросы используют один и тот же ранее созданный объект сервиса
🎓 Should:
- Dependency injection антипаттерны:
- Control Freak
- Bastard Injection
- Constrained Construction
- Service Locator
Как написать интеграционный тест в ASP.NET Core?
📚 Ресурс для изучения: Интеграционные тесты в ASP.NET Core
📌 Must:
Для этого подойдет класс TestServer
. Подробнее как написать такие тесты можно почитать в статье выше.
Какие типы фильтров существуют в ASP.NET Core?
📚 Ресурс для изучения: Фильтры в ASP.NET Core
📌 Must:
- Фильтры авторизации: Применяются в первую очередь и служат для определения того, авторизован ли пользователь для выполнения запроса. Эти фильтры могут сократить выполнение конвейера, если запрос не авторизован.
- Фильтры ресурсов: выполняются после фильтров авторизации. Его метод
OnResourceExecuting()
выполняется до всех остальных фильтров и до привязки модели, а его методOnResourceExecuted()
выполняется после всех остальных фильтров - Фильтры действий: применяется только к действиям контроллера, запускается после фильтра ресурсов как до, так и после выполнения метода контроллера
- Фильтры RazorPages: применяется только к страницам RazorPages, выполняются перед и после обработки запроса страницей Razor Page
- Фильтры исключений: определяют действия в отношении необработанных исключений
- Фильтры результатов действий: фильтр применяется к результатам методов контроллера и страниц Razor Pages, выполняется как до, так и после получения результата
Cloud платформы
🎓 Should:
- Опыт работы с одним из клаудов:
- Azure
- AWS
- Google Cloud
- Понимание в чем разница между:
- Software as a Service (SaaS)
- Platform as a Service (PaaS)
- Infrastructure as a Service (IaaS)
👨🏫 Could:
- Terraform
- CloudFormation
GIT
📚 Ресурсы для изучения:
Какие Branching стратегии вы знаете и использовали на практике?
📌 Must:
- Git Flow (Feature Based Development)
- GitHub Flow
- GitLab Flow
- Trunk Based Development (TBD)
Git команды
🎓 Should:
- Разница между
git fetch
иgit pull
- Fast-forward (
--ff
) vs No-fast-foward (--no-ff
) git merge
vsgit rebase
- команда
cherry-pick
🛶 Continuous Integration & Continuous delivery & Continuous deployment
В чем разница между Continuously Integration, Continuous delivery и Continuous deployment
📚 Ресурсы для изучения:
Continuous integration vs. continuous delivery vs. continuous deployment
📌 Must:
Continuous integration
- Разработчики, практикующие непрерывную интеграцию, как можно чаще мержат свои изменения с основной веткой. Изменения, внесенные разработчиком, проверяются путем создания сборки и выполнения автоматических тестов для сборки. Таким образом вы избегаете проблем с интеграцией, которые могут возникнуть в ожидании дня релиза.
- При непрерывной интеграции большое внимание уделяется автоматизации тестирования, чтобы убедиться, что приложение не сломано, когда новые коммиты мержатся в основную ветку.
Continuous delivery
- Continuous delivery — это расширение Continuous integration, поскольку она автоматически развертывает все изменения кода в тестовой и / или продашкн env'е после этапа билда.
- Это означает, что помимо автоматического тестирования у вас есть автоматизированный релиз, и вы можете релизить приложение в любое время, нажав кнопку.
Continuous deployment
- Continuous deployment еще один этап эволюции после Continuous delivery. Благодаря этой практике каждое изменение, которое проходит все этапы вашего production pipeline, релизится вашим клиентам. Вмешательство кого либо из членов команды отсутствует, и только неудачный тест предотвратит внедрение нового изменения на продакшн.
- Непрерывное развертывание - отличный способ ускорить цикл обратной связи с вашими клиентами и снять давление с команды, поскольку больше нет даты релизов. Разработчики могут сосредоточиться на девелопменте, и они видят, как их работа релизится в "лайв" через несколько минут после завершения работы над ней.
Опыт с одним из CI серверов:
👨🏫 Could:
Каковы факторы успешно построенного continuous integration на проекте?
🎓 Should:
- Maintain репозитория
- Автоматизация билда
- Self-testing сборки
- Everyone commits to the baseline every day
- Каждый commit в мастер должен быть сбилжен
- Билды должны быть быстрыми
- Тестирование на копии продакшн среды
- Все могут увидеть результаты последнего билда
- Автоматизированный деплой
PS: Если вы дочитали до конца, то вы уже крутые! Если вы увидели какие-то неточности или ошибки, пишите в комментариях.