Співбесіда з .NET. 150+ запитань для Junior, Middle, Senior

💡 Усі статті, обговорення, новини для початківців — в одному місці. Приєднуйтесь до Junior спільноти!

На DOU розміщено понад 450 вакансій для .NET-розробників, що свідчить про популярність цієї технології. Редакція DOU зібрала питання, що ставлять .NET-розробники своїм колегам на технічних співбесідах. Готуйтесь на здоров’я :)

Попередня стаття рубрики присвячена Python.

Запитання для Junior

Загальне

1.Назвіть основні принципи ООП.
2.Що таке спадкування, інкапсуляція, абстракція, поліморфізм: наведіть приклади (бажано з власного досвіду). Від якого класу неявно успадковуються всі класи в .NET? Чи дозволено множинне успадкування в C#?
3.Що таке рекурсія?
4.Що таке лямбда-вираз?
5.Що таке паралельне програмування (багатопотоковість) і його призначення? Які класи використовуються?
6.Що таке JSON?
7.Як ви розумієте REST?
8.Розкажіть про SPA concept.
9.Які GoF-патерни використовували?
10.Яка різниця між GET і POST HTTP методами?
11.Яку проблему вирішує Docker? Які його плюси та мінуси?
12.Чим принципово відрізняються unit-тести від інтеграційних тестів?

Обробка винятків

13.Що таке Exception?
14.Для чого служать try, catch, finaly? В якому випадку може не виконатись блок finaly?
15.Що таке call stack? Які ключові слова ви знаєте?

Платформа .NET

16.Що таке ASP.NET?
17.Які існують типи Action filters?
18.Що таке Web Service?
19.Що таке CLR?
20.Що таке збирач сміття (Garbage Collector) на базовому рівні?
21.Що таке делегат?
22.Чи відрізняється Delegate від Action?
23.Що таке LINQ і для чого використовується? Наведіть кілька прикладів застосування LINQ.
24.Що таке простір імен (namespace) і навіщо це потрібно?

Типи даних, колекції та структури даних

25.Які типи даних ви знаєте?
26.Які примітивні типи знаєте?
27.Що таке Nullable-тип?
28.Що таке тип значення, а що таке тип посилання? Що з цього class, а що struct? У якій ділянці пам’яті вони зберігаються?
29.Чим відрізняються value від reference type? String — це reference чи value?
30.В чому відмінність між string builder і string?
31.Що таке дженерики? Які проблеми вони вирішують?
32.Що таке boxing/unboxing?
33.Що таке Array, List, HashSet, Dictionary? Наведіть приклади використання цих структур даних. Яка складність операцій з ними (пошук, вставка, видалення)?
34.Які знаєте колекції?
35.Що робить оператор yield?

Класи, структури та інтерфейси

36.Що таке клас?
37.Чим відрізняється клас від абстрактного класу?
38.Чим відрізняється абстрактний клас від інтерфейсу? Для чого потрібні інтерфейси і які завдання вони виконують?
39.Які ви знаєте модифікатори доступу?
40.У чому різниця між звичайним класом і статичним?
41.У чому різниця перевизначення методу між ключовими словами new та override?
42.Яка відмінність між const та read only?
43.Різниця між структурою і класом. Наведіть приклади структур.
44.Чи може екземпляр структури зберігатися у купі (heap)? Як це зробити?

Асинхронність

45.Що таке асинхронність і чим вона відрізняється від багатопотоковості?
46.Які є ключові слова для використання асинхронності в коді?
47.Що означають ключові слова async/await?

Бази даних

48.Різниця між реляційними та нереляційними базами, плюси та мінуси використання обох варіантів.
49.Що таке індекси в RDBMS?
50.Які типи JOIN існують у SQL?

Тестування

51.Для чого потрібні unit-тести?
52.Які переваги та недоліки використання unit-тестів?
53.З яких трьох логічних блоків складається unit-тест?

Запитання для Middle

Загальне

54.Ви набираєте google.com у браузері. Розкажіть якомога докладніше, що відбувається в цей час на HTTP-рівні?
55.Як працює HTTPS?
56.Як ви розумієте SOLID?
57.Які протоколи серіалізації ви знаєте і де вони застосовуються?
58.Що таке у вашому розумінні чиста функція? Які у неї переваги?
59.Що таке dependency injection і навіщо воно потрібне?
60.Що таке cohesion та coupling (зв’язаність і зв’язність)?
61.Що таке IaaS, PaaS, SaaS і які відмінності між ними?
62.Які способи налагодження програми ви застосовуєте?
63.Які знаєте патерни? Поясніть суть перерахованих.
64.У чому суть патерну Singleton? Чому його ще називають антипатерном?
65.Для чого потрібен патерн Strategy?
66.Які ключові відмінності між розподіленими системами та монолітними?
67.Які патерни проєктування розподілених систем ви знаєте?
68.Які є принципи роботи Message bus? Чому можуть виникати дублікати в чергах?
69.Які принципи побудови ідемпотентних сервісів знаєте?
70.Розкажіть, як працюють асинхронні методи? Чим асинхронність відрізняється від паралелізму?

Платформа .NET

71.Які винятки не можна зупинити в блоці catch?
72.Яка різниця між .NET Standard Class Library і .NET Core Class Library?
73.Поясніть різницю між відкладеним і негайним виконанням в LINQ. Наведіть приклади.
74.Для чого потрібен метод ConfigureServices в Startup.cs?
75.Яка різниця між services.AddTransient і services.AddScope в ASP.NET Core?
76.Що таке Kestrel?
77.Опишіть ASP.NET MVC request pipeline.
78.Як в ASP.NET WebAPI налаштувати кешування відповідей на HTTP-запити?

