Помните времена, когда на собесе спрашивали FizzBuzz? Забудьте. Теперь вас могут попросить писать код на бумаге, а параллельно проверят, не подглядываете ли вы в ChatGPT.
В карточках — пять трендов, которые перевернули рынок: от смерти грейдинга до «AI-friendly» собеседований.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3😢3❤2
dotnet-dump
— ваш лучший помощник, когда приложение падает без логов.Снять дамп памяти:
dotnet-dump collect --process-id 12345
Проанализировать дамп:
dotnet-dump analyze core_*.dmp
Далее доступны команды:
clrstack
, dumpheap
-stat
, gcroot
— чтобы увидеть стеки вызовов, объекты в памяти и цепочки удержания.#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥4❤3🥰1
.NET 10 RC 1 — это шанс заглянуть за кулисы финального релиза.
Это ваша возможность проверить приложения, опробовать новые инструменты и подготовиться к релизу без сюрпризов.
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8👏1
Please open Telegram to view this post
VIEW IN TELEGRAM
💯34❤3😁3
💡 Как определить приоритет задачи
У разработчиков всегда задач больше, чем времени. Чтобы не тратить часы на споры, можно пройтись по этому мини-чеклисту:
1️⃣ Влияние на бизнес/пользователя
Что произойдет, если не сделать? Потеряем клиентов, деньги или просто будет некрасиво?
2️⃣ Срочность
Есть ли жесткий дедлайн? Блокируется ли чужая работа?
3️⃣ Сложность
Сколько времени и сил займет выполнение? Можно ли сделать быстрый фикс?
4️⃣ Риск откладывания
Станет ли хуже, если подождать? Вырастет техдолг, появятся новые баги?
5️⃣ Зависимости
Задача открывает путь для других? Или сама ждет чего-то?
Можно поставить по каждому пункту баллы от 1 до 3 и сложить. Чем выше сумма — тем выше приоритет.
🐸 Библиотека шарписта
#буст
У разработчиков всегда задач больше, чем времени. Чтобы не тратить часы на споры, можно пройтись по этому мини-чеклисту:
Что произойдет, если не сделать? Потеряем клиентов, деньги или просто будет некрасиво?
Есть ли жесткий дедлайн? Блокируется ли чужая работа?
Сколько времени и сил займет выполнение? Можно ли сделать быстрый фикс?
Станет ли хуже, если подождать? Вырастет техдолг, появятся новые баги?
Задача открывает путь для других? Или сама ждет чего-то?
Можно поставить по каждому пункту баллы от 1 до 3 и сложить. Чем выше сумма — тем выше приоритет.
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤5
Хотите увидеть будущее Visual Studio? Insiders для 2026 версии доступен.
Быстрее, умнее, удобнее — проверяйте новые функции, отлаживайте проекты и опробуйте возможности, которые скоро станут стандартом.
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥3❤2
🔐 Хэширование в C#: как и когда использовать
Хэширование — это процесс преобразования данных в фиксированное значение, которое затем можно использовать для быстрого поиска и сравнения.
Основная цель хэширования — ускорить операции, например, поиск элементов в коллекциях или в базах данных.
Как работает хэширование
В C# хэширование чаще всего встречается в таких структурах данных, как
Хэш-таблица использует хэш-функцию, которая принимает ключ и преобразует его в индекс, который указывает на место хранения данных в массиве.
Пример реализации собственного хэширования:
Когда стоит использовать хэширование
Если вам нужно быстро найти, добавить или удалить данные, хэширование может значительно ускорить эти операции. Когда вы добавляете или ищете элемент, хэш-функция преобразует его ключ в индекс, и вы сразу попадаете в нужную ячейку, не перебирая все данные.
Хэширование используется для защиты данных, например, в процессе хранения паролей. В этом случае важно использовать криптографически стойкие хэш-функции, такие как SHA-256 или bcrypt.
Хэш-функции могут использоваться для проверки, не изменились ли данные, например, для контроля над целостностью файлов.
💬 Как вы используете хэширование в своих проектах? Делитесь примерами в комментариях 👇
🐸 Библиотека шарписта
#междусобойчик
Хэширование — это процесс преобразования данных в фиксированное значение, которое затем можно использовать для быстрого поиска и сравнения.
Основная цель хэширования — ускорить операции, например, поиск элементов в коллекциях или в базах данных.
Как работает хэширование
В C# хэширование чаще всего встречается в таких структурах данных, как
Dictionary
и HashSet
, где хэш-функции используются для быстрого поиска элементов. Эти коллекции используют хэш-таблицы для того, чтобы операции поиска, добавления и удаления выполнялись за время O(1) в среднем.Хэш-таблица использует хэш-функцию, которая принимает ключ и преобразует его в индекс, который указывает на место хранения данных в массиве.
Пример реализации собственного хэширования:
// Переопределение метода GetHashCode для обеспечения корректного хэширования
public override int GetHashCode()
{
// Простой хэш-функции, использующей значения полей объекта
// Здесь мы комбинируем хэши Name и Age для создания уникального хэш-значения
int hashName = Name == null ? 0 : Name.GetHashCode();
int hashAge = Age.GetHashCode();
// Используем формулу для комбинирования хэшей, чтобы минимизировать коллизии
return hashName ^ hashAge;
}
Когда стоит использовать хэширование
Если вам нужно быстро найти, добавить или удалить данные, хэширование может значительно ускорить эти операции. Когда вы добавляете или ищете элемент, хэш-функция преобразует его ключ в индекс, и вы сразу попадаете в нужную ячейку, не перебирая все данные.
Хэширование используется для защиты данных, например, в процессе хранения паролей. В этом случае важно использовать криптографически стойкие хэш-функции, такие как SHA-256 или bcrypt.
Хэш-функции могут использоваться для проверки, не изменились ли данные, например, для контроля над целостностью файлов.
💬 Как вы используете хэширование в своих проектах? Делитесь примерами в комментариях 👇
#междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
👾8👍3❤1
Нашли для вас видео, которое поможет разобраться в различиях между операторами неравенства
!=
и паттерн-матчингом с is not
в C#. Несмотря на схожесть, каждое из этих решений имеет свои особенности, и неправильное использование может привести к ошибкам, особенно в случаях с боксингом, проверкой на null и перегрузкой операторов. Паттерн-матчинг предоставляет более безопасное и гибкое решение, особенно для работы с типами и константами.
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7
🔥 Последняя неделя перед стартом курса по AI-агентам
Старт курса уже 15го числа! Если вы планировали вписаться — сейчас ПОСЛЕДНИЙ шанс забронировать место
На курсе:
— разложим LLM по косточкам: токенизация, SFT, PEFT, инференс
— соберём RAG и научимся оценивать его адекватно
— построим настоящую мультиагентную систему — архитектуру, которая умеет расти
— разберём CoPilot, сломаем через prompt injection (спасибо Максу)
— и наконец, посмотрим, как это работает в MCP и реальных кейсах
📍 Это 5 живых вебинаров + раздатка + домашки + чат с преподавателями
И главное — возможность реально разобраться, как проектировать системы на LLM, а не просто «поиграться с API»
Промокод на 5.000₽: LASTCALL
👉 Курс здесь
Старт курса уже 15го числа! Если вы планировали вписаться — сейчас ПОСЛЕДНИЙ шанс забронировать место
На курсе:
— разложим LLM по косточкам: токенизация, SFT, PEFT, инференс
— соберём RAG и научимся оценивать его адекватно
— построим настоящую мультиагентную систему — архитектуру, которая умеет расти
— разберём CoPilot, сломаем через prompt injection (спасибо Максу)
— и наконец, посмотрим, как это работает в MCP и реальных кейсах
📍 Это 5 живых вебинаров + раздатка + домашки + чат с преподавателями
И главное — возможность реально разобраться, как проектировать системы на LLM, а не просто «поиграться с API»
Промокод на 5.000₽: LASTCALL
👉 Курс здесь
🔒 Оптимистическая vs пессимистическая блокировка
Каждый .NET разработчик рано или поздно сталкивается с этим: два запроса одновременно обновляют одну сущность в Entity Framework, и один из них молча затирает изменения другого. Классическая проблема многопоточных приложений, которая превращает стабильный код в источник багов.
В многопользовательских приложениях, где несколько пользователей или процессов одновременно читают или изменяют одни и те же данные, очень важно обеспечить целостность и согласованность данных.
В статье разбираемся как это сделать с помощью двух типов блокировок.
➡️ Читать статью
🐸 Библиотека шарписта
Каждый .NET разработчик рано или поздно сталкивается с этим: два запроса одновременно обновляют одну сущность в Entity Framework, и один из них молча затирает изменения другого. Классическая проблема многопоточных приложений, которая превращает стабильный код в источник багов.
В многопользовательских приложениях, где несколько пользователей или процессов одновременно читают или изменяют одни и те же данные, очень важно обеспечить целостность и согласованность данных.
В статье разбираемся как это сделать с помощью двух типов блокировок.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤7
Please open Telegram to view this post
VIEW IN TELEGRAM
😁31🥱2
Разработчики всегда стояли на перепутье: либо углубляться в одну область, становясь мастерами в ней, либо учить всё и сразу, чтобы быть востребованными на рынке.
Сейчас не редкость, что на рынок труда выходят кандидаты, которые могут работать с абсолютно всем — от фронтенда до бэкенда, от баз данных до DevOps. В некоторых случаях это выглядит как «швейцарские ножи», которые знают всё, но ни в чём не являются экспертами.
Появление инструментов, таких как фреймворки и библиотеки, изменяет саму парадигму разработки. Сегодня мы можем использовать множество технологий, не будучи экспертами в каждой из них. Это позволяет нам быстро создавать сложные системы без необходимости углубляться в каждую деталь.
💬 Как думаете вы? Лучше углубиться в одну область или быть «швейцарским ножом»?
#междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
📰 Недельный дайджест
Собрали для вас материалы второй недели осени.
— Сентябрьские обновления .NET
Microsoft выпустили обновления для .NET 8.0 и .NET 9.0. Эти обновления содержат исправления, не связанные с безопасностью, и направлены на улучшение стабильности и качества платформы.
— Улучшения производительности в .NET 10
В .NET 10 значительные улучшения производительности были достигнуты благодаря оптимизациям в Just-In-Time (JIT) компиляторе. Также улучшена деабстракция, позволяющая интерфейсам и делегатам работать быстрее, а виртуальные вызовы — эффективно инлайнироваться.
— 5 трендов IT-найма 2025
— Первый кандидат к релизу .NET 10
— Visual Studio 2026 Insiders уже доступна
🐸 Библиотека шарписта
Собрали для вас материалы второй недели осени.
— Сентябрьские обновления .NET
Microsoft выпустили обновления для .NET 8.0 и .NET 9.0. Эти обновления содержат исправления, не связанные с безопасностью, и направлены на улучшение стабильности и качества платформы.
— Улучшения производительности в .NET 10
В .NET 10 значительные улучшения производительности были достигнуты благодаря оптимизациям в Just-In-Time (JIT) компиляторе. Также улучшена деабстракция, позволяющая интерфейсам и делегатам работать быстрее, а виртуальные вызовы — эффективно инлайнироваться.
— 5 трендов IT-найма 2025
— Первый кандидат к релизу .NET 10
— Visual Studio 2026 Insiders уже доступна
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Forwarded from Библиотека задач по C# | тесты, код, задания
Библиотечный метод возвращает ValueTask<T> (часто завершается синхронно). В вызывающем коде результат нужно ждать несколько раз и/или комбинировать с другими задачами через Task.WhenAll. Что делать правильно?
👾 — ValueTask<T> можно await-ить сколько угодно раз — как Task<T>
👍 — Сконвертировать в Task<T> через .AsTask() и уже его ждать/комбинировать
🥰 — Обернуть в Task.Run(...), чтобы получить полноценную Task
⚡️ — Никогда не возвращать ValueTask<T> из публичных API — всегда только Task<T>
Библиотека задач по C#
👾 — ValueTask<T> можно await-ить сколько угодно раз — как Task<T>
👍 — Сконвертировать в Task<T> через .AsTask() и уже его ждать/комбинировать
🥰 — Обернуть в Task.Run(...), чтобы получить полноценную Task
⚡️ — Никогда не возвращать ValueTask<T> из публичных API — всегда только Task<T>
Библиотека задач по C#
👍56⚡5
💎 Вспоминаем SOLID
SOLID — это 5 принципов объектно-ориентированного проектирования. Давайте повторим эту базу.
— Single Responsibility Principle (Принцип единственной ответственности)
Каждый класс должен иметь только одну причину для изменения.
Плохо: класс UserManager и сохраняет пользователя в БД, и отправляет email.
Хорошо: UserRepository хранит, EmailService отправляет письма.
— Open/Closed Principle (Принцип открытости/закрытости)
Классы должны быть открыты для расширения, но закрыты для изменения.
Новый функционал добавляем через расширение, а не переписывание старого кода.
Пример: вместо переписывания метода — создаём новый подкласс или внедряем стратегию.
— Liskov Substitution Principle (Принцип подстановки Барбары Лисков)
Объекты подклассов должны работать так же, как объекты родителя.
Если Square наследуется от Rectangle, он должен вести себя как прямоугольник, а не ломать ожидания.
Суть: наследование не должно рушить логику программы.
— Interface Segregation Principle (Принцип разделения интерфейсов)
Лучше много маленьких интерфейсов, чем один огромный.
Плохо: интерфейс IMachine с методами print(), scan(), fax().
Хорошо: IPrinter, IScanner, IFax. Каждый класс реализует только нужное.
— Dependency Inversion Principle (Принцип инверсии зависимостей)
Зависимости должны быть от абстракций, а не от конкретных классов.
Плохо: класс ReportGenerator напрямую вызывает MySQLDatabase.
Хорошо: ReportGenerator работает с интерфейсом Database, а уже конкретная БД подставляется снаружи.
Без SOLID код быстро превращается в спагетти, где одно изменение ломает всё.
💬 Пишите в комменты как вы объясняете, что такое SOLID
🐸 Библиотека шарписта
#буст
SOLID — это 5 принципов объектно-ориентированного проектирования. Давайте повторим эту базу.
— Single Responsibility Principle (Принцип единственной ответственности)
Каждый класс должен иметь только одну причину для изменения.
Плохо: класс UserManager и сохраняет пользователя в БД, и отправляет email.
Хорошо: UserRepository хранит, EmailService отправляет письма.
— Open/Closed Principle (Принцип открытости/закрытости)
Классы должны быть открыты для расширения, но закрыты для изменения.
Новый функционал добавляем через расширение, а не переписывание старого кода.
Пример: вместо переписывания метода — создаём новый подкласс или внедряем стратегию.
— Liskov Substitution Principle (Принцип подстановки Барбары Лисков)
Объекты подклассов должны работать так же, как объекты родителя.
Если Square наследуется от Rectangle, он должен вести себя как прямоугольник, а не ломать ожидания.
Суть: наследование не должно рушить логику программы.
— Interface Segregation Principle (Принцип разделения интерфейсов)
Лучше много маленьких интерфейсов, чем один огромный.
Плохо: интерфейс IMachine с методами print(), scan(), fax().
Хорошо: IPrinter, IScanner, IFax. Каждый класс реализует только нужное.
— Dependency Inversion Principle (Принцип инверсии зависимостей)
Зависимости должны быть от абстракций, а не от конкретных классов.
Плохо: класс ReportGenerator напрямую вызывает MySQLDatabase.
Хорошо: ReportGenerator работает с интерфейсом Database, а уже конкретная БД подставляется снаружи.
Без SOLID код быстро превращается в спагетти, где одно изменение ломает всё.
💬 Пишите в комменты как вы объясняете, что такое SOLID
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23🔥4🥱3⚡1😁1
🧩 Оптимизация кода с помощью Application Insights
В .NET теперь проще выявлять узкие места и оптимизировать производительность приложений благодаря обновлениям в Application Insights. Инструмент собирает данные о работе кода в реальном времени, помогает находить медленные участки, лишние аллокации и повторяющиеся операции.
➡️ Блог разработчиков
🐸 Библиотека шарписта
В .NET теперь проще выявлять узкие места и оптимизировать производительность приложений благодаря обновлениям в Application Insights. Инструмент собирает данные о работе кода в реальном времени, помогает находить медленные участки, лишние аллокации и повторяющиеся операции.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🧗 Кто такие Unit-лид и Technical Owner
Классическая связка «тимлид + продакт-менеджер» не справляется с ростом команд до 50-100+ человек и усложнением продуктов. На смену приходят роли, ориентированные на продуктовое мышление вместо простого исполнения задач.
Unit-лид функционирует как мини-CEO продуктового направления: управляет стратегией, а technical owner служит мостом между бизнесом и техникой.
Главное отличие от прошлого: специалисты не просто выполняют поставленные задачи, а понимают продукт целиком.
➡️ Подробнее про обе роли
🐸 Библиотека шарписта
Классическая связка «тимлид + продакт-менеджер» не справляется с ростом команд до 50-100+ человек и усложнением продуктов. На смену приходят роли, ориентированные на продуктовое мышление вместо простого исполнения задач.
Unit-лид функционирует как мини-CEO продуктового направления: управляет стратегией, а technical owner служит мостом между бизнесом и техникой.
Главное отличие от прошлого: специалисты не просто выполняют поставленные задачи, а понимают продукт целиком.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Включите EventPipe/PerfView/dotnet-trace для старта: какие сборки грузятся, на что тратится время.
Снимите таймлайны: «вход в Main → готовность endpoint'ов / UI».
Измеряйте Release-сборку, без отладчиков и без «горячих» кэшей.
• ReadyToRun (R2R)
Компилирует IL в машинный код при публикации:
<!-- Directory.Build.props или csproj -->
<PropertyGroup>
<PublishReadyToRun>true</PublishReadyToRun>
<PublishTrimmed>true</PublishTrimmed>
<TrimMode>partial</TrimMode> <!-- для библиотек и DI -->
</PropertyGroup>
• PGO (Profile-Guided Optimization) + R2R
Соберите профиль и примените при crossgen2 (даёт лучший порядок/инлайнинг для «горячего» пути старта).
• NativeAOT
Полностью нативный бинарь, почти мгновенный старт. Подходит для CLI/служб с ограниченным набором фич и для «узких» сервисов или edge-эндпоинтов в вебе.
Уберите всё, что не нужно при старте: тяжёлые клиенты (БД, кеши, внешние SDK) создавайте лениво, после поднятия хостинга.
Прогружайте конфигурацию минимально: уберите лишние провайдеры, большие JSON-файлы, многократные AddJsonFile.
Логи на старте — только консоль/минимальный уровень, позже можно расширить.
Уберите неиспользуемые пакеты, объедините внутренние пакеты, избегайте древовидных зависимостей ради одной функции.
Встроенный контейнер быстрый, но следите за графом:
• Регайте Singleton/Scoped только когда нужно.
• Избегайте «сервисов-глобов» с большим конструктором на десятки зависимостей.
• Используйте фабрики/Lazy для тяжёлых зависимостей.
Минимальный хостинг и только нужные middleware:
var builder = WebApplication.CreateBuilder(args);
// Оставьте только то, что нужно для старта
builder.Services.AddRouting();
var app = builder.Build();
// Критичный middleware – ближе к началу конвейера
app.MapGet("/healthz", () => "OK");
app.Run();
Отключите всё, что делает работу на старте: избыточная авто-дискавери Swagger, отражение в валидации, сканирование сборок.
Разнесите готовность принимать трафик и полную готовность всех подсистем:
• Быстрый
/healthz
сразу.• Прогрев кэшей/метаданных — в фоне
IHostedService
с низким приоритетом.• В оркестраторе задайте
readinessProbe
после минимального старта, а «тяжёлый прогрев» делайте уже на фоне.PublishTrimmed=true
+ TrimMode=partial
часто снижает размер и ускоряет загрузку.Обязательно добавляйте
DynamicDependency
/UnconditionalSuppressMessage
/RD.XML
для сохранения типов, которые нужны через рефлексию (DI/JSON/ORM).💬 А у вас сколько секунд уходит на холодный старт .NET сервиса?
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤2🔥2❤🔥1