Индивидуальный проект · 10 класс · информатика
Практико-ориентированный проект: бот, который держит расписание, дедлайны и напоминания одного класса — с реальными пользователями, замерами использования и опросом «до и после».
Это то, что нужно сдать завтра. Формулировки можно взять дословно.
Семь задач — ровно столько, чтобы в заключении по каждой можно было написать вывод. В записке они повторяются дословно из введения.
Функции разделены на три уровня. Третий уровень — не слабость проекта, а его сильная сторона: умение обосновать границы задачи на защите ценится выше, чем длинный список недоделанных функций.
/start — регистрация, выбор класса и времени напоминаний/today, /tomorrow, /week — расписание уроков с кабинетами/help — короткая справка.ics)Главный принцип: вся работа с базой — в одном файле, все тексты сообщений — в другом, обработчики команд не содержат ни SQL, ни длинных строк. Так и код читается, и в записке появляется, что описывать в разделе «Проектирование».
schoolbot/ ├── main.py # точка входа: запуск бота и планировщика ├── config.py # чтение токена из .env, константы ├── db.py # ВСЕ SQL-запросы только здесь ├── models.py # dataclass: Lesson, Deadline, User ├── keyboards.py # inline-кнопки ├── texts.py # все тексты сообщений одним словарём ├── scheduler.py # рассылка напоминаний по времени ├── handlers/ │ ├── common.py # /start, /help, регистрация │ ├── schedule.py # /today, /tomorrow, /week │ ├── deadlines.py # добавление и просмотр дедлайнов │ └── tools.py # конвертер, справочник ├── data/ │ ├── schema.sql # создание таблиц │ ├── schedule.csv # расписание — правится без кода │ └── bot.db # сама база (в .gitignore) ├── .env # ТОКЕН. Обязательно в .gitignore ├── requirements.txt └── README.md # инструкция запуска = приложение к записке
| Компонент | Выбор | Почему именно он |
|---|---|---|
| Язык | Python 3.11 | Изучается в школе, богатые библиотеки, быстрая разработка |
| Работа с Telegram | aiogram 3.x | Асинхронность, машина состояний для диалогов, актуальная документация |
| Хранение | SQLite + aiosqlite | Не требует отдельного сервера, база — один файл, легко копировать |
| Напоминания | APScheduler | Задачи по расписанию без внешнего cron |
| Секреты | python-dotenv | Токен не попадает в исходный код |
| Запуск | Домашний ПК | Бесплатно; для непрерывной работы — Raspberry Pi или free-tier VPS |
Шесть таблиц. Обратите особое внимание на последнюю — именно она превращает работу из «я написал программу» в исследование с измеримым результатом.
| Таблица | Поля | Назначение |
|---|---|---|
| users | user_id, class_group, notify_min, is_editor, created_at | Кто пользуется ботом и с какими настройками |
| lessons | id, class_group, weekday, number, subject, time_start, room | Расписание. Загружается из CSV, правится без изменения кода |
| deadlines | id, class_group, subject, title, due_at, created_by, created_at | Сроки сдачи работ |
| deadline_done | deadline_id, user_id, done_at | Кто уже сдал. Отдельная таблица, потому что связь «многие ко многим» |
| notifications | id, user_id, kind, target_id, sent_at | Что уже отправлено — чтобы напоминание не пришло дважды после перезапуска |
| events_log | id, user_id, command, ts | Метрики. Обезличенный лог обращений — источник всех графиков в главе 3 |
events_log в феврале, статистики за январь просто не будет, и исследовательская часть развалится. Одна строка в лог на каждую команду — это пять минут работы в начале и целая глава записки в конце.
Слабое место всех проектов-«программ»: ученик показывает работающий продукт, а комиссия спрашивает «а что здесь исследовано?». Ответ должен быть готов заранее: измерение реальной пользы на реальных людях.
| Вопрос классу | Что даёт |
|---|---|
| Сколько раз за последний месяц вы забывали о сроке сдачи работы? | Главный показатель «до» |
| Где вы смотрите расписание? (журнал / чат / фото / память) | Обоснование актуальности во введении |
| Сколько минут в день уходит на поиск учебной информации? | Оценка экономии времени |
| Чего вам не хватает больше всего? | Приоритеты в техническом задании |
| Показатель | Откуда берётся |
|---|---|
| Доля класса, зарегистрировавшегося в боте | users |
| Число активных пользователей по дням (график) | events_log |
| Топ-5 самых частых команд | events_log |
| Доля дедлайнов, отмеченных выполненными до срока | deadline_done |
| Кто добавляет дедлайны: один человек или многие | deadlines.created_by |
Итог главы — таблица «до / после» и вывод о гипотезе. Отрицательный результат по отдельной функции — это тоже результат: если конвертером единиц не воспользовался никто, так и написать, а в выводах объяснить, что функции, не решающие названную в анкете проблему, оказались невостребованными. Такая честность на защите работает лучше, чем идеальные цифры.
Расчёт на 4–6 часов работы в неделю. Январь оставлен буфером под каникулы и неизбежные сдвиги.
| Месяц | Что сделать | Результат |
|---|---|---|
| Сентябрь | Утвердить тему, провести анкетирование класса, обработать ответы, составить техническое задание | ТЗ + диаграммы по анкете |
| Октябрь | Изучить Telegram Bot API и aiogram, поднять «бот отвечает на /start», спроектировать схему БД | Первый работающий бот |
| Ноябрь | Расписание: загрузка из CSV, команды /today, /tomorrow, /week, кнопки | Половина минимума |
| Декабрь | Дедлайны и планировщик напоминаний. Написать теоретическую главу — материал ещё свежий | Готовый минимум + глава 1 |
| Январь | Запуск в классе на 5–7 добровольцах, исправление ошибок, доработка формулировок сообщений | Бот выдерживает живых людей |
| Февраль | Открытый доступ всему классу, четыре недели эксплуатации, сбор метрик | Данные для главы 3 |
| Март | Повторная анкета, обработка данных, графики, написание практической главы и заключения | Полный черновик записки |
| Апрель | Оформление по требованиям школы, презентация, запись видео-демонстрации, две репетиции защиты | Сдача и защита |
Ориентир — 22–26 страниц без приложений. Точные требования к оформлению нужно взять у своего руководителя: у каждой школы своё положение о проекте.
Регламент обычно 7–10 минут. Десять слайдов, ни одного лишнего.
| Слайд | Содержание |
|---|---|
| 1 | Титульный: тема, автор, руководитель |
| 2 | Проблема — сразу цифрами из анкеты: «18 из 25 забывали срок хотя бы раз в месяц». Это цепляет комиссию с первой минуты |
| 3 | Цель и задачи — кратко, списком |
| 4 | Существующие решения и чего в них не хватает — таблица из главы 1 |
| 5 | Что умеет бот — три-четыре скриншота реальных диалогов |
| 6 | Архитектура — схема модулей и схема базы данных |
| 7 | Самая сложная техническая задача и её решение: как не отправить напоминание дважды после перезапуска бота |
| 8 | Метрики использования — график активности по дням |
| 9 | Таблица «до / после» и вывод о гипотезе |
| 10 | Что дальше: недостатки и планы развития |
Чем это лучше обычного чата класса?
В чате информация линейна и тонет: чтобы найти срок, надо листать переписку. Бот отвечает на запрос за одно нажатие и сам напоминает заранее — чат этого не делает. Плюс цифры: доля дедлайнов, отмеченных до срока, выросла с … до …
Где хранятся данные и что с персональными данными?
В файле SQLite на моём устройстве. Сознательно не храню фамилии, оценки и контакты — только идентификатор Telegram, класс и настройки. Лог обращений обезличен: команда и время, без содержания сообщений.
Что будет, если бот упадёт?
Данные в файле базы не теряются. Отправленные напоминания фиксируются в таблице notifications, поэтому после перезапуска повторных сообщений не приходит. Автоматический перезапуск настроен через системную службу.
Дедлайн может добавить любой? А если напишут ерунду?
Добавлять могут пользователи с флагом is_editor — староста и ответственные по предметам. Остальные видят записи и отмечают своё выполнение. Автор каждой записи сохраняется, любую можно удалить.
Почему aiogram, а не другая библиотека?
Рассматривал pyTelegramBotAPI: он проще на старте, но у aiogram есть машина состояний, которая нужна для пошагового добавления дедлайна, и асинхронность — при рассылке напоминаний всему классу бот не блокируется.
Сколько человек реально пользуются?
Из 25 человек в классе зарегистрировались …, активны каждую неделю … Ответ должен быть числом из events_log, а не оценкой на глаз — в этом и смысл логирования.
Что бы вы сделали иначе?
Заранее продумал бы формат хранения расписания: первую версию пришлось переделывать, когда появились уроки по числителю и знаменателю. И начал бы собирать метрики с первого дня, а не через две недели.
Отдельный абзац о рисках и способах их снижения хорошо смотрится и в записке, и на защите.
| Риск | Что сделать заранее |
|---|---|
| Токен бота попадёт в публичный репозиторий | Токен только в .env, файл — в .gitignore с самого первого коммита. Если утёк, отозвать через @BotFather |
| Класс не станет пользоваться — исследовательской части не будет | Договориться со старостой заранее, начать с 5–7 добровольцев в январе, добавить бота в чат класса с короткой инструкцией, попросить учителя-предметника анонсировать |
| Бот выключается вместе с домашним компьютером | На период сбора метрик держать его на постоянно работающем устройстве: Raspberry Pi, старый ноутбук или бесплатный VPS |
| Ошибки со временем: часовые пояса, переход между днями | Хранить всё время в UTC, переводить только при выводе. Написать 3–4 теста на границы суток — это же материал для раздела «Тестирование» |
| Записка пишется в последнюю неделю | Теоретическую главу написать в декабре, пока материал свежий. Вести дневник работы — из него потом собирается практическая глава |
| Комиссия сочтёт работу «просто программой» | Держать наготове три цифры: доля класса в боте, число обращений за месяц, изменение показателя «до / после». Это и есть исследование |