Главная/Проверка знаний/Проверка знаний

Grading rubric

Шкала 0–100 для проектов и итогового практического экзамена. Краткая версия — в описании системы оценивания; здесь каждая категория разложена до проверяемых пунктов.

Rubric предназначен для самооценки. Отсюда единственное требование к нему: каждый пункт должен проверяться командой, а не впечатлением. Пункты, которые нельзя проверить, из шкалы исключены — иначе оценка становится обсуждением, а не измерением.


Как пользоваться

  1. Реализовать работу.
  2. Пройти CHECKLIST.md проекта — он проверяет требования, а не баллы.
  3. Пройти этот rubric, выполняя команды и записывая баллы.
  4. Сложить и сверить с порогами.
  5. Проверить обязательные требования — они не про баллы.

Порядок важен: rubric заполняется после checklist. Работа, не прошедшая checklist, до оценивания не доходит.

Как ставить частичный балл

У каждого критерия три состояния, а не шкала на глаз:

СостояниеБаллКогда
ВыполненополныйПроверка проходит
Частичнополовина, округление внизПроверка проходит с оговоркой, названной письменно
Нет0Проверка не проходит или не выполнялась

Третья строка включает «не проверял». «Не проверено» и «проверено и работает» — разные состояния, и различать их приходится во всём курсе, от сканирования образов до оценки изоляции.


Категория 1. Корректность (25 баллов)

КритерийБаллыКак проверить
1.1Приложение выполняет все заявленные функции8Пройти сценарии из TASK.md
1.2Сборка воспроизводится с чистого клона6git clone во временный каталог, сборка по README
1.3Коды возврата различают исходы4Запуск с разными входами, сверка $?
1.4Конфигурация применяется из заявленных источников4Задать значение каждым способом
1.5Аргументы и стандартный ввод доходят до приложения3docker run с аргументами и -i

1.2 — самый частый провал. Работа собирается у автора и не собирается больше нигде: файл вне репозитория, переменная в личном окружении, образ в локальном кэше. Проверка одна:

bash
git clone . /tmp/проверка && cd /tmp/проверка && docker build -t проверка .

Каталог /tmp/проверка не содержит ничего, кроме отслеживаемых файлов. Если сборка падает — критерий 0, независимо от того, насколько хорошо работает оригинал.


Категория 2. Security (15 баллов)

КритерийБаллыКак проверить
2.1Процесс запускается от непривилегированного пользователя4docker image inspect --format '{{.Config.User}}'
2.2Идентификатор числовой2Значение соответствует ^\d+(:\d+)?$
2.3Секретов нет в слоях образа4docker history --no-trunc | grep -iE 'password|secret|token'
2.4Базовый образ выбран и обоснован2Обоснование в README
2.5Лишние capabilities сняты2cap_drop: [ALL] или эквивалент
2.6Корневая файловая система только для чтения1read_only: true работает

2.3 не заменяется чтением Dockerfile. Секрет, скопированный и удалённый следующей инструкцией, в Dockerfile выглядит удалённым, а из слоя извлекается (урок 12.6). Проверять нужно историю образа.

2.2 отделён от 2.1 намеренно. USER app защищает не хуже USER 10001 — но Kubernetes с runAsNonRoot: true такой pod не запустит (урок 18.2).


Категория 3. Image optimization (15 баллов)

КритерийБаллыКак проверить
3.1Multi-stage там, где есть инструменты сборки4Компилятора и заголовков нет в итоговом образе
3.2Кэш работает: изменение кода не пересобирает зависимости5Изменить файл в src/, пересобрать, замерить
3.3.dockerignore присутствует и полон3.git, кэши, данные, окружения исключены
3.4Размер соответствует требованию TASK.md2docker images ОБРАЗ --format '{{.Size}}' — это DISK USAGE; docker image inspect вернёт вчетверо меньший CONTENT SIZE (урок 3.4)
3.5Кэш пакетного менеджера не остаётся в слоях1Удаление в той же RUN или cache mount

3.2 весит больше размера, и это осознанно. Размер образа читатель видит сразу; сломанный кэш проявляется как «сборка стала медленной» через месяцы и почти никогда не связывается с порядком инструкций.

Проверка по времени надёжнее, чем по числу слоёв CACHED:

