Волны ИИ
1.39K subscribers
430 photos
4 videos
5 files
324 links
Творчество искусственного интеллекта.
Download Telegram
📈 Исследование рынка .NET разработки: анализ текущих тенденций и прогнозы

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

🤔 Но как на самом деле чувствует себя сообщество разработчиков?

Для того чтобы понять это, команда fuse8 опросила 300 российских .NET разработчиков и руководителей разработки. Читайте подробнее, что из этого получилось👇

🔗 Читать
🔐 🔑 OAuth 2: как работает современная авторизация

Помнишь кнопку «Войти через Google»? Та самая кнопка, которая избавляет от необходимости запоминать очередной пароль. Сегодня разберем, как работает эта магия изнутри, почему гиганты вроде Spotify и Medium используют такой способ входа, и как внедрить его в свое приложение. Спойлер: это проще, чем кажется, и гораздо безопаснее традиционной формы регистрации.

Читать статью
🎙 Сравнения Rust и C#, Minimal API и Controllers, Problem и Details: 103-й выпуск подкаста RadioDotNet

Таймкоды:

[00:01:50] — Provide opt-in to experimental APIs
[00:11:50] — Comparison of Rust's borrow checker to C#
[00:36:35] — Problem Details for ASP.NET Core APIs
[00:54:30] — Comparing performance between Minimal API and classic Controllers
[01:05:30] — API Error Messages for a Good Developer Experience
[01:19:15] — Книга «ASP.NET Core в действии 3» в правильном переводе
[01:22:55] — Кратко о разном

⏯️ YouTube | Другие площадки

#подкасты
⚖️🛠️ EfCore.SchemaCompare — библиотека для сравнения модели базы данных EF Core со схемой базы данных

Если вы меняете схему базы данных вне системы миграций EF Core, например, с помощью SQL-скриптов, то эта библиотека может быстро сообщить, синхронизированы ли текущая схема базы данных и модель базы данных в EF Core.

👉 GitHub
🔥 Cамые интересные улучшения в библиотеках, Runtime и SDK, представленные в .NET 9: статья Артёма Ровенского из PVS-Studio

◾️C# 13
◾️Производительность
◾️LINQ
▪️Новый тип OrderedDictionary
▪️Новый тип ReadOnlySet
▪️Новый тип Tensor
allows ref struct в библиотеках
▪️[GeneratedRegex] для свойств
◾️SDK
▪️Terminal Logger включён по умолчанию
▪️Параллельный запуск тестов
▪️NuGet Audit
▪️BuildCheck
▪️Workload history
◾️Runtime
▪️Feature switch
▪️Динамическая адаптация к размерам приложений (DATAS)
▪️Улучшение JIT
▪️Улучшения Register Allocator

👉 Читать
🔥 Traversals: как из IEnumerable<Task<Foo>> сделать Task<IEnumerable<Foo>>

Представьте, что у вас есть коллекция идентификаторов и метод, возвращающий асинхронный результат:

public static Task<Foo> Read(int id);


Если вы вызовете этот метод для всех элементов коллекции, вы получите IEnumerable<Task<Foo>>. Однако работать с таким типом неудобно. Желаемый результат — это Task<IEnumerable<Foo>>.

В качестве решения можно использовать Traversals. Они полезны, когда нужно менять порядок вложенных структур данных, что облегчает работу с асинхронными вычислениями и сложными вложенными типами. В .NET это особенно актуально при работе с Task.

👉 Подробнее
⚙️🚦 Лучшие практики для тестирования асинхронного кода

Часто в погоне за производительностью мы забываем про важный аспект — тестирование. Асинхронный код может скрывать множество подводных камней: от скрытых исключений до проблем с многопоточностью. Даже если ваш код компилируется и работает, это не значит, что он свободен от ошибок, особенно в сценариях высокой нагрузки или работы с внешними сервисами.

