.NET epeshk blog


Channel's geo and language: Russia, Russian
Category: Technologies


Канал с заметками о C# и .NET
Поддержать канал: https://t.me/blog_donate/2
Обратная связь: https://forms.gle/3uRz7FmzUA26Kw4y5

Related channels  |  Similar channels

Channel's geo and language
Russia, Russian
Statistics
Posts filter


На какие доклады я пойду на DotNext 2026. Обзор программы

В этом году конференция почти на треть состоит из AI: только в одном слоте (1 день 15:30) нет докладов про него. Не мы такие, жизнь такая. В 2023 году в программе был только 1 доклад о AI, в 2024 и 2025 — 2, а в этом году сразу 8

Увы, эти доклады не выглядят уникальными. Сразу после кейноута "Как меняется индустрия разработки под влиянием AI" следует доклад "Как меняется разработка в эпоху agentic development lifecycle", а продолжает его "Как закрывать весь SDLC с помощью агента" от спикера из той же компании, что и в предыдущем докладе

Наверняка отличия есть, но из названий их не понять. Для меня "индустрия разработки" ~ "разработка", а "agentic development lifecycle" ~ "SDLC с помощью агента". Т.е. все три названия в сущности одно и то же. Презентаций у этих докладов пока нет, пока сделаю вывод, что отличаются они спикерами

Одновременно с этим из программы полностью исчез HR. В 23 был поиск талантов в .NET, и система ревью с промокодами и комиссарами, в 24 развитие в IT, и обучение взрослых людей, и систем дизайн интервью, в 25 — рост специалистов внутри компании. Мне интересно, программный комитет счёл эту тему устаревшей и неактуальной, или ни одной заявки в категории не поступило

Далее разберу каждый слот программы, и расскажу, куда собираюсь пойти лично

==== ДЕНЬ 1 ====

25.09 12:00. В этом слоте выбор между ИИ-командами (Дмитрий Иванов), шардированием БД (Иван Дедов), и SIMD микрооптимизациями (Кирилл Панин). Мне нравится тема про SIMD, но вынужден признать, векторизация циклов это идеальная задача для нейросетей. Пока не определился, на доклад о ИИ ради спикера, или на доклад о SIMD

25.09 14:00. Сравнение C# JIT и Go AOT (Дмитрий Егоров), SDLC с помощью агента (Павел Федотовский), и Outbox (Виталий Сушков). Сложный слот. Доклад о сравнении с Go я слушал уже дважды, и возможно загляну чтобы увидеть финальную итерацию. Доклад про Outbox продолжение серии 2024, 2025 годов, надо вначале послушать их. На AI SDLC не пойду

25.09 15:30. DDD (Денис Цвецких), трассировки (Николай Савенко), своя IDE (Алексей Шестаков, Данил Арендарский). Я пойду на доклад о кастомной IDE, потому что мне нравится безумие. От создателей промокодов и коммисаров. Запасной вариант — трассировки, хоть радикально нового в них и не появлялось уже 7 лет

25.09 17:00. Домашняя ИИ лаборатория на 700 GB памяти (Андрей Зорин), и IDE vNext (4 спикера). У меня нет денег на 700 GB памяти, поэтому послушаю про IDE, в этот раз уже 4.0

==== ДЕНЬ 2 ====

26.09 11:00 ИИ-автоматизации (Дмитрий Нестерук), Extension Members (Виктор Дзицкий), интеграционные тесты с БД (Сергей Булавский). Пока не выбрал между первыми двумя докладами, ради спикеров. Дмитрия Нестерука всегда интересно послушать, а у Виктора Дзицкого — дебют на дотнексте

26.09 12:30 Architecture as a Code (Руслан Сафин), C# 15 Discriminated Unions (Марк Шевченко), Microsoft Agent Framework (Дмитрий Афонченко). Discriminated Unions, которые почему-то перевели как Размеченные объединения. Всё-таки мы на дотнет конференции

