StepOne | Степан Минин – Telegram
StepOne | Степан Минин
3.42K subscribers
247 photos
35 videos
6 files
312 links
StepOne by Степан Минин @ststphn

Твой первый шаг к успеху в программировании

Закрытый тг канал https://news.1rj.ru/str/tribute/app?startapp=slOA

По вопросам рекламы @Spiral_Yuri

Ютуб https://www.youtube.com/@steponeit
Download Telegram
Что означает «CAP» в CAP теореме?

1️⃣ Consistency, Availability, Partition Tolerance

2️⃣ Control, Allocation, Process

3️⃣ Code, Architecture, Pipeline

4️⃣ Connection Access Protocol

Правильный ответ: 1️⃣

Пояснение:

CAP теорема утверждает, что в любой распределённой системе можно добиться только 2 из 3 гарантий.

Consistency - данные между узлами системы согласованы и не противоречат друг другу

Availability - любой request к системе завершается response

Partition Tolerance - выход из строя отдельных узлов системы не влияет на её общую работоспособность


Ставь 🐳 если тебя это спрашивали на собесе
Please open Telegram to view this post
VIEW IN TELEGRAM
🐳24👍13😱41👌1
Слово вкатуна. Харды на собесе

Криминальная драма, основанная на реальных событиях, все совпадения - случайны.

Отчаявшись попасть на стажировку в 😀 после соревнования Контеста, 16-летний Андрей возвращается домой и случайно видит, как пацаны за гаражами решают литкод.

Он присоединяется к пацанами, и работяги-джейсоноукладчики знакомят Андрея с учением Назрана. Благодаря им он узнает, что учить алгоритмы не обязательно (этим занимаются только стажеры-"чушпаны") - достаточно солгать в резюме про 3 года опыта, придумать 2-3 фейковых места работы - и можно будет "вкатиться" в Сбер на наносеки 200к/месяц.

Андрей крадет заначку у матери и поступает в академию Вкатышей. Но со временем Андрей понимает, что обучение в академии - это скам, где вместо реальных знаний его натаскивают на вопросы на собеседованиях. Ему обещают выдать куратора, который будет шептать в наушник ему ответы на вопросы и поможет пройти испытательный, а взамен он должен будет несколько лет отдавать половину своей зарплаты.

И когда Андрей пытается «соскочить», выясняется, что теперь он должен заплатить штраф размером в полмиллиона рублей…

#пятничное от @senior_unicorn
Please open Telegram to view this post
VIEW IN TELEGRAM
😁23🔥43🥱2👍1
Дорогие подписчики StepOne 🎄

От всей души поздравляю вас с наступающим 2024 годом!

Желаю как можно меньше красноглазить с залипанием в устройства, и как можно больше проводить времени с семьёй, друзьями и близкими ❤️

Пусть у вас всё будет хорошо!

В следующем году будет много интересного...😈
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉398🥰2👍1
Программисты на Си такие:

О да, valgrind 🤩
Please open Telegram to view this post
VIEW IN TELEGRAM
😁10🍌4🤯2👍1🤩1
Backlog senior разработчика be like:
😁26🤣3🤯2💯2😢1
StepOne | Степан Минин
Visitor NET. Уникальный проект Когда я начал рефакторинг своего интерпретатора, передо мной встал вопрос, как реализовывать паттерн Visitor. Его нужно было применить несколько раз, поскольку задач по работе с AST немало: многоэтапный статический анализ,…
Casting Performance 🤖

Потихоньку влился в рабочие процессы, и наконец готов выдать первый технический пост в этом году!

Сегодня мы поговорим о производительности приведения типов в разных сценариях, касающихся ковариантности и контравариантности.

Я написал простенький бенчмарк, чтобы проверить скорость работы с типами в 5 разных сценариях:

1️⃣ Direct - полное соответствие сигнатур

2️⃣ Implicit - неявное приведение благодаря особенностям вариантности

3️⃣ Explicit - использование оператора явного приведения типов

4️⃣ As - безопасное приведение через оператор as

5️⃣ Dynamic - отключение статической типизации ключевым словом dynamic

Гипотеза: Dynamic самый медленный, Explicit и As чуть помедленнее, чем Implicit и Direct

Результаты на скрине её подтверждают!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍51👏1🤔1
Неочевидные проблемы

Недавно ко мне обратился подписчик с просьбой разобраться в проблеме.

Есть присланный фрагмент кода, на котором проверяется равенство строк.

Загвоздка в том, что при видимом одинаковом значении "5.1$1" проверка даёт false.

Опытные могли догадаться, что дело в так называемых скрытых символах.

При обработке приложением строк, пришедших извне, надо быть готовым к такому сценарию.

Для начала можно посмотреть в дебаге на результат метода ToCharArray(): он покажет весь массив символов, и врага можно будет увидеть в лицо.

Как с ними бороться, зависит от ваших потребностей и возможностей:

▪️Ожидаете их только по краям? Тогда сойдёт Trim

▪️Когда хотите почистить внутри строки, можно прибегнуть к вызову char.IsControl()

▪️При особых запросах на очистку лишних символов уже придётся прибегнуть к кастомным фильтрациям с помощью статических методов char (например, IsLetter || IsDigit) ну или регулярок
👍281🔥1
Строки и теоретико-множественные операции 🧠

Добро пожаловать в экспериментальную рубрику "сомнительно, но окЭй" 😅

Допустим, у нас есть некоторая строка и набор символов.

