Языком 2023 года по индексу TIOBE назван C#, который сохранил 5 место, но стал лидером по росту популярности (+1.43%) 🥳
Жаба уже одной в могиле, ведь она показала один из самых высоких спадов популярности (-4.34%) ☠️
https://www.tiobe.com/tiobe-index/
Жаба уже одной в могиле, ведь она показала один из самых высоких спадов популярности (-4.34%) ☠️
https://www.tiobe.com/tiobe-index/
👍23🔥3🍌3❤1
«Когда мера становится целью, она перестает быть хорошей мерой» - закон Гудхарта 🧠
Страшно подумать - принцип был сформулирован почти 50 лет назад, но много технических компаний и эффективных менеджеров продолжают его не понимать!
Если ваша цель снизить количество легаси - удалите кодовую базу и начните всё сначала.
Если ваша цель увеличить доход - покройте все экраны рекламой.
Если ваша цель писать больше кода - добавляйте бессмысленные комментарии.
Если ваша цель фиксить больше багов - чините самое простое.
Если ваша цель делать больше пулл реквестов - время вылизывать readme.
Если ваша цель увеличить вовлечённость - превратите всё в кликабельные кнопки.
Если ваша цель уменьшить количество отчётов об ошибке - усложните отправку отчёта.
Если ваша цель быстрая загрузка страницы - удалите всё мультимедиа, JavaScript и CSS с вашего сайта.
Страшно подумать - принцип был сформулирован почти 50 лет назад, но много технических компаний и эффективных менеджеров продолжают его не понимать!
Если ваша цель снизить количество легаси - удалите кодовую базу и начните всё сначала.
Если ваша цель увеличить доход - покройте все экраны рекламой.
Если ваша цель писать больше кода - добавляйте бессмысленные комментарии.
Если ваша цель фиксить больше багов - чините самое простое.
Если ваша цель делать больше пулл реквестов - время вылизывать readme.
Если ваша цель увеличить вовлечённость - превратите всё в кликабельные кнопки.
Если ваша цель уменьшить количество отчётов об ошибке - усложните отправку отчёта.
Если ваша цель быстрая загрузка страницы - удалите всё мультимедиа, JavaScript и CSS с вашего сайта.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥24😁9💯5❤2🤔1🥱1
Рекомендую к прочтению
В прошлом году у меня возникла необходимость систематизировать в моменте свои знания об асинхронном программировании в C# и при этом иметь постоянную шпаргалку под рукой.
Собственно, эта книга идеально решила эту потребность - в ней описаны все необходимые аспекты, при чём очень доступно и концептуально, на уровне идеи, а не конкретного кода.
Вы даже узнаете, в чём преимущество
Бумажный вариант стоит недорого, сама книга имеет небольшой объём - всего 119 страниц.
Так что, однозначный лайк👍🏻
В прошлом году у меня возникла необходимость систематизировать в моменте свои знания об асинхронном программировании в C# и при этом иметь постоянную шпаргалку под рукой.
Собственно, эта книга идеально решила эту потребность - в ней описаны все необходимые аспекты, при чём очень доступно и концептуально, на уровне идеи, а не конкретного кода.
Вы даже узнаете, в чём преимущество
async / await для ASP NET приложений!Бумажный вариант стоит недорого, сама книга имеет небольшой объём - всего 119 страниц.
Так что, однозначный лайк👍🏻
👍40🔥7❤4
StepOne | Степан Минин
Год выходит на финишную прямую, как и контент в декабре на этом канале 🥶 Вот самые важные посты последнего месяца, которые можно перечитать ещё раз 🤔 ⚡️ Как растёт моя архитектурная компетенция на примере пет проекта ⚡️ Хитросделанные partial'ы ⚡️ Самое…
Как же летит время, январь почти всё 🤯
Надеюсь вы хорошо провели праздники, да и для канала месяц в целом прошёл неплохо
⚡️ Начал год со статьи про полиморфизм в DI на Хабре
⚡️ Сравниваем производительность разных способов приведения типов в ковариантном и контравариантных сценариях
⚡️ Пособие по борьбе со скрытыми символами
⚡️ Новый сахар в C# 12
Надеюсь вы хорошо провели праздники, да и для канала месяц в целом прошёл неплохо
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6⚡2🔥1
Какой сахар мне хотелось бы видеть в новых версиях C#
Вас не подвело зрение, мне действительно не хватает кое-какого синтаксического сахара)
Большинство разработчиков знакомы с оператором
Он делает эквивалентными две следующие строчки:
Однако, в моей практике часто встречалась ситуация, когда необходимо было сделать обратный процесс:
Хотелось бы сократить эту запись до одного оператора.
Не важно, как он будет называться, варианты:
Тогда, сокращение будет выглядеть так:
Вас не подвело зрение, мне действительно не хватает кое-какого синтаксического сахара)
Большинство разработчиков знакомы с оператором
??Он делает эквивалентными две следующие строчки:
return expr is null ? fallbackValue : expr
// ...
return expr ?? fallbackValue
Однако, в моей практике часто встречалась ситуация, когда необходимо было сделать обратный процесс:
return expr is null ? null : GetResult(expr)
Хотелось бы сократить эту запись до одного оператора.
Не важно, как он будет называться, варианты:
?!, ?:, ???Тогда, сокращение будет выглядеть так:
return expr ??? GetResult(expr)
🥴26👍12😁5🤯3👌1🕊1💯1
Priority Queue
В .NET 6 завезли такую настоящую объекто-ориентированную очередь с приоритетами.
Объектно-ориентированная в смысле поддержки своих формальных типовых параметров:
▪️
▪️
По сути своей, это сортирующая коллекция, в которой приоритет выступает ключом сортировки.
Причём в конструктор очереди, можно передать экземпляр
Получается, можно постоянно туда что-то докидывать и получать отсортированные подвыборки, помимо решения задачи приоритизирования.
Из недостатков можно отметить, что класс
Больше прочитать про внутреннее устройство класса можно в статье Вадима Мартынова на Хабре
В .NET 6 завезли такую настоящую объекто-ориентированную очередь с приоритетами.
Объектно-ориентированная в смысле поддержки своих формальных типовых параметров:
▪️
TElement - тип содержимого очереди▪️
TPriority - тип приоритета содержимого очередиПо сути своей, это сортирующая коллекция, в которой приоритет выступает ключом сортировки.
Причём в конструктор очереди, можно передать экземпляр
IComparer<T>, чтобы, например, определить направление сортировки:// сортируем по убыванию некоторой даты
var queue = new PriorityQueue<string, DateTimeOffset>(
Comparer<DateTimeOffset>.Create((x, y) => y.CompareTo(x)));
queue.Enqueue("abv", DateTimeOffset.UtcNow.Subtract(TimeSpan.FromDays(2)));
queue.Enqueue("ghj", DateTimeOffset.UtcNow.Subtract(TimeSpan.FromDays(3)));
queue.Enqueue("123", DateTimeOffset.UtcNow.Subtract(TimeSpan.FromDays(1)));
while (queue.TryDequeue(out var card, out var addedOn))
{
Console.WriteLine($"{card}, {addedOn}");
}
// чтение выведет: 123 | abv | ghj
Получается, можно постоянно туда что-то докидывать и получать отсортированные подвыборки, помимо решения задачи приоритизирования.
Из недостатков можно отметить, что класс
PriorityQueue<TElement, TPriority> не реализует никаких LINQ интерфейсов, или интерфейсов коллекций, поэтому совместимость с другими API придётся реализовывать самому.Больше прочитать про внутреннее устройство класса можно в статье Вадима Мартынова на Хабре
Хабр
.NET 6: PriorityQueue
В .NET 6 появилась новая коллекция — PriorityQueue<TElement,TPriority>. До этого очереди с приоритетами уже были в .NET, но только в виде внутренних классов — они использовались под капотом...
👍24❤2🔥2
Всех с началом рабочей недели!
«Самая зрелая реакция — это радоваться его успеху. Вам следует вознаградить его за производительность и признать его успешность, особенно если это очень качественный сотрудник.
…
Кроме того, мы можете учиться у этих упорно трудящихся людей. Если их показатели крайне высоки, узнайте, как им это удаётся.»
https://habr.com/ru/articles/791264/
«Самая зрелая реакция — это радоваться его успеху. Вам следует вознаградить его за производительность и признать его успешность, особенно если это очень качественный сотрудник.
…
Кроме того, мы можете учиться у этих упорно трудящихся людей. Если их показатели крайне высоки, узнайте, как им это удаётся.»
https://habr.com/ru/articles/791264/
Хабр
Как реагировать на то, что вы не единственный (работодатель)?
Когда в начале пандемии мир внезапно был вынужден работать из дома, это глубоко потрясло многих руководителей. Я постоянно учусь руководству и был лидером более сорока лет, в том числе работал...
😁6👍4🔥2🤔1🤣1
Новые выражения коллекций в .NET 8
C# 12 привнёс лаконичный синтаксис для инициализации коллекций, открыв много новых возможностей.
1️⃣ Квадратные скобки
Теперь списки, массивы, спаны и прочее можно объявлять как в JavaScript!
Правда, в случае переменных нужно обязательно указывать
Это работает и для свойств, полей, параметров методов и так далее.
2️⃣ Развёртка коллекции
Опять же, подобное уже было в JavaScript - оператором
3️⃣ Поддержка пользовательских типов данных
Если у вас есть свой тип данных, для которого хочется подключить выражения коллекций, то необходимо сделать три вещи:
✅ Реализовать интерфейс
✅ Написать статический класс билдер с фабричным методом, который создаёт объект вашего типа из коллекции
✅ Пометить тип атрибутом
Подробнее можно прочитать по ссылке
C# 12 привнёс лаконичный синтаксис для инициализации коллекций, открыв много новых возможностей.
Теперь списки, массивы, спаны и прочее можно объявлять как в JavaScript!
Правда, в случае переменных нужно обязательно указывать
target type:int[] intArray = [1, 2, 3];
List<int> intList = [4, 5, 6];
ImmutableArray<object> emptyCollection = [];
Это работает и для свойств, полей, параметров методов и так далее.
Опять же, подобное уже было в JavaScript - оператором
.. можно несколько коллекций соединять в один плоский массив:string[] vowels = ["a", "e", "i", "o", "u"];
string[] consonants = ["b", "c", "d", "f", "g", "h", "j", "k", "l", "m",
"n", "p", "q", "r", "s", "t", "v", "w", "x", "z"];
string[] alphabet = [.. vowels, .. consonants, "y"];
Если у вас есть свой тип данных, для которого хочется подключить выражения коллекций, то необходимо сделать три вещи:
IEnumerable<T>[CollectionBuilder], указав класс строитель и имя фабричного методаПодробнее можно прочитать по ссылке
Please open Telegram to view this post
VIEW IN TELEGRAM
Docs
Collection expressions (Collection literals) - C# reference
Collection expressions convert to many collection types. You can write literal values, expressions, or other collections to create a new collection.
👍25❤🔥3🔥2❤1🐳1
Task.WhenAll vs Parallel.ForEachAsyncЭтот вопрос возникал перед любым практикующим C# разработчиком.
Наконец, окончательный и аргументированный ответ можно получить, прочитав мою новую статью на Хабре!
Ваши плюсы
Please open Telegram to view this post
VIEW IN TELEGRAM
Хабр
Разобраться раз и навсегда: Task.WhenAll или Parallel.ForEachAsync в C#
Все хотят писать код, который работает быстро. Часто мы сидим, просматривая написанные алгоритмы и пытаясь понять, что можно сделать, чтобы настроить их производительность. В таком случае часто...
👍30🔥7❤5👏2🤔2
Сколько времени просить перед выходом на новое место?
Вот вы и получили оффер!
Казалось бы, всё самое трудное позади: глупые HR, демонические тех собесы, выгоревшие снобы интервьюеры и торги за крохи с жадными корпами.
Можно выдохнуть, не так ли?
Спешу немного разочаровать - впереди ещё одно маленькое испытание.
Вопрос о предполагаемой дате выхода на новое место не так прост, как кажется.
Многие совершают ошибку, думая, что нужно как можно скорее бежать, сломя голову, подписывать договор.
Однако, именно такое поведение может характеризовать вас в негативном свете.
❌ "Готов подписать договор уже завтра? Понятно, это его первый попавшийся оффер, он low-value специалист, можно начинать искать ему замену."
❌ "Выйдет в ближайшую возможную дату? Значит, бежит как крыса с корабля, не передав дела коллегам, оставив их утопать в том бардаке, который устроил своим уходом."
Запомните, что если у вас есть оффер, то вас готовы ждать!
Совет из моего личного опыта - возьмите 1-2 недели передышки перед новым местом, лишним не будет.
Как можно поступить в такой ситуации?
✔️ "У меня есть ещё запланированные собеседования на эту неделю. Хотелось бы для начала завершить текущие договорённости, а затем взять некоторую паузу на раздумья, чтобы всё сравнить и принять максимально взвешенное решение."
✔️ "На текущем месте работы отношения с коллегами достаточно хорошие, и мне не хотелось бы уходить по-английски. Поэтому, после того как поставлю их в известность об уходе, потребуется время, чтобы передать дела. Не могу точно сказать, сколько это займёт, но ориентировочно от 3 до 4 недель."
Вот вы и получили оффер!
Казалось бы, всё самое трудное позади: глупые HR, демонические тех собесы, выгоревшие снобы интервьюеры и торги за крохи с жадными корпами.
Можно выдохнуть, не так ли?
Спешу немного разочаровать - впереди ещё одно маленькое испытание.
Вопрос о предполагаемой дате выхода на новое место не так прост, как кажется.
Многие совершают ошибку, думая, что нужно как можно скорее бежать, сломя голову, подписывать договор.
Однако, именно такое поведение может характеризовать вас в негативном свете.
Запомните, что если у вас есть оффер, то вас готовы ждать!
Совет из моего личного опыта - возьмите 1-2 недели передышки перед новым местом, лишним не будет.
Как можно поступить в такой ситуации?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍33🤯4🔥2💯2❤1
А вы используете
У меня сложилось впечатление, будто после релиза C# 8 про эту штуку все забыли, поэтому решил сегодня про неё вспомнить)
Этот тип данных решал задачу потребления и создания асинхронных потоков данных.
То есть, таких потоков, в которых данные получают или генерируют асинхронно.
Напомню, что если у нас есть некоторый метод:
То в таком случае, можно перебрать возвращаемое значение следующим образом:
Но что в таком случае будет наполнять тело метода
Обычно, асинхронные потоки удобны в том случае, когда данные представлены в виде набора батчей, но нам необходимо эмулировать целостность потока.
То есть, всё сразу предъявить мы не можем, но способны заявить об этой возможности.
Например, есть многостраничный список с фиксированным количеством элементов на одной странице.
Тогда, внутри метода
В вашей практике встречается потребность в
IAsyncEnumerable?У меня сложилось впечатление, будто после релиза C# 8 про эту штуку все забыли, поэтому решил сегодня про неё вспомнить)
Этот тип данных решал задачу потребления и создания асинхронных потоков данных.
То есть, таких потоков, в которых данные получают или генерируют асинхронно.
Напомню, что если у нас есть некоторый метод:
static async IAsyncEnumerable<Data> GetData()
{
// ...
}
То в таком случае, можно перебрать возвращаемое значение следующим образом:
await foreach (var item in GetData())
{
// ...
}
Но что в таком случае будет наполнять тело метода
GetData?Обычно, асинхронные потоки удобны в том случае, когда данные представлены в виде набора батчей, но нам необходимо эмулировать целостность потока.
То есть, всё сразу предъявить мы не можем, но способны заявить об этой возможности.
Например, есть многостраничный список с фиксированным количеством элементов на одной странице.
Тогда, внутри метода
GetData будет скачиваться одна страница и разворачиваться в плоский поток до тех пор, пока есть следующая страница:static async IAsyncEnumerable<Data> GetData()
{
var page = 1;
while (page <= 10)
{
var items = await Fetch(page);
foreach (var item in items)
yield return item;
page++;
}
}
В вашей практике встречается потребность в
IAsyncEnumerable?👍25🔥6🤯5💯1
Dictionary vs LookupВ коммерческой практике часто встречается задача преобразовать некий список в словарь по определённому ключу, чтобы получать элементы коллекции за константное время O(1).
Допустим, у нас есть некоторые сообщения, и требуется возможность выбирать нужное сообщение по отправителю:
record Message(string Sender, string Content);
List<Message> messages = [
new Message(Sender: "Alex", Content: "abc"),
new Message(Sender: "Bob", Content: "123"),
new Message(Sender: "Jim", Content: "=-+")
];
С этим конечно справится метод LINQ
ToDictionary:var messagesBySender = messages
.ToDictionary(x => x.Sender, x => x);
Однако, если в коллекции появится несколько сообщений с одним отправителем:
List<Message> messages = [
new Message(Sender: "Alex", Content: "abc"),
// ...
new Message(Sender: "Alex", Content: "xyz")
];
То мы получим необработанное исключение при выполнении программы:
System.ArgumentException: An item with the same key has already been added. Key: Alex
Как этого избежать? Использовать метод
ToLookup, который даже не потребует селектора значения:var messagesBySender = messages
.ToLookup(x => x.Sender);
В чём вообще разница между этими структурами данных?
Lookup
IEnumerable<T>, поскольку одному ключу соответствует несколько значенийDictionary
KeyNotFoundExceptionPlease open Telegram to view this post
VIEW IN TELEGRAM
👍42🔥13❤🔥2❤2
Под шум последних событий случился .NET 9 Preview 1 🤷♀️
Мелкомягкие уже начали разрабатывать новый STS релиз.
Обещали в нём сконцентрироваться на развитии AI и облачных инструментов.
В их числе, например, тот самый Aspire.
Кстати, кто-нибудь разобрался в том, что это за фрукт?
Из интересного для меня завезли пару классных LINQ методов:
✅
✅
Ну и ещё в очередь с приоритетами добавили удаление.
Остальное можно прочитать по ссылке в MSDN
Мелкомягкие уже начали разрабатывать новый STS релиз.
Обещали в нём сконцентрироваться на развитии AI и облачных инструментов.
В их числе, например, тот самый Aspire.
Кстати, кто-нибудь разобрался в том, что это за фрукт?
Из интересного для меня завезли пару классных LINQ методов:
CountBy - наконец в .NET завезли что-то похожее на Counter из PythonAggregateBy - с выборками из коллекций можно будет работать как с агрегатами SQL таблицНу и ещё в очередь с приоритетами добавили удаление.
Остальное можно прочитать по ссылке в MSDN
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14😁4🐳3❤1
Пару недель назад закончил писать новую статью на Хабр 📝
Иногда руки доходят и до пожеланий подписчиков😇
Во-первых, хочу поблагодарить свою аудиторию за инициативу и предложение тем!
Благодаря вам в том числе, у меня отсутствует творческий застой)
Во-вторых, увлёкся так сильно, что получилась моя самая длинная статья - по метрикам Хабра аж 18 минут чтения😱
Публикация запланирована на середину марта, даже не спрашивайте почему.
Интересно, сколько бы денег я заработал, опубликовав этот гайд на бусти и прогревая вас? 🧐
Иногда руки доходят и до пожеланий подписчиков
Во-первых, хочу поблагодарить свою аудиторию за инициативу и предложение тем!
Благодаря вам в том числе, у меня отсутствует творческий застой)
Во-вторых, увлёкся так сильно, что получилась моя самая длинная статья - по метрикам Хабра аж 18 минут чтения
Публикация запланирована на середину марта, даже не спрашивайте почему.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥25👍10❤4🥱4🤩2
Статические анонимные функции
Оказывается, в C# 9 лямбды получили серьёзное обновление!
Штука настолько малоизвестная, что меня даже ни разу не спрашивали про неё на собесах!
Допустим, у вас есть следующий код с замыканием:
Захват переменной
С помощью ключевого слова
Тогда, обновлённый код не скомпилируется:
Однако, если очень нужно иметь возможность использовать
Оказывается, в C# 9 лямбды получили серьёзное обновление!
Штука настолько малоизвестная, что меня даже ни разу не спрашивали про неё на собесах!
Допустим, у вас есть следующий код с замыканием:
int y = 1;
Func<int, int> lambda = x => x + y;
Захват переменной
y и всего внешнего окружения вызовет ненужные аллокации.С помощью ключевого слова
static можно запретить подобные ситуации.Тогда, обновлённый код не скомпилируется:
int y = 1;
Func<int, int> lambda = static x => x + y;
Однако, если очень нужно иметь возможность использовать
y, но при этом сохранять эффективность кода, то переменную просто надо сделать константой:const int y = 1;
Func<int, int> lambda = static x => x + y;
👍19🤔9🔥4🐳2❤1
StepOne | Степан Минин
Статические анонимные функции Оказывается, в C# 9 лямбды получили серьёзное обновление! Штука настолько малоизвестная, что меня даже ни разу не спрашивали про неё на собесах! Допустим, у вас есть следующий код с замыканием: int y = 1; Func<int, int> lambda…
Кирилл сделал хорошее дополнение к последнему посту на своём канале @csharp_gepard
Бенчмарк показал, что производительность не меняется при добавлении
В целом ожидаемо и вполне логично, так как это compile guard
Бенчмарк показал, что производительность не меняется при добавлении
static к делегату.В целом ожидаемо и вполне логично, так как это compile guard
Telegram
C# Heppard
Static в анонимных функциях #отдых #бенч
Представляется, что ключевое слово static в анонимных функциях - декларация о намерениях, не более. То есть мы как бы говорим, что по нашему мнению в данном месте точно не надо захватывать контекст и создавать объект…
Представляется, что ключевое слово static в анонимных функциях - декларация о намерениях, не более. То есть мы как бы говорим, что по нашему мнению в данном месте точно не надо захватывать контекст и создавать объект…
👍11❤2💯1
StepOne | Степан Минин
Как же летит время, январь почти всё 🤯 Надеюсь вы хорошо провели праздники, да и для канала месяц в целом прошёл неплохо ⚡️ Начал год со статьи про полиморфизм в DI на Хабре ⚡️ Сравниваем производительность разных способов приведения типов в ковариантном…
Уже завтра закончится зима, потому что сегодня последний день февраля 🥳
Вот какие материалы больше всего согревали этот холодный месяц:
✅ Обзор новых выражений коллекций
✅ Готовые шаблоны для общения с HR после оффера
✅ Вспомнили про асинхронные потоки
Вот какие материалы больше всего согревали этот холодный месяц:
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7❤🔥1👍1🔥1
Как программисту законно не пойти на срочную службу в армию? 🧐
С 1 января 2024 года призывной возраст составляет 18 - 30 лет согласно Федеральному закону от 4 августа 2023 г. № 439-ФЗ "О внесении изменений в отдельные законодательные акты Российской Федерации".
Поэтому, ответ на вопрос в заголовке поста актуален как никогда для тех, кто проживает на территории РФ.
Прямо сейчас могу предложить три легальных варианта:
1️⃣ Учиться до победного конца и защитить кандидатскую диссертацию. Согласно пункту 2 статьи 23 ФЗ "О воинской обязанности и военной службе" граждане, имеющие предусмотренную государственной системой научной аттестации ученую степень, получают бессрочное право на освобождение от призыва на военную службу.
2️⃣ Работать до 30 лет в аккредитованных IT компаниях. С условиями получения отсрочки и списком компаний можно ознакомиться по ссылке - https://www.gosuslugi.ru/armydelay
3️⃣ Оказаться признанным не годным к военной службе по состоянию здоровья. Для того, чтобы узнать какие проблемы организма этому способствуют, можно ознакомиться с расписанием болезней (смотреть I графу), например, в системе Консультант Плюс - https://www.consultant.ru/document/cons_doc_LAW_149096/7cd8dde08fc9aff1bf6d22025061d18f55e576e5/
С 1 января 2024 года призывной возраст составляет 18 - 30 лет согласно Федеральному закону от 4 августа 2023 г. № 439-ФЗ "О внесении изменений в отдельные законодательные акты Российской Федерации".
Поэтому, ответ на вопрос в заголовке поста актуален как никогда для тех, кто проживает на территории РФ.
Прямо сейчас могу предложить три легальных варианта:
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤6🤣5👍3🤯3🤬1🥱1🍌1