This media is not supported in your browser
VIEW IN TELEGRAM
AI-агенты в продакшн: промышленный стандарт архитектуры
В Enterprise-разработке на первый план выходит контроль и предсказуемость. Мы учим проектировать ИИ-агентов как надёжные системы со строгой логикой и мониторингом.
Ключевые модули:
— управление состоянием в
— архитектура `RAG` на базе
— промышленная автоматизация через
— безопасность и observability с внедрением
Результат — масштабируемая система, готовая к интеграции в ваш стек.
Подробности курса
В Enterprise-разработке на первый план выходит контроль и предсказуемость. Мы учим проектировать ИИ-агентов как надёжные системы со строгой логикой и мониторингом.
Ключевые модули:
— управление состоянием в
LangGraph для проектирования сложных стейт-машин;— архитектура `RAG` на базе
Pinecone или Chroma для обоснованной генерации ответов;— промышленная автоматизация через
n8n для интеграции логики в бизнес-процессы;— безопасность и observability с внедрением
LangSmith и Guardrails для аудита системы.Результат — масштабируемая система, готовая к интеграции в ваш стек.
Подробности курса
😁13❤2🥰2🥱2🌚2
RoomSharp смешивает декларативные
[AutoMigration] и императивные классы миграций. Автоматически обрабатывает переименования таблиц, колонок, добавление/удаление полей. MigrationManager следит за версиями в __room_metadata, предупреждает о деструктивных изменениях и запускает колбэки.Установка —
dotnet add package RoomSharp плюс провайдеры вроде RoomSharp.SqlServer. Расширения RoomSharp.Extensions для конфига.📍 Навигация: Вакансии • Задачи • Собесы
#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍1
Когда коллекция растет, руками гонять двойные циклы для поиска дубликатов уже не хочется. В .NET это хорошо решается комбинацией
LINQ и HashSet, плюс классическими GroupBy и Distinct.• LINQ Any и HashSet
Идея простая: HashSet хранит только уникальные элементы. Метод
Add возвращает false если такое значение уже было. Значит можно пробежать коллекцию через Any и остановиться на первом дубликате:public static bool HasDuplicatesAny<T>(IEnumerable<T> source)
{
HashSet<T> seen = new();
return source.Any(item => !seen.Add(item));
}
Метод возвращает
true как только встретится элемент который не удалось добавить в набор.• LINQ GroupBy и Count 1
Если нужны сами дубликаты, а не только факт их наличия, помогает
GroupBy. Мы группируем по значению и фильтруем группы в которых больше одного элемента:public static IEnumerable<T> GetDuplicatesGroupBy<T>(IEnumerable<T> source)
{
return source
.GroupBy(x => x)
.Where(g => g.Count() > 1)
.Select(g => g.Key);
}
• LINQ Distinct и подсчет элементов
Иногда достаточно проверить есть ли дубликаты, не вытаскивая их. Тогда можно сравнить размер исходной коллекции и количества уникальных элементов после
Distinct:public static bool HasDuplicatesDistinct<T>(IEnumerable<T> source)
{
int total = source.Count();
int unique = source.Distinct().Count();
return unique != total;
}
Для быстрых проверок чаще всего хватает
Any + HashSet. GroupBy удобно когда нужны сами дубликаты.📍 Навигация: Вакансии • Задачи • Собесы
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍3⚡2❤1🥰1
Backend-разработчик C# на удалёнку.
.NET Developer (Middle) — удалёнка или офис в СПб.
Senior Backend-разработчик — от 365 000 ₽
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
📍 Навигация: Вакансии • Задачи • Собесы
#garbage_collector
Please open Telegram to view this post
VIEW IN TELEGRAM
💯3
🎅 Секретный Санта для айтишников от Proglib.academy
Весь этот год команда Академии запускала курсы для айтишников. А под Новый год мы запускаем новый курс по ИИ-агентам и ставим под ёлку самый свежий стек 2025 года и обучение проектированию автономных нейросетевых экосистем — от LLM и ReAct-циклов до мультиагентных систем, LangGraph, AutoGen и продакшн-практик.
🎁 Хотим дарить подарки и приглашаем вас поучаствовать в конкурсе:
1️⃣ Упомяните курс Академии у себя в блоге.
2️⃣ Пришлите скрин сюда.
3️⃣ Получите секретный промокод на 10 000 ₽ при оплате любого курса.
Подходит всё — соцсети, блоги, Telegram-каналы от 300 подписчиков и более.
🎄 Акция действует до Нового года.
Win-win, всё как мы любим!
Весь этот год команда Академии запускала курсы для айтишников. А под Новый год мы запускаем новый курс по ИИ-агентам и ставим под ёлку самый свежий стек 2025 года и обучение проектированию автономных нейросетевых экосистем — от LLM и ReAct-циклов до мультиагентных систем, LangGraph, AutoGen и продакшн-практик.
🎁 Хотим дарить подарки и приглашаем вас поучаствовать в конкурсе:
1️⃣ Упомяните курс Академии у себя в блоге.
2️⃣ Пришлите скрин сюда.
3️⃣ Получите секретный промокод на 10 000 ₽ при оплате любого курса.
Подходит всё — соцсети, блоги, Telegram-каналы от 300 подписчиков и более.
🎄 Акция действует до Нового года.
Win-win, всё как мы любим!
🥱1
Во многих API до сих пор пишут методы вида
public IEnumerable<OrderDto> GetOrders() и думают что это ленивый возврат данных. На деле фреймворк вынужден сначала полностью пройти по IEnumerable, собрать коллекцию, а уже потом целиком сериализовать ее в JSON и отправить в сеть.Большой список целиком оказывается в куче, всплеск аллокаций ускоряет сборку мусора, а клиент ждет первый байт до тех пор пока не будет готов весь массив данных.
В современных версиях .NET намного безопаснее отдавать последовательность как
IAsyncEnumerable<T>. В этом случае ASP.NET может сериализовать элементы по мере их появления и выводить их в ответ потоком вместо полной буферизации результата. Альтернативный вариант — явно использовать
Results.Stream и JsonSerializer.SerializeAsync(stream, data) чтобы отдать JSON как поток байтов и держать в памяти лишь небольшой кусок данных.📍 Навигация: Вакансии • Задачи • Собесы
#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍2
Yield позволяет создавать итераторы, возвращая элементы коллекции по одному, без загрузки всего в память сразу.
Как работает yield return
При
yield return код возвращает значение и сохраняет состояние для следующей итерации в foreach или LINQ. Компилятор генерирует класс, реализующий IEnumerable<T>, с MoveNext() для продолжения.Пример простого генератора четных чисел:
IEnumerable<int> EvenNumbers(int max) {
for (int i = 0; i <= max; i += 2) {
yield return i;
}
}foreach по нему выдаст
0, 2, 4... лениво, только при запросе.📍 Навигация: Вакансии • Задачи • Собесы
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🥱4❤2
WANTED: .NET-РЕЦЕДИВИСТ
Разыскивается эксперт, способный приручить
Приметы:
— глубоко знает экосистему
— умеет проектировать сложные системы без «костылей»;
— готов выступать на большую аудиторию в качестве автора или ментора;
— хочет монетизировать свой профессиональный опыт.
Что в контракте:
— гонорар за интеллектуальный вклад;
— статус официального эксперта Proglib Academy;
— заметный буст личного бренда.
Признаться во всём здесь
P.S. Знаешь сильного «шарписта»? Сдай его следствию — перешли пост.
Разыскивается эксперт, способный приручить
C# и заставить его работать идеально. Мы знаем, что у тебя есть секретные приёмы, которыми пора поделиться с комьюнити.Приметы:
— глубоко знает экосистему
.NET и может сравнить её с Java или Go;— умеет проектировать сложные системы без «костылей»;
— готов выступать на большую аудиторию в качестве автора или ментора;
— хочет монетизировать свой профессиональный опыт.
Что в контракте:
— гонорар за интеллектуальный вклад;
— статус официального эксперта Proglib Academy;
— заметный буст личного бренда.
Признаться во всём здесь
P.S. Знаешь сильного «шарписта»? Сдай его следствию — перешли пост.
😁8❤1
🛠 ToonEncoder для .NET
ToonEncoder — это библиотека, которая кодирует данные в TOON. TOON описывается как компактное человекочитаемое представление той же модели данных что и JSON, но с упором на экономию токенов в промптах для LLM.
Практический кейс для айтишников это подготовка данных для LLM, например список логов, результатов поиска, объектов из базы, или пачка тул коллов, где табличный вид дает меньше лишней пунктуации и меньше повторяющихся ключей.
Пример:
У TOON есть режимы с разными разделителями, включая таб и пайп, чтобы еще чуть подкрутить токенизацию под конкретный ввод.
➡️ Репозиторий
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_view
ToonEncoder — это библиотека, которая кодирует данные в TOON. TOON описывается как компактное человекочитаемое представление той же модели данных что и JSON, но с упором на экономию токенов в промптах для LLM.
Практический кейс для айтишников это подготовка данных для LLM, например список логов, результатов поиска, объектов из базы, или пачка тул коллов, где табличный вид дает меньше лишней пунктуации и меньше повторяющихся ключей.
Пример:
using Cysharp.AI;
var users = new User[]
{
new (1, "Alice", "admin"),
new (2, "Bob", "user"),
};
string toon = ToonEncoder.Encode(users);
Console.WriteLine(toon);
string toon2 = ToonEncoder.EncodeAsTabularArray(users);
Console.WriteLine(toon2);
Console.WriteLine(toon == toon2); // same result
public record User(int Id, string Name, string Role);
У TOON есть режимы с разными разделителями, включая таб и пайп, чтобы еще чуть подкрутить токенизацию под конкретный ввод.
📍 Навигация: Вакансии • Задачи • Собесы
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤1
Строки в горячих участках вашего кода бьют по памяти сильнее чем кажется. В ASP.NET они часто оказываются в топе аллокаторов в профайлере.
Что создаёт лишние строки
• Интерполяция
var key = $"{userId}:{tenantId. Каждый вызов порождает новый string и новый массив char.• string.Format
string.Format("{0}-{1}", a, b); работает по той же схеме создаёт новый объект и буфер под символы.• Частые
ToString()request.Headers["X-Id"].ToString(); при каждом запросе снова строит строку из заголовка.Как сделать безопаснее
• Использовать структурированное логирование
logger.LogInformation("User {UserId} logged in", userId);В этом случае
ILogger не формирует строку когда соответствующий уровень логов отключён, а значения попадают в структурированные поля записи.• Не вызывать
ToString() без необходимостиФормируйте строку только там где она действительно нужна в ответе или в редком логировании, а не в общем горячем пути.
• В особо чувствительных местах использовать
Span и ValueStringBuilderОни позволяют собирать текст в переиспользуемом буфере и заметно снизить количество мусора.
Если код выполняется на каждом запросе, строковая интерполяция и лишние преобразования в string перестают быть дешёвым сахаром и становятся реальным источником аллокаций.
📍 Навигация: Вакансии • Задачи • Собесы
#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤5👾1
Делегаты в шарпах — штука базовая, но в деталях легко запутаться. Посмотрите на код и предскажите вывод, прежде чем проверять.
📍 Навигация: Вакансии • Задачи • Собесы
#dotnet_challenge
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱7👍2😢1
Конструкторы вызываются при создании объекта. В C# можно связывать их в цепочку: один конструктор вызывает другой. Это убирает дублирование кода инициализации.
Представьте класс User с тремя конструкторами:
public class User
{
public string Name { get; set; }
public string Email { get; set; }
public int Age { get; set; }
public DateTime Created { get; set; }
// Базовая инициализация
public User()
{
Created = DateTime.Now;
Name = "Гость";
Email = "guest@example.com";
}
public User(string name)
{
Created = DateTime.Now; // Дублируем!
Name = name;
Email = "guest@example.com";
}
public User(string name, string email)
{
Created = DateTime.Now; // Снова дублируем!
Name = name;
Email = email;
}
}
Проблема: Created и дефолтные значения повторяются. Изменить в одном месте нельзя.
Как работает цепочка с this()
Используйте
: this(параметры):public class User
{
public string Name { get; set; }
public string Email { get; set; }
public int Age { get; set; }
public DateTime Created { get; set; }
// Главный конструктор - вся логика здесь
public User(string name, string email, int age = 0)
{
Created = DateTime.Now;
Name = name ?? "Гость";
Email = email ?? "guest@example.com";
Age = age;
}
// Цепочка к главному
public User() : this("Гость", "guest@example.com") { }
public User(string name) : this(name, "guest@example.com") { }
public User(string name, string email) : this(name, email, 0) { }
}
Тестируем:
var user1 = new User(); // Гость, guest, 0
var user2 = new User("Иван"); // Иван, guest, 0
var user3 = new User("Иван", "i@example"); // Иван, i@example, 0
var user4 = new User("Анна", "a@ex", 25); // Анна, a@ex, 25
Все получают
Created = Now автоматическиПравила цепочки:
• Должна быть первой в конструкторе:
public User(string name) : this(name, "default") // OK
{
// Дополнительная логика
}
• Нельзя дважды:
public User() : this("a") : base() // Ошибка!Идеально для классов с множеством опциональных параметров. Главное: короткие цепочки и главный конструктор с полной логикой.
📍 Навигация: Вакансии • Задачи • Собесы
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱7🤩4❤2