Управління пам’яттю

79.Що таке купа і стек? Відмінності, принцип роботи.
80.Як працює збирач сміття?
81.Навіщо нам зарезервоване слово using у C#, якщо у .NET є автоматичне управління пам’яттю? Як з цим пов’язаний disposable-патерн і навіщо такий складний патерн для managed та unmanaged ресурсів?
82.Які особливості роботи з Large Object Heap?

Типи даних, колекції та структури даних

83.Коли генерується дженерик-клас конкретного типу — під час виконання програми чи під час компіляції?
84.Що таке рефлексія?
85.Розкажіть про колекцію LinkedList<T>. Чим вона відрізняється від інших колекцій?
86.Що таке індексатор?
87.Що таке immutable object? Які переваги дає використання immutable object? Запропонуйте спосіб реалізації його в .NET.
88.Коли використовувати StringBuilder, а коли string? Як працює StringBuilder?
89.Що таке балансування дерев?
90.Що таке Key-value структури?
100.Що таке хеш-функція та навіщо потрібні хеш-таблиці?
101.Якими властивостями має володіти ідеальна хеш-функція?
102.Що таке колізії та як з ними боротися?
103.У чому полягає складність CRUD-операцій в Dictionary<K,V> у .NET?
104.Де зберігаються масиви? Масиви примітивних типів?
105.У чому відмінність між масивом (T []) і списком (List<T>)?
106.У чому різниця між IList<T> та IEnumerable<T>?
107.Навіщо потрібні Enumerable, Observable, AsyncEnumerable та які моделі отримання даних вони реалізовують?
108.У чому різниця між IEnumerable та IQueryable?
109.Що таке enum flags?

Бази даних

110.Розкажіть про нормальні форми в РСУБД.
111.Що таке індекс у БД?
112.Коли варто використовувати індекси? Переваги та недоліки.
113.Які типи індексів існують? Чим вони відрізняються?
114.Що таке ACID?
115.Які ви знаєте рівні ізоляції транзакцій?
116.Що таке план виконання запиту (execution plan) в MS SQL?
117.Проблема: запит довго виконується. Які є методи її діагностування та розв’язання?
118.Як ORM (Entity Framework чи Entity Framework Core) транслюють C# код у мову запитів бази даних? Що для цього використовується?

Паралелізм

119.Для чого використовувати Task.ConfigureAwait?
120.Наприклад, є вебсервер, який за HTTP-запитом робить вибірку з бази даних. Усього на сервері 16 тредів (threads). Кожний HTTP-request виконує запит у базу та чекає результатів, у цьому випадку тред блокується. Чи можна оптимізувати цю роботу засобами .NET?
121.Навіщо потрібен ThreadPool? Опишіть механіку роботи: як потік виділяється та повертається назад у ThreadPool.

Запитання для Senior

Загальне

122.Які ще практики, крім ООП, використовували (AOP, FP тощо)?
123.Назвіть три найскладніші проблеми, які вам доводилося розв’язувати. Як ви це зробили, як прийшли до цього рішення?
124.Що таке слабозв’язаний код? Чим він кращий від сильнозв’язаного коду? Як би ви досягали слабшої зв’язності коду?
125.Використання статичних класів підвищує чи зменшує зв’язність коду?
126.Як можна виміряти performance коду? Чи впливає факт замірів на продуктивність?
127.Для чого використовуються і як працюють multi-stage білди в Docker?
128.Як зрозуміти, що якась частина коду утилізує багато пам’яті або довго виконується? Що може бути ботлнеком у різних випадках? Які є способи зменшення пам’яті і трафіку пам’яті?
129.Як би ви реалізували cross-cutting concern (наприклад, логування, валідація, транзакції)?
130.Розкажіть про Rest Maturity Model.
131.Що таке CPU і IO-bound завдання?
132.Що таке маршалінг?
133.Як працює async/await (детально)? Чому не можна використовувати async void методи?

Платформа .NET

134.Як працює lock? Чи можна використовувати структури всередині виразу lock?
135.Що таке Expression Tree?
136.Як працює збирач сміття (детально)? Чому в GC три покоління, а не, скажімо, п’ять, десять або два?
137.Як би ви організували трасування Web API сервісів?
138.Як в .NET Core можна налаштувати зберігання секретів на комп’ютерах розробників і на робочих середовищах?
139.Як би ви організували процес CI/CD .NET Core сервісів для їх дейплойменту в хмарну інфраструктуру?
140.Як увімкнути CORS в AspNetCore?

Типи даних, колекції та структури даних

141.Як реалізовані дженерики?
142.Як створити власний immutable-тип?
143.Як працює IEnumerable<T> (детально)?
144.Який алгоритм використовує колекція STACK ?
145.Які структури даних ви реалізовували самі для платформи .NET? Розкажіть, чим вони відрізнялися від стандартних реалізацій.
146.Чим відрізняється інтерфейс від абстрактного класу? В яких випадках використали б і те, і те?
147.Чому в структурах немає конструктора за замовчуванням?

Бази даних

148.Як БД зберігає дані?
149.Які типи БД ви знаєте?
150.Які та коли БД краще використовувати?
151.Що таке денормалізація?
152.Коли і які рівні ізоляції транзакцій можна використовувати?
153.Як у популярних РСУБД реалізовані принципи ACID (SQL Server, PostgreSQL тощо)?
154.Чи доводилося оптимізувати запит в БД? Якщо так, то як?
155.Опишіть, які ви знаєте потенційні проблеми, пов’язані з паралельними запитами до БД.
156.Яку базу даних ви б використовували для реалізації distributed lock механізму? Розкажіть деталі реалізації.

Мікросервіси

