Отлаживать код в Rider смогут даже младенцы 👶
JetBrains продолжают развивать лучшую IDE для C# разработчиков и удивлять их новыми обновлениями.
В грядущей версии
Debugger Data Flow Analysis.
Сила статического анализа позволит предсказывать движение потока данных и показывать во время отладки, в каком направлении продолжится выполнение кода.
Must have, can't wait 🔥
JetBrains продолжают развивать лучшую IDE для C# разработчиков и удивлять их новыми обновлениями.
В грядущей версии
2023.3 завезут, на мой взгляд, настоящую killer feature, которая называетсяDebugger Data Flow Analysis.
Сила статического анализа позволит предсказывать движение потока данных и показывать во время отладки, в каком направлении продолжится выполнение кода.
Must have, can't wait 🔥
🔥29👍11🤯8🥴1
Please open Telegram to view this post
VIEW IN TELEGRAM
💯20🤣14😁3
Примитивы синхронизации доступно 🙏
1️⃣
Простейший в использовании примитив синхронизации в .NET, который используется для обеспечения взаимоисключающего доступа к распределённому ресурсу путём получения или высвобождения блокировки на специальном объекте.
Монитор предназначен для использования в рамках одного процесса, и чтобы это делать максимально эффективно и удобно в C# завезли оператор
2️⃣
▪️предоставляет эксклюзивный доступ к ресурсу
▪️также как и Монитор, требует того, чтобы поток, получивший Мьютекс, высвободил его
Однако, главная прелесть этого примитива в возможности межпроцессной синхронизации - достаточно присвоить ему строковое имя, чтобы разные сервисы могли открывать уже существующий примитив.
3️⃣
При этом потоки, которые пытаются пробиться к ресурсу будут ждать, пока любой поток с доступом высвободит семафор, поскольку, в отличие от Мьютекса, поток, заполучивший примитив, не обязан его высвобождать - это может сделать другой.
Семафоры бывают именованными, для синхронизации на уровне ОС, и локальными в рамках одного процесса.
4️⃣
Согласно предписаниям Microsoft его рекомендуется использовать для синхронизации в одном процессе.
5️⃣
Monitor Простейший в использовании примитив синхронизации в .NET, который используется для обеспечения взаимоисключающего доступа к распределённому ресурсу путём получения или высвобождения блокировки на специальном объекте.
Монитор предназначен для использования в рамках одного процесса, и чтобы это делать максимально эффективно и удобно в C# завезли оператор
lock - синтаксический сахар над конструкцией try-Enter-finally-Exit.Mutex
Мьютекс очень похож на Монитор: ▪️предоставляет эксклюзивный доступ к ресурсу
▪️также как и Монитор, требует того, чтобы поток, получивший Мьютекс, высвободил его
Однако, главная прелесть этого примитива в возможности межпроцессной синхронизации - достаточно присвоить ему строковое имя, чтобы разные сервисы могли открывать уже существующий примитив.
Semaphore
Семафор ограничивает число потоков, у которых есть конкурентный доступ к пулу распределённых ресурсов.При этом потоки, которые пытаются пробиться к ресурсу будут ждать, пока любой поток с доступом высвободит семафор, поскольку, в отличие от Мьютекса, поток, заполучивший примитив, не обязан его высвобождать - это может сделать другой.
Семафоры бывают именованными, для синхронизации на уровне ОС, и локальными в рамках одного процесса.
SemaphoreSlim
Это облегчённая и оптимизированная версия локального Cемафора.Согласно предписаниям Microsoft его рекомендуется использовать для синхронизации в одном процессе.
Interlocked
Этот класс стандартной библиотеки предоставляет возможность выполнять простые атомарные операции на переменных, такие как: сложение, инкремент и декремент, перестановка и условная перестановка на основе сравнения, а также чтение long значений.Please open Telegram to view this post
VIEW IN TELEGRAM
👍28🔥8❤4
StepOne | Степан Минин
Примитивы синхронизации доступно 🙏 1️⃣ Monitor Простейший в использовании примитив синхронизации в .NET, который используется для обеспечения взаимоисключающего доступа к распределённому ресурсу путём получения или высвобождения блокировки на специальном…
Продолжение по просьбе подписчика 🔥
6️⃣
У читателей и писателей разные очереди. В момент времени, когда поток высвобождает писательскую блокировку, все потоки, ожидавшие блокировку на чтение, получают её. И, наоборот, когда все эти читательские блокировки отпускаются, поток в читательской очереди обрабатывается. Получается, что примитив чередует обработку коллекции потоков читателей и одного потока писателя.
7️⃣
Класс доработали с разных сторон: упрощены правила рекурсии и изменения состояния блокировки, исправлены многие случаи потенциального дедлока, а также общая производительность выше, чем у предшественника.
А вообще, помните друзья: лучший примитив синхронизации тот, который вам не понадобится, другими словами, не делите данные между потоками 😁
ReaderWriterLock
С помощью этого класса в любой момент времени можно получить или конкурентный доступ на чтение распределённого ресурса для множества потоков, или экслюзивный доступ на запись в него для одного, поэтому, в случае, когда ресурс нечасто меняется, будет обеспечена лучшая пропускная способность, чем с Монитором.У читателей и писателей разные очереди. В момент времени, когда поток высвобождает писательскую блокировку, все потоки, ожидавшие блокировку на чтение, получают её. И, наоборот, когда все эти читательские блокировки отпускаются, поток в читательской очереди обрабатывается. Получается, что примитив чередует обработку коллекции потоков читателей и одного потока писателя.
ReaderWriterLockSlim
Этот примитив синхронизации очень похож на предыдущий, и рекомендуется к использованию в версиях .NET новее .NET Framework 3.5Класс доработали с разных сторон: упрощены правила рекурсии и изменения состояния блокировки, исправлены многие случаи потенциального дедлока, а также общая производительность выше, чем у предшественника.
А вообще, помните друзья: лучший примитив синхронизации тот, который вам не понадобится, другими словами, не делите данные между потоками 😁
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21👍11❤3❤🔥1
StepOne | Степан Минин
Всё, как я и ожидал Обобщённая математика слишком "непонятный фрукт" для рядового C# разработчика - в проде это не используют, и при этом не планируют из-за отсутствия понимания инструмента. Благо, вы подписаны на этот канал, и в этом месяце будет анонс…
Как в C# 11 появилась обобщённая математика ❓
7 ноября при поддержке CUSTIS состоится MskDotNet Meetup #55, где я выступлю с докладом.
В рамках доклада рассмотрим с нуля концепцию обобщённой математики, как она выглядит в C# 11, как могла выглядеть в предыдущих версиях языка и почему вообще появилась.
Также зароемся в кишки
Чтобы посетить митап оффлайн зарегистрируйтесь по ссылке, там вся необходимая информация.
Для онлайн слушателей будет организована трансляция.
7 ноября при поддержке CUSTIS состоится MskDotNet Meetup #55, где я выступлю с докладом.
В рамках доклада рассмотрим с нуля концепцию обобщённой математики, как она выглядит в C# 11, как могла выглядеть в предыдущих версиях языка и почему вообще появилась.
Также зароемся в кишки
System.Numerics, и узнаем, в какой продакшн в скором времени заделиверится эта фича.Чтобы посетить митап оффлайн зарегистрируйтесь по ссылке, там вся необходимая информация.
Для онлайн слушателей будет организована трансляция.
Please open Telegram to view this post
VIEW IN TELEGRAM
mskdotnet.timepad.ru
MskDotNet Meetup #55 / События на TimePad.ru
🔥12⚡5❤4👍2
StepOne | Степан Минин
По традиции, сложившейся месяц назад, публикую подборку лучших постов сентября: 📝 История самого крутого найма 📝 Как я консультировал подписчика по MongoDB 📝 Почему стоит забыть про премии
В Москве уже успело выпасть 7 сантиметров снежного покрова, а я успел собрать для вас самые важные посты октября 🤩
💎 Запись моего спикерского дебюта на Стачке
💎 История о том, как этот дебют состоялся
💎 Самое простое объяснение примитивов синхронизации
💎 Самая ожидаемая фича Rider в 2023 году
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2❤1
Как разобраться в новом проекте: пошаговая инструкция 🤩
Каждый разработчик при выходе на новую работу, скачав код из корпоративного репозитория, сталкивался с мыслью о том, что он не понимает написанного на экране.
Дело тут не в компетенции, а в исторически сложившихся особенностях системы, которые отличаются от компании к компании.
При использовании следующих рекомендаций появится шанс приносить ценность ещё до окончания испытательного срока.
1️⃣ Общайтесь с аналитиками, расспрашивайте их про проект, попросите показать документацию и так далее.
Именно эти люди превращают непонятные бизнес-требования в структурированные технические задачи.
2️⃣ Если нет аналитиков, документации или что-то из этого в плохом состоянии, то смело бросайтесь выполнять много разноплановых мелких задач.
В большинстве проектов есть задачи техдолга, покрывающие разные участки системы: работа с ними позволит сформировать поверхностное представление, которое со временем станет проще углублять.
3️⃣ О качественной аналитике на проекте никогда не слышали, задач для погружения не дают - тогда бегите писать тесты!
Во-первых, тесты нужны всем. Во-вторых, их написание вырабатывает понимание того, как выполняется конкретный код, а, следовательно, какую задачу он решает.
Каждый разработчик при выходе на новую работу, скачав код из корпоративного репозитория, сталкивался с мыслью о том, что он не понимает написанного на экране.
Дело тут не в компетенции, а в исторически сложившихся особенностях системы, которые отличаются от компании к компании.
При использовании следующих рекомендаций появится шанс приносить ценность ещё до окончания испытательного срока.
Именно эти люди превращают непонятные бизнес-требования в структурированные технические задачи.
В большинстве проектов есть задачи техдолга, покрывающие разные участки системы: работа с ними позволит сформировать поверхностное представление, которое со временем станет проще углублять.
Во-первых, тесты нужны всем. Во-вторых, их написание вырабатывает понимание того, как выполняется конкретный код, а, следовательно, какую задачу он решает.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16👍8⚡3🤯3
StepOne | Степан Минин
Как в C# 11 появилась обобщённая математика ❓ 7 ноября при поддержке CUSTIS состоится MskDotNet Meetup #55, где я выступлю с докладом. В рамках доклада рассмотрим с нуля концепцию обобщённой математики, как она выглядит в C# 11, как могла выглядеть в предыдущих…
mskdotnet_meetup_55_обобщенная_математика.pdf
11.7 MB
Слайды MskDotNet Meetup #55
С их оформлением мне помог графический дизайнер Даниил (@deznx1).
Если нужно решить задачу под ключ быстро и качественно, то советую обратиться к нему.
С их оформлением мне помог графический дизайнер Даниил (@deznx1).
Если нужно решить задачу под ключ быстро и качественно, то советую обратиться к нему.
🔥6❤1👍1🤩1
StepOne | Степан Минин
Как в C# 11 появилась обобщённая математика ❓ 7 ноября при поддержке CUSTIS состоится MskDotNet Meetup #55, где я выступлю с докладом. В рамках доклада рассмотрим с нуля концепцию обобщённой математики, как она выглядит в C# 11, как могла выглядеть в предыдущих…
unmanaged constraintПозавчера на докладе меня попросили прокомментировать этот фрагмент кода из ML NET.
В частности слушателя заинтересовало, что означает ограничение
unmanaged.Тогда ответить не вышло, честно не знал 😅
Однако я не я, если не разберусь в теме, и не напишу об этом пост 😁
Запоминаем -
where T : unmanaged означает, что тип T это что-то из списка ниже:sbyte, byte, short, ushort, int, uint, long, ulong, nint, nuint, char, float, double, decimal, boolenum типvoid*)struct с полями только из unmanaged типовИными словами такое ограничение запрещает типу иметь внутри себя ссылки, управляемые GC, то есть это не ссылочный тип, или тип без членов ссылочного типа на любом уровне вложенности.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍46❤2🔥2
Чуть больше двух лет назад я проходил собеседование в OZON, где в рамках технического этапа нужно было провести ревью кода.
Я не знал, что они так проверяли исключительно знание примитивов синхронизации и многопоточности в .NET.
И начал набрасывать, как плохо, не по ООП, спроектирован код, заявленным DDD не пахнет вообще и домен вдобавок смоделирован некорректно, а ещё принципы SOLID нарушаются.
Естественно, сказать, что тогда не прошёл то собеседование - не сказать ничего.
И вот алгоритмы ютуба решили напомнить мне о неудачном опыте, предложив видео паренька, вышедшее 29 октября этого года.
Конечно, разбирает правильно, правда немного неуверенно и нечётко, но почему за два года задача не изменилась совсем?
Буквально, код повторяется посимвольно.
Почему так, для меня загадка 🤷♂️
Я не знал, что они так проверяли исключительно знание примитивов синхронизации и многопоточности в .NET.
И начал набрасывать, как плохо, не по ООП, спроектирован код, заявленным DDD не пахнет вообще и домен вдобавок смоделирован некорректно, а ещё принципы SOLID нарушаются.
Естественно, сказать, что тогда не прошёл то собеседование - не сказать ничего.
И вот алгоритмы ютуба решили напомнить мне о неудачном опыте, предложив видео паренька, вышедшее 29 октября этого года.
Конечно, разбирает правильно, правда немного неуверенно и нечётко, но почему за два года задача не изменилась совсем?
Буквально, код повторяется посимвольно.
Почему так, для меня загадка 🤷♂️
👍11😁6🤯1
ActionFilterAttribute
Это очень крутая штука, которую надо знать всем C# специалистам, разрабатывающим сервисы с помощью ASP NET Core.
Есть обычные фильтры, предоставляющие механизм построения пайплайна вокруг запроса (действия до и после, выполнение сквозного функционала и так далее).
Но простые операции для отдельных ручек можно реализовывать прямо в атрибутах, чтобы не тратить ресурсы на вычисление эндпоинта с помощью рефлексии.
Например, при необходимости проверять наличие определённого заголовка в запросе можно написать следующий атрибут.
[AttributeUsage(validOn: AttributeTargets.Method)]
public class HeaderRequiredAttribute : ActionFilterAttribute
{
private readonly string _headerName;
public HeaderRequiredAttribute(string headerName) =>
_headerName = headerName;
public override void OnActionExecuting(ActionExecutingContext context)
{
var httpContext = context.HttpContext;
var headerValue = httpContext.Request.Headers[_headerName].ToString();
if (string.IsNullOrWhiteSpace(headerValue))
throw new MissingRequiredHeaderException(_headerName);
}
}
Telegram
StepOne
Что такое cross-cutting concern?
Это термин из АОП. Однако прежде чем разобраться с его значением, необходимо выяснить, что такое concern.
Concern - это единица функциональности системы. Существует два вида функционала:
1. Ключевой функционал (core concern).…
Это термин из АОП. Однако прежде чем разобраться с его значением, необходимо выяснить, что такое concern.
Concern - это единица функциональности системы. Существует два вида функционала:
1. Ключевой функционал (core concern).…
👍14🤯4🔥3🤩1
StepOne | Степан Минин
mskdotnet_meetup_55_обобщенная_математика.pdf
Долгожданная запись митапа наконец доступна!
На доклад заглянул аж сам Кирилл Маурин!
Маэстро любезно помог ответить на ряд вопросов и дополнил мой рассказ своими интересными комментариями, от которых история стала ещё глубже 🔥
Обязательно к просмотру 👨💻
На доклад заглянул аж сам Кирилл Маурин!
Маэстро любезно помог ответить на ряд вопросов и дополнил мой рассказ своими интересными комментариями, от которых история стала ещё глубже 🔥
Обязательно к просмотру 👨💻
YouTube
Степан Минин "Как в C# 11 появилась обобщённая математика"
В рамках доклада мы рассмотрим с нуля концепцию обобщённой математики, как она выглядит в C# 11, как могла выглядеть в предыдущих версиях языка и почему вообще появилась.
Также зароемся в кишки System.Numerics, и узнаем, в какой продакшн в скором времени…
Также зароемся в кишки System.Numerics, и узнаем, в какой продакшн в скором времени…
🔥10👍3❤1
Task vs ValueTaskЧто такое
Task знают все C# разработчики - класс, олицетворяющий длительную операцию в асинхронном программировании.А вот в 7 версии языка появилась структура
ValueTask, и до сих пор не всем ясно её назначение.Из интересного в ней два поля - первое для хранения задачи, второе для хранения результата (при наличии).
Поскольку
Task это класс, то его экземпляр хранится в куче, а значит высвобождением памяти будет заниматься GC.ValueTask это структура, а значит вероятнее всего окажется на стеке, и расходов на высвобождение памяти будет потрачено существенно меньше.Соответственно, стоит использовать эту структуру, когда мы ожидаем, что задача будет выполняться синхронно большинство времени (например, закэшированный результат) или расходы на вызов и ожидание обычной задачи будут больше.
Однако, есть ряд ограничений, то есть, нельзя делать следующие вещи:
AsTask несколько раз.Result или .GetAwaiter().GetResult(), если задача не завершенаWhenAll() и WhenAny()Please open Telegram to view this post
VIEW IN TELEGRAM
👍19❤3👏3
StepOne | Степан Минин
Внедрение конкретной реализации в стандартном контейнере Допустим, у нас есть некоторый интерфейс, который имеет несколько реализаций: public interface IDependency {} public class DependencyImplOne : IDependency {} public class DependencyImplTwo : IDependency…
ASP NET 8 наконец-то добавит многообразие зависимостей 🥳
Реализовано это будет через ключи (например строковые).
Возвращаясь к старому примеру, он преобразится следующим образом:
Далее, использовать вот так, с помощью атрибута
Для меня, как поклонника ООП, это знаковая веха в развитии платформы 🔥
Считаю, что ради этой киллер фичи можно смело планировать переезд на новый LTS релиз!
Реализовано это будет через ключи (например строковые).
Возвращаясь к старому примеру, он преобразится следующим образом:
public interface IDependency {}
public class DependencyImplOne : IDependency {}
public class DependencyImplTwo : IDependency {}
builder.Services.AddKeyedSingleton<IDependency, DependencyImplOne>("one");
builder.Services.AddKeyedSingleton<IDependency, DependencyImplTwo>("two");Далее, использовать вот так, с помощью атрибута
[FromKeyedServices]:public class BarService : IBarService
{
public BarService([FromKeyedServices("one")] IDependency dependency) // DependencyImplOne
{
}
}
public class BazService : IBazService
{
public BazService([FromKeyedServices("two")] IDependency dependency) // DependencyImplTwo
{
}
}
Для меня, как поклонника ООП, это знаковая веха в развитии платформы 🔥
Считаю, что ради этой киллер фичи можно смело планировать переезд на новый LTS релиз!
Docs
What's new in ASP.NET Core in .NET 8
Learn about the new features in ASP.NET Core in .NET 8.
🔥24👍8🤯4😱2
Почему я всегда сообщаю рекрутеру зарплатные ожидания? 🤔
Есть распространённое мнение о зарплатных переговорах: «кто первый назвал цифру, тот и проиграл».
Однако это не совсем так.
Во-первых, сама культура подобных переговоров в РФ находится в достаточно зачаточном состоянии по сравнению с той же Америкой, например.
Во-вторых, разработчики это такие же рядовые сотрудники, как и другой персонал: для них существует вполне конкретный ФОТ.
То есть торги - это инструмент не растяжения мешка с деньгами, а прощупывания его границ.
И вот однажды я собеседовался в дом рф, попробовав всеми правдами и неправдами скрыть цифру💵
Изворачивался и уходил от ответа так, как никогда в жизни 🤯
При этом тех собес был очень приятный и даже нетипичный для индустрии, перспективный проект и интересными задачами, да и ребята показались вполне адекватными…
Но когда дело дошло до оффера, меня брали по верху вилки, но оказался таким, что смысл туда идти пропал абсолютно 🥵
Сказать, что чувствовал себя тогда идиотом - не сказать ничего😁
Да, мои зарплатные ожидания достаточно высокие, поэтому отвечаю на вопрос HR о деньгах, чтобы было понятно сразу - удовлетворит компания мои потребности или это пустая трата времени.
А терять время не хочет никто.
Есть распространённое мнение о зарплатных переговорах: «кто первый назвал цифру, тот и проиграл».
Однако это не совсем так.
Во-первых, сама культура подобных переговоров в РФ находится в достаточно зачаточном состоянии по сравнению с той же Америкой, например.
Во-вторых, разработчики это такие же рядовые сотрудники, как и другой персонал: для них существует вполне конкретный ФОТ.
То есть торги - это инструмент не растяжения мешка с деньгами, а прощупывания его границ.
И вот однажды я собеседовался в дом рф, попробовав всеми правдами и неправдами скрыть цифру
Изворачивался и уходил от ответа так, как никогда в жизни 🤯
При этом тех собес был очень приятный и даже нетипичный для индустрии, перспективный проект и интересными задачами, да и ребята показались вполне адекватными…
Но когда дело дошло до оффера, меня брали по верху вилки, но оказался таким, что смысл туда идти пропал абсолютно 🥵
Сказать, что чувствовал себя тогда идиотом - не сказать ничего
Да, мои зарплатные ожидания достаточно высокие, поэтому отвечаю на вопрос HR о деньгах, чтобы было понятно сразу - удовлетворит компания мои потребности или это пустая трата времени.
А терять время не хочет никто.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🔥4💯4
StepOne | Степан Минин
Почему я всегда сообщаю рекрутеру зарплатные ожидания? 🤔 Есть распространённое мнение о зарплатных переговорах: «кто первый назвал цифру, тот и проиграл». Однако это не совсем так. Во-первых, сама культура подобных переговоров в РФ находится в достаточно…
На просторах рунета этого не найти 🤫
Под вчерашним постом развернулась горячая дискуссия о переговорах по зарплате🔥
Поэтому делюсь с вами топом своих любимых материалов по этому вопросу⭐️
▪️https://www.kalzumeus.com/2012/01/23/salary-negotiation/
▪️https://bayareabelletrist.medium.com/how-i-negotiated-a-software-engineer-offer-in-silicon-valley-f11590f5c656
▪️https://faangpath.medium.com/how-to-negotiate-salary-offer-e9475ab11e3f
▪️https://www.freecodecamp.org/news/how-not-to-bomb-your-offer-negotiation-c46bb9bc7dea#.w30tfvb9r
Под вчерашним постом развернулась горячая дискуссия о переговорах по зарплате🔥
Поэтому делюсь с вами топом своих любимых материалов по этому вопросу
▪️https://www.kalzumeus.com/2012/01/23/salary-negotiation/
▪️https://bayareabelletrist.medium.com/how-i-negotiated-a-software-engineer-offer-in-silicon-valley-f11590f5c656
▪️https://faangpath.medium.com/how-to-negotiate-salary-offer-e9475ab11e3f
▪️https://www.freecodecamp.org/news/how-not-to-bomb-your-offer-negotiation-c46bb9bc7dea#.w30tfvb9r
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍6🔥4
StepOne | Степан Минин
В Москве уже успело выпасть 7 сантиметров снежного покрова, а я успел собрать для вас самые важные посты октября 🤩 💎 Запись моего спикерского дебюта на Стачке 💎 История о том, как этот дебют состоялся 💎 Самое простое объяснение примитивов синхронизации…
Завтра начнётся последний месяц 2023 года, а значит пора подвести итоги ноября 🤩
В этом месяце постарался выдать побольше эксклюзивных материалов🤫
🔥 Уникальный гайд по акклиматизации на новой работе
🔥 Разоблачение стагнации процессов собеседования OZON
🔥 Запись доклада на MskDotNet Meetup
🔥 Личная история о важности открытости в зарплатных переговорах
🔥 Эффективные секретные материалы о зарплатных переговорах впервые в telegram
В этом месяце постарался выдать побольше эксклюзивных материалов
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6🥱2❤🔥1⚡1