Сеньору запретили писать откровения на ревью, поэтому он опять наказан использованием эмодзи.
Пишите в комментарии, что это он написал на картинке 👇
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
❤4
Middle/Senior C# разработчик — удалёнка.
C# Developer — до 5500 $, удалёнка.
Full-Stack .NET Developer — до 450 000 ₽, удалёнка.
Tech Lead AI — от 450 000 ₽, удалёнка.
С#-разработчик — от 250 000 ₽, удалёнка.
Бустер — Удалённо (в любом городе мира).
Please open Telegram to view this post
VIEW IN TELEGRAM
🛠 Гид по Redis в C#
Представьте, что ваши запросы обрабатываются мгновенно. Для этого можно использовать Redis. Сейчас покажем как это сделать.
1. Устанавливаем
2. Создаём подключение
3. Базовые операции: SET и GET
4. Механизм подписки и публикации
Подписчик:
Публикация:
5. Дополнительно: списки, хэши и TTL
Пушим и читаем из конца/начала:
Группируем поля в одном ключе:
TTL для удаления ключей через время:
Бонус: бест практис
• ConnectionMultiplexer — тяжёлый объект, создавайте один раз.
• Используйте ConfigureAwait(false) и ловите исключения RedisConnectionException.
• Выполняйте атомарные операции на стороне сервера для консистентности.
• При росте нагрузки переходите на кластерный режим или Redis Sentinel для отказоустойчивости.
В будущем Redis становится центром событийной архитектуры: Stream-поддержка и геоданные открывают новые горизонты.
🐸 Библиотека шарписта #буст
Представьте, что ваши запросы обрабатываются мгновенно. Для этого можно использовать 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
❤13👍5🔥2
🧠 Как алгоритмическое мышление повышает производительность
Если ваше приложение «подтормаживает», вспомните о спортивном программировании: анализируйте асимптотику и меняйте неэффективные алгоритмы — и запросы станут выполняться за доли секунды.
Не догадывайтесь, где узкое место, а измеряйте его профилировщиком и выбирайте правильные структуры данных.
➡️ Почему спортивное программирование полезно
🐸 Библиотека шарписта #буст
Если ваше приложение «подтормаживает», вспомните о спортивном программировании: анализируйте асимптотику и меняйте неэффективные алгоритмы — и запросы станут выполняться за доли секунды.
Не догадывайтесь, где узкое место, а измеряйте его профилировщиком и выбирайте правильные структуры данных.
Please open Telegram to view this post
VIEW IN TELEGRAM
😁5❤1
🧑💻 Тестирование API без выдумок
Без тщательно сгенерированных сценариев, покрывающих как граничные, так и ошибочные состояния, легко упустить скрытые уязвимости, которые проявятся именно в пике трафика.
Подготовили для вас промпт, чтобы данные не нужно было придумывать самостоятельно:
🐸 Библиотека шарписта #буст
Без тщательно сгенерированных сценариев, покрывающих как граничные, так и ошибочные состояния, легко упустить скрытые уязвимости, которые проявятся именно в пике трафика.
Подготовили для вас промпт, чтобы данные не нужно было придумывать самостоятельно:
You are a highly skilled C# Developer and Tester, specializing in creating robust and reliable REST APIs. Your expertise lies in generating diverse and comprehensive test data to thoroughly stress test APIs, uncovering potential vulnerabilities and ensuring optimal performance under heavy load. Your goal is to create a C# program that generates a wide range of test data, specifically focusing on boundary conditions and error scenarios, to effectively stress test a given REST API.
Here is the format you will use to reason through the problem and come up with a fantastic recommendation:
---
## REST API Endpoint Description
$api_endpoint_description (Include the HTTP method, expected request body format, and expected response format)
## Data Types and Constraints
$data_types_and_constraints (Specify the data types of each field in the request body and any constraints, such as minimum/maximum values, allowed characters, or specific formats)
## Boundary Condition Test Data
$boundary_condition_test_data (Generate test data that pushes the limits of the defined constraints. Include examples of minimum values, maximum values, values just outside the allowed range, and edge cases.)
### Example Boundary Condition Test Data Entry
```json
{
"field1": "boundary_value_1",
"field2": "boundary_value_2",
...
}
```
## Error Condition Test Data
$error_condition_test_data (Generate test data that intentionally violates the defined constraints. Include examples of invalid data types, missing required fields, incorrect formats, and malicious input.)
### Example Error Condition Test Data Entry
```json
{
"field1": "invalid_value_1",
"field2": "missing_field",
...
}
```
## C# Code for Test Data Generation
$csharp_code (Provide the C# code that generates the boundary and error condition test data. The code should be well-commented and easy to understand.)
## Explanation of the C# Code
$csharp_code_explanation (Explain the logic behind the C# code, highlighting how it generates the different types of test data and how it can be easily adapted to different REST APIs.)
## Considerations for Stress Testing
$stress_testing_considerations (Discuss important considerations for stress testing the REST API, such as the number of concurrent requests, the duration of the test, and the metrics to monitor.)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤2🔥2
🔥 Последняя неделя перед стартом курса по AI-агентам
Старт курса уже 5го числа! Если вы планировали вписаться — сейчас ПОСЛЕДНИЙ шанс забронировать место
На курсе:
— разложим LLM по косточкам: токенизация, SFT, PEFT, инференс
— соберём RAG и научимся оценивать его адекватно
— построим настоящую мультиагентную систему — архитектуру, которая умеет расти
— разберём CoPilot, сломаем через prompt injection (спасибо Максу)
— и наконец, посмотрим, как это работает в MCP и реальных кейсах
📍 Это 5 живых вебинаров + раздатка + домашки + чат с преподавателями
И главное — возможность реально разобраться, как проектировать системы на LLM, а не просто «поиграться с API»
👉 Курс здесь
Старт курса уже 5го числа! Если вы планировали вписаться — сейчас ПОСЛЕДНИЙ шанс забронировать место
На курсе:
— разложим LLM по косточкам: токенизация, SFT, PEFT, инференс
— соберём RAG и научимся оценивать его адекватно
— построим настоящую мультиагентную систему — архитектуру, которая умеет расти
— разберём CoPilot, сломаем через prompt injection (спасибо Максу)
— и наконец, посмотрим, как это работает в MCP и реальных кейсах
📍 Это 5 живых вебинаров + раздатка + домашки + чат с преподавателями
И главное — возможность реально разобраться, как проектировать системы на LLM, а не просто «поиграться с API»
👉 Курс здесь
Please open Telegram to view this post
VIEW IN TELEGRAM
😁33👏3👍2
🛠 Чек-лист по настройке и ведению репозитория .NET-проекта
Составили для вас чек-лист для организации репозитория .NET-проекта. Получился мини-гайд, который можно скинуть джуну.
✅ Проверьте URL репозитория
• Убедитесь, что имя аккаунта, название репозитория и основная ветка (main или master) соответствуют соглашениям команды.
• Проверьте, нет ли опечаток или лишних символов в пути.
✅ Добавьте файл LICENSE
• Поместите в корень проекта файл с лицензией (MIT, Apache, GPL и т. д.).
• Проверьте, что текст лицензии актуален и соответствует требованиям компании.
✅ Настройте .gitignore
• Используйте готовые шаблоны для .NET (VisualStudio, Rider): исключите bin/, obj/, настройки IDE, файлы сборки.
• При необходимости добавьте игнорацию пользовательских секретов и сертификатов.
✅ Создайте файл .gitattributes
Задайте нормализацию переводов строк:
• Укажите специальные правила для бинарных файлов, чтобы избежать проблем с кодировкой.
✅ Подробный README.md
• Опишите назначение проекта, его архитектуру и ключевые зависимости.
• Дайте инструкции по установке, настройке и запуску (команды CLI, порты, переменные окружения).
• Приведите пример запуска основных сценариев.
✅ Проект тестов
• Создайте отдельный тестовый проект (.Tests) и убедитесь, что все тесты проходят при команде
• Добавьте в README badge с процентом покрытия (например, через Coveralls или Azure Pipelines).
✅ CI/CD через GitHub Actions
• Разместите workflow в .github/workflows/ci.yml: сборка, тесты, анализ кода.
• Опционально — настройте деплой на тестовый или продакшен-стенд.
✅ Файлы 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.
Сколько «галочек» из списка содержит ваш проект?
🐸 Библиотека шарписта #буст
Составили для вас чек-лист для организации репозитория .NET-проекта. Получился мини-гайд, который можно скинуть джуну.
• Убедитесь, что имя аккаунта, название репозитория и основная ветка (main или master) соответствуют соглашениям команды.
• Проверьте, нет ли опечаток или лишних символов в пути.
• Поместите в корень проекта файл с лицензией (MIT, Apache, GPL и т. д.).
• Проверьте, что текст лицензии актуален и соответствует требованиям компании.
• Используйте готовые шаблоны для .NET (VisualStudio, Rider): исключите bin/, obj/, настройки IDE, файлы сборки.
• При необходимости добавьте игнорацию пользовательских секретов и сертификатов.
bin/
obj/
*.user
*.suo
Задайте нормализацию переводов строк:
* text=auto
*.ps1 text eol=crlf
• Укажите специальные правила для бинарных файлов, чтобы избежать проблем с кодировкой.
• Опишите назначение проекта, его архитектуру и ключевые зависимости.
• Дайте инструкции по установке, настройке и запуску (команды CLI, порты, переменные окружения).
• Приведите пример запуска основных сценариев.
• Создайте отдельный тестовый проект (.Tests) и убедитесь, что все тесты проходят при команде
dotnet test
.• Добавьте в README badge с процентом покрытия (например, через Coveralls или Azure Pipelines).
• Разместите 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 описывает, как создавать issue, форкать проект и оформлять PR.
• Настройте лейблы для Issue/PR: bug, enhancement, help wanted, good first issue.
• Добавьте в репозиторий релевантные темы (например, csharp, dotnet-core, webapi).
• Статус сборки (Build Passing/Failing).
• Процент покрытия тестами.
• Поддерживаемые версии .NET.
Сколько «галочек» из списка содержит ваш проект?
Please open Telegram to view this post
VIEW IN TELEGRAM
😁9❤7👍4🔥1
Когда речь заходит о техническом долге, и джуны, и опытные разработчики нередко сомневаются, с чего начать и как приоритизировать задачи.
Один из наших подписчиков недавно спросил:
Как определить, когда стоит принимать новый функционал, а когда — гасить технический долг
На практике подход к техдолгу зависит от контекста проекта, команды и бизнес-целей. Вот основные моменты, которые помогут выбрать стратегию:
— Регулярно формируйте список всех известных проблем: устаревшие библиотеки, неочищенный код, отсутствие тестов.
— Делите техдолг на «осознанный» (trade-off ради скорости) и «неосознанный» (ошибки, хаотичный рост).
— Используйте метрики: время на исправление багов, количество инцидентов, сложность новых фич.
— Включайте небольшие задачи по техдолгу в каждый спринт (например, 10–20 % времени).
— Установите критерии «не допуска к продакшену» для новых заимствований (например, доля покрытия тестами).
💬 Как вы балансируете новые фичи и погашение техдолга? Поделитесь своим опытом в комментариях 👇
P.S. Если хотите задать вопрос сообществу или поделиться историей, заполните нашу гугл-форму.
Please open Telegram to view this post
VIEW IN TELEGRAM
В рамках трансляции On .NET Live ведущие разобрали, как через чёткие интерфейсы Repository и паттерн Specification вынести всю логику запросов из бизнес-слоя, чтобы не забирать в память лишние данные и легко мокировать код для тестов.
Также обсудили компромиссы generic-репозиториев и показали, как Unit of Work возвращает настоящую транзакционность, вызывая
SaveChanges()
один раз в конце.Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍3🥱3😁1
😤 Пока вы думаете — остальные уже учатся строить системы, которые работают за них
⚡24 часа до старта курса по AI-агентам. Самое время задуматься о прокачке скиллов, потому что места ограничены!
Если вы до сих пор думаете, что LLM — это просто «вызов через API», то вы рискуете очень скоро оказаться за бортом индустрии.
Модели больше не в центре. Решают те, кто умеет собирать интеллектуальные системы, а не просто «дообучать модельку».
➡️ Что вы потеряете, если не впишетесь:
— навык, который уже востребован на рынке
— понимание, как из GPT сделать полноценного помощника, агента или продукт
— шанс догнать тех, кто уже перешёл на следующий уровень
📌 Курс стартует уже завтра
— 5 вебинаров, живая практика, код, разборы, продовые кейсы
— без «посмотрите статью», только то, что реально нужно
Спикеры: Никита Зелинский (МТС), Диана Павликова, Макс Пташник, Дима Фомин — те, кто реально собирает агентные системы, а не просто про них пишет.
❗Старт уже завтра — забронируйте место на курсе сейчас
⚡24 часа до старта курса по AI-агентам. Самое время задуматься о прокачке скиллов, потому что места ограничены!
Если вы до сих пор думаете, что LLM — это просто «вызов через API», то вы рискуете очень скоро оказаться за бортом индустрии.
Модели больше не в центре. Решают те, кто умеет собирать интеллектуальные системы, а не просто «дообучать модельку».
➡️ Что вы потеряете, если не впишетесь:
— навык, который уже востребован на рынке
— понимание, как из GPT сделать полноценного помощника, агента или продукт
— шанс догнать тех, кто уже перешёл на следующий уровень
📌 Курс стартует уже завтра
— 5 вебинаров, живая практика, код, разборы, продовые кейсы
— без «посмотрите статью», только то, что реально нужно
Спикеры: Никита Зелинский (МТС), Диана Павликова, Макс Пташник, Дима Фомин — те, кто реально собирает агентные системы, а не просто про них пишет.
❗Старт уже завтра — забронируйте место на курсе сейчас
🥱9❤1😁1
Теперь разработчики могут генерировать альтернативный текст для изображений прямо в своем приложении.
Вместо того чтобы отправлять запросы в облачные сервисы, можно использовать локально размещенные модели, например Ollama.
Для этого достаточно запустить простой скрипт на C#, который анализирует изображение и генерирует для него текстовое описание.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2😁2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁36
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
🌚9💯7❤3😢2🤩2
Несколько интересных материалов, которые вы могли пропустить.
— Фильтрация, сортировка и пагинация в .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
👍5❤1🔥1
С# Senior Backend Developer — от 250 000 ₽, удалёнка.
C# программист — до 160 000 ₽, гибрид (Москва).
Fullstack Middle C# Developer— до 500 000₽, офис (Москва).
Руководитель группы C# — от 450 000 ₽, удалёнка.
Бустер — Удалённо (в любом городе мира).
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
🚀 Анализ изменений с
Команда
Просмотр истории:
История коммитов построчно:
Граф веток + метки (ветки, теги) для всех веток:
Показать diff последних двух коммитов:
Коммиты за последние 2 недели от указанного автора:
Настраиваемый формат: короткий хеш, дата, сообщение, автор:
💬 Вы смотрите историю
🐸 Библиотека шарписта #буст
git log
Команда
git log
позволяет понять, как эволюционировал код — просмотреть последовательность коммитов и метаданные.Просмотр истории:
git log
История коммитов построчно:
git log --oneline
Граф веток + метки (ветки, теги) для всех веток:
git log --graph --decorate --all
Показать diff последних двух коммитов:
git log -p -2
Коммиты за последние 2 недели от указанного автора:
git log --since="2 weeks ago" --author="ProgLib"
Настраиваемый формат: короткий хеш, дата, сообщение, автор:
git log --pretty=format:"%h %ad | %s%d [%an]" --date=short
💬 Вы смотрите историю
log
'ом или используете сторонние инструменты?Please open Telegram to view this post
VIEW IN TELEGRAM
🥰7❤1