C# Development | YeaHub
743 subscribers
304 photos
33 videos
1 file
537 links
Теория, подготовка к интервью и курсы для C# разработчиков

YeaHub — это платформа для IT-специалистов, объединяющая обучение, карьерный рост, развитие и сообщество единомышленников.

Платформа: https://yeahub.ru

Для связи: @ruslan_kuyanets
Download Telegram
🖥 Middle C# Backend разработчик в компанию Платформа

Техническое собеседование. Осень 2024. Просил 350 к. Опыт в резюме: 3+ года. На собеседование было много вопросов по .NET, паттернам проектирования, в конце затронули математику.

Вопросы:
- Объясните механизм deferred execution (отложенного выполнения) в LINQ на примере First() и счётчика.
- Как в вашем проекте определялось, какую стратегию использовать - через фабрику, DI или иным способом?
- С какими ORM вы сталкивались (Entity Framework, Dapper и др.) ?
- Приходилось ли писать T-SQL-запросы вручную?

Все вопросы можно посмотреть на нашей платформе

#собес #коллеции
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1
#Собес #mongoDB
🤔 Какую роль играет кэш WiredTiger в MongoDB и как он влияет на производительность?

💬 Кратко:
Кэш WiredTiger в MongoDB хранит часто используемые данные и индексы в памяти, улучшая производительность чтения, сокращая обращения к диску. Размер кэша критичен для производительности: слишком маленький кэш приведет к частым чтениям с диска, замедляя операции, а слишком большой - вызовет проблемы с распределением памяти.
📌 Полный разбор + примеры использования — на платформе:
👉
Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
#полезное
😎 Dictionary Expressions в C#?

Сейчас это предложение в статусе champion (ссылка ниже) и продолжение фичи Collection Expressions из C# 12.
Предложение Dictionary Expressions

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
This media is not supported in your browser
VIEW IN TELEGRAM
#полезное
😱 Как кеш может работать неправильно?

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

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

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

Есть и пробой по «горячему» ключу. Когда один популярный ключ истекает, вся нагрузка уходит в базу. Поскольку такие ключи могут составлять большую часть запросов, для них обычно не задают время жизни.

Кеш может и просто упасть. Тогда все запросы идут в базу, и система перестаёт справляться. Здесь выход либо в использовании circuit breaker, который блокирует обращения и к кешу, и к базе, либо в развёртывании кластера кеша, чтобы повысить его доступность.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
🤯 Amplication — это инструмент с открытым исходным кодом для автоматического генерации серверной части .NET и Node.js приложений!

Он позволяет разработчикам быстро создавать API и соответствующую серверную логику, исключая необходимость вручную писать код для повторяющихся задач, таких как создание CRUD-операций, управление базой данных и аутентификация. Amplication ориентирован на ускорение разработки и избавление от рутины, предоставляя мощные возможности для конфигурирования и расширения с помощью плагинов и кастомных решений.
Гитхаб

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
#Собес #mongoDB
🤔 Что такое map-reduce в MongoDB и когда его следует использовать?

💬 Кратко:
Map-reduce в MongoDB - это парадигма обработки данных, состоящая из двух этапов:
🟠 Мар: Вы определяете функцию, которая обрабатывает каждый документ и выводит пары ключ-
значение.
🟠 Reduce: Вы определяете функцию, которая агрегирует или вычисляет данные на основе этих пар.

Map-reduce полезен для сложных операций агрегации, которые трудно выполнить с помощью
стандартных методов агрегирования MongoDB.

📌 Полный разбор + примеры использования — на платформе:
👉
Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
#полезное
😐 В .NET 9 может быть самая удобная платформа для микросервисов и вот почему.

Обычно команды тратят недели, чтобы собрать в кучу отказоустойчивость, наблюдаемость, сервис-дискавери и API-шлюзы.

В .NET 9 всё это уже есть из коробки.

🔴 Resilience
Встроенные ретраи, таймауты и circuit breakers, без сторонних библиотек.

🔴 Observability
Поддержка OpenTelemetry из коробки. Трассировки, метрики и логи без лишних усилий.

🔴 .NET Aspire
Cloud-native стек для быстрых распределённых систем.

