dotnetdad .NET бэкенд

Не натаскаться, а разобраться

Подготовка .NET бэкенд-разработчика к технической части собеседования. Несколько тем — до дна.

Смотреть программуМногопоточность в C#: предзаказ за 7 000 ₽

Резюме вылизано у всех. Опыт накручен у всех. Автоотклики разосланы веером. Осталось полтора часа с человеком, который спросит, как это устроено внутри, — и вот там шаблоны перестают работать.

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

На техсобесе спрашивают так

Четыре вопроса по частым темам бэкенд-собеседований. Зачёркнут ответ, после которого интервьюер кивает и идёт дальше. Под ним — ответ до дна.

Сервис лёг под нагрузкой. Весь код асинхронный. Что случилось?
Наверное, потоки кончилисьГде-то в цепочке .Result: он держит поток пула, пока база не ответит. Под нагрузкой так встают все потоки, а пул нарочно растёт медленно. В dotnet-counters это видно сразу: очередь пула растёт, процессор свободен.
В дампе зависшего сервиса поток стоит в <GetOrderAsync>d__4.MoveNext. Что это и откуда взялось?
Какой-то служебный код .NETЭто и есть GetOrderAsync. Компилятор переписал его в структуру: тело переехало в MoveNext, каждый await стал состоянием, а переменные, которые переживают await, — полями. На первом незавершённом await структура переезжает в кучу — эту аллокацию платят только вызовы, которые правда ушли в ожидание.
На горячем пути контроллера Task поменяли на ValueTask. Когда станет хуже?
ValueTask всегда быстрееКогда его ждут дважды или кладут в поле, чтобы дождаться потом. Внутри может лежать объект из пула, который уже служит чужому ожиданию, и второй await вернёт чужой результат или бросит исключение. Выигрыш — одна аллокация Task, и только если результат обычно готов сразу.
Клиент закрыл вкладку, а запрос к базе ещё полминуты держит соединение. Почему?
Сервер не знает, что клиент ушёлЗнает: HttpContext.RequestAborted срабатывает при обрыве. Но отмена в .NET кооперативная — токен доходит до базы, только если его передали по всей цепочке. Потерялся на полпути — запрос к базе доработает до конца.

Что значит «до дна»

Первый вопрос — по слоям:

  1. Механика.Result держит поток пула, пока ждёт ответа базы.
  2. Почему такПул нарочно растёт медленно: он не знает, работают потоки или ждут, а лишние потоки при занятых ядрах только добавят переключений.
  3. Как ломаетсяПод нагрузкой потоки кончаются быстрее, чем пул их добавляет: очередь растёт, ответы уходят в секунды.
  4. Как увидетьВ dotnet-counters очередь пула растёт, процессор почти свободен. В дампе все потоки пула стоят в одном месте — ждут задачу.

Признак, что дошёл, — нет уточняющего вопроса, который опрокидывает ответ.

Чего здесь нет

Ни System Design, ни алгоритмов. К ним уже готовы все одинаково, а мы берём темы, на которых можно стать заметно сильнее, — внутреннее устройство .NET.

Ни резюме, ни откликов, ни мок-собеседований. Этим занимаются другие и занимаются лучше. Мы отвечаем за то, что ты скажешь, когда спросят, почему лёг твой сервис.

Оффер не обещаем. Процент с зарплаты не берём, гарантий трудоустройства не даём. Отвечаем за глубину — исход твой.

Многопоточность в C#

От потока в операционной системе до сервиса под нагрузкой

14 разделов, 53 урока

  1. 1Карта: поток, параллельность, асинхронность
  2. 2Гонки и атомарность
  3. 3Блокировки
  4. 4Примитивы синхронизации
  5. 5ThreadPool
  6. 6Task
  7. 7async/await: как это работает
  8. 8Отмена
  9. 9ValueTask и аллокации
  10. 10Почему сервис встал
  11. 11Коллекции и очереди
  12. 12Модель памяти и lock-free
  13. 13Параллелизм
  14. 14Async в тестах

Штрихом — финал: вторая стадия, купившим первую версию без доплаты.

Предзаказ. Уроки выходят по мере записи и открываются без доплаты, финал тоже. Эта цена действует, пока идёт предзаказ. После — 14 000 ₽.

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