Programming
Java
HTML
Studying in IT
April 17

E-Dobavki — веб-сервис поиска пищевых добавок на Java и Spring Boot, написанный моими студентами

Введение


Так получилось, что последние почти два года я преподаю программирование в одной из IT школ Киева. Занялся я этим Just For Fun. Когда-то я вел блог по программированию, потом забросил. Но желание рассказывать полезные вещи заинтересованным людям никуда не делось.


Мой основной язык — Java. Я писал на ней игры для мобильных, софт для радиосвязи, и различные веб-сервисы. И преподаю я именно Java.


Здесь я хочу рассказать историю обучения последней своей группы. Как они прошли путь от начал обучения до написания работающего веб-сервиса. Полезного веб-сервиса по поиску пищевых добавок. Бесплатного, без рекламы, регистрации и СМС.


Сам сервис вот — E-Dobavki.com.



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


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


9 месяцев обучения


В школе, где я преподаю, курс Java разбит на 2 части. Суммарно курс занимает примерно 9 месяцев, со всеми перерывами (новогодние каникулы, время на написание промежуточных проектов).


Первая часть знакомит студентов с базовыми понятиями ЯП. Переменные, методы, основы ООП и все эти штуки.


Вторая же часть курса предусматривает, что студент уже более-менее понимает, как писать на Java, и ему можно дать "взрослый" стек технологий. Начинается все с SQL, дальше JDBC, Hibernate. Потом HTTP, сервлеты. Дальше Spring, немного про git и maven. И студенты пишут финальные проекты.


Все обучение разбито на модули. Занятия я проводил два раза в неделю. Длительность одного занятия — два часа.


Мой подход к обучению


Я выпустил 5 групп. Вроде много как для двух лет, но я почти всегда вел 2 группы параллельно.


Я пробовал разные подходы.


Первый вариант — это одна пара выделяется на презентацию с теорией. Вторая же пара — чистая практика. Такой подход как-то работал, но эффективность была не очень, как по мне.


Второй вариант, к которому я пришел и по которому работаю сейчас — это не выделять целую пару на теорию. Вместо этого я миксую короткие отрезки теории по 5-10 минут, и сразу закрепляю их практическими примерами. Такой подход работает лучше.


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


До конца доходят не все


Открытием для меня стал факт, что не вся группа доходит до конца курса.


По моим наблюдениям, лишь половина студентов пишет финальный проект. Большая часть отсеивается еще на первой части курса. А те, кто дошел до второй части, уже обычно не отваливаются.


Уходят по разным причинам.


Первое — это сложность. Что бы не говорили, а Java — это не самый простой язык. Для написания даже самой простой программы необходимо понять концепцию класса, метода. А чтобы понять, почему нужно писать public static void main(String[] arg) нужно понять еще несколько концепций.


Сравните это с Турбо Паскалем, с которого начинали многие, в том числе и я:


begin
    writeln("Первая программа");
end.

Решать эту проблему, насколько я знаю, школа будет введением дополнительного тестирования. Теперь на Java пойти учиться смогут не все. Пока это на стадии концепта, но шаг явно правильный.


А вторая причина — это как на картинке ниже:



Люди часто думают, что программирование — это когда печатают много текста, и получают за это много денег. Как копирайтер, только денег больше.


Реальность же немного другая. Много рутинного кода, неочевидные баги, постоянный процесс обучения. Это интересно, но не всем.


Такая статистика. Вначале меня это расстраивало, я думал, что может я что-то не так делаю. Сейчас я понимаю, что примерно такая же статистика на большинстве курсов. Сейчас я не парюсь над этим, а обучаю тех людей, кому это интересно.


Идея сервиса


Когда студенты прошли полный курс, пришло время написания финального проекта. Были разные идеи. Предлагали ToDo листы, проекты управления проектами, еще что-то.


Я же хотел сделать что-то простое, но полезное. Мой критерий был простой — смогу ли я и мои друзья пользоваться этим. Под эти требования подошел веб-сервис поиска пищевых добавок.