🔴 Service Discovery
Можно использовать логические имена сервисов вместо жёстко прописанных URL. В рантайме они резолвятся через конфиг.

🔴 API Gateway
YARP — лёгкий reverse proxy, который работает и как API-шлюз, с минимальной настройкой.

Если вы строите микросервисы на .NET, больше не нужно собирать инфраструктуру вручную.
Подробности: ссылка

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😐 Как включить DATAS в .NET 8

Dynamic adaptation to application sizes (DATAS) по умолчанию включен в dotnet 9, и многие приложения благодаря этому заметно сократили потребление памяти.

В .NET 8 можно включить его через настройку выше.

Не забудь прогнать бенчмарки своего сценария до и после.

https://learn.microsoft.com/en-us/dotnet/standard/garbage-collection/datas

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
😍1
#Собес #mongoDB
🤔 Объясните концепцию уровня подтверждения записи (write concern) в MongoDB.

💬 Кратко:
Уровень подтверждения записи (write concern) в MongoDB определяет, сколько узлов репликационного набора должны подтвердить выполнение операции записи (вставка, обновление, удаление), чтобы она считалась успешной. Существует несколько уровней подтверждения:
🟠 Unacknowledged: Запись выполняется без ожидания подтверждения.
🟠 Acknowledged: Ожидается подтверждение от основного узла.
🟠 Majority: Ожидается подтверждение от большинства узлов репликационного набора, что гарантирует сохранность данных.

📌 Полный разбор + примеры использования — на платформе:
👉
Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
#полезное
👋 Малоизвестная фича в C# — type alias

Она позволяет давать новое имя уже существующему типу.
Мы использовали её в крупном проекте по модернизации, где было море конфликтов типов, и это реально спасло.

Причём alias работает даже с кортежами.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😵 Мало кто из разработчиков знает про Dynamic Authorization в ASP.NET Core

В ASP.NET Core, помимо Role-Based и Claims-Based подходов, можно использовать Dynamic Authorization

Это когда доступ к ресурсу зависит не только от роли пользователя, но и от его атрибутов, самого ресурса и окружения.

Примеры: автор может редактировать только свои книги, а региональный менеджер управляет данными только в своём регионе.

Реализуется это через Attribute-Based Authorization с IAuthorizationRequirement и AuthorizationHandler.

Подход полезен там, где нужно гибкое и контекстное управление правами.

Подробнее про best practices в ASP.NET Core читай тут

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
#полезное
😵 Docker + .NET pro tip

Для .NET приложений используйте многоступенчатую сборку: сначала компилируем и публикуем, потом копируем только готовые бинарники в минимальный рантайм-образ.


# Этап сборки
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY *.csproj .
RUN dotnet restore
COPY . .
RUN dotnet publish -c Release -o /app/publish

# Этап финального образа
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "MyApp.dll"]

Преимущества:

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

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
#Собес #mongoDB
🤔 Как выполнять текстовый поиск в MongoDB?

💬 Кратко:
B MongoDB для текстового поиска используется оператор $text и текстовые индексы. Чтобы выполнить текстовый поиск:
🟠 Создайте текстовый индекс на одном или нескольких полях коллекции.
🟠 Используйте оператор $text в запросе для поиска по индексированным полям.

📌 Полный разбор + примеры использования — на платформе:
👉
Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
#полезное
📞 Monolith или microservices — не вопрос "что лучше".

Важно другое: каждая архитектура даёт свои плюсы и минусы.

Когда нужны микросервисы:
- независимые деплои
- разные технологии под сервисы
- гибкое масштабирование по частям

Все остальные выгоды можно получить и в монолите. Поэтому мой выбор чаще всего — modular monolith: проще, дешевле, без лишней сложности.

Подробнее: https://milanjovanovic.tech/modular-monolith-architecture?utm_source=X&utm_medium=social&utm_campaign=01.09.2025

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😎 Как писать условные и при этом читаемые запросы?

Всё что нужно, это выражение CASE.

Оно работает так же, как if else if else в C#. Как только условие срабатывает, чтение останавливается и возвращается результат, если ни одно условие не выполнилось, возвращается значение из ветки ELSE.

Главный плюс CASE в том, что уменьшается количество обращений к данным в базе, не нужно писать несколько разных запросов с разными условиями, достаточно одного CASE и одного запроса, чтобы получить нужные значения.

