Чек-листы по вехам и гейту
Сводные чек-листы для самопроверки стажёра и контроля наставника. Детальные чек-листы по каждой вехе — в соответствующих документах M0–M4.
M0 — Старт
См. M0: Старт.
- .NET 8 SDK установлен
- IDE (Rider или Visual Studio) работает
- PostgreSQL запущен, пароль сохранён
- Git настроен
- Репозиторий
geolab-defenseсоздан и клонирован - Скелет решения компилируется
- Доступы к стенду и Swagger получены и проверены
- Доступ к
geotimlab.wikiполучен, заведён первый баг-репорт
M1 — Парсер
См. M1: Парсер.
Доменная модель
-
Project,Borehole,Sample,Sample_Lab,ParameterValueсозданы - Поля модели сверены с домен-экспертом
- FK вместо навигационных свойств (DDD-конвенция)
Парсер
-
ILabDataParserобъявлен - Реализация для CSV работает
- Реализация для JSON работает
-
LabDataParseResultсобирает полный граф объектов - Граф объектов корректен, FK согласованы
- Критические ошибки бросают понятные исключения
- Некритичные проблемы попадают в
Warnings
Тесты
- Unit-тесты на парсеры (минимум 7 сценариев)
- Тесты на корректные FK в результате
- Тесты на обработку ошибок (битый файл, отсутствующие колонки)
- Все тесты проходят
Инженерная культура
- Git: коммиты регулярные, сообщения осмысленные
- Ветки под задачи используются
- README описывает, как собрать и запустить тесты
M2 — Персистентность
См. M2: Персистентность.
-
GeoLabDefenseDbContextсоздан - Все 5 сущностей сконфигурированы через Fluent API
- Миграция
InitialCreateсоздана и применяется - Парсер → DbContext → SaveChanges → перезапуск → чтение работает
- Интеграционные тесты проходят
- Строка подключения в
appsettings.json, не в коде
M3 — Web API
См. M3: Web API.
- Контроллеры для основных сущностей реализованы
- CRUD покрыт тестами
- FluentValidation-валидаторы написаны и работают
- Mapperly-мапперы сгенерированы
- Хотя бы один OData-эндпоинт работает
- Ardalis.Specification применён хотя бы один раз
- NSwag генерирует корректный Swagger UI
- Serilog пишет логи
- Эндпоинт запуска парсера по HTTP работает
M4 — UI и подготовка к защите
См. M4: UI и защита.
- Blazor UI запускается локально
- Минимум 5 страниц реализованы
- Загрузка файла в парсер через UI работает end-to-end
- Radzen используется хотя бы на одной странице
- README обновлён
-
docs/defense.mdнаписан - Демо отрепетировано
- Code review-вопросы проработаны
QA-трек (параллельно, весь срок)
См. QA-трек.
- Стабильный поток баг-репортов по форме
- Корректная классификация severity и context
- Еженедельные метрики-агрегаты в
vault/reports/ - Обратная связь в
vault/feedback/
Гейт защиты
Финальная оценка в конце мес. 5/6. Формат — code review + демо перед тимлидом. Решение: успех → Фаза 2; частично → продление; провал → совместное решение с собственниками.
Что проверяется
Гейт оценивает по трём осям: код и принципы, стек, инженерная зрелость.
Код и принципы
- Проект защиты работает end-to-end: UI → API → EF Core → PostgreSQL
- Архитектура соответствует Clean Architecture (направление зависимостей внутрь)
- DDD-конвенция «только FK» соблюдена
- Стажёр объясняет свои архитектурные решения
- Доменная модель сверена с домен-экспертом, расхождения зафиксированы
Стек
- EF Core + PostgreSQL: схема через миграции, прямой доступ к DbContext
- FluentValidation: валидаторы работают
- Mapperly: мапперы генерируются
- Ardalis.Specification: хотя бы одна спецификация применена
- OData: хотя бы один эндпоинт поддерживает фильтры
- NSwag / Swagger: API описан корректно
- Blazor Server: UI работает с API
- Radzen: хотя бы одна страница использует компоненты Radzen
- xUnit: тесты написаны и проходят
Инженерная зрелость
- Git-гигиена: осмысленные коммиты, ветки под задачи
- Обработка ошибок: нет «тихих» падений, понятные сообщения
- Код читаемый, именование согласованное
- README с инструкцией запуска
-
docs/defense.mdс архитектурой и демо-сценарием - QA-трек: стабильный поток качественных репортов и метрик
- Способность ответить на технические вопросы по своему коду
Примеры вопросов на code review
Не исчерпывающий список, ориентир для подготовки:
- «Покажи направление зависимостей в твоём решении. Почему так?»
- «Почему здесь
.Select()до материализации, а не.Include()+ маппинг в памяти?» - «Где ты используешь спецификацию? Почему именно здесь?»
- «Объясни, как валидируется этот DTO. Почему FluentValidation?»
- «Как соблюдается конвенция „только FK“ в твоей схеме БД?»
- «Что произойдёт, если в парсер подать битый файл? Покажи обработку ошибки.»
После гейта
При успешном прохождении — переход в Фазу 2:
- Оплачиваемая роль Dev junior.
- Доступ к основному репозиторию DeepGeo.
- Простые задачи под присмотром dev-ментора: simple Query, правка UI-компонента, integration-тесты в
tests/ai_generated/.
Темы, вынесенные за рамки Фазы 1 и изучаемые в Фазе 2: мультитенантность, MediatR на практике, продвинутый DDD, Blazor WebAssembly, Docker, CI/CD, безопасность.
Дальше
- ⬅️ К началу онбординга
- 📚 Ресурсы — материалы для самостоятельного изучения
- 🎯 Проект защиты — что должно быть готово к гейту