C# (C Sharp) programming

Логотип телеграм канала @csharp_ci — C# (C Sharp) programming C
Актуальные темы из канала:
Пятничныйквиз
Architecture
Backend
Dotnet
Efcore
Repositorypattern
Квиз
Ai
Tencent
Aitools
All tags
Логотип телеграм канала @csharp_ci — C# (C Sharp) programming
Актуальные темы из канала:
Пятничныйквиз
Architecture
Backend
Dotnet
Efcore
Repositorypattern
Квиз
Ai
Tencent
Aitools
All tags
Адрес канала: @csharp_ci
Категории: Технологии
Язык: Русский
Количество подписчиков: 18.75K
Описание канала:

По всем вопросам- @haarrp
C# - обучающий канал Senior C# разработчика.
@ai_machinelearning_big_data - Machine learning
@itchannels_telegram - 🔥лучшие ит-каналы
@csharp_ci - C# академия
@pythonlbooks- книги📚
Реестр РКН: https://clck.ru/3Fk3kb

Рейтинги и Отзывы

4.00

2 отзыва

Оценить канал csharp_ci и оставить отзыв — могут только зарегестрированные пользователи. Все отзывы проходят модерацию.

5 звезд

1

4 звезд

0

3 звезд

1

2 звезд

0

1 звезд

0


Последние сообщения

16 янв
В .NET кэш - это всегда выбор: максимальная скорость или единые данные между серверами.

IMemoryCache
Очень быстрый
Работает только внутри одной ноды
(в кластере из 10 серверов у вас 10 разных кэшей)

Redis / IDistributedCache
Один общий кэш на все ноды - данные одинаковые
Медленнее: сеть + сериализация + лишние накладные расходы

Правильный подход - Hybrid Cache.

Он не заставляет выбирать - он комбинирует оба мира:

- L1 (Local / RAM) - сначала читаем из памяти приложения (самый быстрый слой)
- L2 (Distributed / Redis) - если локально нет, идём в общий кэш
- Source (DB/API) - если нет и там, берём из источника и прогреваем оба уровня

скорость как у MemoryCache
данные согласованы между нодами как в Redis
меньше нагрузки на БД и меньше «холодных» запросов

Microsoft делает нативный HybridCache, но если нужно решение уже сейчас - FusionCache остаётся самым надёжным и реально продакшн-готовым вариантом.

Гайд
2.26K views11:10
Подробнее
Поделиться:
Открыть/Комментировать
16 янв
Открытый урок «Сетевой чат на C#».

22 января в 20:00 МСК
Бесплатно. Урок в рамках старта курса «C# Developer».

На вебинаре:
Рассмотрим написание сетевого приложения на C#.
Мы реализуем простые клиент и сервер с помощью одного из сетевых протоколов.
Также затронем темы многопточности и асинхронности

Кому будет полезно:
• Вебинар будет полезен начинающим разработчикам, желающим разобраться в сетевом и многопочном\асинхронном программировании.

Что вы получите:
• По итогам вебинара смогут проектировать сетевые приложения.
• Получат представление о работе сетевых протоколов, и многопоточности\асинхронности в приложениях.
• На практике попробуют разработать такое приложение.

Ссылка на регистрацию: https://otus.pw/zifo/?erid=2W5zFJaPXHA

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
2.21K views10:07
Подробнее
Поделиться:
Открыть/Комментировать
16 янв
#ПятничныйКвиз
2.35K views07:57
Подробнее
Поделиться:
Открыть/Комментировать
15 янв
Не все стратегии балансировки нагрузки одинаково полезны.

Если ты используешь YARP (Yet Another Reverse Proxy) в .NET - у него есть 5 встроенных способов распределять трафик между серверами. Но какой выбрать?

Вот понятный разбор:

1) RoundRobin (по кругу)
Классика: запросы равномерно идут по очереди на каждый сервер.
просто
плохо работает, если сервера/запросы не одинаковые по скорости

2) LeastRequests (минимум активных запросов)
Самый “умный” вариант: отправляет запрос туда, где сейчас меньше всего работы.
отлично при разном времени обработки запросов
помогает снизить задержки на “хвосте” (tail latency)

3) Random (случайно)
Сервер выбирается случайно.
неожиданно хорошо работает при большом потоке однотипных запросов
может иногда “не повезти” и нагрузить один сервер сильнее

