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

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

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

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

Ютуб https://www.youtube.com/@steponeit
Download Telegram
JetBrains облажались

И признались в собственной стагнации и творческой импотенции. Недавно вышел preview release нового продукта Fleet. Но нужен ли он?

Многие ожидали от Fleet «убийство» Visual Studio Code. Давайте пройдёмся по пунктам и разберёмся кого убьёт новая IDE.

В первую очередь, стоит отметить платность Fleet. В будущем, после официального релиза, для его использования будет необходимо купить подписку. На текущий момент модель лицензирования и ценообразования ещё в разработке.

Fleet позиционируется как легковесный редактор, но в реальности дела обстоят иначе. Для установки надо скачать некий JetBrains Toolbox, уже в котором надо выбрать желаемый продукт. Спасибо компании за лишнюю головную боль.

А ещё спасибо за то, что теперь пользователей компьютеров больше не волнует вопрос, куда девать лишнюю ОЗУ. Ведь теперь её не будет. Fleet потребляет от 2 до 3 ГБ оперативной памяти.

Smart mode - это вообще не киллер фича. Мне предлагают довериться некоторому чёрному ящику в вопросах удовлетворения потребностей при разработке, использующей конкретную технологию.

Лучше скачаю подходящую IDE и допилю её соответствующими плагинами, или сделаю это в том же VS Code. А текущая модель расширения Fleet также, всё ещё в разработке, и нет гарантии, что её не свернут.

В общем, ребята выкатили на всеобщее обозрение сырой неэффективный продукт, не привносящий ничего нового на рынок. Так что, Fleet не убийца VS Code, а убийца JetBrains.
👍12🤯3👎1👏1💯1
Это прозвучит странно…

Но Microsoft знает толк в «импортозамещении»! Сейчас объясню, что это значит.

На языке программирования C# написана одна из самых популярных библиотек по работе с JSON - Newtonsoft.Json.

Я бы сказал, сверхпопулярная - почти 2.5 миллиарда скачиваний. Дошло до того, что платформа .net core (до версии 3.0) включала в себе различные адаптеры и коннекторы под этот инструмент. Под стороннюю библиотеку!

Так появился пакет System.Text.Json, который покрывает 100% потребностей ежедневных задач при работе с форматом. Так ещё и имеет нативную поддержку платформы и работает эффективнее, как по времени, так и по памяти.
👏9👍4😁3🔥1
Остался разочарован программой DotNext 2022 Autumn

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

Моё внимание особенно привлекли два доклада.

1. «Введение в Microsoft SignalR». Серьёзно? Введение? В 2022? Технологии почти 10 лет, на её основе сделали blazor, почему знакомиться надо только сейчас?

2. «MediatR не нужен». Совпадение, однако ранее я выпускал статью на точно такую же тему. Не удивлюсь, если её просто перескажут…
🤔2🤯2😢1🤨1
Замена MediatR здесь

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

У библиотеки много изъянов, но осталось не понятно, как лаконично решить эту проблему распределения.
Сквозь статью красной нитью прошла мысль - явное лучше неявного. Причём по многим параметрам, таким как, например:

▪️Когнитивная сложность кода

▪️Поддерживаемость

▪️Тестируемость

▪️Отлаживаемость

Однако, при использовании явного подхода всплывает проблема избыточности кода. Входной узел может обрабатывать 10 разных сообщений, вследствие чего будет раздуваться конструктор из-за количества внедряемых зависимостей.

Сейчас идёт речь про контроллеры ASP NET Core, поскольку в основном применяется MediatR именно там. Решение было на поверхности - эксклюзивно делюсь им с вами.

FromServicesAttribute

И всё. Мы переходим на method injection, и сразу жизнь упрощается. Код такой же явный и декларативный, но гораздо короче.
В некоторых случаях можно даже не заводить интерфейсы, а регистрировать сразу concrete type.
Пример, как это выглядит:

[ApiController]
[Route("[controller]")]
public class SomeController
{
[HttpGet("data")]
public Task<GetSomeDataResponse> GetSomeData(
[FromQuery] GetSomeDataRequest request,
[FromServices] GetSomeDataRequestHandler handler,
CancellationToken token) =>
handler.HandleAsync(request, token);
}
🔥10👍41🤯1
Стоит ли выбрасывать исключение из конструктора?

По этому вопросу сообщество разработчиков буквально разделилось на два лагеря, «за» и «против», соответственно.
Действительно, это палка о двух концах, давайте разберёмся.

С одной стороны, конструктор - это функция, которая занимается созданием объекта. То есть, перед ним стоит задача инициализировать некий кусок памяти и выдать указатель для дальнейшего использования.
Однако, если что-то пошло не так, то экземпляр типа просто не допускается к существованию.
Предотвратить можно только за
счёт исключения.

С другой стороны, есть практика двухэтапного создания объекта. Сначала готовим данные и проверяем их, затем выделяем память. Подготовку данных можно вынести в отдельный слой, например, валидации.
Или некий фабричный метод. Тогда, вид ошибки (исключение, монада, контейнер) будет зависеть от потребностей в конкретный момент времени.

