This media is not supported in your browser
VIEW IN TELEGRAM
Так вот как становятся ПМ…
⚡️ Полное руководство по Bash: от основ к продвинутым темам
Bash (Bourne Again SHell) — это одна из самых популярных Unix-оболочек, широко используемая для запуска команд и написания скриптов в Linux и macOS.
Скрипты Bash позволяют автоматизировать рутинные задачи, объединять команды в программы и управлять системой через командную строку.
Данное руководство последовательно познакомит вас с основами Bash (синтаксис, переменные, условия, циклы и т.д.), а затем перейдет к продвинутым возможностям (таким как настройка strict mode, использование trap-обработчиков, планирование задач через cron и др.). Мы рассмотрим практические примеры скриптов, сопровождая их поясняющими комментариями, чтобы у вас сложилось цельное понимание создания надежных Bash-скриптов.
https://uproger.com/polnoe-rukovodstvo-po-bash-ot-osnov-k-prodvinutym-temam/
Видео: https://www.youtube.com/watch?v=ei0a1TT4ukU
Bash (Bourne Again SHell) — это одна из самых популярных Unix-оболочек, широко используемая для запуска команд и написания скриптов в Linux и macOS.
Скрипты Bash позволяют автоматизировать рутинные задачи, объединять команды в программы и управлять системой через командную строку.
Данное руководство последовательно познакомит вас с основами Bash (синтаксис, переменные, условия, циклы и т.д.), а затем перейдет к продвинутым возможностям (таким как настройка strict mode, использование trap-обработчиков, планирование задач через cron и др.). Мы рассмотрим практические примеры скриптов, сопровождая их поясняющими комментариями, чтобы у вас сложилось цельное понимание создания надежных Bash-скриптов.
https://uproger.com/polnoe-rukovodstvo-po-bash-ot-osnov-k-prodvinutym-temam/
Видео: https://www.youtube.com/watch?v=ei0a1TT4ukU
«Обзор нововведений в C# 14»
Статья от PVS-Studio на Хабре описывает, что именно добавили в C# 14 и как эти изменения делают код чище и короче.
1. Ключевое слово
Теперь в сеттере свойства можно обращаться к скрытому полю без его явного объявления.
Это уменьшает шаблонный код и делает свойства компактнее.
Пример было:
Пример стало:
Лямбды с модификаторами без указания типа
Если в параметрах используются ref, out, in, теперь можно не писать тип.
Это улучшает читаемость и уменьшает шум.
Было:
Стало:
Перегрузка операторов составного присваивания (+=, -=, *=, /=)
Теперь такие операторы можно перегружать напрямую, а не через комбинацию бинарного оператора и присваивания.
Это делает пользовательские типы более естественными и управляемыми.
nameof для открытых обобщённых типов
Теперь можно писать:
Это полезно при генерации кода, рефлексии и работе с API, где нужны именно открытые generics.
C# 14 - небольшое, но важное обновление языка, направленное на упрощение синтаксиса и уменьшение шаблонного кода. Наиболее заметные улучшения - field и новые правила для лямбд.
Статья от PVS-Studio на Хабре описывает, что именно добавили в C# 14 и как эти изменения делают код чище и короче.
1. Ключевое слово
field Теперь в сеттере свойства можно обращаться к скрытому полю без его явного объявления.
Это уменьшает шаблонный код и делает свойства компактнее.
Пример было:
private string _email;
public string Email
{
get => _email;
set => _email = value.Trim();
}
Пример стало:
public string Email
{
get;
set => field = value.Trim();
}
Лямбды с модификаторами без указания типа
Если в параметрах используются ref, out, in, теперь можно не писать тип.
Это улучшает читаемость и уменьшает шум.
Было:
(value, out string error) => ...
Стало:
(value, out error) => ...
Перегрузка операторов составного присваивания (+=, -=, *=, /=)
Теперь такие операторы можно перегружать напрямую, а не через комбинацию бинарного оператора и присваивания.
Это делает пользовательские типы более естественными и управляемыми.
nameof для открытых обобщённых типов
Теперь можно писать:
nameof(List<>)
Это полезно при генерации кода, рефлексии и работе с API, где нужны именно открытые generics.
C# 14 - небольшое, но важное обновление языка, направленное на упрощение синтаксиса и уменьшение шаблонного кода. Наиболее заметные улучшения - field и новые правила для лямбд.
Вместо того чтобы дублировать конфигурацию в каждом .csproj, ты создаёшь один файл в корне и управляешь всем централизованно: версия языка, уровни предупреждений, Nullable, ImplicitUsings, Deterministic-сборки и даже версии NuGet-пакетов.
Подходит, если хочешь порядок в проектах и одинаковые правила для всей команды.
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡️ Полезное о блокировках в C#. Многие собеседования заваливаются именно здесь.
Коротко по сути:
Причина проста — выполнение может продолжиться на другом потоке, и гарантии взаимного исключения теряются.
Что использовать вместо `lock` в асинхронном коде:
-
-
-
-
Правильный шаблон:
1. Всегда используйте таймаут, чтобы избежать зависаний.
2. Освобождайте ресурс в `finally`, иначе возможна утечка блокировки.
Примерный подход:
- попытаться войти с ограничением времени
- выполнить критическую секцию
- гарантированно освободить семафор
Почему это важно:
В многопоточном и распределённом окружении неправильная синхронизация приводит к гонкам, дублированию запросов, «штормам» в кеше и нагрузке на внешний API.
Вопрос для практики:
Как реализовать блокировку на уровне базы данных, чтобы синхронизировать несколько инстансов приложения?
Ответ — в разборе по distributed locking:
milanjovanovic.tech/blog/distributed-locking-in-dotnet-coordinating-work-across-multiple-instances
Коротко по сути:
lock не работает в `async`-методах. Причина проста — выполнение может продолжиться на другом потоке, и гарантии взаимного исключения теряются.
Что использовать вместо `lock` в асинхронном коде:
-
SemaphoreSlim — основной вариант -
Semaphore -
Mutex -
Monitor (в синхронных сценариях)Правильный шаблон:
1. Всегда используйте таймаут, чтобы избежать зависаний.
2. Освобождайте ресурс в `finally`, иначе возможна утечка блокировки.
Примерный подход:
- попытаться войти с ограничением времени
- выполнить критическую секцию
- гарантированно освободить семафор
Почему это важно:
В многопоточном и распределённом окружении неправильная синхронизация приводит к гонкам, дублированию запросов, «штормам» в кеше и нагрузке на внешний API.
Вопрос для практики:
Как реализовать блокировку на уровне базы данных, чтобы синхронизировать несколько инстансов приложения?
Ответ — в разборе по distributed locking:
milanjovanovic.tech/blog/distributed-locking-in-dotnet-coordinating-work-across-multiple-instances
DelegatingHandler - это удобный способ внедрять сквозную логику в каждый HTTP-запрос: авторизацию, логирование, метрики, ретраи и любые другие политики, не трогая основной код.
Пример обработчика аутентификации:
- добавляет заголовок Authorization
- подставляет корректный User-Agent
- затем передаёт управление следующему звену конвейера
Это позволяет централизованно контролировать конфигурацию запросов и избегать дублирования логики во всех сервисах.
Подходит для чистой архитектуры, микросервисов и SDK, где важна единообразная обработка запросов.
Please open Telegram to view this post
VIEW IN TELEGRAM
🚀 .NET 10 - реально мощный релиз. Вот что важно знать 👇
.NET 10 и C# 14 вышли 11 ноября 2025 года.
Это LTS-версия - поддержку будут выпускать до ноября 2028 года,
поэтому её можно спокойно брать для продакшна.
🔥 Главное
✔ C# 14
Новый синтаксис и возможности языка:
• Extension Members — расширения прямо в типах
• Null-Conditional Assignment - безопасные присваивания
•
• Модификаторы у параметров лямбд
• Частичные конструкторы и события
✔ File-Based Apps
Теперь можно просто создать один
без
✔ ASP.NET Core
• Валидация в Minimal APIs
• JSON Patch
• SSE (Server-Sent Events)
• Поддержка OpenAPI 3.1
✔ EF Core
• Complex Types можно делать optional
• JSON и struct внутри Complex Types
• LeftJoin / RightJoin
• Named Query Filters
• ExecuteUpdate работает с JSON-колонками
• В ExecuteUpdate теперь можно использовать обычные лямбды
Полный гайд здесь:
↳ https://antondevtips.com/blog/new-features-in-dotnet-10-and-csharp-14/?utm_source=twitter&utm_medium=social&utm_campaign=04-12-2025
.NET 10 и C# 14 вышли 11 ноября 2025 года.
Это LTS-версия - поддержку будут выпускать до ноября 2028 года,
поэтому её можно спокойно брать для продакшна.
🔥 Главное
✔ C# 14
Новый синтаксис и возможности языка:
• Extension Members — расширения прямо в типах
• Null-Conditional Assignment - безопасные присваивания
•
field keyword — точный контроль над авто-свойствами • Модификаторы у параметров лямбд
• Частичные конструкторы и события
✔ File-Based Apps
Теперь можно просто создать один
.cs файл и запускать приложение - без
.sln, без .csproj. Быстро, просто, удобно.✔ ASP.NET Core
• Валидация в Minimal APIs
• JSON Patch
• SSE (Server-Sent Events)
• Поддержка OpenAPI 3.1
✔ EF Core
• Complex Types можно делать optional
• JSON и struct внутри Complex Types
• LeftJoin / RightJoin
• Named Query Filters
• ExecuteUpdate работает с JSON-колонками
• В ExecuteUpdate теперь можно использовать обычные лямбды
Полный гайд здесь:
↳ https://antondevtips.com/blog/new-features-in-dotnet-10-and-csharp-14/?utm_source=twitter&utm_medium=social&utm_campaign=04-12-2025
Крутая статья - «Building an Event Queue in ASP.NET Core» от Deepumi.
🔹 Она показывает, как правильно построить очередь событий внутри ASP.NET Core-приложения:
• использовать встроенные механизмы (middleware / DI)
• распределять события между обработчиками
• обрабатывать события асинхронно и надёжно
🔹 Такая архитектура помогает:
• реализовать decoupled компоненты, которые не знают друг о друге
• централизовать событие-поток (логика, оповещения, триггеры и т.п.)
• легче масштабировать и тестировать код
Если работаешь с ASP.NET Core и хочешь сделать систему событий - стоит заглянуть.
Подробнее: deepumi.com/blog/building-an-event-queue-in-aspnet-core.html
🔹 Она показывает, как правильно построить очередь событий внутри ASP.NET Core-приложения:
• использовать встроенные механизмы (middleware / DI)
• распределять события между обработчиками
• обрабатывать события асинхронно и надёжно
🔹 Такая архитектура помогает:
• реализовать decoupled компоненты, которые не знают друг о друге
• централизовать событие-поток (логика, оповещения, триггеры и т.п.)
• легче масштабировать и тестировать код
Если работаешь с ASP.NET Core и хочешь сделать систему событий - стоит заглянуть.
Подробнее: deepumi.com/blog/building-an-event-queue-in-aspnet-core.html
🚦 Feature Flags в .NET - как управлять релизами без redeploy
Feature flags (фиче-флаги) позволяют включать и выключать функциональность на лету, без повторного деплоя и риска для продакшена.
Идея простая:
код задеплоен → поведение управляется конфигурацией.
Что это даёт на практике:
— Постепенные релизы
Можно включить новую фичу сначала для 1%, 10% или конкретной группы пользователей.
— Быстрый rollback
Если что-то пошло не так — просто выключаете флаг. Без откатов и срочных хотфиксов.
— A/B тесты
Разные пользователи получают разное поведение одного и того же кода.
— Targeting пользователей
Фичи можно включать:
• по user id
• по роли
• по региону
• по environment (dev / staging / prod)
— Меньше фиче-веток
Код живёт в main, а не за флагами в git.
В .NET обычно используют:
- Microsoft.FeatureManagement
- Azure App Configuration
- LaunchDarkly / Unleash / ConfigCat
Где это особенно полезно:
- публичные API
- high-traffic сервисы
- SaaS-продукты
- экспериментальные и рискованные фичи
Коротко:
Feature flags превращают релиз из «одного опасного момента» в управляемый процесс.
Это один из самых мощных инструментов для зрелой backend-архитектуры.
👉 Подробнее
Feature flags (фиче-флаги) позволяют включать и выключать функциональность на лету, без повторного деплоя и риска для продакшена.
Идея простая:
код задеплоен → поведение управляется конфигурацией.
Что это даёт на практике:
— Постепенные релизы
Можно включить новую фичу сначала для 1%, 10% или конкретной группы пользователей.
— Быстрый rollback
Если что-то пошло не так — просто выключаете флаг. Без откатов и срочных хотфиксов.
— A/B тесты
Разные пользователи получают разное поведение одного и того же кода.
— Targeting пользователей
Фичи можно включать:
• по user id
• по роли
• по региону
• по environment (dev / staging / prod)
— Меньше фиче-веток
Код живёт в main, а не за флагами в git.
В .NET обычно используют:
- Microsoft.FeatureManagement
- Azure App Configuration
- LaunchDarkly / Unleash / ConfigCat
Где это особенно полезно:
- публичные API
- high-traffic сервисы
- SaaS-продукты
- экспериментальные и рискованные фичи
Коротко:
Feature flags превращают релиз из «одного опасного момента» в управляемый процесс.
Это один из самых мощных инструментов для зрелой backend-архитектуры.
👉 Подробнее
🛠 Как оживить протухшую ветку без merge-хаоса
Бывает: вы увлеклись разработкой, прошло пару недель (или месяцев), а основная ветка уже ушла далеко вперёд. В итоге — боль, конфликты и бесконечные merge-коммиты.
В таких случаях может спасати ребейз на свежую ветку:
Она подтянет последние изменения из релизной ветки и наложит ваши коммиты поверх, сохранив линейную историю.
Конфликты всё равно придётся разруливать, но по одному — в контексте конкретного коммита, а не в гигантской свалке.
После успешного ребейза пушим с
Бывает: вы увлеклись разработкой, прошло пару недель (или месяцев), а основная ветка уже ушла далеко вперёд. В итоге — боль, конфликты и бесконечные merge-коммиты.
В таких случаях может спасати ребейз на свежую ветку:
git pull --rebase origin release/1.2.0
Она подтянет последние изменения из релизной ветки и наложит ваши коммиты поверх, сохранив линейную историю.
Конфликты всё равно придётся разруливать, но по одному — в контексте конкретного коммита, а не в гигантской свалке.
После успешного ребейза пушим с
--force-with-lease, чтобы аккуратно обновить удалённую ветку, и продолжаем работать так, как будто отставания и не было.🔥 Как правильно работать с конфигурацией в .NET
Самый чистый и масштабируемый способ получать настройки в .NET - это Options pattern.
Где живет конфигурация
Настройки приложения могут приходить из разных источников:
- переменные окружения
- JSON-файлы appsettings
- user secrets
- другие configuration providers
Да, можно читать значения напрямую через IConfiguration.
Но это плохо масштабируется:
- легко ошибиться в ключе
- нет типизации
- нет валидации
- код быстро превращается в хаос
Поэтому IConfiguration напрямую лучше не использовать в бизнес-коде.
Options pattern - как правильно
Вместо этого используется Options pattern:
1. Создаешь класс настроек
- один класс = одна логическая группа конфигурации
2. Биндишь его к appsettings.json
- через services.Configure<T>
3. Используешь настройки через DI
- IOptions
- IOptionsSnapshot
- IOptionsMonitor
Плюсы подхода
- строгая типизация
- автокомплит в IDE
- централизованная конфигурация
- проще рефакторить
- можно добавить валидацию через data annotations
Например:
- [Required]
- [Range]
- [EmailAddress]
Это позволяет ловить ошибки конфигурации при старте приложения, а не в продакшене.
Важно знать
Существуют разные интерфейсы:
- IOptions - статические настройки на все время жизни приложения
- IOptionsSnapshot - обновляются на каждый запрос (scoped)
- IOptionsMonitor - отслеживают изменения конфигурации в рантайме
Понимание разницы между ними сильно влияет на корректность архитектуры.
Если пишешь production .NET - Options pattern должен быть стандартом по умолчанию.
https://www.milanjovanovic.tech/blog/how-to-use-the-options-pattern-in-asp-net-core-7
Самый чистый и масштабируемый способ получать настройки в .NET - это Options pattern.
Где живет конфигурация
Настройки приложения могут приходить из разных источников:
- переменные окружения
- JSON-файлы appsettings
- user secrets
- другие configuration providers
Да, можно читать значения напрямую через IConfiguration.
Но это плохо масштабируется:
- легко ошибиться в ключе
- нет типизации
- нет валидации
- код быстро превращается в хаос
Поэтому IConfiguration напрямую лучше не использовать в бизнес-коде.
Options pattern - как правильно
Вместо этого используется Options pattern:
1. Создаешь класс настроек
- один класс = одна логическая группа конфигурации
2. Биндишь его к appsettings.json
- через services.Configure<T>
3. Используешь настройки через DI
- IOptions
- IOptionsSnapshot
- IOptionsMonitor
Плюсы подхода
- строгая типизация
- автокомплит в IDE
- централизованная конфигурация
- проще рефакторить
- можно добавить валидацию через data annotations
Например:
- [Required]
- [Range]
- [EmailAddress]
Это позволяет ловить ошибки конфигурации при старте приложения, а не в продакшене.
Важно знать
Существуют разные интерфейсы:
- IOptions - статические настройки на все время жизни приложения
- IOptionsSnapshot - обновляются на каждый запрос (scoped)
- IOptionsMonitor - отслеживают изменения конфигурации в рантайме
Понимание разницы между ними сильно влияет на корректность архитектуры.
Если пишешь production .NET - Options pattern должен быть стандартом по умолчанию.
https://www.milanjovanovic.tech/blog/how-to-use-the-options-pattern-in-asp-net-core-7
Forwarded from C# (C Sharp) programming
3 простые оптимизации, которые реально ускоряют код
1️⃣ Забирай данные пачкой
Меньше запросов — меньше сетевых задержек.
Вместо десятков запросов — один
2️⃣ Делай больше параллельно
Если задачи не зависят друг от друга — выполняй их одновременно.
Асинхронность часто даёт бесплатный прирост скорости.
3️⃣ Кэшируй результаты
Если данные не меняются — не пересчитывай и не запрашивай их заново.
Память дешевле времени.
Никакой магии и сложных алгоритмов — просто базовые приёмы, которые в реальных проектах дают самый заметный эффект.
1️⃣ Забирай данные пачкой
Меньше запросов — меньше сетевых задержек.
Вместо десятков запросов — один
IN (...).2️⃣ Делай больше параллельно
Если задачи не зависят друг от друга — выполняй их одновременно.
Асинхронность часто даёт бесплатный прирост скорости.
3️⃣ Кэшируй результаты
Если данные не меняются — не пересчитывай и не запрашивай их заново.
Память дешевле времени.
Никакой магии и сложных алгоритмов — просто базовые приёмы, которые в реальных проектах дают самый заметный эффект.
🔥 На stepik вышел курс, который учит Создавать настоящие AI-сервисы, а не просто запускать скрипты?
Этот практический курс по Python и FastAPI покажет, как собрать полноценное приложение с ИИ, базой данных, автогенерацией контента и Telegram-ботом.
Ты пройдёшь путь от первого HTTP-запроса до рабочего сервиса, который сам генерирует текст через ИИ, сохраняет данные, отправляет результаты по расписанию и отвечает пользователям.
Никакой теории ради теории - только практические шаги, из которых рождается реальный продукт.
🎁 48 часов действует скидка в 40% процентов
👉 Начать учиться на Stepik
Этот практический курс по Python и FastAPI покажет, как собрать полноценное приложение с ИИ, базой данных, автогенерацией контента и Telegram-ботом.
Ты пройдёшь путь от первого HTTP-запроса до рабочего сервиса, который сам генерирует текст через ИИ, сохраняет данные, отправляет результаты по расписанию и отвечает пользователям.
Никакой теории ради теории - только практические шаги, из которых рождается реальный продукт.
🎁 48 часов действует скидка в 40% процентов
👉 Начать учиться на Stepik
Forwarded from C# (C Sharp) programming
Индекс TIOBE подвел итоги года: звание «Язык 2025 года» досталось C#, который показал рекордный рост популярности (+2.94%)? однако в общем зачете он по-прежнему занимает 5-ю строчку. Абсолютным лидером остается Python с 22.61% долей рынка.
В первой пятерке произошли перестановки: язык C поднялся на 2 место, сместив C++ на 4-ю позицию; 3 место досталось Java, а R вернулся в топ-10. Провал года - Go, который неожиданно сдал позиции, опустившись сразу на 16-е место.
Индекс оценивает популярность технологий на основе поисковых запросов, активности комьюнити и количества обучающих материалов.
https://www.tiobe.com/tiobe-index/
Please open Telegram to view this post
VIEW IN TELEGRAM