4) PowerOfTwoChoices (2 случайных - выбираем лучший)
Баланс между качеством и стоимостью: берём 2 случайных сервера и выбираем тот, где меньше активных запросов.
почти как LeastRequests, но дешевле по логике
не надо проверять все сервера каждый раз

5) FirstAlphabetical (первый доступный)
Всегда выбирает “первый” сервер из списка (условно самый верхний/раньше по имени).
хорошо для failover (есть основной сервер, остальные - запасные)
плохо распределяет нагрузку (по сути почти без балансировки)

Большинство по привычке ставят RoundRobin, но если время обработки запросов разное - переход на LeastRequests часто заметно улучшает tail latency.

Разбор с примерами, как масштабировать ASP.NET Core API через YARP

А какая стратегия у тебя по умолчанию?
2.56K viewsedited  11:04
Подробнее
Поделиться:
Открыть/Комментировать
13 янв
Обещанного 3 года ...
3.85K views11:03
Подробнее
Поделиться:
Открыть/Комментировать
11 янв
.NET 9 стал гораздо устойчивее к сбоям

В .NET 9 появились официальные пакеты для отказоустойчивости:

- Microsoft.Extensions.Resilience
- Microsoft.Extensions.Http.Resilience

Они построены поверх Polly, поэтому API знакомый - легко описывать политики:

- retry
- circuit-breaker
- fallback
- timeout
- hedging
- rate limiter

Подключаете и ваши HTTP-клиенты и сервисы автоматически восстанавливаются при сетевых ошибках и таймаутах.

Итог: меньше падений и больше стабильности. Отлично для продакшена
4.85K views09:01
Подробнее
Поделиться:
Открыть/Комментировать
9 янв
Какие строки выведутся и в каком порядке(override + overload + dynamic)


using System;

class Base
{
public virtual void Foo(object o) => Console.WriteLine("Base.Foo(object)");
}

class Derived : Base
{
public override void Foo(object o) => Console.WriteLine("Derived.Foo(object)");
public void Foo(string s) => Console.WriteLine("Derived.Foo(string)");
}

class Program
{
static void Main()
{
Base b = new Derived();

b.Foo("A");

((Derived)b).Foo("A");

dynamic d = b;
d.Foo("A");

object x = "A";
d.Foo(x);

d.Foo(null);
}
}


Ответ:

Derived.Foo(object)
Derived.Foo(string)
Derived.Foo(string)
Derived.Foo(string)
Derived.Foo(string)


Пояснение:

1) b.Foo("A")
Статический тип переменной - Base.
Компилятор видит только Foo(object).
Вызов виртуальный, поэтому выполняется override:
Derived.Foo(object)

2) ((Derived)b).Foo("A")
Статический тип - Derived.
Есть перегрузка Foo(string), она точнее для string:
Derived.Foo(string)

3) dynamic d = b; d.Foo("A")
dynamic откладывает выбор метода до runtime.
Реальный тип объекта - Derived.
Реальный тип аргумента - string:
Derived.Foo(string)

4) object x = "A"; d.Foo(x)
Для dynamic учитывается реальный тип аргумента.
x содержит string:
Derived.Foo(string)

5) d.Foo(null)
null подходит и для object, и для string.
string - более специфичный тип:
Derived.Foo(string)
4.44K viewsedited  10:38
Подробнее
Поделиться:
Открыть/Комментировать
8 янв
Как просто добавить multi-tenant в .NET через заголовок запроса

Иногда нужно понимать, какому клиенту (tenant) принадлежит запрос.

Самый простой вариант - передавать X-TenantId в HTTP-заголовке и читать его в сервисе.

Пример сервиса:


public sealed class TenantProvider
{
private const string TenantIdHeaderName = "X-TenantId";
private readonly IHttpContextAccessor _httpContextAccessor;

public TenantProvider(IHttpContextAccessor httpContextAccessor)
=> _httpContextAccessor = httpContextAccessor;

public string TenantId =>
_httpContextAccessor.HttpContext.Request.Headers[TenantIdHeaderName];
}
3.96K views11:25
Подробнее
Поделиться:
Открыть/Комментировать
7 янв
C# стал языком 2025 года по версии TIOBE.

Индекс TIOBE подвел итоги года: звание «Язык 2025 года» досталось C#, который показал рекордный рост популярности (+2.94%)? однако в общем зачете он по-прежнему занимает 5-ю строчку. Абсолютным лидером остается Python с 22.61% долей рынка.