26.09 14:30 Модульность без микросервисов (Станислав Выщепан), Native AOT vs JIT в .NET 10 (Юрий Малич), RAG (Кирилл Сухоруких). Здесь очевидно — на доклад о NativeAOT от Юрия Малича. Есть нюанс: я сам рассказывал об AOT, в 2024 году был доклад Андрея Порожнякова об AOT, и если всё время находится новый контент о нём, значит цель разработчиков рантайма сделать прозрачное переключение JIT/AOT провалена

26.09 16:00 Полнотекстсовый поиск в постгре (Алексей Фадеев), ИИ (Светлана Мелешкина), TDD (Александр Шинкарев). Полнотекстовый поиск в постгре

За пределами поста остались кейноуты и воркшопы. В кейноутах выбора нет, а до воркшопов я никогда не добирался

@epeshkblog




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

Не терпится узнать, как в Контуре делали свою IDE для дотнета. Доклад о ней как раз там будет. Безумцы ёбаные, в хорошем смысле

Приходите на дотнекст вобщем, буду рад увидеться и пообщаться

1.8k 0 19 24 47

Forward from: DotNext — конференция для .NET‑разработчиков
#видеозаписи

До нового DotNext осталось совсем немного, а по дороге на конференцию — можно пересмотреть любимые доклады прошлого года. Сегодня мы открыли полный плейлист DotNext 2025.

😉 YouTube | 📺 VK Видео


.NET и Владимир: отличный повод совместить митап и выходные в городе с историей

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

В программе доклады от разработчиков Altenar и Рови Тех (часть Т-Банка):
— Async/await — асинхронность, которую можно читать.
— Как не терять данные при асинхронной интеграции программных систем.
— EF Core + PostgreSQL: за рамками CRUD.


Кстати, ещё на митапе запланированы активности для программистов: адаптации известных игр ("Сапер", "Крестики-нолики", "Гонки"), где для победы понадобится понимание математики и вероятностей.

Участие бесплатное, а ещё можно сэкономить на проезде — организаторы разыграют несколько билетов на "Ласточку" среди участников.

Для участия в розыгрыше:
1. Зарегистрируйтесь на митап.
2. Напишите «Хочу на .NET-митап на Ласточке» на почту aleksei.korneev@altenar.com с почты, указанной при регистрации.

Итоги розыгрыша подведём 14 сентября.


Регистрируйтесь, планируйте поездку и до встречи во Владимире!


LLM оказались упорнее людей

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

Задача не поддавалась людям 87 лет, и представляет собой классический пример гипотезы, доказательство которой (если она верна) займёт сотни страниц, а для опровержения достаточно лишь привести пример, когда условия не выполняются. Аналогичное свойство есть у Великой теоремы Ферма и Теореме о четырех красках, которые, в отличие от гипотезы о якобиане, оказались верны и были доказаны.

Здесь можно сказать что человеческий вклад в опровержение гипотезы тоже был, но он был минимальным — результат сразу воспроизвели простыми вопросами к другим LLM. Нейросети также самостоятельно обобщили результат для построения бесконечного множества контрпримеров. Т.е. нейросеть действительно создала новое знание, которого раньше не было ни в обучающей выборке, ни вообще где либо среди человеческих достижений.

Гипотеза о якобиане не такая и важная, не входит в проблемы тысячелетия, за неё не назначена награда, и максимум выгоды, который можно из неё извлечь это строчка с именем в википедии. Но в пятницу ИИ смог решить другую задачу с огромной наградой в $100млн, которая годами ускользала от людей

Как LLM добыла $100млн

Оказалось, что один известный холодный криптокошелек 5 лет содержал баг, приводящий к использованию софтверного псевдорандома вместо рандома с security chip. Этот кошелек рекламировался как ultra-secure, with verifiable open-source firmware, и на нём написано: "Don't trust. Verify." Кошелёк был призван удовлетворить потребности самых параноидальных пользователей: коммуникация с компьютером происходила через сканирование QR-кодов, а для питания использовалась батарейка Крона, чтобы исключить side-channel атаку по флуктуациям потребления тока

