Курсовая работа

Курсовая по программной инженерии в МГУ: требования, архитектура, тестирование и качество кода как единый проект

Как писать курсовую по программной инженерии в МГУ: задать требования, спроектировать архитектуру, вести Git, автоматизировать тесты и измерить качество.

Содержание +

Запрос «курсовая по программной инженерии в МГУ» не всегда означает отдельное название бакалаврского направления. На ВМК МГУ программная инженерия представлена в учебных дисциплинах, специализациях и IT-подготовке, а основной набор факультета включает такие направления, как прикладная математика и информатика и фундаментальная информатика и информационные технологии.

Поэтому в курсовой важно опираться на реальный курс и учебный план, а не автоматически писать, будто студент обучается на отдельной программе 09.03.04.

Официальные ресурсы ВМК:
https://cs.msu.ru/education/bachelors
https://cs.msu.ru/studies/curricula
https://iit.cs.msu.ru/studying_process/distant

Программная инженерия шире программирования

Программирование отвечает:

как написать код?

Программная инженерия добавляет:

  • требования;
  • архитектуру;
  • управление изменениями;
  • тестирование;
  • качество;
  • сборку;
  • развёртывание;
  • сопровождение.

Курсовая должна показывать этот цикл.

Начните с требований

До выбора фреймворка сформулируйте:

  • пользовательские сценарии;
  • функциональные требования;
  • ограничения;
  • критерии приёмки.

Плохо:

«Создать удобный сервис».

Лучше:

«Пользователь загружает CSV до 50 МБ и получает отчёт не позднее N секунд при корректном формате».

Теперь требование проверяемо.

User story

Например:

Как аналитик я хочу загрузить набор данных, чтобы получить отчёт по качеству.

Добавьте критерии приёмки.

Иначе user story остаётся пожеланием.

Нефункциональные требования

Для проекта выберите действительно важные:

  • latency;
  • throughput;
  • доступность;
  • безопасность;
  • maintainability.

Не копируйте универсальный список из учебника.

Архитектура

Покажите компоненты и ответственность.

Например:

  • frontend;
  • API;
  • service;
  • database;
  • worker.

Не делайте архитектуру перечнем технологий.

PostgreSQL и FastAPI сами по себе не объясняют структуру.

Связность и ответственность

Каждый модуль должен иметь ясную роль.

Если один класс:

  • читает файл;
  • валидирует;
  • считает;
  • пишет в БД;
  • отправляет письмо,

его слишком трудно тестировать и менять.

Интерфейсы

Определите контракт между модулями.

Например:

input -> output -> error.

Хороший интерфейс уменьшает зависимость частей.

ADR

Architecture Decision Record полезен для ключевых решений.

Например:

Решение: использовать очередь задач.

Причина: длительные операции не должны блокировать HTTP-запрос.

Альтернатива: синхронная обработка.

Так архитектура становится аргументированной.

Git

Используйте историю разработки.

Хороший процесс:

  • небольшие коммиты;
  • содержательные сообщения;
  • ветка для задачи;
  • review, если есть команда.

Один коммит «final» не показывает инженерный процесс.

Issue tracker

Даже в индивидуальной работе удобно вести:

  • задачу;
  • bug;
  • enhancement;
  • статус.

Так видно, как требования превращаются в изменения кода.

Traceability

Сильный проект связывает:

требование -> реализация -> тест.

Например:

FR-04 -> UploadService -> test_upload_invalid_format.

Это гораздо убедительнее общего заявления «всё протестировано».

Unit tests

Проверяют маленький блок.

Для чистой функции вход и ожидаемый выход должны быть понятными.

Не тестируйте детали реализации, если можно проверить поведение.

Integration tests

Проверяют связь:

  • API и БД;
  • сервис и очередь;
  • приложение и внешний API.

Именно интеграции часто ломаются в реальных системах.

End-to-end

Проверяет пользовательский сценарий целиком.

Например:

регистрация -> загрузка -> обработка -> отчёт.

Таких тестов обычно меньше, потому что они медленнее.

Test pyramid

Идея полезна как ориентир:

  • много быстрых unit;
  • меньше integration;
  • ещё меньше end-to-end.

