Расскажите о вашем основном профессиональном опыте и технологическом стеке.

Ответ

Основной опыт — full-stack разработка на платформе .NET. Работал над различными типами приложений:

Бэкенд и сервисы:

  • ASP.NET Core Web API / MVC: Разработка RESTful API, микросервисной архитектуры.
  • Работа с данными: Entity Framework Core (Code First/Database First), Dapper, SQL Server, PostgreSQL, кэширование (Redis).
  • Асинхронность и многопоточность: Широкое использование async/await, Task Parallel Library (TPL), конкурентные коллекции.

Пример асинхронного обработчика запроса:

[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    private readonly IProductRepository _repository;
    private readonly ILogger<ProductsController> _logger;

    public ProductsController(IProductRepository repository, ILogger<ProductsController> logger)
    {
        _repository = repository;
        _logger = logger;
    }

    [HttpGet]
    public async Task<ActionResult<IEnumerable<ProductDto>>> GetProducts([FromQuery] ProductQueryParameters query)
    {
        _logger.LogInformation("Fetching products with query {@Query}", query);
        var products = await _repository.GetFilteredAsync(query);
        return Ok(products.Select(p => p.ToDto()));
    }
}

Фронтенд и десктоп:

  • SPA: Разработка клиентских приложений с использованием Blazor или взаимодействие с отдельными фронтенд-фреймворками (React/Angular) через API.
  • Десктоп: Опыт с WPF (MVVM) и WinForms для legacy-приложений.

Инфраструктура и процессы:

  • CI/CD: Настройка пайплайнов в GitLab CI/CD, GitHub Actions, Azure DevOps.
  • Тестирование: Покрытие кода модульными (xUnit/NUnit) и интеграционными тестами, использование Moq для мокинга зависимостей.
  • Принципы и паттерны: SOLID, Dependency Injection, паттерны Repository, Unit of Work, CQRS.

Ответ 18+ 🔞

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

Начнём с задней части, с бэкенда, там где вся магия происходит, а не эти ваши кнопочки мигают.

  • ASP.NET Core Web API / MVC: Делал эти ваши RESTful API, чтобы фронтендеры потом могли к ним пристраиваться. Пилил микросервисы, пока не понял, что половину из них можно было бы и в одном месте оставить, но архитектор сказал «надо» — пришлось пилить.
  • Работа с данными: Ну, Entity Framework Core, само собой. То Code First, то Database First — как заказчик даст. Когда EF начинает тупить и генерить запросы, от которых SQL Server плачет, беру Dapper и делаю всё вручную, как взрослый. Базы — в основном SQL Server, но и PostgreSQL тоже трогал. А ещё Redis, чтобы не ходить каждый раз в базу за тем, что и так не меняется.
  • Асинхронность и многопоточность: Ну а куда без неё сейчас? async/await везде, где только можно, чтобы приложение не висло, пока чат GPT рисует котика. TPL, конкурентные коллекции — вся эта хуйня, чтобы всё летало и не ломалось, когда пользователей больше трёх.

Вот, смотри, пример кода, как я обычно делаю. Блоки кода не трогаю, они святые.

[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    private readonly IProductRepository _repository;
    private readonly ILogger<ProductsController> _logger;

    public ProductsController(IProductRepository repository, ILogger<ProductsController> logger)
    {
        _repository = repository;
        _logger = logger;
    }

    [HttpGet]
    public async Task<ActionResult<IEnumerable<ProductDto>>> GetProducts([FromQuery] ProductQueryParameters query)
    {
        _logger.LogInformation("Fetching products with query {@Query}", query);
        var products = await _repository.GetFilteredAsync(query);
        return Ok(products.Select(p => p.ToDto()));
    }
}

Видишь? Всё асинхронно, логирование на месте, зависимость через конструктор — красота, SOLID, мать его.

А ещё есть фронтенд, эта... лицевая часть.

  • SPA: Делал на Blazor — прикольная технология, C# везде, можно не прыгать между языками. Иногда приходилось стыковаться с отдельными React или Angular, но это уже просто API под них пилишь и всё.
  • Десктоп: WPF по паттерну MVVM — это когда ты полдня настраиваешь привязку данных, зато потом оно само работает. Ну и WinForms, конечно, для поддержки старого говна, которое ещё работает, но все боятся к нему прикасаться.

Ну и куда же без всей этой инфраструктурной ерунды, без которой сейчас ни один проект не живёт.

  • CI/CD: Настраивал эти пайплайны в GitLab CI/CD, GitHub Actions, Azure DevOps. Иногда кажется, что проще написать само приложение, чем заставить эту штуку правильно собираться и деплоиться.
  • Тестирование: Пишу тесты, конечно. xUnit, NUnit. Интеграционные тесты, которые поднимают целую базу. Moq для мокинга — потому что не будешь же ты ради одного юнит-теста реальную почту всем клиентам слать.
  • Принципы и паттерны: SOLID пытаюсь соблюдать, Dependency Injection использую, как все. Repository, Unit of Work, CQRS — все эти умные слова применял на практике. Иногда помогает, иногда просто добавляет кода, но зато красиво звучит на совещаниях.

Вот такой вот опыт, как-то так. Вроде ничего не забыл.