157.Яку проблему вирішують мікросервіси?
158.Які є способи комунікації мікросервісів?
159.Розкажіть варіанти реалізації розподілених транзакцій у мікросервісах.
160.Що таке circuit breaker?
161.Яким чином ви будете налагоджувати систему, що складається з безлічі мікросервісів, якщо потрібно відстежити повний шлях обробки запиту?
162.Що таке брокери повідомлень? Що таке at-least-once, at-most-once семантика? Чи є якісь брокери, які гарантують exactly-once семантику?
163.Як повинен працювати код клієнта брокера залежно від обраної семантики?
164.Які інструменти для роботи з чергами вам відомі (як у .NET, так і окремі продукти), який інструмент/продукт ви б обрали й чому?

MS Azure

165.Які види сервісів бувають у Service Fabric?
166.Які особливості та обмеження Azure Table Storage?
167.Як боротися з проблемою холодного старту в Azure Functions?
168.У чому відмінність черг і топіків в Azure Service Bus?

Практичні завдання

Junior only

1.Опишіть, як би ви реалізували калькулятор. Якщо знадобиться додати підтримку для римської системи числення, що будете робити?
2.Напишіть програму, щоб перевірити, чи є число простим, чи ні.
3.Знайдіть найменший елемент у масиві.
4.Впорядкуйте структури папок у файловій системі.
5.Напишіть програму, що симулює fizz-buzz.
6.Розкажіть, що робить цей код, і запропонуйте, як його поліпшити.

а)

public bool IsArrayEmpty(string[] array)
{
  if (array.Length > 0)
    return false;
  else
    return true;
}

б)

protected string GetClass(object url)
{
  string result = string.Empty;
 
  if (SiteMap.CurrentNode != null && SiteMap.CurrentNode.Url == url.ToString())
    result = "class=\"active\"";
 
  return result;
}

Middle

7.Напишіть програму для тиражування послідовності Фібоначчі для заданого числа.
8.Спроєктуйте базу даних лікарів і пацієнтів у SQL. Створіть stored procedure або запит в SQL, що поверне лікарів, які мають більше, ніж N пацієнтів.
9.Перевірте колекцію на наявність дублікатів.
10.Спроєктуйте thread-safe клас Singleton у C#.
11.Треба записати якусь сутність у базу даних і відправити подію у брокер повідомлень. Як це зробити з мінімальним ризиком втрати даних?
12.Є три сервіси. Виконується HTTP-запит на перший. Перший повинен записати дані у другий, а другий — у третій. Як гарантувати, що дані при такій складній комунікації не загубляться? Як запобігти запису дублікатів даних?
13.Чи працюватиме цей код і чому?

a)

SomeClass myClass = null;
myClass.SomeMethod();

б)

var table = GetTable();
table.Draw();
…
private SomeClass GetTable()
{
  using(var table = new SomeClass())
  {
    table.ID = "www";
    table.Width = "95%";
    table.Controls.Add(tr);
 
    return table;
  }
}

14.Розкажіть, що робить цей код, і запропонуйте, як його поліпшити.

а)

Shape shape = GetNextShape();
if(shape is Circle)
  Console.WriteLine(((Circle)shape).Radius);

б)

public int Quantity
{
  get
  {
    try
    {
      return int.Parse(TxtQuantity.Text);
    }
    catch (Exception)
    {
      return 0;
    }
  }
}

15.Що не так з кодом?

try
{
  SomeMethod();
}
catch(Exception e)
{
  Log(e.Message);
  throw e; 
}

Senior

16.Як би ви спроєктували FTP-сервер? Web-сервер? Хостинг картинок з поділом прав доступу? Систему, що складається з front- і back-офісів? Створіть клон будь-якої популярної соціальної мережі (Instagram, Facebook тощо)
17.Припустимо, є сутність угоди (Bid). І в угоді є список партнерів, з якими ця угода укладається. Самі угоди зберігаються в сервісі угод (bidding service), а партнери — у своєму сервісі (partners service). І коли показується список угод, на початковому скрині треба відобразити кількість партнерів. Як би ви спроєктували зберігання і зображення цього лічильника?
18.Задача на знання LINQ: з вихідної колекції даних треба отримати нову колекцію за певними вимогами (наприклад, відсортовану, без дублікатів тощо).
19.Напишіть програму, яка перевіряє, чи є поле судоку 9×9 правильно заповненим.
20.Реалізуйте свій Select, Where, SelectMany з усіма характеристиками LINQ (відкладене виконання, одномоментна (eager) перевірка вхідних даних).
21.За допомогою LINQ напишіть метод, який поверне такі елементи колекції, які діляться на N без залишку, відсортовані від найбільшого значення до найменшого. Сигнатура методу: List<int> Filter(IEnumerable<int> collection, int n);.
22.Напишіть функцію, яка поверне суму всіх парних елементів масиву, який передається у функцію (JavaScript).

Дякуємо за підготовку статті Олексію Краєвому, Максиму Шнуренку, Андрію Ткаченку, Владу Медведовському, Сергію Селецькому, Андрію Губському, Сергію Марущенку, Олександру Скрінніку, Андрію Соболю, Богдану Нановському, Святославу Аксьончикову, Івану Корнелюку, Михайлу Пивоварову, Олексію Дерке, Євгену Гур’єву, Михайлу Меркулову, Юрію Вороніну.

Наступний матеріал готуємо про JavaScript. Якщо ви співбесідуєте фахівців різних рівнів на позицію JavaScript-розробника, пишіть на [email protected].

Все про українське ІТ в телеграмі — підписуйтеся на канал DOU

👍ПодобаєтьсяСподобалось14
До обраногоВ обраному48
LinkedIn



