Обновить
53.72

C# *

Объектно-ориентированный язык программирования

Сначала показывать
Порог рейтинга
Уровень сложности

Надежный код: как писать тесты, чтобы запускать фичи в продакшен одним днем

Уровень сложностиСредний
Время на прочтение15 мин
Охват и читатели4.7K

Писать или не писать тесты — выбор очевидный. Конечно, писать. Но если проект масштабный, одних unit‑тестов будет недостаточно: они бессильны на границах модулей, в интеграциях и пользовательских сценариях, а значит в этих местах будут пролезать баги. Такой код будет сложно поддерживать, вносить в него изменения и получать ожидаемый результат.

В статье поговорим про разные стратегии тестирования под разные риски и кейсы. Поднимемся над привычными unit‑тестами и заглянем, что там есть еще. Спойлер: а еще там workflow‑, integration‑, property‑based‑ и resilience‑тесты.

Читать далее

Новости

OWASP Top 10 2025 — от кода к цепочке поставок: расширение границ безопасности

Уровень сложностиСредний
Время на прочтение24 мин
Охват и читатели8.9K

Разбираем изменения в OWASP Top 10 версии 2025 года на примерах и рассматриваем, как SAST может помочь избежать уязвимостей.

Читать далее

Грейд по коду, а не по трудовой: гибридный анализ репозиториев с помощью GraphCodeBERT и метрик

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели6.6K

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

Заваривайте чай и готовьтесь к погружению: сейчас мы будем препарировать код метриками, эмбеддингами и суровой статистикой

Читать далее

Собрать данные с автосимулятора: как Assetto Corsa стала живым датасетом

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели7.6K

229 заездов, 140 пилотов, 28 часов работы — столько данных мы собрали из Assetto Corsa за три дня SOC Forum 2025.

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

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

Читать далее

Практический подход к миграции большой базы C# кода на async

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели5.7K

Итак, Вам не повезло, Вы – техлид (тимлид, главный инженер etc) большого и старого проекта на C#, который был написан в доисторические времена, когда async еще не завезли. Проект старый и большой, но живой и развивается. Может быть даже, что проект использует современный .NET, современную версию C#, но вот незадача – не использует async, а очень бы хотелось.

 Как осуществить такой рефакторинг и какие трудности ожидают на этом пути?

Читать далее

Визуализация задачи Дирихле для уравнения Лапласа/Пуассона в прямоугольнике

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели9K

Программа визуализирует решение и промежуточные результаты задачи Дирихле для уравнения Лапласа/Пуассона в прямоугольнике на CPU и GPU.

Уравнение Пуассона(при f=0 уравнение Лапласа) :

\frac{\partial ^{2}}{\partial x}u + \frac{\partial ^{2}}{\partial y}u = -f

Задача Дирихле(краевые условия 1-го рода) - заданы значения u на границе области(в данном случае в прямоугольнике).

Результаты визуализируются при помощи тепловой карты(HeatMap). Используются цвета и оттенки синего, сине-зелёного(циан), зеленого, желтого и красного цветов(от меньшего к большему значению).

Читать далее

Самый тупой способ повышения производительности

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели13K

Введение

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

Читать далее

Написал ИИ-оверлей для прохождения собеседований

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели7K

Написал ИИ-оверлей для прохождения собеседований

Я — .NET-разработчик, и уже некоторое время прохожу собеседования. Иногда на них задают вопросы про такие «пыльные уголки» .NET, что если я и читал про них, то лишь в самом начале своего пути, листая книги Рихтера, Троелсена и Шилдта.

А ещё встречаются откровенно странные задачи, далёкие от реальной работы.

Зачем всё это? Очевидно, чтобы отсечь новичков из онлайн-курсов и тех, кто «вкатился» в IT без должной подготовки.

Ну а раз на собеседовании всё изначально настроено так сказать «враждебно», и интервьюер подозревает, что каждый мухлюет… почему бы действительно не начать мухлевать?

Читать далее

Merge для IAsyncEnumerable<T>

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели7.7K