В коде содержалась строка
#define MICROPY_HW_ENABLE_RNG (0)
отключающая честный рандом

Рядом был и assert:

#ifndef MICROPY_HW_ENABLE_RNG
#error "get a HW TRNG plz"
#endif

Но он некорректный: #ifndef проверяет, что константа не определена, но она определена — в 0. В итоге ассерт не срабатывал, а код компилировался с низкокачественным рандомом, который снижал секретность приватных ключей с 2^128 до 2^40 (по некоторым оценкам и до 2^32)

В итоге кто-то добыл крипты на $100млн, оставив пользователей этих кошельков ни с чем. Баг оставался незамеченным 5 лет. Кошельки были опустошены максимально заметно, без попыток хоть как-то замести следы и скрыть украденный баланс, из чего можно сделать вывод, что код для массового перевода написала нейросеть, не вникая в смысл происходящего (здесь отмечу, мы не знаем точно, нашла ли баг нейросеть, но глупая реализация атаки явно намекает на это)

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

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

Человеческая сущность боится зря потраченного времени, боится потерпеть поражение, и предпочитает верить предыдущим исследователям вместо собственных попыток. А у нейронок нет ни подобных комплексов, ни сожаления о зря потраченном времени и токенах (за них нейронкам все равно заплатят, даже если получится слоп, в отличие от мясных)

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

@epeshkblog


Расскажите кто каким антикапча решением пользуется? Надоело прокликивать велосипеды, пешеходные переходы, собирать паззлы. Нужен плагин для браузера с ИИ, в который можно закинуть $10 и забыть о капчах как о страшном сне


💬 Комментарии в коде

Мне никогда не нравился откомментированный код.

Комментирование каждой строки сразу выдаёт начинающего программиста. А те комментарии, которые при написании были уместными все равно устаревают — код изменяется, комментарии обновить забывают, человеческий фактор. Лучший вариант, для компилируемых языков, self-explanatory код

Однажды не смог сделать оптимизацию в РеШарпере из-за комментария. Исправление предполагало переписывание логики к которой был написан очень длинный и основателеный комментарий. С одной стороны его стыдно удалить, а с другой — лень переписывать.

С переходом на AI программирование комментарии стали бесить вдвойне! Первые LLM комментировали каждую строку, словно только вчера начали программировать (так оно впрочем и было). Самые тупые и маленькие LLM стали уклоняться от написания кода через комментарии. Писали // TODO вместо реализации. Комменты стали признаком низкокачественного слопа

Приходилось говорить в промпте не писать комментарии, и упорно вычищать всё же написанные.

И оказалось зря. Если поддерживать код будет тоже агент — пусть пишет комменты. Для LLM куда меньше разницы между кодом и текстом комментариев, т.к. она видит токены. И комменты становятся дополнительным контекстом, с помощью которого нейронка сможет вспомнить бизнес-логику проекта, без полного повторного погружения в код. Вопрос с актуализацией комментариев тоже отпадает — нейросети подходят к этому ответственнее (они следуют алгоритму — поменял код, пройдись по референсам и актуализируй их, человек же — поменял код, скорей на прод)

Нейрокомментированный код конечно же неэстетичный. Но предназначен ли нейрокод для чтения и редактирования людьми?

@epeshkblog

2.9k 0 14 46 73

Бежать со всех ног, чтобы только оставаться на месте

Именно это придётся делать дотнету для выживания в мире Mythos-level моделей, которые могут всё переписать

В этом посте разберём, что нейронки могут улучшить в .NET.

Критерии отбора задач:
- очевидна полезность
- гарантированно существует решение
- требует больших трудозатрат для реализации

1. Сделать кросскомпиляцию для NativeAOT. Сейчас фактически нужно компилировать код под каждую платформу отдельно. Хочу на Windows x64 компилировать под Macbook M5 Max, а на макбуке — под легаси Windows x64