В первой пятерке произошли перестановки: язык C поднялся на 2 место, сместив C++ на 4-ю позицию; 3 место досталось Java, а R вернулся в топ-10. Провал года - Go, который неожиданно сдал позиции, опустившись сразу на 16-е место.

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

https://www.tiobe.com/tiobe-index/
7.72K views06:11
Подробнее
Поделиться:
Открыть/Комментировать
5 янв
В EF Core есть штука, о которой многие забывают: CompileAsyncQuery.

С её помощью можно заранее скомпилировать LINQ-запрос,а потом выполнять его асинхронно: быстрее и без лишнего overhead’а.

И важный еще момент:
вам не нужно писать отдельную “async-версию” самого LINQ-запроса.
EF сам оборачивает выполнение в асинхронный пайплайн. Немного странно, но работает.

Пример:

private static Func> GetByTitle =
EF.CompileAsyncQuery(
(AppDbContext context, string title) =>
context.Set()
.FirstOrDefault(c => c.Title == title)
);

public async Task GetNewsletterByTitleAsync(string title)
{
return await GetByTitle(this, title);
}


Что получаем:

• повторные запросы выполняются быстрее
• нет лишней компиляции выражений
• async-подход сохраняется

Если в проекте есть часто вызываемые запросы - Compiled Queries могут дать хороший прирост производительности, особенно под нагрузкой.
4.75K views10:01
Подробнее
Поделиться:
Открыть/Комментировать
2 янв
В какой строке возникнет первое исключение?

#ПятничныйКвиз
5.07K viewsedited  07:40
Подробнее
Поделиться:
Открыть/Комментировать
29 дек 2025
Как делать code review, которые находят реальные баги, а не только придираются к стилю

Большинство code review застревают на форматировании, нейминге и мелочах. В итоге реальные проблемы - логические ошибки, гонки, неправильные инварианты - проходят мимо.

Идея правильного code review:
— Проверять поведение кода, а не его внешний вид
— Искать сценарии отказа, а не соответствие линтеру
— Думать как система, а не как форматтер

Что реально стоит смотреть на ревью:
• Граничные случаи и ошибки в бизнес-логике
• Null / empty сценарии и некорректные состояния
• Побочные эффекты и порядок операций
• Работа с асинхронностью, транзакциями и ресурсами
• Соответствие инвариантам доменной модели

Инструменты с AI-ассистентами для code review помогают сместить фокус:
— меньше шума про стиль
— больше внимания к логике и потенциальным багам
— автоматические подсказки прямо в PR

Хороший code review — это не «код красивый»,
а «код не сломается в проде».
2.08K views10:00
Подробнее
Поделиться:
Открыть/Комментировать
27 дек 2025
Интеграционные тесты прямо в CI/CD - максимум уверенности в коде

Я запускаю интеграционные тесты прямо внутри CI/CD пайплайна.
Так я проверяю не абстракции и моки, а реальное поведение системы.

Всё это возможно благодаря:
- Docker
- Testcontainers

Идея простая:
ты поднимаешь реальные внешние сервисы как контейнеры и используешь их прямо в тестах.

В примере поднимаются:
- PostgreSQL
- Redis
- Keycloak

Контейнеры:
- автоматически стартуют перед тестами
- доступны из кода приложения
- уничтожаются после выполнения тестов

Почему это работает лучше моков:
- тесты максимально близки к продакшену
- одинаковое поведение локально и в CI
- сразу ловятся проблемы с конфигурацией, миграциями, auth
- меньше сюрпризов после деплоя

Особенно полезно для:
- backend-сервисов
- микросервисной архитектуры
- систем с авторизацией и внешними зависимостями
- .NET-приложений с серьёзной бизнес-логикой

Если хочешь вывести интеграционное тестирование в .NET на новый уровень — Testcontainers стоит попробовать обязательно.

#dotnet, #testing
2.54K views10:01
Подробнее
Поделиться:
Открыть/Комментировать
25 дек 2025
В мире #dotnet есть куда больше вариантов для messaging, чем RabbitMQ и Kafka.

И для real-time систем эти инструменты часто избыточны.

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

Здесь идеально заходит NATS.

NATS - лёгкая и сверхбыстрая система обмена сообщениями, спроектированная именно для real-time:
- минимальная латентность
- простая модель
- высокая масштабируемость

