Вопросы на собеседовании для Senior C# / .NET Developer


Здравствуйте, я пишу на С# с 2012 года. Я как проходил, так и проводил множество собеседований. В этой статье я собрал полный список вопросов и тем которые я задавал и мне задавали на собеседовании. В этой статье будет собрано все то, что должен знать хороший Senior C# / .NET разработчик с уклоном к web разработке и современному стеку с ASP.NET Core. Хочу сразу сказать, что если вы интервьюер и собираете список вопросов для собеседования в вашу компанию, не берите этот список за чистую монету, тк кандидаты скорее всего тоже будут мониторить данный список и будут его использовать как базу для подготовки. Следовательно если вы готовитесь к собеседованиям как кандидат, используйте эту статью как подготовительную базу и обзор разных топиков которые нужно подтянуть перед собеседованием.

@csharp_ci – еще больше материалов для разработчиков в нашем телеграм канале.

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

  1. Вопросы на собеседовании по C#
  2. RoadMap для .NET Core разработчиков
  3. Как правильно проходить технические интервью
  4. Антипаттерны в программировании и проектировании архитектуры
  5. Чеклист для разработчиков по подготовке к техническому собеседованию

Все ответы на вопросы я поделю на 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 разработчиков “новой закалки” читают и разбираются в подобной теории🥺. Как по мне это очень важный вопрос и рекомендую вам его изучить.

📚​ Ресурсы для изучения:

  1. Куда ж без статьи на msdn
  2. Хорошая статья где понятным языком описывают принцип работы и поколения в GC – https://habr.com/ru/company/clrium/blog/464169/
  3. Еще одна статья заслуживающая вашего внимания – https://habr.com/ru/company/clrium/blog/463293/
  4. Оптимизация сборки мусора в высоконагруженном .NET сервисе 
  5. Принципы работы Garbage collection