2. Pauseless GC. Сейчас GC в .NET имеет неустранимые stop-the-world паузы, которые могут длиться неограниченное время. Нейронки могут вдохновиться Java и реализовать алгоритмы сборки мусора с гарантированным временем паузы

3. JIT-оптимизации по анроллингу циклов. Вот пример, где Java в 2 раза быстрее за счёт анроллинга

4. Const generics. Возможность использовать константу как generic-параметр. Array arrayOfThreeInts. Прототип фичи уже реализован, но заброшен с аргументацией, что нужны ресурсы

5. Green Threads. Уже были реализованы вручную, в итоге реализация оказалась неудачной, и была отвергнута в пользу Runtime Async. Имеет смысл сделать второй заход

6. Улучшение дебаг инструментов. Например, миграция PerfView на AvaloniaUI/Blazor. Должна быть возможность анализировать dotnet trace без использования Windows и без конвертации в флеймграфы для браузера

7. Нативная поддержка int128/int256 констант в языке C# (сейчас тип есть, а константу задать нельзя, только через Int128.Parse("..."))

8. llvm backend для NativeAOT, включающийся одним параметром --llvm

9. Переписать dotnet runtime с C++ на Rust

10. Оптимизировать все методы ToString / TryFormat. Например, DateTime имеет оптимизированный путь для форматов O/R/S и неэффективный для форматной строки

@epeshkblog

3.4k 0 19 146 68

Claude Fable 5 написал GC для .NET на C#

Если точнее, модель довела до ума проект по написанию managed GC от Kevin Gosse. На некоторых бенчмарках, AI сгенерированный нейронкой GC не уступает в производительности оригинальному

neuecc с помощью Fable 5 ускорил WriteInt в MessagePack. Вместо того, чтобы просить AI ускорить код и make no mistakes применили итеративный подход. В промпт загружались C# исходник и его disassembly после JIT-компиляции + результаты бенчмарков. Модель анализировала ассемблерные инструкции и шаг за шагом подгоняла исходный C# код. Результат — ускорение в 4 раза

Anthropic купили bun — Javascript рантайм, на котором работает Claude Code. Сразу после покупки Fable 5 переписал bun с Zig на Rust за 11 дней, потратив на это $165K токенов

====

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

Языку Zig не повезло. ИИ просто исключил его из цепочки, отдав предпочтение более надежному Rust. Похожая участь досталась C# NativeAOT, когда порт компилятора TypeScript сделали на Go.

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

@epeshkblog


Главное, не списывать точь-в-точь, чтоб не спалили




Возвращаемся к теме многопоточности




Нарратив про AI bubble, который вот-вот взорвётся почти полностью исчез


C# показал рекордный рост популярности (+2.39%) в индексе TIOBE

а Go за год опустился с 7 позиции до 16

Реальность:
- C# в индексе восстановился до уровня 2024 года в 7.4 после просадки до 4.2 в прошлом году
- индекс TIOBE основан на статистике поисковых запросов, и показывает что шарписты до сих пор пользуются гуглом, а гошники сразу спрашивают чат гпт

Методология TIOBE абсурдная изначально, т.к. показывает социальный интерес к языкам, а не то, на чём реально программируют, а после появления LLM полностью некорректна.

Другие рейтинги языков программирования тоже необъективны, но всё же лучше, они в отличие от TIOBE хотя бы видят TypeScript

Рейтинг от GitHub, с bias в опенсорсный код

Рейтинг от Jetbrains, с bias к пользователям Jetbrains IDE

Рейтинг от StackOverflow, с bias к пользователям StackOverflow (который тоже заменяют LLM)

@epeshkblog


Снова про Windows 11

Вчера наконец-то поставил Windows 10 вместо Windows 11.

Недавно вышел пост про планы Microsoft переписать Windows на Rust с помощью AI-агентов в концепции 1 человек, 1 месяц, 1 миллион строк кода. Microsoft выпустили опровержение: переписывания на Rust не будет. Windows перепишут на TypeScript.