Найкращі коментарі пропустити

Учитывая...

Несколько последних месяцев собеседую, в основном, бэкендщиков для работы с распределёнными системами в облаке, поэтому буду писать конкретно о таких интервью — для другой специфики интервью будет другим. Большинство разработчиков позиционировали себя как Senior, также было несколько Middle и несколько Lead. Алгоритм собеседованиям людей уровня Senior/Lead/Architect одинаков, т.к. в моём понимании Senior бэкендщик хотя бы в общих чертах уже должен понимать архитектуру и инфраструктуру, поэтому идём от уровня хай-левел архитектуры и опускаемся к уровню собственно .NET. Соответственно, если я даю Senior маленькую задачку на кодинг или написать SQL запрос, то это фактически означает, что в фидбэке будет речь о Middle, потому что для Senior мне будет о чём поговорить и без этого, чтобы не выйти за рамки разумного времени проведения интервью (да и в целом не морочить людям голову).

В целом интервью делится на несколько блоков, от более важного к менее важному. Максимально используются кейсы из практики, причём, не какие-то специфичные (некоторые интервьюеры этим грешат — не надо так), а те, которые попадаются практически во всех проектах. Блоки примерно следующие (сильно конкретизировать не буду — это моя профессиональная тайна, если хотите):
1. Проектирование. В каких случаях какие архитектурные решения человек будет принимать, и почему.
2. Основные проблемы распределённых систем, как их решать.
3. Облачная инфраструктура.
4. CI/CD (вкл. git и стратегии ветвления, тесты, окружения).
5. ORM, microORM.
6. Секьюрность (это достаточно хай-левел вопрос, но иногда забываю о нём или нет времени после предыдущих, поэтому он здесь — всё-таки предыдущие более важны в повседневной работе).
7. Web, немного ASP.NET Core (если ещё осталось, что обсуждать).
8. Опционально — пара-тройка вопросов по .NET.
9. Опционально — дежурная задачка на кодинг (около 10 минут) и, возможно, ещё небольшой SQL запрос.

Такое интервью основано на логике выявления сильных сторон кандидата. Чем ниже уровень вопроса, тем легче забыть, сглупить и т.д. из-за стресса, а на вопросы первых блоков человек ответит практически в любом состоянии, если действительно имел с этим дело. И вот таким вот образом недавно я рекомендовал человека на .NET тех лида с минимумом вопросов по, собственно, .NET (как-то писал в одной из тем на DOU, что он отказался от оффера, но в итоге всё-таки передумал, и отличный вообще мужик).

Но появляется проблема квалификации собеседующего для проведения подобного интервью:
1. Для того, чтобы задавать и интерпретировать первые блоки, нужен реальный опыт с ними. Причём, не на примере непонятно как сделанных пары проектов, когда хорошо сделанных сам интервьюер до сих пор-то и не видел, а толковых, где переиспользуемые практики не повторяют ту же боль, что и в прошлый раз, а наоборот столь же успешно облегчают жизнь.
2. Опций набрать вопросов с ответами из интернета (которыми можно прособеседовать либо миддла, либо винтик для копания от забора до обеда) или же экстраполировать Свой Самый Важный Опыт на кандидата не будет. Потому что типичные ответы из интернета чаще всего являются если не аналогом hello world, то близко к тому. Например, большинство ответов кандидатов после упоминания о NoSQL можно свести всего к двум словам, которые написаны в каждой статье по теме («неструктурированные данные»), что сразу показывает уровень реального (не)понимания нюансов использования. По архитектуре нормальные вопросы вообще редко можно «найти», т.к. если Вы сами не знаете, какие задавать, то и толку нет, потому что адекватно оценить ответ тоже не получится, как и задать дополнительные/наводящие вопросы.
3. Отдельное внимание нужно обращать на то, что было написано в резюме, и что оказалось в реальности. Я, например, негативно отношусь к подходу, когда люди пишут всё подряд, что у них было на проектах, хотя сами просто «рядом стояли».

Был опыт проведения интервью для одной крупной компании (детали не могу раскрывать) — огромный список вопросов, среди которых ни одного высокоуровневого, и люди хотят уложиться с этим всем в один час, хотя реально нужно два с половиной. Считаю такой подход крайне вредным как для кандидата, так и для интервьюера/компании.

Не так давно проходил несколько интервью на .NET Tech Lead, и все они порадовали упором на адекватные хай-левел вопросы — были, конечно, и по .NET, но в рамках приличия (в основном GC/IDisposable, ref vs value types, структуры данных, TPL/threads). Честно говоря, ожидал, что будет хуже.. хотелось бы разве что больше вопросов по отказоустойчивости и инфраструктуре — их почему-то почти не задавали, хотя, по-моему, это важно.

95 коментарів

Підписатись на коментаріВідписатись від коментарів Коментарі можуть залишати тільки користувачі з підтвердженими акаунтами.
15.Що таке call stack? Які ключові слова ви знаєте?

Як ці питання пов’язані?

12.Є три сервіси. Виконується HTTP-запит на перший. Перший повинен записати дані у другий, а другий — у третій. Як гарантувати, що дані при такій складній комунікації не загубляться? Як запобігти запису дублікатів даних?

Питання на мідла. Аж хочеться поспілкуватись з автором і послухати як він / вона пропонує гарантувати це.

Я тут) Есть минимум два способа, оба предполагают переписывание текущей реализации.
1. Оркестрация. Можно сделать сагу, которая будет трекать состояние выполнения запросов. Опционально — компенсационные механизмы, ретраи итд.
2. Хореография. Можно построить данную коммуникацию на консьюмерах ивентов. Первый сервис отправляет сообщение, второй слушает сообщение первого, второй отправляет сообщение и так по цепочке.
Задача со звездочкой — упомянуть стрим процессинг и построение etl архитектуры

