Pull to refresh
76
0
Вадим Мартынов @Vadimyan

Программист

Send message

Пришло время пересмотреть структуру проектов на .NET

Level of difficultyEasy
Reading time11 min
Views16K

C релизом .net 6 у нас появился новый упрощенный подход для быстрого создания сервисов  Minimal APIs. Эта статья появилась потому, что с новым подходом появились новые вопросы, связанные с организацией кода внутри проекта.

Это — немного вольный перевод статьи "Maybe it's time to rethink our project structure with .NET 6" от Tim Deschryver про подход к созданию сервисов с помощью Minimal APIs, который может помочь нам сделать архитектуру приложения более чистой, простой и легкой в поддержке и развитии.

Читать далее
Total votes 16: ↑13 and ↓3+10
Comments24

Cписок ИТ-компаний, которые проводят стажировки в Ростове-на-Дону, Таганроге или удаленно в 2023

Level of difficultyEasy
Reading time4 min
Views10K

Вообще‑то, такой пост уже был в 2017ом. Но каждый год список меняется, поэтому мы cобрали в одном месте (и регулярно обновляем) компании, которые проводят стажировки для студентов в 2023 году в Ростове, Таганроге или удаленно.

В этом году можно найти стажировки по Java, С#, Kotlin, JS, Go, Python, С++, Swift, FPGA, PHP, Ruby, Flutter, QA, DevOps, ML, Scala,.NET, SQL, дизайну и аналитике от 10 компаний. Актуальная версия есть на github, а в посте есть текущий список и пару рекомендаций для стажёров.

К списку компаний
Total votes 5: ↑4 and ↓1+3
Comments1

Ростов-на-Дону: IT-компании, сообщества и мероприятия в 2022 году

Reading time7 min
Views3.2K

Статья про местное ИТ-сообщество в 2019 году была посвящена Ростову и городским сообществам. В 2020-ом мы писали про Таганрог. В прошлом году я решил написать о необычных форматах митапов в Ростове — ИТ-баре, ИТ-стендапе, йога-митапе, ИТ-ЧБД и традиционной конференции с бассейном. Пора подводить итоги этого года.

Что будет в этой статье: как сделать ежегодное исследование ИТ-сообщества для полутора тысяч человек, рассказ про самый большой JS-митап в парке для 400 человек, итоги опроса и планы на 2023 год.

Поехали
Total votes 8: ↑7 and ↓1+6
Comments2

Сравнение AutoMapper и Mapster

Reading time10 min
Views12K

Использование автоматизированных инструментов преобразования объектов (object-object mapping) может помочь в организации кода и отделении ответственности за преобразования в отдельный изолированный уровень приложения.

AutoMapper — самая популярная библиотека для маппинга объектов в dotnet — NuGet-пакет скачали больше 313 миллионов раз за 11 лет существования библиотеки.

Mapster появился на 4 года позже AutoMapper и имеет 8.2 миллионов загрузок на nuget.org. Популярность отличается больше, чем на порядок, так зачем бы вообще смотреть на альтернативу AutoMapper? Дело в том, что Mapster обещает лучшую производительность и меньший объем памяти по сравнению с другими библиотеками маппинга объектов, поэтому стоит по крайней мере рассмотреть использование этой библиотеки и понять возможности для замены автомаппера на мапстер.

Сравнение, бенчмарки и выводы
Total votes 7: ↑6 and ↓1+5
Comments10

.NET 6: PriorityQueue

Reading time12 min
Views18K

В .NET 6 появилась новая коллекция — PriorityQueue<TElement,TPriority>. До этого очереди с приоритетами уже были в .NET, но только в виде внутренних классов — они использовались под капотом разных механизмов в WPF, Rx.NET и в других частях фреймворка. 

Но в .NET 6 PriorityQueue стала новой коллекцией, которой теперь можно пользоваться из клиентского кода. Давайте посмотрим, что предлагает эта очередь, как она устроена внутри и насколько быстро работает. Под катом будет постепенное погружение: от примеров использования в коде к введению n-арные деревья.

Читать далее
Total votes 21: ↑21 and ↓0+21
Comments5

Эффективная генерация сортируемых GUID для первичных ключей БД на клиенте

Reading time12 min
Views18K

Использовать Guid.NewGuid() в качестве первичного ключа в базе данных — плохая с точки зрения производительности идея. Это связано с тем, что в SQL Server, MySQL и некоторых других БД для первичных ключей создаются кластерные индексы, которые определяют, как строки будут храниться на диске. GUID — это по сути случайное значение, поэтому новая строка может попасть в начало, середину или конец таблицы. Серверу БД в этом случае придётся перемещать другие строки, что приведёт к фрагментации данных, а их извлечение может занять больше времени, если вам нужно извлечь несколько добавленных последовательно записей (например, когда вы добавляете набор связанных сущностей, которые потом будут извлекаться вместе — БД понадобится прочитать данные из разрозненных страниц вместо последовательного чтения набора данных).