Надо решить две задачи:

1️⃣Проверить содержит ли строка хотя бы один символ из набора. Для этого надо проверить пересечение двух множеств - строка & символы != пустое множество

2️⃣Проверить содержит ли строка все указанные символы. Тут налицо математическое определение подмножества.

LINQ в C#, а также API интерфейса ISet<> даёт все возможности для лаконичного программирования указанных решений:

public static class StringExtensions
{
public static bool ContainsAnySymbol(
this string str,
IEnumerable<char> symbols) =>
str.Intersect(symbols).Any();

public static bool ContainsAllSymbols(
this string str,
IEnumerable<char> symbols) =>
symbols.ToHashSet().IsSubsetOf(str.ToHashSet());
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22🤔9🌭41🥴1🍌1
Незамеченная фишка C# 12 😱

Уверен, вы могли упустить это нововведение в последней версии языка - лично я узнал о нём только благодаря подсказкам IDE 😱

Теперь классы, структуры и интерфейсы с пустым телом можно объявлять без фигурных скобок, прямо как рекорды!

Соответственно, следующий фрагмент кода скомпилируется:

class MyClass;

abstract class MyAbstractClass;

struct MyStruct;

interface IMarkerInterface;
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18🤯6👍51
Языком 2023 года по индексу TIOBE назван C#, который сохранил 5 место, но стал лидером по росту популярности (+1.43%) 🥳

Жаба уже одной в могиле, ведь она показала один из самых высоких спадов популярности (-4.34%) ☠️

https://www.tiobe.com/tiobe-index/
👍23🔥3🍌31
Узнали? Согласны?
😁18🔥12🥴54💯4🥱3
«Когда мера становится целью, она перестает быть хорошей мерой» - закон Гудхарта 🧠

Страшно подумать - принцип был сформулирован почти 50 лет назад, но много технических компаний и эффективных менеджеров продолжают его не понимать!

Если ваша цель снизить количество легаси - удалите кодовую базу и начните всё сначала.

Если ваша цель увеличить доход - покройте все экраны рекламой.

Если ваша цель писать больше кода - добавляйте бессмысленные комментарии.

Если ваша цель фиксить больше багов - чините самое простое.

Если ваша цель делать больше пулл реквестов - время вылизывать readme.

Если ваша цель увеличить вовлечённость - превратите всё в кликабельные кнопки.

Если ваша цель уменьшить количество отчётов об ошибке - усложните отправку отчёта.

Если ваша цель быстрая загрузка страницы - удалите всё мультимедиа, JavaScript и CSS с вашего сайта.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥24😁9💯52🤔1🥱1
Рекомендую к прочтению

В прошлом году у меня возникла необходимость систематизировать в моменте свои знания об асинхронном программировании в C# и при этом иметь постоянную шпаргалку под рукой.

Собственно, эта книга идеально решила эту потребность - в ней описаны все необходимые аспекты, при чём очень доступно и концептуально, на уровне идеи, а не конкретного кода.

Вы даже узнаете, в чём преимущество async / await для ASP NET приложений!

Бумажный вариант стоит недорого, сама книга имеет небольшой объём - всего 119 страниц.

Так что, однозначный лайк👍🏻
👍40🔥74
Какой сахар мне хотелось бы видеть в новых версиях 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 завезли такую настоящую объекто-ориентированную очередь с приоритетами.

Объектно-ориентированная в смысле поддержки своих формальных типовых параметров:

▪️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 придётся реализовывать самому.

Больше прочитать про внутреннее устройство класса можно в статье Вадима Мартынова на Хабре
👍242🔥2
Всех с началом рабочей недели!

«Самая зрелая реакция — это радоваться его успеху. Вам следует вознаградить его за производительность и признать его успешность, особенно если это очень качественный сотрудник.



Кроме того, мы можете учиться у этих упорно трудящихся людей. Если их показатели крайне высоки, узнайте, как им это удаётся.»

https://habr.com/ru/articles/791264/
😁6👍4🔥2🤔1🤣1
Новые выражения коллекций в .NET 8

C# 12 привнёс лаконичный синтаксис для инициализации коллекций, открыв много новых возможностей.

1️⃣ Квадратные скобки

Теперь списки, массивы, спаны и прочее можно объявлять как в JavaScript!

Правда, в случае переменных нужно обязательно указывать target type:

int[] intArray = [1, 2, 3];
List<int> intList = [4, 5, 6];
ImmutableArray<object> emptyCollection = [];


Это работает и для свойств, полей, параметров методов и так далее.

2️⃣ Развёртка коллекции

Опять же, подобное уже было в 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"];


3️⃣ Поддержка пользовательских типов данных

Если у вас есть свой тип данных, для которого хочется подключить выражения коллекций, то необходимо сделать три вещи:

Реализовать интерфейс IEnumerable<T>
Написать статический класс билдер с фабричным методом, который создаёт объект вашего типа из коллекции
Пометить тип атрибутом [CollectionBuilder], указав класс строитель и имя фабричного метода

Подробнее можно прочитать по ссылке
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25❤‍🔥3🔥21🐳1
Task.WhenAll vs Parallel.ForEachAsync

Этот вопрос возникал перед любым практикующим C# разработчиком.

Наконец, окончательный и аргументированный ответ можно получить, прочитав мою новую статью на Хабре!

Ваши плюсы мотивируют поднимать планку качества контента раз за разом, поэтому продолжайте их ставить!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍30🔥75👏2🤔2