Отлично подходит для:
- телеметрии и sensor data
- live-обновлений
- edge-систем
- сценариев, где важно «сейчас», а не «через секунду»

В статье подробно разобрано:
- когда NATS имеет смысл (а когда нет)
- сравнение с RabbitMQ и Kafka
- использование NATS в .NET с понятными примерами кода
- Pub/Sub, queue groups и request–reply

https://thecodeman.net/posts/introduction-to-nats-real-time-messaging
3.2K views10:05
Подробнее
Поделиться:
Открыть/Комментировать
23 дек 2025
3 простые оптимизации, которые реально ускоряют код

Забирай данные пачкой
Меньше запросов — меньше сетевых задержек.
Вместо десятков запросов — один IN (...).

Делай больше параллельно
Если задачи не зависят друг от друга — выполняй их одновременно.
Асинхронность часто даёт бесплатный прирост скорости.

Кэшируй результаты
Если данные не меняются — не пересчитывай и не запрашивай их заново.
Память дешевле времени.

Никакой магии и сложных алгоритмов — просто базовые приёмы, которые в реальных проектах дают самый заметный эффект.
4.26K views10:04
Подробнее
Поделиться:
Открыть/Комментировать
21 дек 2025
Feature Flags в .NET - как управлять релизами без redeploy

Feature flags (фиче-флаги) позволяют включать и выключать функциональность на лету, без повторного деплоя и риска для продакшена.

Идея простая:
код задеплоен → поведение управляется конфигурацией.

Что это даёт на практике:
— Постепенные релизы
Можно включить новую фичу сначала для 1%, 10% или конкретной группы пользователей.
— Быстрый rollback
Если что-то пошло не так — просто выключаете флаг. Без откатов и срочных хотфиксов.
— A/B тесты
Разные пользователи получают разное поведение одного и того же кода.
— Targeting пользователей

Фичи можно включать:
• по user id
• по роли
• по региону
• по environment (dev / staging / prod)

— Меньше фиче-веток
Код живёт в main, а не за флагами в git.

В .NET обычно используют:
- Microsoft.FeatureManagement
- Azure App Configuration
- LaunchDarkly / Unleash / ConfigCat

Где это особенно полезно:
- публичные API
- high-traffic сервисы
- SaaS-продукты
- экспериментальные и рискованные фичи

Коротко:
Feature flags превращают релиз из «одного опасного момента» в управляемый процесс.

Это один из самых мощных инструментов для зрелой backend-архитектуры.

Подробнее
3.84K views10:04
Подробнее
Поделиться:
Открыть/Комментировать
19 дек 2025
#ПятничныйКвиз
3.63K views06:04
Подробнее
Поделиться:
Открыть/Комментировать
18 дек 2025
Инструмент для перехвата сессий в C#

SessionHop — это утилита на C#, использующая COM-объект IHxHelpPaneServer для перехвата пользовательских сессий. С помощью создания "сессионного моникера" и интерфейса Execute можно запускать произвольные файлы в контексте другой сессии, что полезно для таких задач, как кейлоггинг или скриншоты.

Основные моменты:
- Перехват сессий пользователей с помощью COM-объекта.
- Запуск файлов в контексте другой сессии.
- Альтернатива удаленному инжектированию процессов.
- Полезен для доступа к ресурсам как затронутый пользователь.

GitHub: https://github.com/3lp4tr0n/SessionHop

#csharp
3.75K views16:07
Подробнее
Поделиться:
Открыть/Комментировать
18 дек 2025
Задачи точного покрытия — фундамент для многих алгоритмических подходов. Но пока теория лежит на полке, она мало что меняет в вашем инженерном мышлении

На открытом уроке мы разберем Dancing Links через практику: соберем пентамино на столе, представим фигуры в виде строк матрицы и разберемся, как работает поиск с возвратом. Когда алгоритм становится наглядным, вы начинаете понимать, что на самом деле происходит внутри.

Если вы хотите развивать алгоритмическое мышление, системно улучшать свои решения и уверенно чувствовать себя в задачах уровня middle+, такие разборы — обязательная часть роста.

Встречаемся 22 декабря в 20:00 МСК в преддверие старта курса «Алгоритмы и структуры данных», регистрация открыта: https://tglink.io/3be365254757?erid=2W5zFHNTeic

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
3.26K views14:03
Подробнее
Поделиться:
Открыть/Комментировать
18 дек 2025
Синтаксическое сжатие строк даёт больше вертикального пространства в редакторе. Строки без букв и цифр сжимаются на 25%, благодаря чему на экране помещается больше кода без потери читаемости.