1. Тестовые методы тоже должны быть асинхронными
Асинхронные методы нельзя правильно протестировать синхронно. Чтобы избежать неожиданных ошибок, всегда пишите тесты с async и возвращайте Task. Это позволяет тестовому фреймворку дождаться завершения всех операций и корректно обработать результат.

2. Не игнорируйте исключения
Асинхронный код может выбрасывать исключения, которые на первый взгляд не будут видны. Например, вызов метода может завершиться через await, но исключение «упаковано» и не проявится в вашем тесте. Используйте методы вроде Assert.ThrowsExceptionAsync, чтобы убедиться, что ваши тесты обрабатывают такие ситуации.

3. Следите за состоянием
Асинхронный код часто запускается в многопоточной среде. Это значит, что тестируемый код может обращаться к разделяемым ресурсам, например, коллекциям, файлам или базам данных. Убедитесь, что такие ресурсы правильно изолированы или настроены для работы с несколькими потоками.

4. Не забывайте про тайм-ауты
В реальных приложениях асинхронные операции могут зависнуть из-за внешних факторов: сеть стала недоступна, база данных не отвечает. Добавление тайм-аутов в тесты гарантирует, что тест не будет висеть вечно, если что-то пойдет не так. Например, устанавливайте предел времени на выполнение асинхронного метода и заверяйте, что он укладывается в него.

5. Используйте моки для зависимостей
Асинхронный код часто зависит от внешних сервисов, например, API или базы данных. Вместо того, чтобы тестировать реальную интеграцию, создавайте «заглушки» (моки), которые имитируют поведение этих сервисов. Это делает тесты быстрее и надежнее.
Value Object — это объект, который описывает значение или набор связанных значений. Он не имеет уникального идентификатора, и если два таких объекта содержат одинаковые данные, они считаются одинаковыми.

Например, адрес, сумма денег или цвет — это Value Objects. Они нужны, чтобы сделать код понятнее и безопаснее: вместо использования обычных строк или чисел, вы создаёте объект, который отражает смысл данных.

Зачем использовать Value Object?

Читаемость и выразительность кода. Вместо использования примитивных типов (string, decimal) создаются объекты, которые лучше отражают смысл данных.

Инкапсуляция бизнес-логики. Value Object может содержать валидацию данных, упрощая проверку их корректности на этапе создания.

Неизменяемость для безопасности. Объект остаётся неизменным после создания, что упрощает отладку и повышает предсказуемость.
Как управлять функциональностью приложения без повторного развертывания?

Feature flags открывают новые горизонты: они позволяют включать или отключать функции в реальном времени, проводить A/B-тестирование и снижать риски при выпуске новых возможностей.

Статья погружает вас в мир feature flags на платформе .NET и C#, объясняет их преимущества и предлагает практическое руководство по внедрению.
Хотите узнать, как сделать свои приложения более гибкими и надежными?

📎 Читать статью
ref и out: в чём разница?

Вы когда-нибудь задумывались, в чём различие между ключевыми словами ref и out в C#? Оба позволяют передавать параметры по ссылке, но используют их по-разному:

ref: требует, чтобы переменная была инициализирована до передачи в метод. Метод может изменить её значение, но не обязан.

out: позволяет передавать неинициализированные переменные. Метод должен обязательно присвоить значение перед возвратом.

Если вы хотите углубиться в тему и понять, как правильно использовать эти ключевые слова, загляните в подробное объяснение с примерами кода:
👉 Читать источник
🚀 Как ускорить распределенные системы: 8 стратегий снижения времени ожидания

Высокая latency — это скрытый враг, превращающий приложение в тормозящую телегу. Особенно в распределённых системах, где данные путешествуют между серверами и каждая задержка становится катастрофой. Знаете ли вы, какие 8 стратегий помогут превратить "задумчивое" приложение в настоящего чемпиона?

Что эффективнее: кэшировать, сжимать или оптимизировать запросы к базе? А что, если правильный ответ — балансировка нагрузки или вообще CDN?

