Импортозамещение на минималках (ч. 2) домашки, онлайн-доска и боль WebSocket
В прошлой части я показывал самый первый MVP кабинета учителя: ученики, предметы, оценки, домашние задания и программы.
В этой части уже расскажу про то, где началась настоящая разработка, а не просто “нарисовать форму и сохранить данные в таблицу”.
Старых бэкапов первых версий почти не осталось, зато сохранились фото и скрины процесса. По ним хорошо видно, как проект постепенно превращался из обычного кабинета в маленький образовательный комбайн.
Первой серьёзной задачей стали домашние задания.
На бумаге всё звучит просто: учитель создаёт задание, ученик его получает, выполняет, учитель проверяет.
На практике появляется куча нюансов: текстовые задания, PDF, изображения, готовые материалы, статусы, сроки сдачи, хранение файлов, личный кабинет ученика и нормальная структура папок на сервере.
Я решил, что документы учителя должны сохраняться не хаотично, а по понятной структуре. Например:
id_пользователя / формат документа / номер задания
Так проще искать файлы, чистить мусор и не превращать сервер в свалку из file_final_final_2.pdf.
На этом этапе часто ломалось всё подряд. Особенно работа с PDF и изображениями.
То путь собрался неправильно, то файл сохранился не туда, то код уже третий раз “почти исправлен”, но в итоге ломает соседнюю часть.
После нескольких таких кругов стало понятно: структуру хранения нужно переделывать полностью, а не чинить точечно.
Следующей большой задачей стала онлайн-доска.
Я подумал: раз это платформа для занятий, то нужна доска, на которой учитель и ученик могут работать вместе.
Звучит логично. А потом начинается реальность.
Сначала я сделал простую доску: карандаш, фигуры, ластик, текст.
Но быстро выяснилось, что “просто рисовать” мало. Нужно, чтобы доска сохранялась, синхронизировалась между участниками, не ломалась при обновлении страницы и не превращалась в лагучий холст после пары минут работы
Первая версия была максимально базовой. Она вроде бы работала, но постоянно вылезали проблемы:
ластик стирал не всегда, линии могли вести себя странно, изображения не добавлялись, сохранение доски иногда отваливалось.
Самое неприятное в таких задачах — баги не всегда воспроизводятся одинаково.
У тебя локально всё нормально, открываешь с другого устройства — и начинается цирк.
В какой-то момент пришлось почти полностью переписывать логику доски, смотреть, как работают события мыши, касания, слои, сохранение состояния и синхронизация.
Позже доска стала уже больше похожа на мини-тетрадь..
Появились листы, переключение страниц, инструменты рисования, текст, фигуры, изображения, совместный просмотр презентаций, видео и аудио-связь между учителем и учениками.
Отдельная история — звук и видео.
Чтобы это работало стабильнее, пришлось поднимать свой TURN-сервер. До этого связь могла зависеть от сети пользователя: у одного всё хорошо, у другого камера не подключается, у третьего звук есть, но видео нет.
Сейчас доска умеет:
рисовать;
добавлять текст;
работать с фигурами;
стирать;
добавлять изображения;
переключать листы;
показывать презентации;
подключать аудио/видео;
сохранять состояние.
И да, после этого я окончательно понял, почему “простая онлайн-доска” редко бывает простой.
Параллельно развивались домашние задания и библиотека материалов.
Сначала домашка была обычным текстом. Потом захотелось добавить PDF. Потом изображения. Потом готовые задания. Потом игры WordWall. Потом стало понятно, что нужно хранить не только само задание, но и статус выполнения, ответ ученика, материалы, проверку и историю.
На скрине видно ранний вариант: слева список активных и проверяемых заданий, справа само задание, материалы и статус.
Идея была в том, чтобы учитель мог быстро открыть работу ученика и понять, что происходит: сдано, не сдано, просрочено, есть ли ответ, какие материалы прикреплены.
Тут же появилась библиотека.
Библиотека нужна была для того, чтобы не создавать одни и те же задания заново.
Учитель может подготовить материалы заранее, сохранить готовое задание, а потом быстро выдать его ученику или группе.
На этом этапе стало понятно, что “домашнее задание” — это уже не одно поле с текстом. Это отдельный конструктор.
Форма создания задания тоже начала разрастаться.
Можно выбрать, кому выдать задание: одному ученику или группе.
Можно выбрать тип: текст, PDF, WordWall, готовое задание.
Можно привязать предмет, название, описание, срок сдачи.
И вот тут появилась классическая проблема: функционала становится больше, но интерфейс начинает тяжелеть.
С одной стороны, возможности нужны. С другой — учителю не хочется заполнять огромную анкету ради простой домашки.
Это место я до сих пор считаю одним из самых сложных: нужно оставить гибкость, но не превратить форму в монстра.
Следующий этап — программы обучения.
Идея была такая: если учитель ведёт ученика не разово, а по курсу, то можно заранее собрать программу.
Внутри программы есть предметы, расписание, даты начала и окончания, длительность уроков и будущие домашние задания.
То есть учитель один раз настраивает структуру, а дальше система помогает распределять занятия и задания.
На словах красиво. В коде — очередная пачка зависимостей.
Программа связана с предметами.
Предметы связаны с уроками.
Уроки связаны с расписанием.
Расписание связано с домашними заданиями.
Домашние задания связаны с учениками и группами.
И если где-то в этой цепочке ошибиться, потом начинаются весёлые вещи: задание ушло не туда, дата съехала, программа создалась, но уроки не подтянулись.
На этом этапе я понял главную вещь: образовательная платформа очень быстро перестаёт быть “сайтом”.
Сначала кажется, что нужны простые разделы:
ученики, оценки, домашки, расписание.
А потом каждый раздел начинает тянуть за собой ещё пять сущностей и десять сценариев.
Домашка требует библиотеку.
Библиотека требует хранение файлов.
Онлайн-доска требует WebSocket, сохранение состояния и видео.
Программы требуют расписание и автоматизацию.
А всё вместе требует нормальной архитектуры, иначе проект начинает разваливаться под собственным весом.
Самая большая сложность была не в том, чтобы “сделать кнопку”.
Сложность была в том, чтобы все эти кнопки не противоречили друг другу.
В итоге вторая версия стала переходным этапом: уже не сырой MVP, но ещё и не финальный продукт.
Зато именно здесь стало понятно, какие части действительно нужны, какие нужно упрощать, а какие придётся переписывать полностью.
Дальше началась самая болезненная, но самая полезная часть: привести всё это в нормальный вид, убрать лишнее, переписать слабые места и собрать из набора функций цельную платформу.
Но это уже будет следующая часть, или через следующую часть, так как нужно показать все таки Личный кабинет ученика.

















