В этот раз у DotNext непривычный формат: сначала два дня в онлайне, а позже офлайн-день в Петербурге (первая за два года возможность встретиться на DotNext очно!) Для тех, кто не может добраться до Питера, у последнего дня будет и интернет-трансляция. С программой принципиальных изменений нет: она по-прежнему о всём том, что может быть интересно .NET-разработчикам. Новые тенденции, архитектурные подходы, производительность, best practices — а ещё нестандартные темы, позволяющие расширить кругозор. Однако отличия от прошлых лет есть и здесь. Какие именно доклады будут? Под катом — и их описания, и мнения нескольких участников программного комитета. Комментарии программного комитета Новости и тренды Архитектура Производительность Лучшие практики Расширяем горизонты Главная студия и итоги Sytac / Контур «У нас на этой конференции в кои-то веки будут доклады, связанные с Kafka. Долгое время эта тема на DotNext оставалась несколько проигнорированной. А в этот раз сначала к нам подался Артём Рудневский с докладом "Exactly-once в микросервисной среде" с примерами использования Redis и Kafka. Доклад нам понравился, но для новичков в Kafka он может быть сложноват, и поэтому мы решили сделать ещё и более вводный доклад. Позвали для этого Григория Кошелева, который как раз суперопытный спикер про Kafka». Ланит-Терком «На мой взгляд, в этом сезоне программа получилась не совсем обычной. Традиционно на DotNext было много докладов про внутренности, производительность и прочие хардкорные штуки. В этот раз всё не так. Microsoft планомерно улучшает .NET, но каких-то суперновинок, тянущих на полноценный доклад, очень немного (хотя .NET AOT и Hot Reload нашли своё место в программе). C# развивается, грядёт версия 11, в которой прорывных фич вроде бы и нет, поэтому в этот раз поговорим не только о ближайшей версии языка, но и о будущем. В результате этот сезон конференции получается, на мой взгляд, очень "практичным". В программу вошло довольно много докладов где можно научиться чему-то, что можно применить в работе. Я хочу отметить два направления, которые можно найти в программе. Во-первых, у нас будет несколько докладов на тему event-based communication. Много кто использует брокеры сообщений, но мы очень мало говорили о них на DotNext. В этот раз такие доклады есть. А во-вторых, у нас есть доклады, которые "не про .NET", но про темы близкие и связанные (впрочем, Kafka сюда тоже входит). Про .NET мы знаем много, однако дотнетчики не только пишут на .NET, но и используют различные инструменты и библиотеки — вот про них и поговорим подробнее». Монополия «Если раньше мы с трудом набирали половину локальных докладов, то в этот раз внезапно мы нашли русскоговорящих докладчиков на целых две конференции: online и offline. Оказалось, что их много и материал у них очень разнообразный и глубокий. Из-за этого программа получила глоток свежего воздуха. Много новичков. Но и старички стабильно не подкачали.  В программе будет много актуального материала про использование "православного" ПО, защиту от различных нехороших атак, опыт построения отказоустойчивых систем. Очень интересно наблюдать, как индустрия подстраивается под новые реальности и как это влияет на нашу программу. От офлайна, безусловно, ждём много лампового общения, обмена опытом, долгожданной встречи с друзьями, коллегами и прочими специалистами».  «Офлайн вернулся, это прекрасно. А программа в целом получилась разнообразной. Если когда-то DotNext был почти целиком из сплошного хардкора и "кишочков", то сейчас эти вещи никуда не делись, но меня радует, что есть также хорошие блоки об архитектуре и о "расширении горизонтов"». .NET: AOT в 2022 Тинькофф JIT-компиляция позволяет создавать кроссплатформенные приложения и решает проблемы взаимодействия сборок в рантайме, но может негативно сказаться на производительности приложения, особенно на этапе старта, когда необходимо загрузить и скомпилировать множество методов сразу. .NET на протяжении всей своей истории имел средства для решения этой проблемы, позволяющие предкомпилировать весь или часть кода заранее. Например, Ngen в .NET Framework или CoreRT как самостоятельная платформа. В современном .NET основное средство для Ahead-of-Time compilation — это Crossgen2. К сожалению, Ahead-of-Time компиляция — далеко не серебряная пуля, а технология, несущая свои tradeoffs и не гарантирующая прирост производительности. В каком состоянии она сейчас? Комментарий Романа Неволина: Евгений — это страшный человек: единственный спикер, который при первом же выступлении на DotNext сделал один из лучших докладов той конференции по оценкам участников. А потом спустя полгода на следующем DotNext с новым докладом снова попал в топ-3. Обычно у него хардкорные темы, а в этот раз будет немного попроще, но тоже не без глубины. Начнётся с того, что вообще такое AOT-компиляция и зачем она дотнетчикам, а вот позже дойдёт до нюансов текущей реализации. Сквозь тернии к кроссплатформе. Портируем WPF-приложение на Avalonia Icons8 С 2017 года команда Сергея пишет на WPF векторный редактор Lunacy. И вот встала задача переехать на кроссплатформу Windows+macOS+Linux. Выбрали Avalonia. Порт занял полгода, и это было серьезное испытание.  Сергей по пунктам расскажет, как делать порт, какие бывают грабли, как их обойти и на какие жертвы придется пойти. Он расскажет, насколько тяжело во всем было разобраться и является ли Avalonia production ready. Также в докладе Сергей коснется проблем публикации приложения, в том числе в сторах. А еще вы узнаете, насколько готово к использованию WebAssembly. Комментарий Романа Неволина: «Есть проблема с кроссплатформенным UI на .NET: сам .NET уже несколько лет как стал кроссплатформенным, а UI в него завозят очень медленно. Есть MAUI и Xamarin.Forms, а есть от сообщества, самая заметная — Avalonia. Но многие сомневаются, что её можно использовать в чём-то серьёзном. А вот тут люди реальный бизнес с её помощью строят, интересно послушать про их опыт и собранные грабли. Отдельно интересно, что в качества эксперта на докладе будет Никита Цуканов, работающий над Avalonia — ему точно будет, что добавить к словам спикера». Hot Reload Internals  Время разработчика стоит дорого, поэтому задача современных инструментов — обеспечивать более быструю обратную связь во время разработки. В докладе рассмотрим, как работает технология HotReload в различных сценариях, и какие подводные камни ожидают разработчиков при ее использовании. Атакуем цепочку поставок Контур Контур Доклад офлайн-дня Проблема безопасности всегда стоит остро: уязвимостей много, а способов их эксплуатировать ещё больше. В этом докладе рассмотрим одну из самых горячих проблем современности — атаку на цепочку поставок.  Вы воочию увидите, как это может произойти, что с этим можно сделать и почему процесс обеспечения безопасности бесконечный. Будут рассмотрены некоторые инструменты и методологии защиты от подобного рода атак. Комментарий Романа Неволина: Помните историю с удалением leftpad из npm? А недавний случай с проектом node-ipc, когда контрибьютор попытался сделать так, чтобы он заменял сердечками все данные на российских компьютерах? С точки зрения безопасности подобное всегда было важным вопросом, а теперь стало особенно актуально. Денис давно занимался подобными вопросами безопасности в Контуре, а теперь и всем остальным покажет, как можно поместить в ваш проект неожиданную зависимость, которую вы вроде бы в глаза не видели. Гибридная архитектура: слияние микросервисов в монолит по необходимости ЦРТ Бывают ситуации, когда необходимо работать в различных окружениях: и на дистанции в несколько сотен серверов, и на одном сервере на все сервисы сразу. В таких случаях возникают проблемы несвойственные для обычной разработки. Например, .NET считает и CPU, и всю память своими. Но если на одном сервере запускаются больше ста сервисов, это может убить всю систему на старте. Правильным вариантом здесь будет монолит. Возникает вопрос: как работать на оба направления?  Станислав наглядно покажет, как сочетание абстракций выливается в проблемы и как эти проблемы решить. В его докладе легкий хардкор будет сочетаться с практическим опытом. Рекомендуем его тем, кто интересуется микросервисной архитектурой и нюансами ее эксплуатации. Комментарий Алексея Мерсона: «Станислав — один из рекордсменов DotNext по числу докладов. Зачастую в них содержится суровый продакшен-опыт, он рассказывает не какие-то теоретические измышления, а прям по живому. И здесь как раз такой случай». Kafka: от теории к практике Контур Что такое Apache Kafka? Нужен ли этот проект .NET-разработчикам? Пора ли отправить RabbitMQ на свалку? В своем докладе Григорий ответит на эти вопросы. Он рассмотрит внутреннее устройство Kafka, его .NET-драйвер, лучшие практики и, конечно, грабли. Аспектно-ориентированное программирование на C# и .NET вчера, сегодня и завтра DevBrothers Аспектно-ориентированное программирование позволяет без дублирования кода добавлять функциональность вроде кэширования и логирования на разные слои приложения. И все это — не меняя уже написанный код. Это мощная и удобная, но редко используемая техника. Понятно, почему это так: лет десять назад инструменты для реализации этого подхода были не развиты, и за ним закрепилась репутация «для энтузиастов». Однако сейчас АОП можно увидеть даже в веб-фреймворках, лишь бы только его распознать. Денис расскажет про 10-летний опыт использования АОП на C# и .NET. Он поговорит о подходах к реализации АОП и покажет, как менялись инструменты для разработки аспектов вместе с языком программирования и платформой. Конечно, он предложит наиболее оптимальный вариант реализации аспектов.  После доклада можно будет подискутировать о будущем инструментов для AOP-разработки. Все примеры будут на C# и .NET, но идеи доклада будут актуальны для любой платформы. Ordering the Chaos: Cleaning Logs and Ordering Events in Microservices  Микросервисы — это хорошо, но они приносят свои сложности в логировании. При асинхронном вызове микросервисов, если одновременных вызовов целое множество, часы не идеально соответствуют друг другу, а сеть нестабильна, бывает тяжело разобраться с логами и выяснить, что пошло не так и в каком порядке всё происходило. Адам поговорит о проблемах синхронизации часов и объяснит, почему в мире микросервисов не стоит полагаться на временные метки. Он расскажет, почему общепринятое понятие времени не совсем справедливо для распределенных систем и что делать, чтобы со всем этим разобраться. Вы увидите отношения "happened-before", векторные часы, идентификаторы корреляции и другие паттерны, которые используют для введения осмысленного порядка. Обратная сторона GraphQL. (Не)стандартная реализация потоков данных Банк Открытие Что может быть более комплексным, чем построение архитектуры в банке, особенно на микросервисах? Десятки команд, куча продуктов, омниканальная логика. Андрей представит интересный практический кейс внедрения GraphQL в большом энтерпрайзе. Начав с .NET под Linux, он покажет, как выстроить с нуля все обслуживание клиентов, обеспечить безопасность и достичь мультиязычности разработки на практике. Не менее интересным будет и обсуждение того, что начинается после этого, а именно сбор данных в DWH. Вы услышите про проектирование моделей данных для событий, реализацию подписок GraphQL в корпоративных средах, проблему поддержки stateful-сервисов в контейнеризованных средах, и про то, как все это заставить работать. Будут и практические выводы — про компромисс между идеальным кодом и производительностью при сохранении правильно спроектированной системы. Комментарий Алексея Мерсона: «Андрей уже много лет занимается банковским софтом и рассказывает об этом на конференциях. Не факт, что этот доклад будет напрямую применим на практике для широкой аудитории, но он передаёт масштаб: показывает, как строят очень сложные системы в энтерпрайзе, куда более сложные, чем типовые решения».  Exactly-once в микросервисной среде Mindbox В разработке монолитного приложения с одной базой данных, когда по отношению к системе еще и нет вызова внешних сервисов, проблем не так много. Но в системе из нескольких сервисов и под высокой нагрузкой — они возникают. Становится сложно добиться того: чтобы логические и бизнесовые транзакции выполнялись однократно; чтобы клиентам гарантированно отправлялось одно и только одно уведомление или выдавался один и только один промокод. Артем объяснит, как можно решить эти задачи за счет проектирования идемпотентных сервисов. Он покажет, как решались эти проблемы на примере высоконагруженного сервиса, и расскажет, как в этом помогали Kafka и Redis. Многоликий DDD ScrumTek Доклад офлайн-дня Domain Driven Design всегда имел высокий порог входа. Сложность изучения и применения усугублялась туманностью объяснений выгод как для коллег-разработчиков, так и для архитекторов, менеджеров, продактов. Подарившим DDD вторую жизнь ударом дефибрилятора стали микросервисы. Микросервисы — это то, как мы проводим границы и оказалось, что в DDD для этого содержаться одни из лучших инструментов. Профессиональное сообщество подхватило идеи DDD на хайпе микросервисов и началось бурное развитие.  Появились и новые техники, облегчающие вход в DDD и открывающие новые возможности. Умело комбинируя Event Storming и DDD можно из одной и той же модели получить бэклог, API, тестовые сценарии, наброски UI/UX, структуру команд, структуру компонентов и тех же микросервисов. Именно об этом пойдет речь в докладе. Выступление будет полезно для того, чтобы: 1. Выжать из DDD еще больше, если вы уже его применяете 2. Научиться «продавать» DDD через выгоды, понятные тем, кому «продаете» 3. Расширить кругозор Комментарий Алексея Мерсона: «Сергея многие знают как эксперта по микросервисам, DDD, Event Storming и прочим модным вещам. Он консультировал самые разные компании, и поэтому его доклады — это всегда уникальный взгляд, обобщающий опыт многих». Как написать высокопроизводительный драйвер базы данных GridGain Базы данных лежат в основе большинства сервисов и приложений. Как мы общаемся с нашей БД? Как работает драйвер (клиент), как его спроектировать и реализовать? В этом докладе раскрыты все шаги — работа с TCP-сокетами, формат сообщений, сериализация, отказоустойчивость, распределение ресурсов и много другое. Прослушав доклад, вы узнаете все необходимое, чтобы написать свой драйвер или спроектировать клиентский протокол для новой базы данных. Поговорим о хэш-функциях Broadbridge В 2002 с релизом .NET мы получили достаточно примитивный вариант хэш-функции для строк. В 2010 его обновили, а текущая версия ушла еще дальше вперед.  Поговорим про историю хэш-функций в .NET, почему так вышло и какие требования к ним применяются. Затронем и тему криптографических функций — разберемся, зачем они вообще нужны и почему не используются по умолчанию. Посмотрим на то, как проверяются качества хэш-функции в пакете SMHasher. В качестве эталона будет предложена XXH3 и ее реализация на .NET, которая обгоняет текущий string.gethashcode по скорости и, скорее всего, превосходит по качеству. Как мы написали свой lock-free dictionary Контур Антон расскажет, как написали lock-free замену ConcurrentDictionary для внутреннего сервиса хранения данных. Посмотрим, за счёт чего удалось справиться с проблемами потребления памяти, которые есть у готового решения из .NET. Немного обсудим, зачем и когда стоит писать велосипеды. А также коснёмся важных и интересных нюансов в многопоточном программировании. Комментарий Романа Неволина: «Вот есть потокобезопасная коллекция ConcurrentDictionary, и в теории уже решает все проблемы. Можно пользоваться этим словариком, можно написать свой. Вообще-то написать свой — это какой-то маргинальный вариант, кто вообще так делает? А мы в Контуре зачем-то сделали, да ещё и про это рассказываем. Зачем мы это сделали? Чего добились? Будут ответы на это, ну и в целом интересный практичный доклад про многопоточное программирование». Тонкие настройки стандартного ThreadPool ЦРТ Доклад офлайн-дня Не так давно, в процессе изучения кода стандартного ThreadPool, Станислав заметил, что он имеет достаточно много пусть и специфичных во многом, но настроек для коррекции своей работы. Среди прочих — возможность задать нижнюю и верхнюю границу по количеству потоков, количество потоков, которое пул может добавить за один шаг, и многие другие, более специфичные. Возможности эти вполне открытые, но не документированные: вполне возможно, что когда-нибудь команда .NET представит их общественности как что-то новое, но в своем докладе спикер расскажет, как этим можно пользоваться уже сейчас. Миграция с MS SQL в PostgreSQL, когда нужно ещё вчера ГК Монополия Доклад офлайн-дня Станислав расскажет о различных способах миграции с MS SQL в PostgreSQL. Максимальное внимание будет уделено инструментам: по работе с БД, конвертации схемы, репликации данных и мониторингу. Все это позволит значительно снизить время, необходимое на миграцию вашего приложения. Обезболивание enterprise-разработки. Применяем лучшее из мира микросервисов Croc Code Доклад офлайн-дня Сейчас энтерпрайз-разработка в России усиливает свои позиции. К сожалению, зачастую она не приносит удовольствия разработчикам, ибо обычно связана с устаревшими по современным меркам стеками, технологиями, архитектурами, подходами и повязана с кучей легаси. В докладе пойдет речь о том, как привнести в разработку инфраструктурные решения из мира микросервисов, и что стоит учесть, чтобы сэкономить время и трудозатраты на разработку и эксплуатацию приложения. Пройдёмся по логированию, взаимодействию сервисов, Service Discovery и не только. gRPC: наш опыт внедрения. Почему всегда он? Dodo Engineering Когда Андрей с командой распиливал крупный платежный шлюз, им понадобился RPC-фреймворк. Сначала выбрали Thrift, но потом перешли на gRPC. Он расскажет, с какими проблемами столкнулись. О том, какие нововведения .NET 5, 6 и 7 делают gRPC фактически дефолтным выбором для взаимодействия микросервисов. И без бенчмарков, но покажет, как использовать кусочки этой технологии по отдельности. Отдельно поговорим об особенностях работы в K8s. Аутентификация и авторизация на платформе ASP.NET Core Райффайзен Банк Райффайзен Банк Райффайзен Банк ASP.NET Core дает всё необходимое для защиты приложений и данных, но бывают пользовательские решения, которые не удовлетворяют стандартам и не проходят тщательного тестирования. Сергей, Роман и Кирилл поделятся опытом разработки защищенных приложений с использованием стандартизированных средств ASP.NET Core: Negotiate, O'Auth 2.0, OIDC. Они расскажут о типовых ошибках разработки и предложат несколько вариантов решения. Подискутируют на тему защиты приложений с асинхронным взаимодействием через брокеров сообщений: «Нужно ли передавать токен в сообщениях?» Обработка XML-файлов как причина появления уязвимостей PVS-Studio LLC Дефекты безопасности, возникающие при обработке XML-файлов, хитры. Почему блог, развернутый на вашей машине, может стать причиной утечки данных? Почему при обработке картинок приложение начинает отправлять сетевые запросы?  В ходе доклада мы разберем, как обработка XML-файлов связана с дефектами безопасности, что такое XXE и XEE, и каким образом можно защититься от них. Комментарий Романа Неволина: «В приложениях у нас куча конфигурационных файлов. И к ним часто относятся спустя рукава: конфигурация — это же не база данных, что за них опасаться. Но в читалках XML есть свои весёлые уязвимости, которыми можно воспользоваться. Что-то вроде старых-добрых SQL-инъекций, но только про поля ввода все уже привыкли помнить, что там может быть что-то опасное, а вот про конфигурационные файлы не привыкли». FFmpeg в приложениях .NET для работы с медиафайлами Ростелеком FFmpeg — один из самых популярных кроссплатформенных фреймворков для работы с видео и аудио с открытым исходным кодом. В докладе спикер расскажет об основных терминах, о подключении библиотек FFmpeg к приложению .NET и покажет простое кроссплатформенное приложение, способное осуществлять муксинг-демуксинг видеофайлов. Extended events: помощь разработчикам в решении проблем на MS SQL production server Altenar Любая высоконагруженная система рано или поздно сталкивается с проблемой производительности на уровне БД, вызванной неоптимально написанными запросами или спецификой работы ORM. Часто возникают кратковременные, но значительные просадки. Одним из способов диагностики, очевидно, является логирование событий БД. Обычные способы (профайлер и ручное логирование на триггерах) плохо ведут себя под нагрузкой на продакшене. В MS SQL Server есть механизм, который всё записывает и достаточно безопасен. Посредством Extended Events команда Ирины научилась оценивать быстродействие как сгенерированного Entity Framework кода, так и stored procedures. Также они научились легко отслеживать входные параметры, вызывающие различные ошибки на стороне БД. Плох тот программист, кто не мечтает стать архитектором, или Как развиваться, если ты уже Senior Software Engineer Тинькофф Доклад офлайн-дня Несмотря на то, что вопросам обучения уделяют много времени, как правило они касаются тех, кто еще только хочет войти в IT. Александр расскажет про то, как продолжить развиваться, если ты уже Senior. Какие карьерные пути бывают, как проще всего идти по ним и главное, как сохранять мотивацию на саморазвитие. Вы узнаете, какой подход спикер выработал для себя и почему считает, что он работает. Комментарий Алексея Мерсона: «Это интересная тема, потому что про неё мало информации. Люди зачастую упираются в "стеклянный потолок": вот я сеньор, а что дальше? Дорожка в тимлиды понятная и расписанная, а про архитекторов говорят куда меньше, и Александр это исправит».А для тех, кто ещё не дошёл до вопроса «как развиваться сеньору», будет и сессия «Как стать сеньором» — этот вопрос Александр обсудит с Андреем Парамоновым и Антоном Оникийчуком. А помимо обычных докладов, будет ещё и «главная студия» с более разговорными форматами: круглыми столами, интервью и тому подобными. Её программа продолжает дорабатываться, но уже известны такие пункты: Интервью со Станиславом Сидристым «Страх и ненависть в open source» «Откуда что взялось в C#» «За техническими кулисами конференции» Чуть-чуть позже в программу ещё будут внесены последние дополнения, их можно будет увидеть на сайте. Но уже сейчас, как можно видеть, всё довольно разнообразно: наверное, среди такого набора каждый дотнетчик найдёт какие-то актуальные для него доклады. Если и вы тоже нашли — будем рады видеть и 16-17 июня в онлайне, и 27-го в Петербурге! Расписание, остальные подробности и билеты — на сайте.  Редактор