TG Telegram Group Link
Channel: Библиотека шарписта | C#, F#, .NET, ASP.NET
Back to Bottom
🎮 Снова сеньор без клавиатуры

Сеньору запретили писать откровения на ревью, поэтому он опять наказан использованием эмодзи.

Пишите в комментарии, что это он написал на картинке 👇

🐸Библиотека шарписта #междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
🆕 Неделя в кадре

Ключевые новости, которые могли ускользнуть от вашего внимания.

Диагностика задержек в .NET

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

Руководство по выживанию с устаревшим кодом

В 2025 году Visual Basic 6.0 уже почти не используется, а VB.NET и .NET Framework постепенно уходят в прошлое, оставшись только для поддержки старых приложений.

xUnit для сложных интеграционных тестов

Джереми Миллер описывает, как интегрировать логирование в xUnit для сложных интеграционных тестов с использованием Wolverine.

🐸Библиотека шарписта #свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
🍀 Подборка вакансий для шарпистов

Middle/Senior C# разработчик — удалёнка.

C# Developer — до 5500 $, удалёнка.

Full-Stack .NET Developer — до 450 000 ₽, удалёнка.

Tech Lead AI — от 450 000 ₽, удалёнка.

С#-разработчик — от 250 000 ₽, удалёнка.

Бустер — Удалённо (в любом городе мира).

➡️ Еще больше топовых вакансий — в нашем канале С# Jobs
Please open Telegram to view this post
VIEW IN TELEGRAM
🛠 Гид по Redis в C#

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

1. Устанавливаем
Install-Package StackExchange.Redis


2. Создаём подключение
using StackExchange.Redis;

var redis = ConnectionMultiplexer.Connect("localhost:6379");
IDatabase db = redis.GetDatabase();


3. Базовые операции: SET и GET
// Записываем строку
bool setResult = db.StringSet("user:42:name", "ProgLib");
Console.WriteLine($"SET OK: {setResult}");

// Читаем строку
string name = db.StringGet("user:42:name");
Console.WriteLine($"GET: {name}"); // → ProgLib


StringSet возвращает true, если всё прошло гладко. StringGet в случае отсутствия ключа вернёт null.

4. Механизм подписки и публикации

Подписчик:
var sub = redis.GetSubscriber();
sub.Subscribe("notifications", (channel, message) => {
Console.WriteLine($"Получено сообщение: {message}");
});


Публикация:
sub.Publish("notifications", "Новый заказ №128");


5. Дополнительно: списки, хэши и TTL

Пушим и читаем из конца/начала:
db.ListRightPush("tasks", "Сделать отчёт");
var task = db.ListLeftPop("tasks");


Группируем поля в одном ключе:
db.HashSet("session:1001", new HashEntry[] {
new HashEntry("userId", 42),
new HashEntry("expiresAt", DateTime.UtcNow.AddMinutes(30).ToString("O"))
});
var expires = db.HashGet("session:1001", "expiresAt");


TTL для удаления ключей через время:
db.StringSet("cache:item:7", "данные", TimeSpan.FromMinutes(5));


Бонус: бест практис

• ConnectionMultiplexer — тяжёлый объект, создавайте один раз.

• Используйте ConfigureAwait(false) и ловите исключения RedisConnectionException.

• Выполняйте атомарные операции на стороне сервера для консистентности.

• При росте нагрузки переходите на кластерный режим или Redis Sentinel для отказоустойчивости.

В будущем Redis становится центром событийной архитектуры: Stream-поддержка и геоданные открывают новые горизонты.

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🧠 Как алгоритмическое мышление повышает производительность

Если ваше приложение «подтормаживает», вспомните о спортивном программировании: анализируйте асимптотику и меняйте неэффективные алгоритмы — и запросы станут выполняться за доли секунды.

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

➡️ Почему спортивное программирование полезно

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 Последняя неделя перед стартом курса по AI-агентам