Обе практики имеют место быть, и между ними можно даже найти баланс. Например, ThrowIfNull вызовы.
Но чего уж точно не должно быть в конструкторе - сложной логики.
Только элементарная инициализация.
👍5🔥2🐳1
Монолиты и микросервисы

Достаточно часто можно увидеть в чатах/комментариях по теме что-то вроде такого:

«А с микросервисами не все работают? Я вот на первой работе год работал и там был монолит. Но мне казалось, что микросервисы вот вообще у всех, кроме меня»

«С одним местом работы на монолите мало какие конторы будут звать на собес на вменяемые деньги»

Говорить о том какие плохие монолиты и какие хорошие микросервисы стало очень модно. Но, как обычно, правда где-то посередине.

Инженеры любят сложные задачи. Всплывшая концепция делать приложения модульными породила множество вызовов. Некоторые из них не отвечены по сей день.

Но иногда чем проще, тем лучше. Иногда, простой монолит - это хорошо.
Есть множество успешных примеров:
▪️StackOverflow
▪️Slack
▪️GitHub
и многие другие

Но постоянный пуш этой темы в медиа, миллион докладов об одном и том же, одинаковые описания вакансий - всё вместе создаёт эффект «ошибки выжившего».
Слушать про успешный запуск на простой архитектуре неинтересно.

Больше по вопросу можно почитать в этой классной статье Хабре
🔥6👍2👏1
StepOne | Степан Минин
AutoMapper не нужен Я провёл детальное расследование по этому вопросу. Материалы дела уже на Хабре. Попрошу вас прочитать и поставить плюс #хабр
Под вышедшей статьёй очень понравился один комментарий. Настолько, что решил его опубликовать в канале. Орфография и пунктуация автора сохранены в оригинале:

«Я не могу понять одного, почему библиотека или ее автор решает за меня как ее использовать? Если есть инструмент для маппинга, то его домен это маппинг и основная задача - предоставить апи для решения задач маппинга. Вместо этого создатели автомаппера гнут свою линию, причем доходит до смешного: в одном ответе на стековерфлоу они советуют юзать какой-то новый метод, а уже в другом говорят что это плохая идея, а метод мы удалили навсегда. И эти парни не знают слов deprecated, obsolete и тп. Мы художники - мы так видим, а вы переписывайте как хотите ваши маппинги - напрасная трата человеко-часов. Мало того, они как бы дают вам возможность вернуть часть функционала, если очень надо, но код примеров еще надо найти в каком-то из обсуждений и самое главное - этот код бажный, какое-то издевательство. Этого достаточно, чтобы начать обходить эту либу стороной, неизвестно что они решат удалить или запретить завтра, а переписывать сотни мапингов нет никакого желания.

Сама идея неявного маппинга многократно доказала, что это гарантированный источник ошибок, который к тому же скрывает связи внутри приложения. Это означает, что все эти маппинги надо будет покрывать тестами, но зачем, если вполне можно сделать апи, которое максимально ограничит эти ошибки?
»
🔥7💯3👍2
async void это костыль .NET’а

Многие .NET разработчики знают, что с 5й версии C# в языке появились инструменты для реализации концепции асинхронного программирования.
Ключевые слова async/await, типы данных Task и Task<T>, библиотека TPL.

Однако, мало кто знает почему два слова, async void, можно написать друг за другом, а компилятор не отругается, в отличие от бородатого сеньора-помидора на код ревью.

Казалось бы, всё просто: если метод возвращает что-то типа T, то его асинхронный вариант вернёт Task<T>.
Если не возвращается ничего, то есть стоит void, то асинхронный вариант имеет тип Task.

Однако, при внедрении киллер фичи, разрабам сишарпа было важно не поломать обратную совместимость и консистентность парадигм. Да-да, C# - это мультипарадигмальный язык программирования. И помимо всего прочего там на уровне языка встроена событийная система.

То есть, можно кидать события, создавать обработчики, регистрировать их, реализовать паттерн Publisher-Subscriber и многое другое. Но, для событийно-ориентированного программирования странно, когда обработчик имеет возвращаемый тип.

Поэтому было принято решение сделать такую штуку, с которой мы живём до сих пор. Всё ради существования асинхронной обработки событий на уровне языка.

Почему async void нельзя применять в реализации типовых задач асинхронного программирования?
У него совершенно другая семантика.

1️⃣ Исключения, выброшенные в такой среде не отлавливаются через catch. Они не оборачиваются в задачу, а вызываются прямо на контексте синхронизации. Отследить такое можно только с помощью глобальных «ловцов всего», что есть прямая дорога к неподдерживаемости.

2️⃣ Методы с такой сигнатурой нельзя компоновать с другими асинхронными вызовами через общий API. Цепочки задач, коллбеки при продолжении, общее ожидание - всё это недоступно.

3️⃣ Такой код сложно тестировать и поддерживать. Например, MS Test вовсе работает только с асинхронным кодом, возвращающим Task и Task<T>. Для каждого конкретного случая придётся писать свой собственный контекст синхронизации. Решение не простое и далеко не оптимальное.