А как вы сообщение в брокер положите отказоустойчиво? Тут же распределённая транзакция. Не гарантируете ее — можно было и не начинать играться в события

Про это другой мой вопрос. Это тоже давно уже решено — transactional outbox, или polling publisher

Ну тут вопрос тогда надо на слабосвязность перевести) Вы кстати не указали самый простой ответ — 2 phase commit, остальные варианты вообще не отвечают на такую постановку вопроса.

Второй вопрос был — как транзакционно записать сущность в базу и отправить событие в брокер. Имхо, те два варианта + Ваш вполне четко отвечают на поставленный вопрос

Як гарантувати, що дані при такій складній комунікації не загубляться?

Как мы это гарантируем ивентами?)

Часть с дублированием данных тоже прекрасна. Тут то хоть что мидл должен ответить?)

Как минимум, что существует идемпотентность. Если это вопрос не на мидла, то на кого ?

А мидл точно должен знать в каком порядке ставить транзакции в саге? А как реализовать оплату идемпотентно?

Это точно не собеседование сейчас ?)
Допустим есть сущность кошелька, у неё есть версия, она инкрементится каждый раз после дебета, или кредита. все события выполняются на определенной версии кошелька. В ивенте на дебет или кредит тоже приходит версия, на которой надо выполнить данную транзакцию. Если версии в ивенте и на сущности не совпадают, то мы скипаем такие ивенты. Если собювпадают — совершаем списание

Не собеседование, просто я не вижу целостного вопроса) События — хорошая тактика для атрибута качества «изменяемость» — получаем слабую связность и т.д. Если ставить вопрос про «доступность» мидлу — то это все-равно что просить ученика 5-го класса посчитать неопределенный интеграл. Кто-то посчитает, но это не значит что остальные ученики плохи. Без всей цепочки до целостного пуша в месседж брокер ответ неверный. Без стратегии откатываемые — критичная (максимум одна) — идемпотентные ответ поо дублирование данных тоже неверный

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

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

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

Что в Вашем понимании «надежный пуш» ?

Ще є цікаве питання: як відрізнити, що .exe файл скомпільваний (написаний) на C++ чи на C#?

Більш цікаве питання: «А нафіга»?

Зрозуміти наскільки людина розуміє архітектуру. Що відбувається «за лаштунками»

Посмотреть его заголовок ?

Якщо відповідати коротко, то так

Чи відрізняється Delegate від Action?

Action и есть делегат.

Як працює IEnumerable (детально)?

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

13.Чи працюватиме цей код і чому?

a)

SomeClass myClass = null;
myClass.SomeMethod();

ууу..... я помню это говнище.... и интервьювер в авторах.... лет 7-8 назад

я: нул референс будет
интервьювер: уверен? подумай еще
я: ну.... это же класс?
интервьювер: да
я: он не инициализирован и вызывается его метод, должен быть нул референс
интервьювер: неправильно!
я: как так-то?
интервьювер: SomeMethod() - это экстеншен
я: О_О

Уже лучше литкод задрачивать в FAANG чем на вопросы с подъебами от местных чучел отвечать)

Как-то давно читал что .Net runtime так может наоптимизировать иногда что если в интстанс методе ты не обращаешься к членам класса, то можно успешно вызвать такой метод с null объектом. Жаль не помню условия когда это получается.

рефлексией по особому создать его нужно, сунуть в делегат (тоже хитро засетапленный) и сломать таргет, но тот вопрос не про это был

а читал ты это, наверное, на стеке у Джона Скита в ответах, т.к. он первый этот баг нашел, а не фичу кстати, и сча починено насколько я знаю

Догадываюсь откуда ноги растут у этого вопроса)
Встречал вот такое как раз в те времена:
someParameter.ThrowIfNullOrEmpty()
В те времена вряд-ли можно было придумать более компактную запись вместо простыни из ифов. Явный минус — без nameof этот чек превращался в тыкву)
А проект был емнип на 5 шарпе.
Да и CallerArgumentExpression подвезли еще папизже.

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

Ладно, поясню чуть детальнее:

static void ThrowIfNullOrEmpty(this string source)
{
    if (string.IsNullOrEmpty(source))
    {
      throw new ArgumentNullException();
    }
}
....
void SomeMethod(string someParam)
{
    someParam.ThrowIfNullOrEmpty();
}
так что интервьюер хотел выяснить, может ли тебе такое в голову прийти
оказалось что нет, хотя применения у такого подхода есть
Впрочем, если ты архитект по крудам, то и не удивительно)

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

что показывают эти тайные шаолинские техники мне до сих пор не ясно

Ну хотя бы то, что собеседуемый понимает, что между
someParam.BlaBlaBla() и SomeExtensions.BlaBlaBla(someParam) нет разницы
Проверка на знание основных возможностей языка, никакой эзотерики
Другое дело, что внятно сформулировать вопрос могут не только лишь не все собеседующие)

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

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

Согласен, формулировка невнятная, хрен догадаешься чего ждут. Особенно если сам их не пишешь, а только юзаешь готовое из коробки.
Среди тех, кого я собеседовал, свои экстеншены писала от силы половина,
а некоторые так вообще не знали что это такое (и это люди с опытом 5+ лет)...

Забавно: 168 вопросов, из которых тех, которые имеют прямое отношение к .NET, я насчитал 82. Или менее 50%.

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

И это нужно хоть в c#, хоть в java, хоть в ruby/python/php

Ну тогда и называть надо не «Вопросы по .NET», а «Вопросы по Full stack»