Идея проста. Покупая какой-то продукт в магазине, вы видите в составе какую-то E-шную добавку. По коду непонятно, насколько это опасно или нет (а есть и опасные добавки, запрещенные во многих странах).


Вы открываете сайт, вбиваете название добавки (номер, одно из альтернативных названий), и получаете сводку по добавке:



Похожие проекты есть. Можно также просто вбить добавку в Гугл, хотя он не всегда корректно показывает информацию.


Но поскольку проект учебный, трудности выше не остановили нас :)


Реализация


Все писали на Java, исходный код проекта на Гитхабе.


Нас было 7 человек, включая меня. Каждый делал пулл реквест, и я, либо же еще один человек из группы, принимал этот пулл реквест.


Реализация проекта заняла примерно месяц — от озвучки идеи до того состояния, который вы видите сейчас.


Парсинг добавок


Первое, что сделал один из студентов, не считая базового создания обвязки вокруг БД (сущности, репозитории и т.д.) — это парсинг добавок из существующего информационного сайта.


Это необходимо было для тестирования остальных моментов. Не нужен дополнительный код для наполнения БД. Быстро спарсив несколько добавок, можно было дальше тестировать UI, сортировку, фильтрацию.


Spring Boot позволяет создать несколько профилей. Профиль — это файл с настройками.


Для dev-окружения мы использовали профиль с локальной СУБД H2 и HTTP портом по умолчанию (8080). Таким образом, при каждом запуске приложения БД очищалась. Парсер в этом случае был той вещью, которая спасала нас.


Поиск и фильтрация


Важный момент — это поиск и фильтрация. Человек в магазине должен быстро тыкнуть код добавки, или какое-то из названий, и получить результат.


Поэтому сущность Добавка имеет несколько полей. Это код добавки, альтернативные названия, описание. Поиск идет по Like по все полям одновременно. И если вы введете [123] либо [амарант], то получите одинаковый результат.


Делали все это на основе спецификаций (Specification). Это часть Spring, которая позволяет описать базовые условия поиска (like по какому-то полю, например), а потом комбинировать эти условия (OR или AND).


Написав десяток спецификаций, можно задавать сложные запросы вида "все опасные добавки-красители, у которых в описании есть слово [красный]".


В плане работы с БД Spring мне кажется очень удобным. Особенно это проявляется в случае работы со сложными запросами. Я понимаю, что это дает свой оверхед, и вручную написанный и оптимизированный SQL запрос будет выполняться быстрее.


Но также я придерживаюсь точки зрения, что не нужно заранее все оптимизировать. Первая версия должна запуститься, работать, и допускать возможность замены отдельных частей. А если пойдет нагрузка — вот эти отдельные части и нужно переписывать.


Security


Все просто. Есть пользователи с ролью ADMIN — они могут редактировать добавки, удалять, добавлять новые.


И есть другие пользователи (зарегистрированные либо нет). Они могут только просматривать список добавок и искать нужные.


Для разделения прав использован Spring Security. Данные пользователей хранятся в БД.


Пользователи могут регистрироваться. Сейчас это ничего не дает. Если студенты продолжат развивать сервис, и вводить какие-то персонализированные функции, то регистрация пригодится.


Адаптивность и Bootstrap


Следующий момент — это адаптивность. В случае с нашим сервисом (по крайней мере так, как мы это видели) большинство пользователей будут с мобильными телефонами. И с мобилки нужно быстро посмотреть добавку.


Чтобы не мучаться с CSS, взяли Bootstrap. Дешево, сердито, и выглядит прилично.


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


Могу сказать только, что я старался по минимуму вмешиваться в работу. Это все же проект студентов. Ну и конечно же ребята смогут поправить потом такие моменты.


Минутка SEO оптимизации


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


По факту, я сделал шаблонную геренацию Title и Description для каждой добавки. URL почти ЧПУ, хотя можно сделать и короче.