Старт курса уже 5го числа! Если вы планировали вписаться — сейчас ПОСЛЕДНИЙ шанс забронировать место

На курсе:
разложим LLM по косточкам: токенизация, SFT, PEFT, инференс
— соберём RAG и научимся оценивать его адекватно
— построим настоящую мультиагентную систему — архитектуру, которая умеет расти
— разберём CoPilot, сломаем через prompt injection (спасибо Максу)
— и наконец, посмотрим, как это работает в MCP и реальных кейсах

📍 Это 5 живых вебинаров + раздатка + домашки + чат с преподавателями

И главное — возможность реально разобраться, как проектировать системы на LLM, а не просто «поиграться с API»

👉 Курс здесь
🐢 Столкнулись с «тормозным» C#-кодом? Медленные алгоритмы могут растянуть выполнение задачи на минуты вместо миллисекунд.

📅 Приглашаем на открытый урок «Анализ сложности алгоритмов и сортировка на C#» 3 июля в 20:00 МСК.

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

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

Регистрируйтесь сейчас — урок проходит перед стартом курса «C# Developer»: https://clc.to/5ttuqA

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
🛠 Чек-лист по настройке и ведению репозитория .NET-проекта

Составили для вас чек-лист для организации репозитория .NET-проекта. Получился мини-гайд, который можно скинуть джуну.

Проверьте URL репозитория

• Убедитесь, что имя аккаунта, название репозитория и основная ветка (main или master) соответствуют соглашениям команды.

• Проверьте, нет ли опечаток или лишних символов в пути.

Добавьте файл LICENSE

• Поместите в корень проекта файл с лицензией (MIT, Apache, GPL и т. д.).

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

Настройте .gitignore

• Используйте готовые шаблоны для .NET (VisualStudio, Rider): исключите bin/, obj/, настройки IDE, файлы сборки.

• При необходимости добавьте игнорацию пользовательских секретов и сертификатов.
bin/
obj/
*.user
*.suo


Создайте файл .gitattributes

Задайте нормализацию переводов строк:
* text=auto
*.ps1 text eol=crlf


• Укажите специальные правила для бинарных файлов, чтобы избежать проблем с кодировкой.

Подробный README.md

• Опишите назначение проекта, его архитектуру и ключевые зависимости.

• Дайте инструкции по установке, настройке и запуску (команды CLI, порты, переменные окружения).

• Приведите пример запуска основных сценариев.

Проект тестов

• Создайте отдельный тестовый проект (.Tests) и убедитесь, что все тесты проходят при команде dotnet test.

• Добавьте в README badge с процентом покрытия (например, через Coveralls или Azure Pipelines).

CI/CD через GitHub Actions

• Разместите workflow в .github/workflows/ci.yml: сборка, тесты, анализ кода.

• Опционально — настройте деплой на тестовый или продакшен-стенд.
name: CI
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-dotnet@v1
with: { dotnet-version: '7.0.x' }
- run: dotnet build --no-restore
- run: dotnet test --no-build --verbosity normal


Файлы CODE_OF_CONDUCT.md и CONTRIBUTING.md

• CODE_OF_CONDUCT.md определяет правила поведения участников.

CONTRIBUTING.md описывает, как создавать issue, форкать проект и оформлять PR.

Метки и темы

• Настройте лейблы для Issue/PR: bug, enhancement, help wanted, good first issue.

• Добавьте в репозиторий релевантные темы (например, csharp, dotnet-core, webapi).

Badge-значки в README

• Статус сборки (Build Passing/Failing).

• Процент покрытия тестами.

• Поддерживаемые версии .NET.

Сколько «галочек» из списка содержит ваш проект?

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👀 Эффективный доступ к данным в .NET

В рамках трансляции On .NET Live ведущие разобрали, как через чёткие интерфейсы Repository и паттерн Specification вынести всю логику запросов из бизнес-слоя, чтобы не забирать в память лишние данные и легко мокировать код для тестов.