«Вопросы на Technical Interview с уклоном в .NET» или «в команду, использующую .NET». Или для краткости «по .NET», потому что многим контекст и так понятен.

SPA і Docker? А тепер уже весь .NET це веб?

Да, мир резко изменился с появлением Blazor.

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

Веб, он везде i.kym-cdn.com/...​/002/868/XXEverywhere.jpg. На самом деле мне тоже непонятен изначальный впорос, но очень хотелось что-то ответить.

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

Довольно прикольная штука, у нас исользуется для нескольких backoffice UI. Но я сам глубоко не копал. Смущают две вещи: долгая начальная загрузка приложения и безопасность. Blazor позволяет референсить (условно) любые либы/проекты и можно незаметно для себя утянуть внутренности на UI, что потом даст возможность кулхацкеру декомпилить эти либы и узнать логику работы сервера со всеми вытекающими. Не говоря уже про какие-то секреты/ключи в строках, в сборке.

и можно незаметно для себя утянуть внутренности на UI

Есть же Blazor Server, когда код реально выполняется на сервере. На клиенте только UI крутится

Да, где-то мелькала эта штука, но я пока не интересовался. Нужно будет как-то глянуть, но в чем тогда преимущество по сравнению с теми же Razor Pages?

По умолчанию для общения с Blazor Server используется SignalR, в отличии от Razor Pages. В некоторых сценариях full duplex может оказаться предпочтительнее polling, например для интерактивных дашбордов.

Да, наверное, удобнее, когда это все есть из-коробки.

Думаю, что если вас будут собеседовать на какого-нибудь WPF девелопера, то про докер и спа спрашивать не будут :) Или удовлетворяться ответом — «не работал, не знаю».

Як раз шукаю роботу по стеку React і шарпа. Чудова підбірка.

53. З яких трьох логічних блоків складається unit-тест?

Какая программа называется ярлыком? Какой ярлык является программой? Почему на диске не может быть создан ярлык из римских цифр? В какую папку нельзя поместить информацию?

136.Як працює збирач сміття (детально)? Чому в GC три покоління, а не, скажімо, п’ять, десять або два?

В Mono (Xamarin, Blazor, Uno) 2 покоління.

Тем интереснее послушать, почему в Mono два, а в CLR три :) И есть ли в .NET где-нибудь сборщик мусора вообще без поколений (docs.microsoft.com/...​brada/resource-management, в исходниках .NET остался прототип GC с reference counting). Вопрос больше направлен на оценку понимания, как работает GC внутри и оценку желания собеседуемого в принципе разбираться с инструментами, с которым он работает. Последнее, очевидно, важнее, чем глубокие знания GC internals.

Тем интереснее послушать, почему в Mono два, а в CLR три

И почему же? Я когда-то попал на схожий вопрос, все что мне удалось нагуглить, что просто эмпирически получилось, что три лучше.

prodotnetmemory.com/...​images/weakstronghyph.png
Взято отсюда prodotnetmemory.com/slides/UnderstadingGC/#1
Вообще, советую книгу автора этих слайдов.
В Mono обошлись без temporal generation (их, кстати, может быть сколько угодно, на самом деле, просто на практике видимо нет смысла выделять >1 «temporal» поколения).

График немного ни о чем. Имхо. Это не иллюстрирует ответ на вопрос «почему». Ну или я тупой). Чем это лучше, чем например пять поколений или например провести отсечку «больших объектов» выше или ниже. В джаве по-моему их больше, чем три. Почему же для джавы оптимальным оказался другой механизм сборки мусора

На графике нет

«больших объектов»

Есть коротко- и долгоживущие.
Если график непонятен, вот видео от автора GC (можно только слушать)
channel9.msdn.com/...​Inside-Garbage-Collection
Речь о поколениях ведется с 14:45.
В джаве зависит от терминологии, но в целом их там 2 (а вообще зависит от GC).Но! young делится на eden и survivor, что по сути аналогия Gen 0 и Gen 1 в CLR. По ссылке ниже описание того, как это работает «у них»:
docs.oracle.com/...​gctuning/generations.html

survivor

на два внутрилежащих. Иными словами работа отличается от .NET

Если график непонятен, вот видео от автора GC (можно только слушать)

а можно вкратце, а не посылать в видосы которые еще нужно смотреть? Я понимаю смысл графика и понимаю принцип работы. Но все это отвечает на «Как?», а не на «Почему?»

Учитывая...

Несколько последних месяцев собеседую, в основном, бэкендщиков для работы с распределёнными системами в облаке, поэтому буду писать конкретно о таких интервью — для другой специфики интервью будет другим. Большинство разработчиков позиционировали себя как Senior, также было несколько Middle и несколько Lead. Алгоритм собеседованиям людей уровня Senior/Lead/Architect одинаков, т.к. в моём понимании Senior бэкендщик хотя бы в общих чертах уже должен понимать архитектуру и инфраструктуру, поэтому идём от уровня хай-левел архитектуры и опускаемся к уровню собственно .NET. Соответственно, если я даю Senior маленькую задачку на кодинг или написать SQL запрос, то это фактически означает, что в фидбэке будет речь о Middle, потому что для Senior мне будет о чём поговорить и без этого, чтобы не выйти за рамки разумного времени проведения интервью (да и в целом не морочить людям голову).