Ну а больше деталей - на странице MSDN
👍121🤯1💯1
Не знаю подводят ли другие блоггеры итоги года, но для меня 2022 однозначно был хорошим.

Я ротировался на senior должность, оказался в гостях у Антона Назарова, выпустил немало успешных статей на Хабре и, конечно, завёл этот замечательный канал!

Уверен, дальше - больше 🚀⚡️💪
Всех с наступающим🎄
Счастливого Нового Года 🥳
🔥23🎉62👍1
Год начинается с хороших новостей 😊
🔥15👏1🎉1
🙈
😁9💯5🤯1
Как объяснить обывателю что такое программирование?

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

Всё это далеко от истины.
Начиная от бесполезности и до притворства в работе.

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

Мне кажется, аналогия очевидна. Программисты - инженеры XXI века.
Только механизмы и детали - цифровые.
Разрабатываемые системы нельзя потрогать, только представить в голове или выразить с помощью некоторой нотации.

На сознание программиста оказывается огромная когнитивная нагрузка.
Отсюда и уровень дохода.
Никакого пузыря не существует, я бы даже сказал, что в некоторых ситуациях нам недоплачивают.
👍10💯2👏1
Do I need to run tests before push?

На текущем проекте мы используем Kafka. Так вышло, что я - MacBook enjoyer и пишу код на m1 машине.

Соответственно, интеграционные тесты, задействующие Kafka тупо не запускаются.
И какое-то время назад у меня в голове возник вопрос: «а должно ли это вообще меня волновать?»

Ладно, Kafka. Но в большом коммерческом проекте есть ещё много других вещей, которые нужно было бы поднимать на своей машине, просто чтобы запустить приложение:

▪️Эмулятор внешних систем (mock интеграций);

▪️Базы данных;

▪️Кэш;

▪️Gateway микросервисов;

И многое другое…

Зачем мне засорять компьютер, когда уже есть облако с окружением, где крутятся пайплайны, триггернутые коммитом? CI/CD - это автоматизация всей вот этой рутины. И я воспользуюсь этим технологическим достижением, чтобы упростить себе жизнь.

Смысл прогонять тесты на машине, если репорт будет читаться из пайплайна в гитлабе?
👍5👌1💯1
marker interface

Для чего их вообще используют?
Допустим, в коде используется некий объект, который реализует указанный интерфейс. Тогда, появляется возможность проверить реализуется ли он и скорректировать на основе этого обработку объекта.

Также, маркерный интерфейс может быть необходимым злом при отсутствии поддержки в языке discriminated union types.
К сожалению, в объектно-ориентированных языках вроде C# объявить тип, который будет чем-то конкретным из указанного набора, невозможно.

Поэтому, приходится прибегать к таким уловкам.

Почему маркерных интерфейсов стоит избегать?
Главная проблема такого подхода - нарушение инкапсуляции.

Объект сам по себе теперь обладает неявным контролем над возможностями внешнего использования. Более того, он знает окружение, в котором будет использоваться.

Применение маркерного интерфейса подразумевает, что где-то будет находится проверка на этот маркер. Это противоречит идее инкапсуляции, потому что у объекта появляется знание о реализации той части системы, которая находится совершенно вне зоны его «полномочий».

В общем, обычный интерфейс говорит окружающему миру о том как он может быть использован, пустой, маркерный, о том, как должен быть использован.
👍81👏1🤔1
Привет, я - компилятор!

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

Я не постесняюсь ни на йоту перед тем, как превращу трёх-строчный цикл в тысячи инструкций с целью просто его ускорить.
Я пойду на всё ради оптимизации, буквально. Даже на самые грязные уловки. И мне не будет стыдно.

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

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

Да. Всё это за доли секунд. И только потому что человек знает, что я могу, а он - нет.

P.S.
Кстати говоря, половина написанного человеком кода не использовалась программой.
Я оказал ему услугу и просто выбросил его на помойку.
🔥12👍1🙏1
Подготовка к новой статье на Хабр идёт полным ходом!
🔥6👏1🤯1
А вы знали, что на сайте Microsoft Developer Blogs есть полноценный блог о Java на китайском?

Microsoft, что за дела???
😁5🤯1🤨1
Swagger и полиморфные контракты в .NET 7

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

Читаем и ставим плюсы!

#хабр
🔥7🤩2💯2👍1
Пока я писал статью про .NET 7

Microsoft успели выпустить первый превью .NET 8.
Новая итерация платформы в первую очередь интересна тем, что будет LTS. Поэтому её и ждут.

Из нововведений и доработок пока объявлены только улучшения производительности и потребления ресурсов.
В этом направлении ведётся активная работа, за что Microsoft можно похвалить.

Ну а если вы хотите узнать больше про перфоманс в .NET или узнать как новые оптимизации влияют на генерируемый IL, то добро пожаловать на канал моего хорошего знакомого @csharp_gepard

Он пишет об этом давно, интересно, и самое главное понятно.

Ссылка на новость про превью:
https://devblogs.microsoft.com/dotnet/announcing-dotnet-8-preview-1/
👍3🔥2👏1