Хакатон 13-14 апреля 2024
На выходных 13-14 апреля мы с моей командой принимали участие в хакатоне от Политеха. Я хочу поделиться своими впечатлениями, рассказать о том, с какими трудностями нам пришлось столкнуться, ну и, само собой, подвести некий итог нашей работе.
Начало
Ночь. Я лежу и думаю, что за тему могут дать. Перебираю разные варианты: фреймворки, UI-библиотеки, какие-то SDK — всё это вряд ли дадут, ведь это сложные проекты, с которыми справится далеко не каждый. Десктоп — я знаю про PWA, а ещё про Electron-подобные фреймворки, т.е. способ писать приложения, используя веб-технологии. Дадут ли что-то такое, что поставит меня в тупик? Примерно так я и заснул, причём достаточно быстро.
Утром я собрался, доехал до метро, где все мы встретились. Мы с командой поехали в Политех. По дороге рассуждали над возможными кейсами, но в целом атмосфера была довольно расслабленной.
Тема
После небольшой презентации от кураторов, мы получили тему: “Электронный документооборот”. В кейсе было сказано, что необходимо решить проблемы дороговизны печати документов.
После небольшого раздумья мы решили создать “Хиэду” (“Hieda”) — микросервисы для работы с документами. Вначале я стал реализовывать авторизацию, но один из членов команды, Даня, к тому моменту разобрался, чего именно от нас хотят.
Документооборот — это не только про передачу документов и их хранение, но и про верификацию. Существует механизм электронных подписей, позволяющий удостовериться, что переданный файл не подделан, а его содержимое не изменено.
Именно на этом мы решили сфокусироваться.
Работа
Пока я настраивал всю инфраструктуру будущего приложения, Никита, второй backend-инженер, написал сервис для сохранения данных в Яндекс Облако. Мы использовали их объектное хранилище, чтобы сохранять документы для последующей передачи.
Мы написали интерфейс этого сервиса, документы уже можно было загружать. После загрузки мы предоставляли возможность скопировать ссылку на загрузку документа. Таким образом, первая часть фунционала была реализована.
Остаток дня мы потратили на доработку всего того, что было готово. Мы успели показать этот сервис одному из членов жюри: ей всё понравилось. В этот момент я думал, как лучше реализовать верификацию документов, и эти раздумья растянулись прямо до двери моей квартиры.
Подпись документов
Вначале я рассматривал вариант хранения подписи в метаданных файла. Этот подход имеет свои плюсы: удобство передачи документа, возможность читать данные так, как если бы подписи не было, и т.д.
Идея была в следующем:
- Вычислить SHA-256 хэш загруженного файла.
- Зашифровать хэш публичным RSA-ключом; полученную последовательность байт мы решили назвать сигнатурой, или подписью. Именно с её помощью будет осуществляться верификация данных.
- Записать сигнатуру в метаданные.
При проверке документа на подлинность метаданные нужно будет прочитать и удалить, чтобы содержимое файла не отличалось от первоначально загруженного. Далее сигнатура расшифровывается приватным ключом и сравнивается с хэшом файла.
Но у этого подхода были проблемы:
- Не все форматы файлов содержат метаданные
- После удаления сигнатуры из файла хэши всё ещё отличались.
Я не смог решить вторую проблему. По видимому, при записи метаданных изменялась ещё какая-то часть файла, но отследить это было невозможно.
Поэтому была придумана альтернатива: отправлять сигнатуру в виде отдельного файла. При удостоверении документа сервис попросит отправить файл и соответствующую подпись. Если после расшифровки хэши совпадут, файл будет считаться валидным, в противном случае — нет.
Это решало и первую проблему, ведь при использовании внешнего файла появляется возможность подписать что угодно.
Дело оставалось за малым — реализовать то, что пришло в голову. С этим я управился к ночи.
Дальше, примерно до пяти утра, я занимался рефакторингом, т.е. улучшением кода без изменения функционала, успел немного поработать над презентацией. Так завершился первый день хакатона.
Второй день
Проснулся я в 6:30, суммарно проспав около полутора часов. Выпив несколько чашек крепкого чая, я вновь поехал на метро, мы с ребятами вновь встретились и вновь поехали в университет. По дороге я рассказал о реализации, мы поговорили про презентацию и то, как лучше демонтрировать функционал продукта.
Почти всё время второго дня мы потратили на создание презентации. Мы действительно постарались над ней, чтобы сделать всё в лучшем виде. Также мы записали видео, демонстрирующее основные сценарии использования системы:
- Подпись документа.
- Верификация документа.
- Сохранение файла.
- Загрузка файла по ссылке.
Мы успели немного подготовиться к выступлению. Ничего не репетировали, не учили текст, но распределили слайды, повторили тезисы.
Презентация
Мы выступали пятыми по счёту — ровно посередине. Как сказал Вадим Борисович Скотников, мой преподаватель, это было похоже на презентацию реального продукта. Всё складывалось просто идеально. Настолько, что как только я заговорил о верификации документов, на видео как раз начала воспроизводиться нужная часть. Мы также успешно ответили на вопросы экспертов. Одним словом, выступлением я доволен.
Стоит отметить, что проекты других команд были достаточно интересными. Какие-то
напомнили мне о том, что я делал раньше, а какие-то — заинтересовали с
точки зрения реализации. Очень порадовало, что было мало повторяющихся
технологий. Кто-то делал десктоп-приложение на C#, кто-то API на Python, одна
из команд вообще сделала iOS приложение на Swift. Что касается нас, то большая
часть микросервисов написана на Go, один на Python, а запускается всё при
помощи docker-compose
.
Ожидание результатов
Так как хакатон проводит Политех, за победу дают 5 дополнительных баллов при поступлении. Это отличный приз, но есть нюанс… Я уже успел заработать максимально возможное число доп. баллов — 10. Да и если говорить откровенно, ехал на хакатон я не ради баллов, а ради интересных проектов и опыта.
Тем не менее, как и на любых соревнованиях, мне хотелось занять первое место. Это просто неотъемлемая часть конкурсов, спортивных турниров или чего бы то ни было ещё, где есть призовые места.
Команда была полностью уверена в том, что мы займём первое место. Я старался не радоваться раньше времени, хотя и рассчитывал на то, что это действительно произойдёт. Всё-таки мне понравилось решение, которое мы смогли реализовать в столь короткие сроки.
Победа?
Результаты пришли сегодня, 15 апреля. Как раз после этого я и сел писать свой пост.
Мы заняли… 2 место.
Первое место заняла команда 583 школы. Если не ошибаюсь, они сделали облачное хранилище для документов.
Эмоции
Расстроен ли я?
Честно, да. Мне, как и всегда, хотелось победить, даже если это ничего не дало бы. Но я не могу сказать, что я слишком сильно огорчился из-за того, что мы лишь вторые. В конце концов, нам удалось создать рабочее решение, пусть и в минимальной реализации.
С другой стороны, это возможность понять, где можно стать лучше. Как мне кажется, порой важно проиграть, ведь поражение — это всегда точка роста. И пусть поражение в данном случае — это серебро.
Для тех, кому интересно
Я не могу не поделиться материалами, ведь наверняка будут те, кто захочет поближе изучить наш проект. Если это будет полезно хотя бы одному человеку, значит, все усилия были приложены не зря.
Заключение
Участвуйте в хакатонах. Этот не был для меня первым, но он дал много новых эмоций, позволил получить интересный опыт. Само собой, мы не остановимся на достигнутом.