Скоро в Visual Studio.
3.24K views08:10
Подробнее
Поделиться:
Открыть/Комментировать
18 дек 2025
Открытый урок «Основы работы с Telegram API».

25 декабря в 20:00 МСК
Бесплатно. Урок в рамках старта курса «C# Developer».

На вебинаре:
Рассмотрим общие вопросы посвященные работе c API, WEB API .
Более подробно познакомимся с работой Telegram API , позволяющей создавать ботов для Telegram.

Кому будет полезно:
- Для начинающих разработчиков, которые хотят создать своего первого бота для Telegram.

Что вы получите:
К концу занятия мы получим необходимые знания и умения для написания консольного приложения работающего с Telegram API, создадим Telegram бота.

Ссылка на регистрацию: https://otus.pw/ZC0M/?erid=2W5zFGtDrat

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
3.2K views07:02
Подробнее
Поделиться:
Открыть/Комментировать
17 дек 2025
Многим C#-разработчикам знакома боль: в проекте хаос из имён классов, обработчиков, сервисов. Общих правил нет, каждый пишет как хочет — и через полгода код сложно читать даже автору.

Есть практичное решение: архитектурные тесты, которые автоматически проверяют соблюдение naming conventions.

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

Такую технику можно использовать для:
- сервисов (`...Service`)
- хендлеров (`...Handler`)
- репозиториев (`...Repository`)
- DTO/Queries/Commands
- модульных границ и зависимости между слоями

Это простой способ навести порядок в архитектуре, а не надеяться только на дисциплину команды.