Не воспринимайте пропорции как жёсткий стандарт для любого проекта.

Coverage

100% покрытия строк не гарантирует качество.

Можно выполнить строку, но не проверить правильность результата.

Coverage используйте как сигнал, а не цель.

Mutation testing

Если уровень курса позволяет, mutation testing проверяет, способны ли тесты обнаружить искусственную ошибку.

Это сильнее одного процента coverage.

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

Статический анализ

Linters и type checking помогают находить:

  • стиль;
  • потенциальные ошибки;
  • несоответствие типов.

Не включайте 500 предупреждений в приложение.

Покажите правила и итоговый статус.

Code review

Если проект командный, review может оценивать:

  • корректность;
  • читаемость;
  • тесты;
  • архитектурное соответствие.

Если работа индивидуальная, можно провести self-review по чек-листу.

CI

Автоматическая проверка при push может запускать:

1. lint;
2. tests;
3. build;
4. security scan.

Схема pipeline хорошо показывает инженерный процесс.

CD

Автоматическое развёртывание нужно не всегда.

Если курсовая заканчивается локальным прототипом, не добавляйте Kubernetes ради модного слова.

Инфраструктура должна соответствовать задаче.

Docker

Контейнер полезен для воспроизводимой среды.

Укажите:

  • базовый образ;
  • зависимости;
  • порты;
  • переменные окружения.

Не храните секреты в Dockerfile.

Конфигурация

Разделяйте:

  • код;
  • конфиг;
  • секрет.

Пароль к базе не должен быть в репозитории.

Даже учебная работа должна показывать нормальную практику.

Логирование

Логи помогают расследовать ошибку.

Используйте уровни:

  • info;
  • warning;
  • error.

Не логируйте пароль и персональные данные.

Наблюдаемость

Для сервисной темы можно измерять:

  • latency;
  • error rate;
  • throughput.

Так эксплуатационная часть становится количественной.

Производительность

Сначала задайте SLA или иной критерий.

Например:

p95 latency < N мс.

Среднее может скрывать редкие долгие запросы.

Нагрузочный тест

Задайте:

  • число виртуальных пользователей;
  • сценарий;
  • длительность;
  • метрику.

Не сравнивайте разные версии под разной нагрузкой.

Security

Для веб-проекта проверьте минимум:

  • валидацию;
  • права;
  • секреты;
  • зависимости;
  • обработку ошибок.

Не пишите «защищено от всех атак».

Ограничьте вывод проведёнными тестами.

Зависимости

Зафиксируйте версии.

Lock-файл помогает воспроизвести окружение.

Без него новая версия библиотеки может изменить поведение.

Документация

README должен позволять другому человеку:

  • установить;
  • настроить;
  • запустить;
  • выполнить тест.

Если проект нельзя воспроизвести без автора, инженерная часть слабее.

Метрика качества

Можно выбрать:

  • число дефектов;
  • время тестов;
  • coverage;
  • complexity;
  • p95 latency.

Не собирайте десять метрик без связи с целью.

Технический долг

Если сознательно оставили ограничение, зафиксируйте:

  • что;
  • почему;
  • риск;
  • дальнейшее действие.

Это лучше, чем скрывать недоделку.

Практическая глава

Хорошая структура:

1. требования;
2. архитектура;
3. реализация;
4. версия и сборка;
5. тестирование;
6. CI;
7. benchmark;
8. ограничения.

Что важно именно для запроса по МГУ

На ВМК программная инженерия может быть частью конкретного учебного плана или специализации. Поэтому SEO-фраза страницы не должна подменять официальное название образовательной программы.

В тексте курсовой используйте название своего курса из учебного плана.

Защита

Будьте готовы показать:

  • requirement;
  • архитектурное решение;
  • commit;
  • тест;
  • CI;
  • метрику;
  • ограничение.

Сильная курсовая по программной инженерии в МГУ показывает не только финальный код, но и управляемый процесс создания программной системы, в котором каждое важное решение можно проверить.

Степан Сергеев

Автор – Степан Сергеев

Кандидат физико-математических наук (PhD). Четыре диплома о высшем образовании. Помогаю разобраться в учебных и исследовательских задачах.

Ещё по теме