Библиотека шарписта | C#, F#, .NET, ASP.NET
22.2K subscribers
2.68K photos
41 videos
85 files
4.99K links
Все самое полезное для C#-разработчика в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/b60af5a4

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
Download Telegram
Что выведет код

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

Посмотреть ответ 👉 в нашем канале

📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта

#dotnet_challenge
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱20🌚1
📄 Забытое искусство XML

Наткнулись на статью, которая ставит под сомнение один из главных технологических трендов последних лет — отказ от XML в пользу JSON.

XML был отвергнут не из-за технической неполноценности, а потому что победил JavaScript.

Что мы потеряли, отказавшись от XML:

• Схемы и валидация — XSD позволяет проверять типы и структуру данных на уровне документа, до парсинга. JSON Schema существует, но это сторонняя надстройка, которая так и не стала стандартом.

• Пространства имён — можно комбинировать документы из разных схем без конфликтов. В JSON приходится импровизировать с префиксами.

• Комментарии — в XML они есть изначально. JSON их запрещает, потому что они усложняют парсинг.

• Самодокументирование — XML-документ содержит или явно ссылается на свою схему. В JSON приходится гадать, что значит "status": 1.

Вместо того чтобы использовать XML, мы потратили миллиарды на создание библиотек валидации, TypeScript, генераторов API-клиентов — по сути, воссоздавая то, что уже было в XML.

Microsoft, несмотря на все критику, продолжали использовать XML для MSBuild, WPF, и системы конфигурации .NET Framework. Переход на JSON в .NET Core случился не потому что XML был плох, а под давлением модных трендов.

📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта

#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26🤔6
⭐️ Нестандартные форматы резюме для шарписта

Рынок IT вакансий в 2026 году переполнен кандидатами с похожими PDF резюме. Рекрутеры тратят на просмотр отклика секунды, и стандартный формат часто теряется в потоке.

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

➡️ Все 6 форматов в статье

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

📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Задачи копятся, а ты всё ещё вручную «жаришь» контроллеры под каждый промпт?

Это работа в забегаловке. Настоящий Шеф не пишет услуги вечно — он проектирует Систему. 💠

В понедельник, 26 января, стартует интенсив по разработке ИИ-агентов. Мы научим создавать автономные решения в экосистеме .NET, которые закроют рутину, пока ты занимаешься архитектурой.

В программе:

— мультиагентные системы в CrewAI: делегирование рутины и контроль логики;
— сложная логика в LangGraph: стейт-менеджмент и работа с графами;
tool use интеграция: связь агентов с вашим API, БД и облаком. ⚡️

Записаться на курс
🥱51
🟥 Новостной дайджест

Выходные выходными, но новости должны быть по расписанию.

Быстрая загрузка Windows 95

NBomber 6.2.0

Ghostty почти запретил ИИ-генерированный код

Разработчик терминала Ghostty Митчелл Хашимото ужесточил правила: теперь любой PR с кодом от ИИ вроде Claude или Cursor требует раскрытия использования модели, полного тестирования человеком и предварительного одобрения issues, а нарушителей грозит бан и публичное осмеивание.

Microsoft выпустили WinApp

Новый открытый инструмент WinApp CLI упрощает жизнь разработчикам на кросс-платформенных фреймворках вроде Electron, Rust или Dart, избавляя от ручной настройки SDK, манифестов, сертификатов и упаковки в MSIX.

Chrome в Windows 11 скоро позволит перетаскивать несколько файлов из веб-приложений в Проводник

📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
3
Завтра стартуем: курс по разработке ИИ-агентов в .NET 💠

Хватит писать бойлерплейт — переходите к архитектуре автономных систем. Мы научим проектировать мультиагентные связки на CrewAI, управлять стейтом в LangGraph и подключать нейросети к вашим API и облаку.

👉 Успейте занять место до начала занятий
🌚7👾2
⚡️ Урок про боксинг в C#

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

Код с подвохом:
struct StackValue
{
public override bool Equals(object obj)
{
if (Object.ReferenceEquals(this, obj))
return true;

if (!(obj is StackValue))
return false;

var value = (StackValue)obj;
return this.Kind == value.Kind
&& this.Flags == value.Flags
&& this.Type == value.Type;
}
}


На первый взгляд всё логично: сначала быстрая проверка через ReferenceEquals, если не сработала — сравниваем по полям.

В чём подвох

ReferenceEquals принимает параметры типа object. Когда вы передаёте структуру, происходит боксинг: значение копируется в хип и оборачивается объектом.

Что происходит при вызове Equals:

• this упаковывается в новый объект
• Создаётся уникальная ссылка в heap
• Сравниваются две разные ссылки
• Результат всегда false

В современных версиях .NET есть правило CA2013, которое отлавливает подобные случаи.

📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта

#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🥱31
👨‍💻 Паттерны проектирования — не для облачных систем