Поэтому, чаще всего, лучше пользоваться сгенерированными БД первичными ключами. В SQL Server, например, есть функция NEWSEQUENTIALID(), которая генерирует последовательные GUIDы. Зачем может понадобиться генерировать ключи именно на клиенте и как это правильно сделать?

Читать далее
Total votes 21: ↑21 and ↓0+21
Comments35

22 новых фичи C# — каким будет C# 11+

Reading time26 min
Views24K

1. Полуавтоматические свойства и ключевое словоfield.
2. Модификатор уровня доступа file.
3. Первичные конструкторы для классов и структур.
4. Паттерн-матчинг для списков.
5. Атрибуты для Main в программах с top level statement.
6. Сырые строки без экранирования внутри строки для удобства работы с json, xml, html и регулярными выражениями.
7. Строковые литералы для UTF-8.
8. Паттерн-матчинг для Span<char>.
9. Перенос строк в выражениях интерполяции.
10. Возможность перегрузки операторов с проверкой на переполнение
11. Оператор побитового сдвига вправо без знака >>>.
12. Доступ к параметрам методов nameof.
13.nameof для членов экземпляров.
14. Ключевое слово required для обязательно инициализируемых свойств и полей.
15. Автоматическая инициализация свойств структур значением по-умолчанию.
16. generic-атрибуты.
17. локальные переменные и параметры только для чтения.
18. Кэширование делегатов при использовании method group для статических методов.
19. Поля с значением хранящимся по ссылке.
20.params Span<T>/params ReadOnlySpan<T>/params IEnumerable<T> в объявлении методов чтобы избежать лишних неявных созданий массива в куче и копирований коллекций.
21. Удаление оператора проверки параметров на null !!.
22. Предупреждения для имен типов полностью в нижнем регистре.

Внутри — разбор каждой фичи и сценарии применения.

Читать далее
Total votes 43: ↑43 and ↓0+43
Comments25

Roslyn-анализатор для преобразования кода из Regex в новый Regex Source Generator

Reading time10 min
Views3.3K

Source generators (генераторы исходного кода) — это часть платформы Roslyn, которая появилась в .NET 5. Они позволяют анализировать существующий код и создавать новые файлы с исходным кодом, которые в свою очередь могут добавляться в процесс компиляции.

В .NET 7 появилась новая функиональность для регулярных выражений, которая позволяет генерировать исходный код для проверки регулярного выражения во время компиляции с помощью специального source generator. Генерация исходного кода во время компиляции, а не во время выполнения, имеет несколько преимуществ:

Читать далее
Total votes 16: ↑16 and ↓0+16
Comments0

Запуск фоновых задач в asp.net core

Reading time10 min
Views39K

Небольшой обзор стандартных средств запуска бэкграунд-задач в аспнет приложениях — что есть, чем отличается, как пользоваться. Встроенный механизм запуска таких задач строится вокруг интерфейса IHostedService и метода-расширения для IServiceCollection — AddHostedService. Но есть несколько способов реализовать фоновые задачи через этот механизм (и ещё несколько неочевидных моментов поведения этого механизма).

Читать далее
Total votes 16: ↑15 and ↓1+14
Comments10

Ростов-на-Дону: IT-компании, сообщества и мероприятия в 2021 году

Reading time8 min
Views6.1K

Привет, меня зовут Вадим и я всё ещё занимаюсь развитием ИТ-сообщества в Ростове. В 2021 у нас было много интересного — исследование ит-сообщества на 1500 человек, 70 митапов и самая большая на юге конференция с 1200 участниками и 50 спикерами со всей страны. Прошлые посты были посвящены городам — Ростову и Таганрогу. В этот раз хочу больше рассказать о мероприятиях и том, как встречается Ростовское ИТ-сообщество.

Поехали
Total votes 30: ↑28 and ↓2+26
Comments5

Ростов-на-Дону: IT-компании, сообщества и мероприятия в 2020 году

Reading time7 min
Views6K

В прошлой статье "Ростов-на-Дону: IT-компании, сообщества и мероприятия в 2019 году" я рассказывал о том, чем живёт и из чего состоит Ростовское сообщество — как мы собираем 60-70 митапов в год, какие компании есть в городе и чем они занимаются.