💡 Найдите недостающий элемент в вашем стеке и максимально ускорьте свои приложения.

🔗 Читать статью
🔗 Зеркало
⚙️⚙️ System.Threading.Channels

Каналы в C# — это мощный инструмент для организации обмена данными между производителями (producers) и потребителями (consumers). Канал можно представить как асинхронную очередь, которая связывает две стороны: одна записывает данные, а другая — их читает. Такой подход полезен, если данные генерируются в одном потоке, а обрабатываются в другом.

Основные компоненты каналов:
⚙️ ChannelWriter — отвечает за добавление данных в канал. Это «производитель».
⚙️ ChannelReader — отвечает за чтение данных из канала. Это «потребитель».
⚙️ Channel — объединяет Writer и Reader, предоставляя общий интерфейс для их взаимодействия.

Преимущества использования:
Работа с каналами основана на async/await, что упрощает интеграцию с другими асинхронными компонентами.
Низкоуровневое управление потоками и памятью делает их быстрее, чем использование классических очередей.
Поддерживает настройку поведения, например, фиксированный или неограниченный размер буфера.
Вакансии «Библиотеки программиста» — ждем вас в команде!

Мы постоянно растем и развиваемся, поэтому создали отдельную страницу, на которой будут размещены наши актуальные вакансии. Сейчас мы ищем:
👉контент-менеджеров для ведения телеграм-каналов

Подробности тут

Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴

Ждем ваших откликов 👾
⚙️ 🗒️ MemoryCache в C#: Зачем и как использовать
MemoryCache — это инструмент для хранения временных данных в оперативной памяти, что позволяет ускорить доступ к часто используемой информации. Это особенно полезно для веб-приложений, API или других программ, где важно снизить нагрузку на внешние источники данных (например, базы данных).

Основные возможности MemoryCache
⚙️ Быстродействие: Данные хранятся в памяти, поэтому доступны быстрее, чем при запросах в БД или файловую систему.
⚙️ Временное хранение: Вы можете настроить срок жизни данных (например, 5 минут или до определённого времени).
⚙️ Политики истечения:
Абсолютное истечение (Absolute Expiration): Данные удаляются по истечении указанного времени.
Скользящее окно (Sliding Expiration): Время истечения обновляется при каждом обращении к данным.
⚙️ Управление памятью: Ограничение общего объёма данных, чтобы не перегружать оперативную память.

Когда использовать MemoryCache?
Кэширование часто используемых данных: Например, результаты сложных запросов в базу данных, ответы сторонних API или статические файлы (настройки, конфигурации).
Улучшение производительности: Если ваши данные редко изменяются, кэширование уменьшает задержки на их повторное получение.
Локальные сценарии: MemoryCache используется для данных, которые актуальны только в текущем процессе (например, при работе на одном сервере).
Привет, друзья! 👋

Мы готовим статью об ИИ-инструментах для программирования в 2024 году и хотим услышать ваше мнение! 🤖💻 Поделитесь своим опытом и помогите нам сделать материал еще полезнее. Самые интересные ответы войдут в статью! 🏆
Не забудьте оставить комментарий с вашими мыслями об ИИ в программировании! Какие преимущества и недостатки вы видите? Какие инструменты рекомендуете попробовать коллегам? 🤔💬
🚀 CountBy: Новый метод LINQ в .NET 9, который упростит вашу жизнь

В .NET 9 команда Microsoft продолжает улучшать библиотеку LINQ, и одним из нововведений стал метод CountBy. Этот метод открывает новые горизонты для удобной и лаконичной работы с данными, позволяя эффективно группировать элементы и подсчитывать их количество.

🔍Что именно он делает?
- Группирует элементы по заданному ключу;
- Подсчитывает количество элементов в каждой группе;
- Возвращает результат в виде коллекции пар «ключ-значение».

Как это работало раньше? Пример с подсчётом букв в строке:

var charCounts = input
.Where(c => !char.IsWhiteSpace(c))
.GroupBy(c => c)
.Select(group => new { Key = group.Key, Count = group.Count() });


Ранее подобное можно было сделать через комбинацию методов GroupBy и Select, но CountBy делает этот процесс проще и менее подверженным ошибкам. Теперь это выглядит вот так:

var charCounts = input
.Where(c => !char.IsWhiteSpace(c))
.CountBy(c => c);
⚙️ gRPC против REST: что выбрать для вашего проекта?

⚙️ REST (Representational State Transfer): Архитектурный стиль взаимодействия, который основан на протоколе HTTP и обычно использует формат JSON или XML для передачи данных.
⚙️ gRPC (Google Remote Procedure Call): Фреймворк удаленного вызова процедур, построенный на основе HTTP/2 и использующий протокол сериализации Protocol Buffers (Protobuf).

Когда выбрать gRPC?
- Высокопроизводительные микросервисы с бо́льшим количеством запросов.
- Нужен стриминг данных в реальном времени.
- Система использует несколько языков программирования.
- Ограничения на пропускную способность или необходимость минимизировать задержки.

Когда выбрать REST?
- Простые CRUD-приложения, где производительность не критична.
- Высокая совместимость с веб-приложениями и стандартными клиентами.
- Простота разработки и отладки важнее строгой типизации.
- Нужна удобная документация и тестирование API.
⚙️ gRPC против REST: что выбрать для вашего проекта?

⚙️ REST (Representational State Transfer): Архитектурный стиль взаимодействия, который основан на протоколе HTTP и обычно использует формат JSON или XML для передачи данных.
⚙️ gRPC (Google Remote Procedure Call): Фреймворк удаленного вызова процедур, построенный на основе HTTP/2 и использующий протокол сериализации Protocol Buffers (Protobuf).

Когда выбрать gRPC?
- Высокопроизводительные микросервисы с бо́льшим количеством запросов.
- Нужен стриминг данных в реальном времени.
- Система использует несколько языков программирования.
- Ограничения на пропускную способность или необходимость минимизировать задержки.

Когда выбрать REST?
- Простые CRUD-приложения, где производительность не критична.
- Высокая совместимость с веб-приложениями и стандартными клиентами.
- Простота разработки и отладки важнее строгой типизации.
- Нужна удобная документация и тестирование API.
📜 ТОП-15 международных IT-сертификаций, которые увеличат твой доход в 2025 году

Хочешь знать, какие «корочки» реально поднимут твою зарплату? Исследование Skillsoft раскрыло ТОП-15 самых денежных IT-сертификаций. Спойлер: облака и безопасность рулят.

👉 Читать статью
📦 Что такое dotnet scaffold?
dotnet scaffold — это инструмент для быстрого создания компонентов, шаблонов проектов и приложений на основе ваших потребностей. Его главная цель — автоматизировать рутинные задачи, чтобы разработчики могли сосредоточиться на написании кода, а не на настройке окружения.

🛠️ Установка
Чтобы начать использовать инструмент, установите его через командную строку:
dotnet tool install --global Microsoft.dotnet-scaffold


⚙️ Как это работает?
1️⃣ Войдите в папку с вашим проектом.
2️⃣ Выполните команду:
dotnet scaffold


3️⃣ Вам будет предложено выбрать тип создаваемого объекта. Например:
- Web API
- Blazor
- Web App
4️⃣ Далее следуйте интерактивным подсказкам: выберите фреймворк, настройте маршруты или добавьте зависимости.
5️⃣ Инструмент автоматически сгенерирует необходимые файлы и обновит ваш проект.

Преимущества использования:
🚀 Интерактивность: Удобные подсказки помогают избежать ошибок при настройке.
🚀 Экономия времени: Генерация готовых к использованию шаблонов за считанные секунды.
🚀 Гибкость: Поддерживаются различные типы проектов, включая ASP.NET Core, Blazor и даже кастомные шаблоны.