📌 Must:

  • Фазы сборки мусора:
  1. Маркировка (mark phase).
  2. Чистка (sweep phase).
  3. Сжатие (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:

  • Сравнение с помощью вспомогательных классов и интерфейсов (IEqualityComparerIStructuralEquatableIComparable)

👨‍🏫 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; vs throw;

🎓 Should:

  • Избегать throw`инг эксепшина где это возможно.
  • throw’айте эксепшн вместо возврата кода ошибки

👨‍🏫 Could:

  • Используйте .NET предопределенные типы эксепшинов
  • При создании своего кастомного эксепшина, называйте класс NameException

Типы данных, коллекции и структуры данных в .NET

data types

📚​ Ресурсы для изучения:

  1. Dictionary в .NET
  2. Как правильно выбрать коллекцию в .NET
  3. Сравнение коллекций в .NET
  4. О большое: что это такое, почему это важно, и почему это не важно
  5. Исходный код 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

Расскажите что знаете про асинхронность. Для чего нужны и как работают конструкции Async await, какие типы операций лучше выполнять асинхронно?

📚​ Ресурсы для изучения:

  1. Async/await в C#: концепция, внутреннее устройство, полезные приемы
  2. Использование async и await в C# — лучшие практики
  3. .NET async/await in a single picture
  4. ConfigureAwait FAQ
  5. Когда следует использовать ValueTask<T>?

📌 Must:

  • Какие операции лучше выполнять синхронно, а какие асинхронно (CPU bound vs IO bound)
  • ConfigureAwait(false) vs ConfigureAwait(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.InvokeParallel.For и Parallel.ForEach

🎓 Should:

  • Понимание зачем нужен класс Interlocked и очень желателен опыт работы с ним.
  • Понимание принципа работы PLINQ и основных его методов
  • Опыт работы и понимание как реализованы под капотом Concurrent коллекции в .NET

👨‍🏫 Could:

  • AsyncLocal vs ThreadLocal
  • 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 

📚​ Ресурсы для изучения:

🎓 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# разработчику.

📚​ Ресурсы для изучения:

Расскажите какие принципы и антипаттерны в программировании вы знаете

Принципы и антипаттерны возможно даже важнее паттернов 🤪

📌 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 server, no sql databases

SQL

Куда ж .NET девелопер и без SQL 😊

📚​ Ресурсы для изучения:

  1. Уровени изолированности транзакций
  2. Нормализация баз данных
  3. 14 вопросов об индексах в SQL Server, которые вы стеснялись задать
  4. 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 vs TRANSACTION

Масштабирование 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

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

📚​ Ресурсы для изучения:

  1. Компонент 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:

  •  Типы темповых таблиц:
  1. Table variables (DECLARE @t TABLE) видны только тому коннекшину, которое его создает, и удаляются при завершении батча или хранимой процедуры.
  2. Local temporary tables (CREATE TABLE #t)  видны только тому коннекшину, которое его создает, и удаляются при закрытии коннекшина.
  3. Global temporary tables (CREATE TABLE ##t) видны всем и удаляются, когда все соединения, которые на них ссылаются, закрываются.
  4. Tempdb permanent tables (USE tempdb CREATE TABLE t) видны всем и удаляются при перезапуске сервера.

Какие типы JOIN’ов вы знаете?

📌 Must:

join

 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: 1w: "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? А с 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?

📚​ Ресурсы для изучения:

Сравнение коллекций в .NET

📌 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 вы знаете?

📚​ Ресурсы для изучения:

Entity Framework Architecture

📌 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

timer messaging meme

Что такое 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?

🎛️ Микросервисы

microservices

Какие способы коммуникации между микросервисами вы знаете?​

📌 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

Как реализовать атомарность транзакции между несколькими микросервисами?

📚​ Ресурсы для изучения:

📌 Must:

  • Saga pattern + eventual consistency
  • MassTransit + Saga

🎓 Should:

  • Correlation id + обеспечение атомарности с помощью меседж брокера. По сути разновидность самописной саги.

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

📌 Must:

🎓 Should:

👨‍🏫 Could:

Как обеспечить security микросервисов?

📚​ Ресурсы для изучения:

🎓 Should:

  • API Gateways
  • Service discovery и ограничение доступа к сервисам
  • OAuth

Какие способы хостинга микросервисов вы знаете?

🎓 Should:

  • Docker + k8s
  • Azure API Managment 

👨‍🏫 Could:

  • Docker swarm
  • Rancher
  • Azure Service Fabric

🧪 Тестирование

testing

Какие Test Frameworks вы знаете и использовали на практике?

📌 Must:

  • MSTest
  • NUnit
  • xUnit

Какие вспомогательные библиотеки вы знаете и использовали для написания тестов?

📚​ Ресурсы для изучения:

📌 Must:

  • FluentAssertions
  • Moq
  • NSubstitute

🎓 Should:

👨‍🏫 Could:

В чем разница между Integration и Unit тестами?

📌 Must:

  • При интеграционных тестах мы используем реальные модули системы (БД, сервис и тд), а не “моканую” версию.

🎓 Should:

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

В чем разница между Dummy, Fake, Stubs, Spies, Mocks объектами?

📌 Must:

  • Dummy — это объекты, которые передаются в методы, но на самом деле не используются. В основном, это параметры методов (если конечно, они не влияют в тесте на то, что мы хотим проверить). Иногда это просто NULL
  • Fake — объекты, которые имеют внутреннюю реализацию, но обычно она сильно урезанная и их нельзя использовать в продакшине. Memory database хороший пример Fake объекта.
  • Stubs — предоставляют стандартные ответы на вызовы, сделанные во время теста, обычно не отвечая ни на что, кроме того, что запрограммировано для теста.
  • Spies — это Stubs, которые также записывают некоторую информацию в зависимости от того, как они были вызваны. Одной из форм этого может быть сервис электронной почты, который записывает, сколько сообщений было отправлено.
  •  Mocks — объекты, заранее запрограммированные с ожиданиями, которые формируют спецификацию вызовов, которые они ожидают получить. Проверки соответствия ожиданиям проводятся через вызовы к Mock-объекту.

🖧 Сетевое взаимодействие и протоколы

network

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:

Load Balancer

📚​ Ресурсы для изучения:

Что такое 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

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 можно разделить на такие типы:

  1. Content-Generating Middleware – Для отправки ответа прямо внутри middleware. Такие middleware никогда не переходят к следующей по цепочке.
  2. Short-Circuiting Middleware – так называют middleware, которые не всегда переходит к следующей Middleware, а по какому-то условию возвращают ответ прямо внутри себя. 
  3. Request-Editing Middleware – так называют middleware, в которых нам нужно отредактировать запрос.
  4. Response-Editing Middleware –  так называют middleware, в которых нам нужно отредактировать ответ.

В чем разница между app.Use и app.Run при добавлении middleware?

📌 Must:

  • app.Use позволяет вызывать следующую middleware в pipeline
  • app.Run не вызывает следующую по списку middleware 

🎓 Should:

  • app.Run также не принимает на вход параметр next

Что такое SignalR, как он работает?

📚​ Ресурсы для изучения:

📌 Must:

  • SignalR – это абстракция над соединением. Это дает вам две модели программирования через это соединение (хабы и persistent коннекшины)

🎓 Should:

  • SignalR имеет несколько встроенных “транспортов”:
  1. WebSockets
  2. Server Sent Events
  3. Forever Frame
  4. 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 антипаттерны:
  1. ​Control Freak
  2. Bastard Injection
  3. Constrained Construction
  4. Service Locator

Как написать интеграционный тест в ASP.NET Core?

📚​ Ресурс для изучения: Интеграционные тесты в ASP.NET Core

📌 Must:

Для этого подойдет класс TestServer. Подробнее как написать такие тесты можно почитать в статье выше.

Какие типы фильтров существуют в ASP.NET Core?

📚​ Ресурс для изучения: Фильтры в ASP.NET Core

filter

📌 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 vs git rebase
  • команда cherry-pick

🛶 Continuous Integration & Continuous delivery & Continuous deployment

В чем разница между Continuously Integration, Continuous delivery и Continuous deployment

📚​ Ресурсы для изучения:

Continuous integration vs. continuous delivery vs. continuous deployment

ci/cd

📌 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:  Если вы дочитали до конца, то вы уже крутые! Если вы увидели какие-то неточности или ошибки, пишите в комментариях.

Источник

+1
0
+1
3
+1
0
+1
0
+1
0

Ответить

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