Также обсудили компромиссы generic-репозиториев и показали, как Unit of Work возвращает настоящую транзакционность, вызывая SaveChanges() один раз в конце.

➡️ Смотреть запись трансляции

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
😤 Пока вы думаете — остальные уже учатся строить системы, которые работают за них

24 часа до старта курса по AI-агентам. Самое время задуматься о прокачке скиллов, потому что места ограничены!

Если вы до сих пор думаете, что LLM — это просто «вызов через API», то вы рискуете очень скоро оказаться за бортом индустрии.

Модели больше не в центре. Решают те, кто умеет собирать интеллектуальные системы, а не просто «дообучать модельку».

➡️ Что вы потеряете, если не впишетесь:
— навык, который уже востребован на рынке
— понимание, как из GPT сделать полноценного помощника, агента или продукт
— шанс догнать тех, кто уже перешёл на следующий уровень

📌 Курс стартует уже завтра
— 5 вебинаров, живая практика, код, разборы, продовые кейсы
— без «посмотрите статью», только то, что реально нужно

Спикеры: Никита Зелинский (МТС), Диана Павликова, Макс Пташник, Дима Фомин — те, кто реально собирает агентные системы, а не просто про них пишет.

Старт уже завтра — забронируйте место на курсе сейчас
⚡️ Быстро и без облака

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

Вместо того чтобы отправлять запросы в облачные сервисы, можно использовать локально размещенные модели, например Ollama.

Для этого достаточно запустить простой скрипт на C#, который анализирует изображение и генерирует для него текстовое описание.

➡️ Узнать как это сделать

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
var в C# — удобство или маска

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

Вместо явного написания громоздких типов можно писать лаконичный код:
// Вместо List<Dictionary<string, List<Tuple<int, DateTime>>>> data = ...
var data = GetComplexData();


Также var не делает переменную динамической, это всё тот же строго типизируемый код.

Но есть и сильный аргумент против использования var. На примере кода выше:
// Вместо List<Dictionary<string, List<Tuple<int, DateTime>>>> data = ...
var data = GetComplexData(); // каков тип data? int, string, CustomType?


Тип, получаемый из функции неочевиден и это в разы ухудшает читаемость кода.

var — полезный инструмент, но требует дисциплины. При очевидном типе он упрощает код, при неочевидном — мешает пониманию.

💬 Вы используете var в коде или сторонник явного? Делитесь мыслями в комментариях 👇

🐸Библиотека шарписта #междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
📰 Дайджест недели

Несколько интересных материалов, которые вы могли пропустить.

Фильтрация, сортировка и пагинация в .NET

От инициализации проекта и установки пакета Sieve до настройки DI и написания контроллера с автоматическим применением фильтров и сортировок.

Каналы не подходят для In-Memory шины сообщений

Использование каналов в качестве шины сообщений может завести в тупик: отсутствие персистентности приводит к необходимости самому реализовывать dead-letter очереди, экспоненциальные откладывания для повторов, механизмы отложенной доставки и «claim-check» для тяжёлых полезных нагрузок.

Запуск коммерческих изданий AutoMapper и MediatR

В обновлённых релизах AutoMapper v15.0 и MediatR v13.0 на NuGet реализован запрос лицензии при установке.

Помимо тарификации по размеру команды и скидок за годовую подписку, подписчики получают приоритетную поддержку, ранний доступ к выпускам и частные каналы в Discord.

🐸Библиотека шарписта #свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
🥳 Подборка вакансий для шарпистов

С# Senior Backend Developer — от 250 000 ₽, удалёнка.

C# программист — до 160 000 ₽, гибрид (Москва).

Fullstack Middle C# Developer— до 500 000₽, офис (Москва).

Руководитель группы C# — от 450 000 ₽, удалёнка.

Бустер — Удалённо (в любом городе мира).

➡️ Еще больше топовых вакансий — в нашем канале С# Jobs
Please open Telegram to view this post
VIEW IN TELEGRAM
HTML Embed Code:
2025/07/08 05:06:14
Back to Top