13726
Присоединяйтесь к нашему каналу и погрузитесь в мир для C#-разработчика Связь: @devmangx РКН: https://clck.ru/3FocB6
Оказывается, чтобы расти в доходе в ML и IT, недостаточно закончить топовый матфак, работать 24/7 и знать все фреймворки мира
Да, это круто, но это – далеко не главное. На самом деле чаще всего выигрывают люди с прокаченным софт скиллами – те, кто уверенно ведет диалог и грамотно доносит ценность своих решений.
Вот вам пример: Senior ML-инженер Олег Андриянов рассказывает в своем канале, как его доход вырос за 4 года в 12,5 раз. В блоге куча крутых статей, вот наш топ-3:
– Как гарантированно повысить свою зарплату?
– Какие 2 ключевых софт-скилла делают тебя на голову выше конкурентов на рынке труда?
– Как Олегу удалось вырасти в доходах в 12,5 раз за 4 года?
У автора большой опыт руководителя, так что он знает, чего хочет от сотрудника индустрия, и в его канале – не фантазии, а настоящие практические инструменты, которые помогут быстрее достичь карьерных целей.
Подписывайся, если хочешь стать незаменимым в любой IT-команде: @andriyanov_leads
Реклама. СЗ Волков Д.Д. ИНН: 370701873479, erid: 2Vtzqwy7BPx
Версионирование API в .NET 9
В .NET 9 ты можешь гибко управлять версиями API — хоть в контроллерах, хоть в минималках:
⏩URL-версионирование — /api/v1/orders, /api/v2/orders
⏩Query string — /api/orders?api-version=1
⏩Заголовок HTTP — X-Api-Version: 1
⏩Тип медиа — application/vnd.myapi.v1+json
⚙️ Подключи нужные пакеты:
Asp.Versioning.Http
Asp.Versioning.Mvc
Asp.Versioning.Mvc.ApiExplorer
Вы слышали о Coravel?
Coravel — это .NET-библиотека без необходимости конфигурации, ориентированная на разработчиков, вдохновлённая Laravel (PHP-фреймворком).
Она создана для того, чтобы сделать ваше приложение мощнее — за счёт фоновых задач и автоматизации.
Это как бустер продуктивности для .NET-бэкенда.
Возможности без базы данных, брокеров сообщений и внешних сервисов:
—> Планирование задач (как Cron)
—> Очереди фоновых задач (в памяти)
—> Классы фоновых задач (Invocables)
—> Рассылка событий (Pub/Sub внутри процесса)
—> Отправка писем
—> Простое кэширование
Не подходит для критически важных задач, которым нужна устойчивость, и для распределённых систем, требующих координации.
Ты уже пробовал? 🏴☠️
👉 @KodBlog
OpenAI выпустила Codex CLI — опенсорс агента ИИ
Лицензия Apache 2.0. Легко запускается локально и превращает командную строку в среду программирования на естественном языке.
👉 @KodBlog
Central Package Management в .NET
⏩Статья
👉 @KodBlog
Если вы ещё не включили RespectRequiredConstructorParameters в System.Text.Json 9 — самое время это сделать
Эта опция позволяет сериализатору учитывать обязательные параметры конструктора при десериализации.
Если какой-то required-параметр отсутствует в JSON — JsonException тут как тут
Больше никаких тихих багов из-за значений по умолчанию
💪💪💪
👉 @KodBlog
200+ задач по структурам данных и алгоритмам
⏩Массивы – https://bit.ly/3vM1JP5
⏩Строки – https://bit.ly/3vM1JP5
⏩Двоичное дерево – https://bit.ly/3JIsn1i
⏩Связный список – https://bit.ly/3zFatrn
⏩Динамическое программирование – https://bit.ly/3vLwjs5
⏩Рекурсия – https://bit.ly/3JDhUnv
👉 @KodBlog
Хочешь условный middleware в .NET?
Используй app.UseWhen(), чтобы применять middleware только при выполнении определённых условий.
✅ Преимущества:
—> Повышает производительность
—> Поддерживает чистоту кода
—> Позволяет реализовать логику для конкретных маршрутов
Идеально для сложных приложений. Просто, мощно и аккуратно.
👉 @KodBlog
Что делает AsSplitQuery() в Entity Framework?
Выше приведён пример до / после использования
В 1 случае —> только небольшая проблема «декартова взрыва», так как здесь соединяется всего одна таблица
… НО при большем количестве соединений дублирование данных увеличивается
Во 2 случае —> разделённые запросы означают меньше дублирования
… НО больше обращений к базе и потенциальная несогласованность данных
👉 @KodBlog
Краткая история языка C#
Microsoft выпустила C# 13 в ноябре прошлого года. За более чем 20 лет C# развивался через 13 версий, каждая из которых привносила новые возможности.
Вот краткий обзор этих функций:
⏩ C# 1.0 (.NET 1.0, 2002): Первый релиз
⏩ C# 1.2 (.NET 1.1, 2003): IDisposable для IEnumerators
⏩ C# 2.0 (.NET 2.0, 2005): Обобщения, nullable-типы, итераторы
⏩ C# 3.0 (.NET 3.5, 2007): Лямбда-выражения, LINQ, методы расширения
⏩ C# 4.0 (.NET 4, 2010): Динамическое связывание, именованные аргументы, необязательные параметры
⏩ C# 5.0 (.NET 4.5, 2012): Async/await, атрибуты информации о вызывающем
⏩ C# 6.0 (.NET 4.6, 2015): Инициализаторы автосвойств, статические импорты, фильтры исключений
⏩ C# 7.0 (.NET 4.7, 2017): Кортежи, сопоставление с образцом, ref-переменные и возвращаемые значения
⏩ C# 7.1 (2017): Async main, вывод кортежей, выражения по умолчанию
⏩ C# 7.2 (2017): Модификатор доступа private protected, Span<T>
⏩ C# 7.3 (2018): Новые ограничения для обобщений, переназначение ref
⏩ C# 8.0 (.NET Core 3.0, 2019): Nullable-ссылочные типы, индексы и диапазоны, using-объявления
⏩ C# 9.0 (.NET 5.0, 2020): Records, свойства init, верхнеуровневые программы
⏩ C# 10.0 (.NET 6.0, 2021): Record-структуры, глобальные using-и, пространства имён в файлах
⏩ C# 11.0 (.NET 7.0, 2022): Обобщённая математика, обязательные члены, необработанные строковые литералы
⏩ C# 12.0 (.NET 8.0, 2023): Выражения коллекций, первичные конструкторы
⏩ C# 13.0 (.NET 9.0, 2024): Улучшенные параметры, частичные свойства, новый объект блокировки
Зависимости сетевых протоколов, которые необходимо знать
👉 @KodBlog
Новый релиз бесплатного инструмента T-SQL Analyzer на .NET для выявления антипаттернов в T-SQL-скриптах — более 140 проверок
НОВОЕ: поддержка форматирования SQL-кода с использованием библиотеки SqlScriptDom
Приводите ваш T-SQL к единообразному и читаемому виду 🍺
👉 @KodBlog
💡 Совет по C#
Используй метод string.Join, чтобы объединить элементы коллекции в одну строку, вставляя указанный разделитель между элементами.
А ты используешь string.Join в своём коде?
👉 @KodBlog
💡 В .NET 9 представлено новое поведение GUID, основанное на метке времени и случайности
Теперь GUID стал последовательным, что делает его более подходящим для реляционных баз данных
Также добавлено свойство Version, позволяющее определить версию созданного GUID
👉 @KodBlog
Микросервисы
В правильном контексте они решают реальные проблемы
Мы создавали продукт, в котором разные команды владели разными бизнес-областями — платежи, биллинг, уведомления, отчётность.
Каждой команде нужно было быстро деплоиться, принимать решения независимо и масштабироваться в зависимости от нагрузки
Микросервисы сделали это возможным.
1. У платежей была высокая нагрузка → мы масштабировали только этот сервис
2. Отчётность требовала тяжёлой обработки → мы использовали другой стек
3. Уведомления? Деплоились по нескольку раз в день без влияния на остальное
Это прекрасно работало.
Почему? Потому что проблема была достаточно серьёзной, чтобы оправдать сложность.
Но вот главное:
Микросервисы — не отправная точка
Если вы строите небольшую или среднюю систему с одной командой, чистый монолит с модульными границами будет быстрее, дешевле и проще в управлении
Начните с простоты. Переходите к микросервисам, когда (и только когда) проблема станет реальной
👉 @KodBlog
Новинка: Incrementalist 1.0 — инструмент инкрементальной сборки для .NET, который использует git diff (через libgit2sharp) и Roslyn для анализа изменений и зависимостей в коде, чтобы значительно сократить время сборки и тестирования в больших .NET-решениях и монорепозиториях.
Хотя его использовали и раньше, но только сейчас инструмент получил полноценный интерфейс командной строки 😊
👉 @KodBlog
Ты используешь локальные переменные в LINQ?
Слышал про ключевое слово let?
Ключевое слово let позволяет создавать локальные переменные прямо внутри LINQ-запроса.
Это похоже на создание переменной внутри цикла. С помощью let можно выносить сложные выражения в отдельные переменные — так запрос становится модульным и легче читается.
Кроме того, let может помочь в оптимизации производительности LINQ-запросов, уменьшая количество итераций, необходимых для обработки данных.
На фото прикрепил простой пример использования.
⏩Также чекни эти 4 совета по улучшению производительности в Entity Framework: тут
👉 @KodBlog
Схема последовательности действий Outbox Pattern
Этот паттерн обеспечивает надёжную доставку событий из приложения в очередь сообщений без потери данных
1. Пользователь отправляет заказ.
2. Приложение сохраняет:
—> Заказ в таблицу Orders
—> Соответствующее событие в таблицу Outbox
Всё это происходит в рамках одной транзакции — то есть либо оба действия выполняются, либо ни одно.
3. Отдельный процессор Outbox затем:
—> Извлекает необработанные события
—> Публикует их в очередь сообщений (например, Kafka, RabbitMQ)
—> Отмечает их как обработанные в БД
⏩Как реализовать его с нуля? —> читать
👉 @KodBlog
Трудно отлаживать запросы в EF Core?
Используй .EnableSensitiveDataLogging() — и увидишь в логах реальный SQL + значения параметров
Очень удобно для:
—> Понимания проблем с запросами
—> Копирования и запуска SQL напрямую
Не используй в проде! 👊
👉 @KodBlog
IAsyncActionFilter — недооценён, но очень полезный фильтр
В ASP.NET Core фильтры позволяют запускать логику до и после выполнения запроса в пайплайне.
Зачем их использовать?
—> Повторно используемая логика
—> Чистые, читаемые контроллеры
Отлично подходит для:
—> Проверки прав доступа
—> Подтверждения email
—> Применения бизнес-правил
👉 @KodBlog
Нужно получить ID вошедшего пользователя в Web API ? 🪑
(Предполагается, что ID пользователя был добавлен как claim при генерации токена)
—> Определи интерфейс IUser
—> Реализуй его, чтобы считывать ID из claims
—> Зарегистрируй зависимости
—> Внедряй IUser и получай доступ к ID где угодно
👉 @KodBlog
Архитектор : «В .NET слишком любят всё усложнять.»
Он же через минуту : «А вот 10 ПОТРЯСАЮЩИХ паттернов, которые мы можем взять из референсной архитектуры eShop от Microsoft! 😍»
Давайте тогда возьмём сайт на WiX и превратим его в магистерскую диссертацию по распределённым системам
А вы тоже замечали такие противоречия среди разработчиков?
👉 @KodBlog
Что такое преобразование клеймов (Claims Transformation) в ASP.NET Core?
Если access token от вашего провайдера идентификации (Identity Provider) не полностью соответствует внутренним требованиям авторизации вашего приложения, вы можете использовать преобразование клеймов.
Преобразование клеймов позволяет изменить клеймы до того, как приложение начнёт использовать их для авторизации 🔧
С помощью этого механизма можно, например, добавить недостающие клеймы из базы данных или другого источника.
Почему это полезно —> читайте здесь: статья
👉 @KodBlog
Пример условного присваивания с null-проверкой в C# 14
Это нововведение доступно в C# 14 Preview 3 и позволяет выполнять присваивание свойству или полю только если экземпляр-объект существует (не равен null)
Что думаете? 🤔
👉 @KodBlog
Подождите, что, Cursor Pro - это бесплатно?
Автоматическая регистрация в Cursor AI, автоматический сброс MachineID, бесплатное получение доступа к Pro-функциям
GitHub - https://github.com/yeongpin/cursor-free-vip 🥴
👉 @KodBlog
Новинка: HybridCache в .NET наконец-то получил стабильный релиз
HybridCache в ASP.NET Core — новая кэш-библиотека, объединяющая преимущества внутрипроцессного (in-memory) и распределённого кэширования
⏩Узнайте больше: здесь
👉 @KodBlog
ASP.NET Core Roadmap for .NET 10 — здесь
Команда разработчиков ASP.NET Core изложила основные направления и функции, над которыми они планируют работать в рамках выпуска .NET 10
Этот список является предварительным и может изменяться по мере разработки
👉 @KodBlog
5 причин, почему простые extension-методы в C# чаще всего лучше AutoMapper 👇
1. Простота
Пишешь только то, что нужно и ничего лишнего. Extension-методы дают точное управление маппингом без лишней конфигурации
2. Производительность
Без рефлексии и скрытых накладных расходов. Прямой маппинг работает быстрее и экономит ценные миллисекунды на рантайме
3. Читаемость
Код должен рассказывать историю. Когда другой разработчик читает маппинг, extension-метод чаще всего более прозрачен
4. Гибкость
Это твой код. Можно легко адаптировать логику под конкретные кейсы, не упираясь в ограничения сторонней библиотеки.
5. Отладка
Можно спокойно зайти в свой маппинг-код и сразу увидеть, что и как работает. Без необходимости лезть в внутренности AutoMapper
Простота, производительность и контроль — часто выигрывают, особенно когда пишешь чистую и поддерживаемую архитектуру
👉 @KodBlog
У нас был один класс под названием UserManager
Он занимался всем:
Регистрацией пользователей. Проверкой паролей. Отправкой приветственных писем. Логированием событий. Обновлением информации профиля. Даже вызовами сторонних API
Он работал. Пока не перестал 😵💫
Любое изменение становилось рискованным. Небольшое изменение в одном методе ломало другой. Юнит-тесты были в хаосе.
Никто не хотел к нему прикасаться
Вот тогда я по-настоящему понял принцип единственной ответственности (SRP):
🔜 Класс должен иметь только одну причину для изменения
Не потому что так красиво звучит. А потому что это делает код тестируемым, поддерживаемым и читаемым
Мы разбили UserManager на более мелкие, сфокусированные сервисы:
⏩UserRegistrationService
⏩EmailNotifier
⏩PasswordValidator
⏩AuditLogger
Вдруг всё стало понятно. Тесты стали точечными. Вносить изменения стало проще
SRP — это не просто правило. Это способ сохранить ваш код живым надолго
👉 @KodBlog
Наткнулся тут на интересный проект — ReactiveGenerator
Это такой современный C# source generator, который автоматизирует реализацию уведомлений об изменении свойств, поддерживая как стандартный INotifyPropertyChanged, так и паттерны ReactiveUI
Нам, разработчикам, это даёт главное — чистый код без тонны однотипной ручной писанины.
Например, раньше приходилось вручную писать геттеры и сеттеры с вызовами RaiseAndSetIfChanged
Теперь же достаточно использовать атрибуты [Reactive] и [ObservableAsProperty]
👉 @KodBlog