Медленная прорисовка webview2-элементов и стала последней каплей. Когда нажимаешь на иконку вайфай, появляется пустое всплывающее окно и только через секунду отрисовываются элементы внутри. Так происходит из-за того, что каждое подобное окно — по сути отдельная вкладка браузера.

Ещё по неизвестной причине перестал работать WSL, т.е. система уже требовала переустановки.

Откатить оказалось проще, чем казалось:
- лицензия при откате сохраняется
- файлы 11 винды бэкапятся в Windows.old. Форматирование диска не обязательно
- большинство программ подхватывают подложенные в AppData\Local, AppData\Roaming настройки
- внезапно, Edge в Windows 10 хоть и основан на Chromium, но работает с дичайшими лагами. Не более 10фпс. В других браузерах проблем нет. Майки смогли сделать то, с чем не справились сотни браузероклепателей-любителей

Почему откатил, а не остался на StartAllBack, OpenShell, ExplorerPatcher:
- Баги. В сторонних утилитах UI-элементы Windows 10 воссозданы с нуля, не всегда работают, отличаются по дизайну и поведению от оригинала. выглядит глупо, когда меню громкости из семёрки, wi-fi из десятки, а батареи — из 11
- Сторонние шеллы исправляют только визуальную часть. webview2 компоненты остаются в системе и продолжают потреблять память зря
- AI-агенты майкрософт продолжают ломать windows 11 в обновлениях, например мгновенно открывающееся Win+R окно заменили на webview2-компонент

====

https://www.youtube.com/watch?v=7VZJO-hOT4c
https://habr.com/ru/news/982546/

На ютубе появился реалистичный тест различных версий винды в одинаковых условиях

Время загрузки:
- Windows XP и 10 загружаются за одинаковое время
- Windows 11 на 20-40 секунд медленнее. Из-за того, что интерфейс системы AI-сгенерирован, при тесте выстрелил баг с долгой прорисовкой таскбара, что и добавило 20 секунд

В Windows 8.1 явно провели работу над оптимизацией потребления места на диске и в RAM. 11-ая версия прибавила гигабайт в RAM относительно 10

Количество вкладок в Chromium браузере:
- Windows 11 оказалась хуже Windows XP, не справившись с открытием 50 вкладок. Полностью соотносится с тем, что я наблюдал на 11 винде вживую
- Windows 8.1 выдерживает 250 вкладок, а 10 — 150. Что все равно гораздо лучше 11

Тесты по скорости загрузки программ — Windows 11 снова оказалась медленнее всех

====

Имхо, использование Windows 11 это расчеловечивающая пытка, и надо откатываться на 10, и ждать 12 или переходить на мак.

Скорее всего webslop это будущее всех ОС. Живых людей с компетенциями в разработке нативного UI почти не осталось, рыночек порешал, и подобную работу найти невозможно в отличие от веба, да и платят на ней меньше. Хоть навык и уникальный, сотрудника можно пугать сложностями поиска работы, и дешевизной переписывания на web.

LLM отлично справляются с React, Typescript, и Python, что эти языки вытесняют остальные. Когда только вышел ChatGPT я ожидал, что статическая типизация будет помогать валидировать результаты AI-генерации. Так вот, ни-хре-на. Для типизированного кода нужна умная LLM, которая может удерживать в контексте одновременно бизнес-логику и типы, а не подписка за $20 в месяц

Web проник даже в консольные утилиты. Claude Code написан с использованием ink — либы, позволяющей рендерить реакт компоненты прямо в терминале. В итоге бинарник тонкого клиента, отправляющего запросы в LLM на сервер весит 208 МБ!!!

3.5k 0 74 93 74

IAsyncEnumerator и его использование вручную

Енумераторы в дотнете можно использовать двумя способами: через foreach, и вручную, через MoveNext/Dispose. Второй способ часто приводит к багам.

В этом методе разработчик пытался реализовать обёртку для IAsyncEnumerable, которая распараллеливает обработку текущего элемента последовательности и получение следующего:

