Roadmap: C# и ASP.NET Core для Junior Backend Developer

Пошаговый менторский план обучения от основ синтаксиса до разработки профессиональных API, составленный с учетом актуальных требований рынка [habr.com](https://habr.com/ru/articles/826692/). Курс охватывает архитектуру, базы данных и инструменты развертывания, опираясь на официальную документацию [dotnet.microsoft.com](https://dotnet.microsoft.com/ru-ru/learn/back-end-web-dev).

1. Основы C# и Инструменты: Типы данных, методы и Git

Roadmap: C# и ASP.NET Core для Junior Backend Developer

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

Ниже представлен твой Roadmap — карта, которая приведет тебя от «Hello World» до первого оффера.

Твой путь к Junior Backend Developer

Мы разобьем обучение на 6 логических модулей. Не пытайся выучить всё сразу — двигайся последовательно.

Модуль 1: Основы языка C# и Инструменты

Это фундамент. Без понимания того, как компьютер хранит данные и выполняет команды, далеко не уедешь. * Что учим: Синтаксис C#, переменные, типы данных (Value vs Reference), циклы, методы, массивы. Основы Git (commit, push, pull). Пет-проект: Консольный менеджер расходов (версия 1)*. Приложение, которое спрашивает сумму и категорию траты, а затем выводит отформатированную строку. * Вопросы для собеседования: В чем разница между значимыми и ссылочными типами? Что такое строгая типизация?

Модуль 2: ООП и Архитектура

Переход от написания скриптов к проектированию систем. * Что учим: Классы, объекты, наследование, полиморфизм, инкапсуляция. Интерфейсы и абстрактные классы. Принципы SOLID (базовое понимание). Пет-проект: RPG-битва в консоли*. Создай классы героев и монстров с разными способностями, используя наследование и интерфейсы. * Вопросы для собеседования: Три кита ООП? Зачем нужны интерфейсы? В чем разница между абстрактным классом и интерфейсом?

Модуль 3: Продвинутый C#

Инструменты, которые делают код профессиональным и быстрым. * Что учим: Коллекции (List, Dictionary), LINQ (язык запросов), Generics (обобщения), Асинхронность (async/await), Обработка исключений. Пет-проект: Анализатор текста*. Программа, которая читает большую книгу, считает частоту слов, находит самые длинные слова, используя LINQ и асинхронное чтение файлов. * Вопросы для собеседования: Как работает async/await? Что такое сборщик мусора (Garbage Collector)?

Модуль 4: Базы данных

Бэкенд не существует без данных. * Что учим: Реляционные базы (PostgreSQL), язык SQL (SELECT, JOIN, INSERT). NoSQL (MongoDB). ORM Entity Framework Core. Пет-проект: Учет книг в библиотеке*. Подключи свое консольное приложение к реальной базе данных PostgreSQL. * Вопросы для собеседования: Разница между SQL и NoSQL? Что такое первичный и внешний ключ? Проблема N+1.

Модуль 5: ASP.NET Core (Web API)

Самая важная часть для трудоустройства. Создание веб-сервисов. * Что учим: Архитектура REST, Контроллеры, Dependency Injection (DI), Middleware, Аутентификация (JWT), Swagger. Пет-проект: REST API для сервиса заметок*. Полноценный бэкенд с регистрацией пользователей и сохранением заметок в БД. * Вопросы для собеседования: Жизненный цикл запроса в ASP.NET Core? Жизненный цикл сервисов в DI (Transient, Scoped, Singleton)?

Модуль 6: Инфраструктура и Тесты

То, что отличает «кодера» от инженера. * Что учим: Docker (контейнеризация), Unit-тестирование (xUnit), основы CI/CD. Пет-проект: Упаковка сервиса заметок*. Напиши Dockerfile для своего API и покрой основные методы тестами. * Вопросы для собеседования: Зачем нужен Docker? Что такое пирамида тестирования?

---

План готов. Не откладывай на завтра — переходим к первому уроку прямо сейчас.

Основы C# и Инструменты: Типы данных, методы и Git

C# (произносится как «си-шарп») — это строго типизированный объектно-ориентированный язык. «Строго типизированный» означает, что компилятор требует четко знать, является ли переменная числом, строкой или чем-то иным. Это спасает от множества ошибок еще до запуска программы.

1. Типы данных: Где живут данные?

В .NET существует фундаментальное разделение типов данных на две категории. Понимание этого различия — один из самых частых вопросов на собеседованиях learn.microsoft.com.

!Стек хранит простые значения, Куча хранит сложные объекты

#### Значимые типы (Value Types) Они хранят данные непосредственно в своей ячейке памяти (обычно в Стеке). Они быстрые и легкие. * int — целые числа (например, 42, -100). Диапазон: от -2,147,483,648 до 2,147,483,647. * double — дробные числа с плавающей точкой (3.14, -0.01). * bool — логическое значение: только true (истина) или false (ложь). * char — один символ ('A', 'z', 'Rn2^{32} \approx 4.29Maxn1"Привет, {name}!"); } ``

4. Git: Ваша машина времени

Git — это система контроля версий. Она позволяет сохранять историю изменений кода. Для Junior-разработчика это обязательный навык roadmap.sh.

Основные команды, которые нужно знать наизусть:

  • git init — создать новый репозиторий в текущей папке.
  • git status — проверить, какие файлы изменились.
  • git add . — добавить все измененные файлы в «индекс» (подготовить к сохранению).
  • git commit -m "Описание изменений" — зафиксировать изменения (сделать «снимок»).
  • git push — отправить изменения на сервер (например, GitHub).
  • > Настоятельно рекомендуется использовать систему контроля версий git как для работы над проектами, так и для выполнения заданий github.com.

    Идея для Пет-проекта: Console Expense Tracker (Stage 1)

    Задание: Напиши простое консольное приложение.

  • Программа приветствует пользователя.
  • Спрашивает название покупки (используй Console.ReadLine()).
  • Спрашивает сумму (используй Convert.ToInt32() или int.Parse()).
  • Выводит итоговое сообщение: "Вы потратили [Сумма] руб. на [Название]".
  • Git-челлендж: Создай репозиторий на GitHub, сделай первый коммит с пустым проектом, а затем второй коммит с готовым кодом.
  • Итоги

  • C# — строго типизированный язык. Каждая переменная имеет свой тип, который определяет размер памяти и доступные операции.
  • Типы делятся на Value Types и Reference Types. Первые живут в стеке и хранят значения, вторые — в куче и хранят ссылки.
  • Методы структурируют код. Они принимают аргументы и могут возвращать значения или быть void.
  • Git обязателен. init, add, commit` — ваша ежедневная мантра.
  • 2. ООП, Архитектура и Тестирование: SOLID, паттерны и xUnit

    ООП, Архитектура и Тестирование: SOLID, паттерны и xUnit

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

    Часто новички пишут то, что мы называем «спагетти-кодом»: всё перемешано, изменение в одной строке ломает половину программы, а добавление новой функции превращается в пытку. Чтобы этого избежать, инженеры придумали правила архитектуры. Сегодня мы разберем три кита профессиональной разработки: принципы SOLID, паттерны проектирования и Unit-тестирование.

    1. SOLID: Пять заповедей архитектуры

    SOLID — это акроним, описывающий пять принципов, которые делают код гибким и понятным. Это не жесткие законы физики, а скорее «правила гигиены» для программиста surf.ru.

    S — Single Responsibility Principle (Принцип единственной ответственности)

    Суть: У класса должна быть только одна причина для изменения.

    Представь класс UserManager. Если он и сохраняет пользователя в БД, и отправляет ему Email, и логирует ошибки в файл — это нарушение. Если изменится логика отправки почты, мы рискуем сломать сохранение в БД.

    * Плохо: Один «Божественный класс» (God Object), который делает всё. * Хорошо: UserRepository (работает с БД), EmailService (шлет письма), Logger (пишет логи).

    O — Open/Closed Principle (Принцип открытости/закрытости)

    Суть: Программные сущности должны быть открыты для расширения, но закрыты для модификации.

    Допустим, ты пишешь игру. У тебя есть метод расчета урона:

    Это нарушение. Каждый раз, добавляя оружие, ты лезешь в работающий метод. Правильный подход — использовать полиморфизм (наследование или интерфейсы).

    L — Liskov Substitution Principle (Принцип подстановки Барбары Лисков)

    Суть: Наследники должны без проблем заменять родителей.

    Если у тебя есть класс Bird с методом Fly(), а ты создаешь наследника Penguin : Bird, который не умеет летать и выбрасывает ошибку в методе Fly() — ты нарушил принцип. Код, ожидающий птицу, сломается, получив пингвина.

    I — Interface Segregation Principle (Принцип разделения интерфейса)

    Суть: Много маленьких интерфейсов лучше, чем один большой.

    Не заставляй клиента реализовывать методы, которые ему не нужны. Если у тебя есть интерфейс IWorker с методами Work() и Eat(), то робот-рабочий не сможет его реализовать корректно, так как он не ест habr.com.

    D — Dependency Inversion Principle (Принцип инверсии зависимостей)

    Суть: Модули верхнего уровня не должны зависеть от модулей нижнего уровня. Оба должны зависеть от абстракций.

    Это самый сложный, но самый важный принцип для ASP.NET Core.

    !Инверсия зависимостей: разрыв жесткой связи через интерфейс

    Вместо того чтобы писать new SqlDatabase() внутри бизнес-логики, мы говорим: «Мне нужно что-то, что умеет сохранять данные (IRepository)». А что именно это будет — PostgreSQL или файл — бизнес-логике всё равно.

    2. Паттерны проектирования: Готовые рецепты

    Паттерны — это типичные решения частых проблем. Их десятки, но Junior-разработчику нужно знать базу metanit.com.

    Singleton (Одиночка)

    Гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа. Часто используется для конфигураций или логгеров.

    Factory Method (Фабричный метод)

    Определяет интерфейс для создания объекта, но оставляет подклассам решение о том, какой класс инстанцировать. Помогает соблюдать принцип Open/Closed.

    Dependency Injection (Внедрение зависимостей)

    Это реализация принципа D из SOLID. Мы не создаем зависимости внутри класса (через new), а получаем их извне (обычно через конструктор).

    3. Unit-тестирование с xUnit

    Как узнать, что твой рефакторинг не сломал код? Только тесты. Unit-тесты (модульные тесты) проверяют самые маленькие кусочки логики изолированно от всего остального.

    В мире .NET стандартом де-факто является библиотека xUnit habr.com.

    Паттерн AAA

    Любой тест строится по схеме:
  • Arrange (Подготовка): Создаем объекты, задаем начальные данные.
  • Act (Действие): Вызываем метод, который тестируем.
  • Assert (Проверка): Сравниваем полученный результат с ожидаемым.
  • Пример теста

    Допустим, мы рассчитываем урон в игре по формуле:

    Где — итоговый урон (Damage), — базовый урон оружия (Base damage), — множитель силы героя (Multiplier).

    Напишем тест для этой логики:

    * [Fact] — помечает метод как тест. * [Theory] — позволяет запустить один тест с разными наборами данных (используя [InlineData]).

    > Тесты — это ваша страховка. Если вы написали тест, вы можете смело менять код внутри метода, зная, что если вы ошибетесь, тест упадет и предупредит вас.

    Пет-проект: RPG-битва в консоли (Stage 2)

    Задание: Создай симуляцию боя, применяя ООП и SOLID.

  • Архитектура:
  • * Создай интерфейс IAttackable с методом TakeDamage(int damage). * Создай абстрактный класс Unit, реализующий этот интерфейс. * Создай классы Hero и Monster, наследующиеся от Unit.
  • Паттерны:
  • * Используй Strategy (или просто полиморфизм) для оружия. У героя должно быть поле IWeapon, и он может менять оружие (Меч, Лук) прямо во время боя.
  • Тесты:
  • * Подключи xUnit к проекту. * Напиши тест, который проверяет, что здоровье монстра уменьшается ровно на величину урона оружия. * Напиши тест, проверяющий, что герой умирает, когда здоровье падает до 0.

    Итоги

  • SOLID — это база. Старайся, чтобы каждый класс делал что-то одно (SRP) и зависел от абстракций (DIP).
  • Интерфейсы — твои лучшие друзья. Они позволяют разрывать жесткие связи между частями программы.
  • Тестирование — это не трата времени, а инвестиция. Используй xUnit и паттерн AAA (Arrange, Act, Assert).
  • Dependency Injection — ключевой паттерн для современного .NET, который мы будем активно использовать в ASP.NET Core.