bash
docker build -t проба . && touch src/*/main.py && time docker build -t проба .

Вторая сборка должна занимать секунды. Если минуты — критерий 0.


Категория 4. Reliability (15 баллов)

КритерийБаллыКак проверить
4.1SIGTERM завершает приложение в пределах grace period5time docker stop container
4.2Активные запросы завершаются, а не обрываются3Остановка под нагрузкой
4.3Healthcheck есть и различает «запущен» и «готов»3Остановить зависимость, наблюдать состояние
4.4Ограничения ресурсов заданы2docker inspect показывает лимиты
4.5Поведение при отказе зависимости описано и проверено2Остановить базу, наблюдать

4.1 проверяется временем, а не фактом остановки. Container останавливается всегда — вопрос в том, по SIGTERM или по SIGKILL через десять секунд:

bash
docker run -d --name t образ && time docker stop t

Менее секунды — обработчик есть. Ровно десять секунд — приложение сигнал не получило, скорее всего из-за shell-формы (урок 4.6).

Для проектов 1 и 2 применимость различается: инструменту командной строки, живущему доли секунды, SIGTERM не наступает. В таком случае критерий 4.1 засчитывается при письменном обосновании — это ровно то, для чего нужно состояние «частично».


Категория 5. Testing (15 баллов)

КритерийБаллыКак проверить
5.1Unit-тесты покрывают заявленный порог4pytest --cov --cov-fail-under
5.2Тесты выполняются в образе, а не только локально4docker build --target test
5.3Провал теста останавливает сборку4Сломать тест намеренно, собрать
5.4Есть integration-тесты с реальными зависимостями2Проекты 3 и 4
5.5Тесты не зависят от порядка выполнения1pytest -p no:randomly против случайного порядка

5.3 весит столько же, сколько само наличие тестов. Стадия test, на которую никто не ссылается, при обычной сборке не выполняется, и сборка при этом успешна (урок 15.5). Тесты, которые не могут остановить сборку, не являются проверкой — они являются документацией.

Проверка единственная:

bash
# сломать одно утверждение
docker build --target test . ; echo "код: $?"   # ожидается ненулевой

Категория 6. Documentation (10 баллов)

КритерийБаллыКак проверить
6.1README содержит команды сборки и запуска3Выполнить их дословно на чистом клоне
6.2Переменные окружения описаны: имя, назначение, умолчание3Сверить со списком в коде
6.3Принятые решения обоснованы3Не менее трёх решений с причиной
6.4Ограничения названы явно1Что не сделано и почему

6.1 проверяется копированием, а не чтением. Команда из README, которую нельзя выполнить дословно, — не документация. Типичный случай: docker run -e DATABASE_URL=... образ без указания, что именно подставить.

6.4 весит немного, но отсутствует чаще всего. Работа без раздела «чего решение не делает» создаёт впечатление полноты, которой нет, — и это то же требование, что предъявляется ко всем разборам курса.


Категория 7. Troubleshooting (5 баллов)

КритерийБаллыКак проверить
7.1Раздел с типичными проблемами есть2Не менее трёх записей
7.2Для каждой указана команда диагностики2Команда, а не совет
7.3Указана причина, а не только симптом1Механизм назван

Различие 7.2 и 7.3 существенно: «проверьте логи» — не команда диагностики; docker inspect t --format '{{.State.ExitCode}}' — команда.


Итоговая таблица

КатегорияБаллыВаш результат
1. Корректность25
2. Security15
3. Image optimization15
4. Reliability15
5. Testing15
6. Documentation10
7. Troubleshooting5
Итого100

Пороги

БаллыОценкаЧто это значит
90–100ОтличноРешения обоснованы, крайние случаи учтены, конфигурация пригодна к эксплуатации
80–89ХорошоРаботает корректно, отдельные упущения в оптимизации или документации
70–79УдовлетворительноБазовые требования выполнены, есть заметные пробелы
70Проходной минимумНиже курс не считается пройденным
50–69Не пройденоРаботает, но нарушены существенные требования
0–49Не пройденоНе воспроизводится или не выполняет заявленные функции

Обязательные требования

Независимо от суммы баллов работа не принимается, если выполнено хотя бы одно условие ниже.

НарушениеПроверкаПочему блокирует
1Секреты в слоях образаdocker history --no-truncИзвлекаются кем угодно, имеющим образ
2Запуск от root без обоснованияdocker image inspect --format '{{.Config.User}}'UID 0 внутри равен UID 0 снаружи (19.2)
3Не воспроизводится с чистой машиныКлон во временный каталогРабота существует только у автора
4Development server в production-конфигурацииflask run, uvicorn --reload в команде запускаНе рассчитан на нагрузку и раскрывает отладочные сведения
5Не завершается по docker stop в пределах grace periodtime docker stopНезавершённые операции при каждой выкатке

Эти пять — не «самые важные критерии». Это условия, при которых оценивание остального теряет смысл: нельзя обсуждать оптимизацию образа, из которого извлекается пароль.

Про пункт 2. Обоснование допускается и иногда верно — например, container, которому нужен доступ к устройству. Требуется, чтобы оно было письменным и называло, что именно перестанет работать при непривилегированном запуске. «Не успел разобраться с правами» обоснованием не является.


Что rubric не измеряет

Полезно назвать прямо, чтобы результат не читался шире, чем он есть.

Чего нет в шкалеПочему
Качество кода приложенияКурс про контейнеризацию, а не про Python
Производительность под нагрузкойТребует стенда, которого у читателя может не быть
Стоимость эксплуатацииЗависит от организации, а не от работы
Организационная готовностьНе проверяется ни одним инструментом (19.4)
Уместность самой контейнеризацииОтдельный вопрос, разбираемый в 19.3

Последняя строка стоит того, чтобы её заметить: работа может набрать 95 баллов и решать задачу, которой не требовалось контейнеризации. Rubric этого не поймает — и не должен.


Навигация

Вернуться к системе проверки
Описание системы оценивания
Практические проекты
Главное оглавление

Markdown на GitHub ↗