Классические design patterns из Банды четырёх часто вредят cloud-native приложениям.

Большинство классических паттернов проектирования создавались для in-process объектно-ориентированных систем — а не для распределённых, подверженных сбоям облачных окружений.

Но в 2026 году всё ещё встречаются облачные системы, построенные на репозиториях повсюду, синглтонах как кеше и фасаде, оборачивающем HTTP-вызовы.

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

Синглтон: самый опасный паттерн

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

Репозиторий тормозит запросы

Репозиторий абстрагирует данные, чтобы домен оставался чистым. В распределённых системах это плодит лишние вызовы через сеть, N+1 проблемы и перерасход ресурсов БД. Каждый запрос добавляет задержку и траты.

Лучше ориентироваться на запросы: оптимизировать чтение, использовать CQRS для доминирующего чтения и принимать форму данных как часть дизайна. Доступ к БД становится ключевой частью архитектуры, а не скрытой деталью.

Фабрика усложняет жизнь

Фабрики прячут создание объектов и типы. В облаке они дублируют DI-контейнеры, маскируют жизненный цикл и ломают трассировку. Если код полон фабрик, локаторов и инъекций, ясность теряется.

Платформы вроде Kubernetes берут управление lifecycle на себя. Делайте ресурсы явными, отдавайте композицию контейнерам и избегайте лишних прослоек.

Обдумывайте контекст перед копипастой паттернов. Это спасёт от боли при росте нагрузки.

💬 Был у вас шаблон, который подставил вас в облаке?

📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
😁84👍2🥱1
C#-разработчик? Пора осваивать AI-агентов

Экосистема .NET активно интегрирует ИИ (например, через Semantic Kernel). Наш курс поможет вам понять фундаментальные принципы построения автономных систем.

Начинаем сегодня в 19:00 МСК.

Основные темы:

— путь от базовых промптов до мультиагентных систем;
— использование инструментов и планирование задач;
— деплой и масштабирование своих ИИ-решений;
— работа с векторными хранилищами данных.

Занять место
😁7
🛠 PostgreSQL как Dead Letter Queue

История о том, как в Wayfair отказались от Kafka DLQ в пользу PostgreSQL и получили более управляемую систему обработки сбоев.

Проблема: события падают, а видимости нет

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

Первая попытка: Kafka как DLQ

Логичным решением было использовать сам Kafka в качестве Dead Letter Queue. Общий паттерн: если событие не обработалось, отправляем его в отдельный топик DLQ.
Но быстро стало ясно, что это не лучший вариант. Kafka отлично двигает данные, но когда сообщения попадают в DLQ-топик, с ними сложно работать:

• Нельзя просто взять и выполнить запрос «покажи всё, что упало вчера»
• Нет нормальной фильтрации по причине сбоя
• Чтобы повторить обработку конкретного набора событий, нужны кастомные консьюмеры
• Для любого анализа требуется дополнительный инструментарий

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

Решение: PostgreSQL как первоклассный DLQ

Вместо публикации сбойных событий в топик Kafka, начали сохранять их прямо в таблицу DLQ в PostgreSQL. CloudSQL уже использовался как основное хранилище, так что операционно это почти ничего не добавило. Концептуально же сбои стали первоклассными гражданами системы, а не непрозрачными сообщениями, потерянными в потоке.

Дизайн-решения

• payload как JSONB — сохраняет сырое событие без жёсткой схемы. Можно хранить любую структуру и при этом эффективно запрашивать.

• Простая модель состояний — только PENDING и SUCCEEDED. Минимализм делает жизненный цикл события понятным.

• retry_after — предотвращает агрессивные повторы, когда зависимые системы нестабильны.

• retry_count — позволяет ограничивать количество попыток без внешнего состояния. Если событие не обработалось за 240 попыток — возможно, с ним что-то фундаментально не так.

• Временные метки — делают аудит и операционный анализ простым делом.

Целью не было заменить Kafka на PostgreSQL. Kafka остался основой для высокопроизводительного приёма событий, а PostgreSQL взял на себя то, что умеет лучше всего — долговременность, запросы и наблюдаемость вокруг сбоев.

📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта

#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍3🤔3
💡 Мигающий светодиод за 10 строк кода

Работа с железом через .NET — это не просто про серверы и веб-приложения. С библиотекой Gpio вы можете управлять физическими устройствами напрямую с Raspberry Pi или других одноплатников.

Рассмотрим базовый пример: как заставить мигать светодиод.

Что понадобится

Минимальный набор компонентов: Raspberry Pi (или аналог с поддержкой .NET), светодиод на 5 мм, резистор 330 Ом, макетная плата и провода.

Как это работает

Схема собирается просто: плата подключается к аноду светодиода (длинная ножка), катод идёт через резистор на землю. Резистор ограничивает ток и защищает светодиод от выгорания.