public static async IAsyncEnumerable Prefetch(
this IAsyncEnumerable source) {
await using var enumerator = source.GetAsyncEnumerator();
var nextTask = enumerator.MoveNextAsync();

while (await nextTask) {
var current = enumerator.Current;
nextTask = enumerator.MoveNextAsync(); // запускаем MoveNext перед возвратом управления в вызывающий код

yield return current;
}
}

// USAGE //

var sw = Stopwatch.StartNew();

await foreach (var x in En())
await Task.Delay(100);
Console.WriteLine("Without prefetch: " + sw.ElapsedMilliseconds); // 700

sw.Restart();
await foreach (var x in En().Prefetch())
await Task.Delay(100);
Console.WriteLine("With prefetch: " + sw.ElapsedMilliseconds); // 400

async IAsyncEnumerable En()
{
await Task.Delay(100);
yield return 1;
await Task.Delay(100);
yield return 2;
await Task.Delay(100);
yield return 3;
await Task.Delay(100);
}


Однако, такой код сломается, если внутри await foreach сделать break:
await foreach (var x in En().Prefetch())
break;

Unhandled exception. System.NotSupportedException: Specified method is not supported.
at Program.g__En|0_0()+System.IAsyncDisposable.DisposeAsync()
at Extensions.Prefetch[T](IAsyncEnumerable`1 source)+MoveNext()

Ошибка возникает потому что у `IAsyncEnumerator` нельзя одновременно вызывать `MoveNextAsync` и `DisposeAsync`. А в реализации Prefetch так и происходит — после break сразу вызывается DisposeAsync (из-за await using) для переменной enumerator, при наличии незавершенного nextTask

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

Исправить можно явно дожидаясь nextTask перед enumerator.DisposeAsync(). При этом нужно учесть, что ValueTask можно await-ить только один раз:

public static async IAsyncEnumerable Prefetch(this IAsyncEnumerable source)
{
await using var enumerator = source.GetAsyncEnumerator();
var nextTask = enumerator.MoveNextAsync();

try {
while (true) {
var nextTaskResult = await nextTask;
nextTask = default; // предотвращаем повторный await ValueTask
if (!nextTaskResult)
yield break;

var current = enumerator.Current;
nextTask = enumerator.MoveNextAsync();

yield return current;
}
}
finally {
if (nextTask != default)
await nextTask;
}
}

Такое исправление решает эту проблему — теперь MoveNextAsync и DisposeAsync вызываются последовательно, и ошибки не возникает.

@epeshkblog


🙈 Goodbye, Windows 11!

Наконец-то я смог открыть ноут и установить в него второй SSD. Мучения с Windows 11 скоро закончатся.

Пользоваться Windows 11 стало невозможно. Постоянные утечки памяти, фризы, чёрные экраны. Куча бесполезных жрущих память процессов: Antimalware (MsMpEng), StartMenuExperienceHost, PhoneExperienceHost (я вообще не подключаю телефон к ноуту, какой phone experience, a), msedgewebview2 (они переписали интерфейс системы на TypeScript)

Помогите выбрать, что установить. Windows 10 LTSC, Ubuntu, Mint, CachyOS? Или какой-то другой дистрибутив? Как вариант наверное поставить линукс на второй SSD, перенести данные на него, дальше на первый диск переустановить на 10-ую винду


Перегрузка операторов

С новыми extension-методами наконец-то появилась перегрузка операторов для сторонних типов:

static class Extensions {
extension(IEnumerable) {
public static IEnumerable operator +(IEnumerable a, IEnumerable b)
=> a.Concat(b);
}

extension(T[]) {
public static T[] operator +(T[] a, T[] b)
=> a.Concat(b).ToArray();
}
}

Выглядит синтаксис с extension(TypeName) максимально странно, зато extension-ы наконец-то избавились от странных ограничений старого синтаксиса с this

@epeshkblog

20 last posts shown.