В рамках одного из обсуждении с чатах я предложил использовать функцию Merge для  IAsyncEnumerable<T>, чтобы объединить результаты чтения однотипных данных из разных источников. Но когда попытался сделать пример оказалось что такой функции в System.Linq.Async нет. Есть аналог в Reactive Extensions, но тащить библиотеку для одного примера не захотел и решил написать сам.

Читать далее

Unity, Roslyn и code analysis. Прикладная задача визуализации графа состояний

Уровень сложностиСредний
Время на прочтение24 мин
Охват и читатели8.5K

В команде, большая часть серверных фич пишется с помощью стейт машин.
Стейт машина позволяет выразить окружающее состояние и то как с объектом можно взаимодействовать предельно конкретно. Хорошо составленный стейт граф позволяют понять как работает фича без глубокого погружения в код. При прохождении code review большое внимание уделяется составленному графу состояний. Часто возникает потребность в чтение или модификации уже существующего кода. Отсюда возникает потребность в ускорении процесса восстановления контекста или понимании как работает код.

На помощь приходит статический анализ кода.

Привет! Меня зовут Игорь, я занимаюсь разработкой на Unity c 2018 года.
В этой статье расскажу, как с помощью Roslyn можно автоматизировать задачи.

Читать далее

Наш опыт формирования шаблона фоновых сервисов на базе .NET

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели6.5K

Привет, Хабр! На связи снова разработчик из компании АльфаСтрахование. Наша скрам-команда занимается автоматизацией бизнес-процессов Операционного блока, и для решения многих задач нам часто требуются фоновые операции. В этой статье я расскажу о шаблоне фонового сервиса на .NET, который мы используем в своей работе

Читать далее

Вероятности и .NET: сравниваем библиотечные решения для оценки спортивных событий и не только

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели6.7K

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

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

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

Читать далее

Композиция в архитектуре тестов на примере Playwright + C#

Уровень сложностиСредний
Время на прочтение22 мин
Охват и читатели5.4K

Привет! Я Миша Симонов. Работаю в Контуре ведущим специалистом по тестированию и являюсь техлидом по автоматизации тестирования кластера из 18 команд.

Когда говорят про архитектуру UI-тестов на Selenium или Playwright, то ограничиваются объяснением паттерна Page Object Model. Но достаточно ли только знания POM в современном мире программирования?

В этой статье я постараюсь мягко провести вас от классического Page Object Model к архитектуре, основанной на композиции и Dependency Injection. Я убеждён, что написание тестов — это такое же программирование, как и разработка фич. Здесь нужны те же современные практики: DI, чистая архитектура, композиция, SOLID — всё, что делает код гибким и живучим.

Потому предлагаю рассмотреть значимые части архитектуры тестов и разобраться в том, что за зверь такой — композиция — и как его приготовить. А готовить мы будем на NUnit, Playwright на C# и Microsoft.DependencyInjection. 👨‍🍳

Читать далее

Ближайшие события

System.Threading.Channels: адекватные lock-free очереди для producer/consumer

Уровень сложностиПростой
Время на прочтение7 мин
Охват и читатели6.5K

BlockingCollection<T> долгое время был стандартом для producer/consumer в .NET. Он работает, но построен на блокирующих примитивах — когда очередь пуста, читающий поток висит на Monitor.Wait(). В мире async/await это антипаттерн: заблокированный поток — потраченный ресурс.

System.Threading.Channels грамотно решил эту проблему. Lock-free структуры данных, async API, контроль backpressure, интеграция с пайплайнами обработки данных. Это не замена BlockingCollection — это просто другой уровень.

Разберём, как Channels устроены, когда их использовать, и какие паттерны они открывают.

Читать далее

GreatEasyCert или как реализовать контейнер ключа по ГОСТу

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели7.6K

Привет, Хабр! Меня зовут Гоша, я старший инженер-программист в Контуре. Практически любой сценарий ЭДО связан с использованием криптографии, будь то ЭДО с государством или контрагентами: где-то нужно подписать документы, где-то зашифровать архив с отчётом, где-то проверить подпись документа от контрагента. Каждый из таких сценариев хочется тестировать не на реальных данных, но на наиболее похожих в реальности. Помимо самих данных нам нужны сертификаты, имитирующие сертификаты участников ЭДО: организаций, физлиц, государственных органов. Ранее для генерации тестовых сертификатов мы использовали сервис на базе ПАК УЦ, проприетарной штуки, выпускающей сертификаты по определённым правилам, не позволяя издеваться над сроками действия серта как хочется.

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