Я добавил также счетчики посещаемости. Добавил сайт в Яндекс Вебмастер и Google Search Console, чтобы отслеживать предупреждения от поисковых систем.


Это мало. Нужно еще добавить robots.txt и sitemap.xml для полной индексации. Но опять-таки, это проект студентов. Я им скажу, что нужно сделать, и если захотят — сделают.


Нужно прицепить SSL сертификат. Подойдет и бесплатный Let's Encrypt. Я делал это для Spring Boot. Делается несложно, а доверие ПС повышается.


Что дальше с проектом


Дальше по факту выбор за ребятами. Изначальная идея проекта еще включала в себя БД продуктов с привязками к добавкам.


Вводите "сникерс" и видите, какие в нем есть пищевые добавки.


Еще на старте проекта я знал, что продуктов у нас не будет :) Поэтому начали мы только с добавок.


Сейчас же можно прикрутить продукты, внедрить доп. плюшки. Если это будет обширная БД, пользователи найдутся.


Развертывание


Проект развертывался на VPS, Aruba Cloud. Это самый дешевый VPS, который мы смогли найти. Я пользуюсь этим провайдером уже больше года для своих проектов, и он приятно меня радует.


Характеристики VPS: 1 GB RAM, 1 CPU (за частоту не знаю), 20 GB SSD. Для нашего проекта этого хватает с головой.


Проект собирается обычным mvn clean package. Получается fat jar — исполняемый файл со всеми зависимостями.


Чтобы немного автоматизировать все это, я написал пару баш скриптов.


Первый скрипт удаляет старый jar файл, и собирает новый.


Второй скрипт запускает собранный jar, передавая ему имя нужно профиля. В этом профиле содержатся сведения подключения к БД.


БД — MySQL на этом же VPS.


Итого перезапуск проекта включает в себя:


  • зайти на VPS по SSH
  • скачать последние правки git
  • запустить local-jar.sh
  • убить запущенное приложение
  • запустить launch-production.sh

Занимает эта процедура три минуты. Мне это кажется разумным выбором для такого небольшого проекта.


Сложности


Основные сложности при создании проекта были организационного характера.


Есть группа людей, которые вроде бы и умеют программировать, но не очень. Что-то знают, но применить толком еще не могут. И вот нужно, чтобы они сделали проект за месяц.


Я выделил условного тимлида в этой группе. Он вел гугл док со списком задач, раздавал задачи, контролировал их принятие. Также он принимал пулл реквесты.


Также я попросил студентов, чтобы каждый вечер они писали краткий отчет по сделанной работе по проекту. Не сделали ничего — ок, так и пишите "не сделал ничего". Это отличная практика, которая заставляет немного напрячься. Не все этому правилу следовали, к сожалению.


Цель всей этой движухи была простая. Сформировать команду, пусть и на короткое время, будет работать вместе.


Я хотел, чтобы у ребят было ощущение важности их работы. Понимать, что они не пишут сферический код в вакуме. А что они делают вместе проект, которым потом будут пользоваться люди.


Первую неделю-две была раскачка. Вяло делались сущности, небольшие коммиты. Понемногу я все же их расшевелил, и работа пошла веселее. Общение в чате стало живей, студенты предлагали свои дополнения.


Я считаю, что цель достигнута. Проект сделан, небольшой опыт работы в команде ребята получили. Есть видимый ощутимый результат, который можно показать друзьям, можно дальше развивать.


Выводы


Обучение — это интересно.


После каждой пары я приходил эмоционально взбудораженным. Я стараюсь сделать каждую пару уникальной, и передать максимум знаний.


Приятно, когда группа, которую я обучаю, доходит до финала. Особенно круто, когда ребята пишут "я устроился на работу, все норм, спасибо". Пусть это джуниор, пусть не самые большие деньги сначала. Но самое главное — они сделали шаг навстречу своим желаниям, и у них это получилось.


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

+25
6.2k 54
Comments 24