Кроме того, CASE полезен, если у вас несколько ORDER BY для многоуровневой сортировки.

Но есть важный момент, который я сам однажды понял на практике, использовать CASE лучше в SELECT, а не в WHERE.

Почему? потому что WHERE почти всегда работает быстрее для фильтрации строк.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
#Собес #mongoDB
🤔 Какие типы индексов существуют в MongoDB?

💬 Кратко:
B MongoDB существуют следующие типы индексов:
🟠 Индекс на одно поле (Single-field)
🟠 Составной индекс (Compound index)
🟠 Текстовый индекс (Text index)
🟠 Геопространственный индекс (Geospatial index)
🟠 Хешированный индекс (Hashed index)|
🟠 Шаблонный индекс (Wildcard index)|
🟠 Индекс с временем жизни (TTL index)

📌 Полный разбор + примеры использования — на платформе:
👉
Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
This media is not supported in your browser
VIEW IN TELEGRAM
Карто-ориентированное программирование

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
#полезное
😇 Фича дня в EF Core — алгоритм Hi/Lo.

Он позволяет генерировать идентификаторы на клиентской стороне, за счёт чего уменьшается количество обращений к базе и снижается конкуренция за блокировки.

Работает это так. Приложение не берёт каждый новый ID отдельно, а запрашивает у базы целую пачку. В самой базе хранится hi_value, который отражает максимальный выданный идентификатор. Когда приложению нужна новая порция, оно начинает с hi_value + 1.

Минус в том, что могут появиться пропуски в последовательности, если приложение упадёт до того, как израсходует все ID из своей пачки, но это не критично.

Включается всё через метод UseHiLo, который создаёт в базе sequence для выдачи батчей идентификаторов. После этого EF Core может сам задавать все первичные ключи на клиенте, что особенно удобно для parent/child-отношений.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😇 Слышал о новом типе UUID?

Я часто использую UUID (Guid в C#) как уникальные идентификаторы в базе.

Они удобны тем, что «рандомные», но есть и минусы.

Во-первых, они занимают много памяти — Guid в C# весит 16 байт.
Кроме того, индексы с такими значениями могут фрагментироваться, так как они не сортируемые.

Теперь появился UUID V7. Он сортируемый, потому что в нем есть компонент времени.

Его можно создать в .NET 9 через Guid.CreateVersion7

Также он будет поддерживаться нативно в PostgreSQL 18.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
#Собес #mongoDB
🤔 Что такое агрегатный конвейер (aggregation pipeline) в MongoDB и как он работает?

💬 Кратко:
Агрегатный конвейер в MongoDB представляет собой последовательность этапов, каждый из которых выполняет операцию на входных документах и передает результат следующему этапу. Этапы могут включать фильтрацию ( $match ), группировку ( $group ), сортировку ($sort ), проекцию ( $project ) и другие. Это позволяет выполнять сложные преобразования и агрегации данных.

📌 Полный разбор + примеры использования — на платформе:
👉
Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
👋 .NET Aspire позволяет запускать фронтенд прямо из Vite

В Community Toolkit появился пакет
Aspire.Hosting.NodeJS.Extensions, который позволяет интегрировать Node.js-приложения в .NET Aspire.

Что он даёт:
🟠 Запуск Vite-приложений напрямую из Aspire.
🟠 Поддержка npm, Yarn и pnpm — выбирай свой пакетный менеджер.
🟠 Автоустановка зависимостей перед стартом (`WithNpmPackageInstallation()`, WithYarnPackageInstallation(), `WithPnpmPackageInstallation()`).
🟠 Лёгкая интеграция фронтенда и бэкенда: всё управляется из одного места.

Пример кода:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddViteApp("vite-demo")
.WithExternalHttpEndpoints();

builder.AddViteApp("yarn-demo", packageManager: "yarn")
.WithExternalHttpEndpoints();

builder.AddViteApp("pnpm-demo", packageManager: "pnpm")
.WithExternalHttpEndpoints();

builder.Build().Run();


💡 Итог: теперь запуск React/Vue/Angular через Vite можно встроить прямо в Aspire, без лишних шагов и костылей.
Подробнее

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2