Пример теста (C#):


public void CommandHandler_ShouldHave_NameEndingWith_CommandHandler()
{
Types.InAssembly(ApplicationAssembly)
.That()
.ImplementInterface(typeof(ICommandHandler<>))
.Or()
.ImplementInterface(typeof(ICommandHandler<,>))
.Should()
.HaveNameEndingWith("CommandHandler")
.GetResult()
.ShouldBeSuccessful();
}


Такие архитектурные проверки избавляют от стихийных ошибок и делают кодовую базу предсказуемой — особенно в больших командах и долгоживущих проектах.
3.36K views10:01
Подробнее
Поделиться:
Открыть/Комментировать
15 дек 2025
ASP.NET Core лайфхак: если нужно получить данные текущего пользователя в любом слое приложения — внедри IHttpContextAccessor и оберни его в сервис UserContext.

Так ты централизуешь доступ к UserId и статусу авторизации без прямых обращений к HttpContext, а при отсутствии контекста сразу получишь исключение вместо тихих ошибок.


/// Пример класса контекста пользователя
internal sealed class UserContext(IHttpContextAccessor httpContextAccessor)
: IUserContext
{
public Guid UserId =>
httpContextAccessor
.HttpContext?
.User
.GetUserId() ??
throw new ApplicationException("User context is unavailable");

public bool IsAuthenticated =>
httpContextAccessor
.HttpContext?
.User
.Identity?
.IsAuthenticated ??
throw new ApplicationException("User context is unavailable");
}
1.91K views10:04
Подробнее
Поделиться:
Открыть/Комментировать
13 дек 2025
Delegating Handlers в .NET: как правильно добавлять сквозную логику для HttpClient

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

Пример обработчика аутентификации:

- добавляет заголовок Authorization
- подставляет корректный User-Agent
- затем передаёт управление следующему звену конвейера

Это позволяет централизованно контролировать конфигурацию запросов и избегать дублирования логики во всех сервисах.

Подходит для чистой архитектуры, микросервисов и SDK, где важна единообразная обработка запросов.
2.37K views10:03
Подробнее
Поделиться:
Открыть/Комментировать
11 дек 2025
Cursor-пагинация действительно очень быстрая - в тестах она оказалась в 17 раз быстрее**, чем классическая offset-пагинация.

Но использовать её нужно не всегда. Вот почему.

Что такое cursor-пагинация
Она работает через «точку отсчёта» - курсор.
Это может быть уникальный идентификатор или набор полей, по которым сортируются записи.
Фронтенд передаёт курсор, и сервер возвращает следующую порцию данных, начиная строго после него.

Почему она быстрая
- Серверу не нужно пересчитывать offset и пропускать тысячи строк.
- Он просто выбирает данные «после курсора».
- Это даёт стабильную производительность даже на больших таблицах.

Но есть нюанс
Cursor-пагинация отлично подходит для:
- лент обновлений
- real-time интерфейсов
- бесконечной прокрутки

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

Вот подробный разбор с реализацией и тестами.
2.98K views10:00
Подробнее
Поделиться:
Открыть/Комментировать
10 дек 2025
C# Pattern Matching — делает ваш код чище

Вместо громоздких проверок вида:


if (user != null &&
user.Name.Length > 0 &&
user.Subscription != null)
{
// ...
}

C# позволяет писать проще и выразительнее:

if (user is { Name.Length > 0, Subscription: not null })
{
// ...
}


Что изменилось?

Нет ручных проверок на null - компилятор сам учитывает это в выражении
Условие читается как описание объекта, а не как набор проверок
Логика становится компактнее и легче сопровождается

Используйте pattern matching, чтобы избавляться от лишнего шума и писать более понятный код.
3.01K views10:01
Подробнее
Поделиться:
Открыть/Комментировать
9 дек 2025
Почти 50 процентов разработчиков сталкиваются с утечками памяти в EF Core.
И причина у большинства одна и та же.

Ошибочное управление временем жизни DbContext

Многие регистрируют DbContext как scoped и считают что этого достаточно.
На деле всё сложнее.

- DbContext не потокобезопасен.
Делить один экземпляр между потоками приводит к исключениям.

- DbContext лёгкий и должен жить недолго.
Создавай его часто, освобождай сразу.

- Неверная работа с контекстом ведёт к росту памяти и утечкам.

Решения которые уже есть в EF Core

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

DbContext Pooling
Переиспользует заранее подготовленные экземпляры.
Сбрасывает состояние после использования, снижает нагрузку на память и процессор.

Pooled DbContextFactory
Комбинирует фабрику и пул.
Даёт контексты по запросу и эффективно их переиспользует.

Правила которые нельзя нарушать

- Никогда не дели DbContext между потоками.
- Всегда освобождай контекст с помощью using или возврата в пул.

Грамотное управление жизненным циклом DbContext повышает стабильность и масштабируемость и убирает скрытые утечки памяти которые годами портят EF Core проекты.

https://antondevtips.com/blog/top-10-mistakes-developers-make-in-ef-core/
2.67K views15:25
Подробнее
Поделиться:
Открыть/Комментировать
9 дек 2025
44 000 000+ операций c товарами осуществляется на складских объектах Ozon. Лучший способ влиять на то, как эти товары находят дорогу к покупателям, — откликнуться на одну из этих вакансий.

В команду расписания и отгрузки магистрали:
Руководитель группы разработки C#
Старший C#-разработчик

В команду коммерциализации логистики:
Старший C#-разработчик

В команду учётной интеграции и претензионной работы:
Руководитель группы разработки C#
Старший C#-разработчик
C#-разработчик

Удачи на интервью!
2.61K views13:15
Подробнее
Поделиться:
Открыть/Комментировать
9 дек 2025
Annotation Toolkit помогает дизайнерам прямо в макете объяснить, как должны работать элементы интерфейса.

Проще говоря, он позволяет:

подписывать элементы: что кликается, что меняется, как ведёт себя при разной ширине экрана;

сразу указать требования по доступности: например, какой alt-текст нужен или что должно быть доступно с клавиатуры;

убрать путаницу при передаче макета разработчикам, чтобы они точно понимали задумку.

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

https://github.blog/enterprise-software/collaboration/level-up-design-to-code-collaboration-with-githubs-open-source-annotation-toolkit/
2.8K views10:02
Подробнее
Поделиться:
Открыть/Комментировать
7 дек 2025
Async-блокировки в C# - тема, на которой часто «ловят» на собеседованиях.

Синхронный lock не работает с async/await, и многие пытаются заменить его чем угодно, лишь бы компилилось. Правильный путь — использовать SemaphoreSlim с WaitAsync, как на примере: он позволяет ограничивать конкуренцию и работает корректно в асинхронном коде.

Главное — всегда освобождать семафор в finally и не забывать про таймауты, чтобы не создавать висячие блокировки.

Асинхронная синхронизация — это не магия, а аккуратность и понимание того, как работает планировщик задач в .NET.
3.4K views10:01
Подробнее
Поделиться:
Открыть/Комментировать