Какой стек используешь

«Какой стек используешь» — вопрос из категории Софт-скиллы, который задают на 28% собеседований C# Разработчик. Ниже — развёрнутый пример ответа, который можно адаптировать под свой опыт.

Ответ

Мой основной стек — это бэкенд-разработка на .NET (C#) с фокусом на создание масштабируемых и поддерживаемых веб-API и сервисов.

Бэкенд:

  • Платформа: .NET 8+ (ранее .NET Core).
  • Веб-фреймворк: ASP.NET Core (для REST API, gRPC, SignalR).
  • ORM/Работа с данными: Entity Framework Core (для реляционных БД) + Dapper для высоконагруженных операций.
  • Архитектура: Чистая архитектура (Clean Architecture), CQRS/MediatR, Domain-Driven Design (где уместно).

Базы данных и кэширование:

  • Реляционные: PostgreSQL (предпочтительно), SQL Server.
  • Документная БД: MongoDB (для специфичных сценариев).
  • Кэширование: Redis (для сессий, кэша данных, распределенных блокировок).

Фронтенд (если требуется full-stack участие):

  • TypeScript как основной язык.
  • React с современным стэком (Hooks, Zustand/Redux Toolkit, React Query).
  • Для внутренних админ-панелей иногда использую Blazor WASM.

Инфраструктура и DevOps:

  • Контейнеризация: Docker, Docker Compose.
  • Оркестрация: Kubernetes (базовый опыт), чаще управляемые сервисы (Azure Kubernetes Service, AWS EKS).
  • Облака: Azure (App Services, Functions, Service Bus, Cosmos DB) или AWS (EC2, S3, SQS).
  • CI/CD: GitHub Actions, GitLab CI, Azure DevOps Pipelines.
  • Мониторинг и логи: Seq, ELK Stack (Elasticsearch, Logstash, Kibana), Application Insights.

Пример типичного слоя контроллера в моем проекте:

[ApiController]
[Route("api/v1/[controller]")]
[Authorize]
public class ProductsController : ControllerBase
{
    private readonly IMediator _mediator;

    public ProductsController(IMediator mediator)
    {
        _mediator = mediator;
    }

    [HttpGet]
    [ProducesResponseType(typeof(PagedList<ProductDto>), StatusCodes.Status200OK)]
    public async Task<IActionResult> GetProducts([FromQuery] GetProductsQuery query)
    {
        // Использование паттерна CQRS через MediatR
        var result = await _mediator.Send(query);
        return Ok(result);
    }

    [HttpPost]
    [ProducesResponseType(StatusCodes.Status201Created)]
    public async Task<IActionResult> CreateProduct([FromBody] CreateProductCommand command)
    {
        var productId = await _mediator.Send(command);
        return CreatedAtAction(nameof(GetProduct), new { id = productId }, null);
    }
}

Инструменты: Git (GitFlow/Trunk-Based), Visual Studio / Rider, Postman, Swagger/OpenAPI.