Читать далее

Оптимизация рендера 2D-персонажей в MonoGame: Прагматичный подход слоёв и инстансинга

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели6.4K

Теги: #monogame #gamedev #оптимизация #csharp #графика #индиразработка

Введение: Проблема падающих FPS и желание красоты

Каждый разработчик 2D-игр, мечтающий о живом, населённом мире, рано или поздно упирается в суровую реальность: рендеринг множества уникальных анимированных персонажей — это дорого. Хочется дать игроку кастомизацию, смену снаряжения, разнообразие врагов, но классический подход «нарисовать каждый спрайт отдельно» ведёт к сотням draw calls и падению производительности.

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

Часть 1: Анализ проблемы — почему «в лоб» не работает

Допустим, у персонажа 10 слоёв: тело, голова, ноги, броня, шлем, оружие в каждой руке и т.д. Если рендерить каждый слой отдельным вызовом SpriteBatch.Draw(), для 50 NPC мы получим 50 × 10 = 500 draw calls. При целевом значении в 60 FPS у нас есть всего ~16.6 мс на кадр. Если один draw call занимает ~0.1 мс, только на отрисовку персонажей уйдёт 50 мс — это в три раза больше бюджета!

Ключевой инсайт: Не всем персонажам нужна одинаковая детализация. Фоновому горожанину или стае врагов не требуется динамическая смена снаряжения. А главному герою — требуется.

Часть 2: Гибридная архитектура — 3 уровня детализации

Читать далее

Pattern matching в .NET

Уровень сложностиПростой
Время на прочтение15 мин
Охват и читатели9.9K

Привет, Хабр! Меня зовут Митя, я инженер-программист в Контуре. Во время написания кода анализаторы иногда предлагают заменить привычные конструкции на pattern matching. Однако то, что призвано повысить читаемость, нередко делает код более трудным для восприятия, особенно, если не понимать, во что именно разворачиваются те или иные конструкции. И в один из дней я задался вопросом: а есть ли какие-нибудь подводные камни при использовании pattern matching и во что именно его преобразует компилятор? В этой статье — мои мысли и заметки.

Читать далее

NuGet пакеты, которые ты не ожидал

Уровень сложностиПростой
Время на прочтение9 мин
Охват и читатели11K

Меня зовут Степан, я C# профессионал уже более 7 лет на рынке и рассказываю об этом в Telegram каналe StepOne. В этой статье я покажу вам личную подборку 9ти underground NuGet пакетов. Вы наверняка не встречали их на работе, потому что они либо решают конкретную специальную задачу, либо решают известные задачи нестандартным подходом, либо ещё недостаточно известны на рынке РФ. Мне же удалось затащить их на прод и пощупать в бою!

dotnet nuget add package "StepOne"

Plain text serialization

Уровень сложностиПростой
Время на прочтение2 мин
Охват и читатели7.7K

Я люблю простые костыли.

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

// Name/Value item
public class NVItem {
public string? Name;
public object? Value;
public IEnumerable? SubItems;

public NVItem(string? name, object? value) {
Name = name;
if (value==null) return;
SubItems = value as IEnumerable;
if (SubItems != null) return;

// Упс!
Value = value as string;
if (Value != null) return;

var num = value as IEnumerable;
if (num==null) {
Value = value;
} else {
SubItems = num.Cast<object>().Select(t => new NVItem(null, t));
}
}
}

Читать далее

Запускаем бенчмарки всего с одним C# файлом

Уровень сложностиПростой
Время на прочтение2 мин
Охват и читатели5.2K

Если вы когда-нибудь задумывались, можно ли запустить бенчмарк, используя всего один C#-файл, то ответ: да, можно. Начиная с .NET 10, существует возможность создавать C#-приложения в одном *.cs‑файле. Проблема в том, что BenchmarkDotNet (BDN) не поддерживает такие бенчмарки с настройками по умолчанию. В этой статье я покажу, как обойти это ограничение, используя режим in-process.

Читать далее
1
23 ...