Готова подборка интересного из 2020 и планы на 2021 год — новые сообщества, бум митапов, ИТ-конференция с бассейном и результаты опроса о том, где хотят работать местные разработчики. А еще немного про уникальный феномен Таганрога — города с самой большой концентрацией ИТ-специалистов на человека. И, конечно, приглашение в гости к Ростовскому ИТ-сообществу. Но давайте по порядку.

Погрузиться в атмосферу Ростовского ИТ
Total votes 29: ↑29 and ↓0+29
Comments13

Почему онлайн-митапы никогда не заменят оффлайн, что с этим делать и почему онлайн всё равно нужен

Reading time6 min
Views2.3K
Мне это надоело.

В прошлом году я был на 50+ митапах, нескольких конференциях и на паре хакатонов.
За последние пару месяцев я сходил на 30 онлайн-мероприятий разных форматов, и хочу рассказать, почему зря потратил это время, в чём проблема с онлайн (и офлайн) митапами и что мы можем сделать чтобы оказаться в чуть лучшем мире. Давайте по порядку.



Зачем приходить на митапы


Читать дальше →
Total votes 6: ↑6 and ↓0+6
Comments0

Онлайн-паб 23 мая: холиварим про облака, JS и мобилки

Reading time2 min
Views1.1K
Бывало такое, что на митапе самое интересное вы узнавали не из докладов, а на кофе-брейке или афтерпати, пока общались с спикером или другими участниками? Если да, то давайте пропустим лишнее и пойдём сразу в паб. В онлайн-паб.



Никаких скучных докладов, соберем 12 экспертов и сделаем живой разговор с аудиторией. Будем говорить про облака в реальном мире, проблемы заезда, неожиданные косты и стереотипы, которые есть вокруг облачных сервисов. Попробуем понять, кто такой хороший JS-разработчик, каким он должен быть и должен ли он вообще что-нибудь кому-нибудь. Подумаем, как дела с мобильной разработкой в 2020 и сколько осталось жить флатеру.

Как всё будет и где смотреть:
Читать дальше →
Total votes 6: ↑6 and ↓0+6
Comments4

Ростов-на-Дону: IT-компании, сообщества и мероприятия в 2019 году

Reading time7 min
Views12K
Привет. Меня зовут Вадим и я занимаюсь развитием IT-тусовок в Ростове. Через год после этой статьи я написал следующую: "Ростов-на-Дону: IT-компании, сообщества и мероприятия в 2020 году", так что можно сходить и почитать свежие новости там. А тут я рассказываю, каким был Ростов с точки зрения ИТ в 2019 году.
В 2016 году spasibo_kep написал статью "Едем в город южный: как живут разработчики в Ростове-на-Дoну" о Ростовском IT. Пришло время её обновить, тем более, что Ростов в 2019 году стал 4ым в России городом по интенсивности IT-мероприятий и активности сообщества. Статья будет полезна тем, кто думает о релокации, хочет узнать про IT-жизнь за пределами столиц, или интересуется развитием IT-сообществ.
В статье будет чуть-чуть о климате и географии и очень много о компаниях и сообществе.


Читать дальше →
Total votes 27: ↑27 and ↓0+27
Comments22

Сравнение строк в C# (по умолчанию)

Reading time10 min
Views53K
Часто бывает, что мы соединяем 2 коллекции или группируем коллекцию при помощи LINQ to Objects. При этом происходит сравнение ключей, выбранных для группировки или связывания.
К счастью, стоимость этих операций равна O(n). Но в случае больших коллекций нам важна эффективность самого сравнения. Если в качестве ключей выбраны строки, то какая из реализаций сравнения будет использована по умолчанию, подходит ли эта реализация для ваших строк и можно ли, указав IEqualityComparer<string> явно, сделать эту операцию быстрее?
clients.Join(orders, 
                   c => c.Name, 
                   o => o.ClientName, 
                   (c, o) => CreateOrederDto(c, o));

Как же выбирается реализация компаратора, если пользователь не указал её явно?
Пороемся в исходном коде coreclr
Total votes 28: ↑28 and ↓0+28
Comments1

Базовая реализация INotifyPropertyChanged

Reading time12 min
Views22K
WPF в чём-то повторил судьбу js — в силу некоторых нерешённых на уровне платформы проблем многие пытаются стать первооткрывателями наравне с Карлом фон Дрезем.

Проблема


В случае с INPC в ViewModel часто существуют свойства, зависящие от других или вычисляемые на их основе. Для .net 4.0 ситуация с реализацией усложняется тем, что CallerMemberNameAttribute не поддерживается в этой версии (на самом деле поддерживается, если вы маг и кудесник).

Решение

Как пользоваться и что внутри
Total votes 9: ↑7 and ↓2+5
Comments12