В целом интервью делится на несколько блоков, от более важного к менее важному. Максимально используются кейсы из практики, причём, не какие-то специфичные (некоторые интервьюеры этим грешат — не надо так), а те, которые попадаются практически во всех проектах. Блоки примерно следующие (сильно конкретизировать не буду — это моя профессиональная тайна, если хотите):
1. Проектирование. В каких случаях какие архитектурные решения человек будет принимать, и почему.
2. Основные проблемы распределённых систем, как их решать.
3. Облачная инфраструктура.
4. CI/CD (вкл. git и стратегии ветвления, тесты, окружения).
5. ORM, microORM.
6. Секьюрность (это достаточно хай-левел вопрос, но иногда забываю о нём или нет времени после предыдущих, поэтому он здесь — всё-таки предыдущие более важны в повседневной работе).
7. Web, немного ASP.NET Core (если ещё осталось, что обсуждать).
8. Опционально — пара-тройка вопросов по .NET.
9. Опционально — дежурная задачка на кодинг (около 10 минут) и, возможно, ещё небольшой SQL запрос.

Такое интервью основано на логике выявления сильных сторон кандидата. Чем ниже уровень вопроса, тем легче забыть, сглупить и т.д. из-за стресса, а на вопросы первых блоков человек ответит практически в любом состоянии, если действительно имел с этим дело. И вот таким вот образом недавно я рекомендовал человека на .NET тех лида с минимумом вопросов по, собственно, .NET (как-то писал в одной из тем на DOU, что он отказался от оффера, но в итоге всё-таки передумал, и отличный вообще мужик).

Но появляется проблема квалификации собеседующего для проведения подобного интервью:
1. Для того, чтобы задавать и интерпретировать первые блоки, нужен реальный опыт с ними. Причём, не на примере непонятно как сделанных пары проектов, когда хорошо сделанных сам интервьюер до сих пор-то и не видел, а толковых, где переиспользуемые практики не повторяют ту же боль, что и в прошлый раз, а наоборот столь же успешно облегчают жизнь.
2. Опций набрать вопросов с ответами из интернета (которыми можно прособеседовать либо миддла, либо винтик для копания от забора до обеда) или же экстраполировать Свой Самый Важный Опыт на кандидата не будет. Потому что типичные ответы из интернета чаще всего являются если не аналогом hello world, то близко к тому. Например, большинство ответов кандидатов после упоминания о NoSQL можно свести всего к двум словам, которые написаны в каждой статье по теме («неструктурированные данные»), что сразу показывает уровень реального (не)понимания нюансов использования. По архитектуре нормальные вопросы вообще редко можно «найти», т.к. если Вы сами не знаете, какие задавать, то и толку нет, потому что адекватно оценить ответ тоже не получится, как и задать дополнительные/наводящие вопросы.
3. Отдельное внимание нужно обращать на то, что было написано в резюме, и что оказалось в реальности. Я, например, негативно отношусь к подходу, когда люди пишут всё подряд, что у них было на проектах, хотя сами просто «рядом стояли».

Был опыт проведения интервью для одной крупной компании (детали не могу раскрывать) — огромный список вопросов, среди которых ни одного высокоуровневого, и люди хотят уложиться с этим всем в один час, хотя реально нужно два с половиной. Считаю такой подход крайне вредным как для кандидата, так и для интервьюера/компании.

Не так давно проходил несколько интервью на .NET Tech Lead, и все они порадовали упором на адекватные хай-левел вопросы — были, конечно, и по .NET, но в рамках приличия (в основном GC/IDisposable, ref vs value types, структуры данных, TPL/threads). Честно говоря, ожидал, что будет хуже.. хотелось бы разве что больше вопросов по отказоустойчивости и инфраструктуре — их почему-то почти не задавали, хотя, по-моему, это важно.

Чому не можна використовувати async void методи?

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

Так там же ж вполне себе тривиальная причина (пруф).

Там же написано избегайте (не используйте без необходимости), а не нельзя.

Так async void’ы очень редко используются (по крайней мере, в веб-программировании как минимум), поэтому от ревьюера в общем случае вероятность вполне справедливо получить по пальцам). Исключения на то и исключения.

Исключения на то и исключения.

Возможно тогда стоит перефразировать вопрос чтобы понять на сколько хорошо собеседуемый понимает проблему и узнать в каких случаях он бы использовал async void, если бы использовал вообще. Я бы, например, не использовал, но есть неединичные случаи когда я писал var _ = DoSomethingAsync(); что по сути является аналогом async void. И интересно было бы понять на сколько собеседуемый понимает какие ограничения подобные вызовы накладывают, к каким проблемам могут приводить и как с ними (проблемами) работать.

18.Задача на знання LINQ: з вихідної колекції даних треба отримати нову колекцію за певними вимогами (наприклад, відсортовану, без дублікатів тощо).
21.За допомогою LINQ напишіть метод, який поверне такі елементи колекції, які діляться на N без залишку, відсортовані від найбільшого значення до найменшого. Сигнатура методу: List Filter(IEnumerable collection, int n);.

Поясніть будь ласка, чому ці задачі обрані для senior а не middle рівня?

Як працює збирач сміття (детально)? Чому в GC три покоління, а не, скажімо, п’ять, десять або два?

А после уверенного рассказа почему три поколения — это единственно правильный вариант, добить вопросом — «А где используются именно два поколения сборки мусора?»

И таки да, в вопросы по коду для миддла я бы добавил пример в котором в MemoryStream пишется мегабайт 30 данных блоками по 2 килобайта, и спросил бы всё ли в порядке в этом коде и какие у него побочные эффекты?

Как думаете, часто мидл использует

MemoryStream

кроме как в middleware сделать копию запроса?

А как же типовые задачи вроде «почитать файл, обработать в памяти и сохранить как массив байт», или например «вот тут лежит либа для конвертации в пдф, используй ее». Некоторые таки тянутся использовать MemoryStream с ожидаемыми последствиями. Вообще, MemoryStream такая коварная штука, что чем раньше начинаешь понимать, как оно работает, тем лучше.