В коде всего несколько строк:
using var controller = new GpioController();
controller.OpenPin(18, PinMode.Output);
bool ledOn = true;
while (true)
{
controller.Write(18, ledOn ? PinValue.High : PinValue.Low);
Thread.Sleep(1000);
ledOn = !ledOn;
}


В цикле мы записываем значение «включено» или «выключено», меняем состояние каждую секунду.

Приложение компилируется как self-contained и разворачивается на устройстве. После назначения прав на выполнение (chmod +x) запускаете исполняемый файл — и светодиод начинает мигать с интервалом в секунду.

➡️ Гайд от майков

📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22❤‍🔥4🤔41😁1
🐳 Docker для быстрого запуска сервисов локально

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

Предположим, вам нужно быстро поднять MongoDB локально, не устанавливая ее системным пакетом.

Достаточно выполнить:
docker run -p 27017:27017 mongo


Эта команда скачает официальный образ mongo с Docker Hub и запустит контейнер. Флаг -p 27017:27017 пробрасывает порт на хост, то есть вы обращаетесь к базе на localhost:27017.

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

📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
💯15🥱3👍1👏1
🛋 Работа в кайф

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

➡️ В статье 10 базовых советов по обустройству вашего рабочего места

📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
💯7
📞 Как доска объявлений, но отборная

C#/.NET-разработчик до 300 000 ₽ и удалёнка.

С# разработчик от 200 000 ₽ и снова удалёнка.

.NET Developer внезапный офис в Новосибирске.

📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥42
AI-агенты в экосистеме .NET: расширяем границы возможного

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

Курс «Углубленные AI-агенты» даст вам глубокую экспертизу в актуальном стеке.

На обучении вас ждёт:

— проектирование автономных агентских систем;
— освоение LangGraph, CrewAI и AutoGen;
— интеграция RAG и инструментов планирования;
— 13 живых вебинаров и поддержка менторов.

Поток уже стартовал, присоединяйтесь сейчас.

🚀 Записаться на основной курс

Если сомневаетесь — просто посмотрите вводное занятие.
❤‍🔥21😁1
⚡️ ExecuteUpdate и ExecuteDelete в EF Core

ExecuteUpdate и ExecuteDelete появились для случаев, когда вам не нужны сущности и сложные хуки.

Это способ выполнять быстрые массовые операции, говоря с базой на языке SQL через LINQ.

Простой пример с заказами, которые нужно отметить как просроченные:
public async Task<IActionResult> ExpireOldOrders()
{
var cutoff = DateTime.UtcNow.AddDays(-30);

var affectedRows = await _db.Orders
.Where(o => o.Status == OrderStatus.Pending
&& o.CreatedAt < cutoff)
.ExecuteUpdateAsync(setters =>
setters.SetProperty(
o => o.Status,
OrderStatus.Expired));

return Ok(new { affectedRows });
}


EF Core сгенерирует один SQL примерно такого вида:
UPDATE Orders
SET Status = 2
WHERE Status = 0
AND CreatedAt < @cutoff


Приложение отправляет в базу одну команду, а не тысячи мелких запросов. С точки зрения БД — это максимально естественный сценарий: нагрузка на сеть и блокировки минимальны.

ExecuteDelete решает такую же задачу для удаления:
public async Task<int> CleanOldLogsAsync(DateTime cutoff)
{
var affected = await _db.Logs
.Where(l => l.CreatedAt < cutoff)
.ExecuteDeleteAsync();

return affected;
}


EF Core не загружает логи в память — удаление происходит одним SQL-запросом.

Важно: эти методы обходят change tracking и не вызывают события SaveChanges.
Используйте их, когда производительность важнее бизнес-логики в коде.

📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта

#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
👍151
🔛📈 Включаем фичи без редеплоя

Feature Flags — это условные переключатели, которые позволяют включать/выключать фичи на лету, без передеплоя приложения.

Зачем они нужны

• Безопасный rollout — можно включить фичу для 10% пользователей, проверить метрики, затем раскатывать дальше.

• A/B тестирование — запуск двух версий фичи и выбор лучшей на основе данных.

• Eсли что-то пошло не так, флаг выключается за секунду вместо отката всего деплоя.

• Возможность коммитить незавершённый код без риска для продакшна

Подготовка:
// Добавим NuGet пакет
dotnet add package Microsoft.FeatureManagement

// В appsettings.json
"FeatureManagement": {
"NewDashboard": false
}


В коде:

if (await featureManager.IsEnabledAsync("NewDashboard"))
{
RenderNewDashboard();
}
else
{
RenderOldDashboard();
}


📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍94
📎 ValueTask в публичном API

ValueTask часто хвалят за экономию памяти. Но если использовать его в публичном API, потребители могут не оценить такой шаг.

Вопрос: чем так плох ValueTask в публичном API? Он же снизит аллокации

Ответ: у нас в канале с вопросами с собесов

📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта

#dotnet_challenge
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3😢1