Действительно прозрачное использование WCF

Reading time12 min
Views49K

Мотивация


Для desktop-мира wcf остаётся самым распространенным способом организации клиент-серверного взаимодействия в .net как для локальных, так и для глобальных сетей. Он гибок в настройке, прост в использовании и прозрачен.

По крайней мере, так должно быть. На практике добавление нового сервиса — это рутина. Нужно не забыть прописать конфигурацию на сервере, сделать то же самое на клиенте, нужно написать или сгенерировать proxy-класс. Поддерживать конфиги неудобно. Если сервис изменился, то нужно вносить изменения в proxy-класс. А ещё не забыть про регистрации в IoC-контейнере. И добавление новых хостов для новых сервисов. И еще хочется простой асинхронности. По отдельности всё просто, но даже для статьи я дописывал этот список уже трижды, и не уверен, что не упустил чего-нибудь.

Время автоматизировать. Простейший сценарий от создания решения до вызова wcf-сервиса выглядит так:
  1. Install-Package Rikrop.Core.Wcf.Unity
  2. Пишем ServiceContract и их реализации
  3. На сервере и клиенте добавляем одну строку регистрации в IoC (конфиги править не надо)
  4. Поднимаем хосты с двух строк
    var assembly = Assembly.GetExecutingAssembly();
    _serviceHostManager.StartServices(assembly);
    
  5. На клиенте резолвим IServiceExecutor<TService>. Эта обёртка служит для вызова методов сервиса и скрывает работу с каналом.
  6. Можно пользоваться
    var articles = await _myServiceExecutor.Execute(service => service.GetArticles());
    

Как пользоваться и что внутри
Total votes 16: ↑15 and ↓1+14
Comments11

Авторегистрируемые в Unity репозитории на .net для EF Code first

Reading time5 min
Views6.9K
Привет. Приступим.

Мотивация

  1. Есть проект с Entity framework (>= 5.0.0.0) code first.
  2. Вы любите IoC, но не любите бесконечные регистрации новых сущностей.
  3. В качестве контейнера используется Unity (или есть возможность потратить 10 минут на допиливание исходников под свой контейнер).
  4. Перспектива написания однотипного кода почему-то отпугивает вас.

Итак, что предлагает эта статья. Вы подключаете 2 nuget-пакета, реализуете для своих Entity простой интерфейс IRetrievableEntity<TEntity, TId> (можно упростить задачу, отнаследовавшись от готового класса Entity<TId>), добавляете в код 2 строки регистрации и получаете на выходе полную независимость от DBContext и возможность резолвить репозитории для каждой IRetrievableEntity-сущности с возможностью построения объектно-ориентированных (типизированных) запросов к этим репозиториям. Только посмотрите:
var employeeRepository = container.Resolve<IRepository<Emloyee, int>>();
var employees = employeeRepository.Get(q =>
{
    q = q.Filter(e => e.EmploymentDate >= new DateTime(2014, 9, 1));
    if(excludeFired)
        q = q.Filter(e => !e.Fired);
    q = q.Include(e => e.Department, p => p.Department.Chief)
            .OrderBy(p => p.FirstName);
});

Как быстро начать использовать

из коробки
Total votes 20: ↑16 and ↓4+12
Comments11

Starban. Гибкая методология разработки, геймификация и еще много модных слов

Reading time13 min
Views20K
Поскольку пост некороткий и даже неуместные картинки не делают его чтение легче, то давайте первым делом обозначим целевую аудиторию.
  • Вы разработчик ПО, руководитель группы разработки, менеджер проекта или его эквивалент.
  • Над проектом работает больше одного программиста, желательно — больше трех.
  • Вы пробовали все эти скрамы и эджайлы, почувствовали их прелесть, но есть определенные нарекания к догматическому следованию методологии. Возможно, у вас никто не занимается постановкой процессов совсем и задачи просто «накидываются».
  • Команда устала (от проекта, от стресса, ...) и в скором времени всех ждут кнуты и пряники.


Хорошо, есть методология, которая выдумана командой программистов «для себя», но которую, по нашему мнению, будет интересно попробовать и другим. Внутри команды воссоздаётся небольшая экономическая модель рыночных отношений, а приоритеты регулируются при помощи курса внутрикомандной валюты.
Starban
Total votes 14: ↑12 and ↓2+10
Comments3

Information

Rating
Does not participate
Location
Ростов-на-Дону, Ростовская обл., Россия
Works in
Date of birth
Registered
Activity

Specialization

Backend Developer, Community manager
Lead
C#
.NET Core
Database
High-loaded systems
Designing application architecture
Database design