В дотнете (да и в любой другой технологии) вообще достаточно мест, в которых можно поймать «ожидаемые последствия». Но для этого и задачи должны отличаться от «поставить ню-гет пакет и вызвать метод оттуда».
Unrelated: Вообще очень интересно наблюдать как постепенно происходит разделение дотнет программистов на тех, кто ставить ню-гет пакеты, и на тех кто эти пакеты пишет (или хотя бы интересуется как оно там внутри работает).

Но для этого и задачи должны отличаться от «поставить ню-гет пакет и вызвать метод оттуда»

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

В чому тут буде коварство?
MemoryStream це по суті List<byte> з інтерфейсом Stream-а. Звичайно він має всі недоліки List<byte>, якщо розглядати його в контексті задачі

MemoryStream пишется мегабайт 30 данных блоками по 2 килобайта

а саме постійна реалокація внунрішнього массива.

Ну ще можливо те, що можна положить в память файл розміром в 100500гб одним махом, але таке може трапитись і із звичайним byte[]. Тут вже грає роль «унікальність» ходу думки розробника.

В чому тут буде коварство?
MemoryStream це по суті List з інтерфейсом Stream-а.

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

Ага. Беда в том что в итоге дико фрагментируется LOH, и ООМ может вылететь в совершенно несвязанном месте, в абсолютно корректном коде.

Благо, в 4.5.1 появилась настройка LargeObjectHeapCompactionMode, но это не повод забивать на правильные подходы к работе с LOH :)

Благо, в 4.5.1 появилась настройка LargeObjectHeapCompactionMode

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

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

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

Судя по use case в доках, это предлагается как One-shot лекарство последнего шанса, т.е. рассчитывать на эту опцию точно не стоит, имхо.

Там выделится памяти в примерно в два c половиной раза больше чем исходный файл, то есть «сожрётся» 70-80 мегабайт вместо 30. Это, конечно, не очень хорошо, но на «ужас-ужас у нас ООМ» явно не тянет.

приходится искать места, где есть такие аллокации

В смысле так сложно найти все MemoryStream-ы где не указывается явно capacity/buffer? Ну ок.

Вообще это типичный вопрос «угадай что у меня в голове». Я бы например не догадался.

Вопрос все-таки в основном в дорогой реалокации массива n раз, а не сколько конкретно памяти выделится.

Хз, там будет аллоцировано около 16 массивов и только часть из них попадут в LOH. Не знаю на сколько это можно считать ужас-ужас.

И взагали, наверное, лучше делать как ASP.NET Core middleware для кешируемого стрима или в том же nginx, когда размер стрима больше определенного значения его просто пришут на диск, а не в память, если LOH вызывает проблемы. Не думаю, что аллокация нужного размера массива для MemoryStream как-то существенно улутшит положение дел.

Проблему решает вот эта штука
www.nuget.org/...​O.RecyclableMemoryStream
На практике ее часто использую, удается держать расход памяти под контролем

В комменте ничего не было про 30 мб. Вопрос направлен на выяснения понимания работы мемори стрима и сайд эффектов от его использования.

Там выделится памяти в примерно в два c половиной раза больше чем исходный файл, то есть «сожрётся» 70-80 мегабайт вместо 30. Это, конечно, не очень хорошо, но на «ужас-ужас у нас ООМ» явно не тянет.

Проблема начинается в том случае, если сервис часто работает с картинками/документами размером >85кб в памяти. Поскольку LOH собирается только с Gen2 и не дефрагментируется, в какой-то момент нагрузка на сервис стриггерит ООМ.
Понятное дело, что от одного файла никому ничего не будет.

В комменте ничего не было про 30 мб.

Изначально вопрос был «в MemoryStream пишется мегабайт 30 данных блоками по 2 килобайта, и спросил бы всё ли в порядке в этом коде».

По этому вопросу человек должен догадаться, что речь идёт о «сервисе», который часто работает с файлами и никогда-никогда не рестартует, т.е. то, чего в 99% условно «типичных» проектах случается примерно никогда.

Всё, что я хотел сказать, это что такие вопросы более на навыки телепатии, а не на понимание работы GС.

Які GoF-патерни використовували?

Чи не зарано задавати джуну таке питання?

Неть, задавать не рано. Рано ждать развернутый ответ про все 23 паттерна. Зато сразу будет понятно, какой именно подвид юниора перед вами — код манки, который просто «рисует формочки» или человек, который как минимум занимается самообразованием и хочет расти в профессии.

скоріше за все відповідь буде про сінглтон чи якусь фабрику. Зустріти людину яка добре розуміє, що вона використовувала та для чого і залишається джуном, ну це трохи... малоймовірно, ні? тут і старші трохи плутаються у свідченнях ))
Я хочу сказати, що питання до джунів лежать більше у теоретичній площині ніж практичній.

Давно вы в джунах не ходили
Сейчас без развёрнутого ответа про все паттерны никуда не берут :/

Давно вы в интерны не ходили
Сейчас без развёрнутого ответа про все паттерны никуда не берут :/

Это такой подвид интервью, называется «интервью задротское». Ничего не показывает, зато тешит самолюбие интервьюера). Я, кстати, когда давал коммент к этой статье, то присылал развёрнутый по поводу того, как надо и не надо делать — знал бы, что суть статьи будет сводиться к сухому списку вопросов, то даже не распинался бы — по сути, меня можно из соавторов смело убирать).

Вы можете выложить то, что не вошло в публикацию отдельным постом на форуме. Я лично свои соображения по поводу собеседований опубликовал у себя на сайте: andrew.gubskiy.com/...​log/item/21-net-questions

Було би непогано те саме з джави якщо ще не було :)

Підписатись на коментарі