E-Dobavki – веб-сервіс пошуку харчових добавок на Java та Spring Boot, написаний моїми студентами

Запровадження

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

Моя основна мова - Java. Я писав на ній ігри для мобільних, софт для радіозв'язку та різні веб-сервіси. І викладаю я саме Java.

Тут я хочу розповісти історію навчання останньої своєї групи. Як вони пройшли шлях від початку навчання до написання працюючого веб-сервісу. Корисний веб-сервіс з пошуку харчових добавок. Безкоштовного, без реклами, реєстрації та СМС.

Сам сервіс ось E-Dobavki.com.

E-Dobavki – веб-сервіс пошуку харчових добавок на Java та Spring Boot, написаний моїми студентами

Проект є навчальним, не містить будь-якої реклами. Як я зрозумів з цієї публікаціїможна давати посилання на такі проекти.

Перед описом самого проекту трохи розповім про процес навчання групи, без цього картина буде неповною.

9 місяців навчання

У школі, де я викладаю, курс Java розбитий на дві частини. Сумарно курс займає приблизно 2 місяців, з усіма перервами (новорічні канікули, час написання проміжних проектів).

Перша частина знайомить студентів із базовими поняттями ЯП. Змінні, методи, основи ОВП та всі ці штуки.

Друга частина курсу передбачає, що студент вже більш-менш розуміє, як писати на Java, і йому можна дати «дорослий» стек технологій. Починається все з SQL, далі JDBC, Hibernate. Потім HTTP, сервлет. Далі Spring, трохи про git та maven. І студенти пишуть фінальні проекти.

Все навчання розбите на модулі. Заняття я проводив двічі на тиждень. Тривалість одного заняття – дві години.

Мій підхід до навчання

Я випустив 5 груп. Начебто багато як для двох років, але я майже завжди вів дві групи паралельно.

Я пробував різні підходи.

Перший варіант - це одна пара виділяється на презентацію з теорією. Друга пара — чиста практика. Такий підхід якось працював, але ефективність була не дуже, як на мене.

Другий варіант, до якого я прийшов і яким працюю зараз — це не виділяти цілу пару на теорію. Натомість я міксую короткі відрізки теорії по 5-10 хвилин, і відразу закріплюю їх практичними прикладами. Такий підхід працює краще.

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

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

Відкриттям для мене став факт, що не вся група сягає кінця курсу.

За моїми спостереженнями лише половина студентів пише фінальний проект. Більшість відсівається ще на першій частині курсу. А ті, хто дійшов до другої частини, зазвичай не відвалюються.

Йдуть з різних причин.

Перше – це складність. Що б не говорили, а Java - це не найпростіша мова. Для написання найпростішої програми необхідно зрозуміти концепцію класу, методу. А щоб зрозуміти, чому потрібно писати public static void main(String[] arg) Потрібно зрозуміти ще кілька концепцій.

Порівняйте це з Турбо Паскалем, з якого починало багато, у тому числі і я:

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

Вирішуватиме цю проблему, наскільки я знаю, школа буде запровадженням додаткового тестування. Тепер на Java вчитися зможуть не всі. Поки що це на стадії концепту, але крок явно правильний.

А друга причина - це як на малюнку нижче:

E-Dobavki – веб-сервіс пошуку харчових добавок на Java та Spring Boot, написаний моїми студентами

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

Реальність трохи інша. Багато рутинного коду, неочевидні баги, постійний навчання. Це цікаво, але не всім.

Така статистика. Спочатку мене це засмучувало, я думав, що, може, я щось не так роблю. Зараз я розумію, що приблизно така сама статистика на більшості курсів. Зараз я не парюсь над цим, а навчаю тих людей, кому це цікаво.

ідея сервісу

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

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

Ідея проста. Купуючи якийсь продукт у магазині, ви бачите у складі якусь E-шну добавку. За кодом незрозуміло, наскільки це небезпечно чи ні (а є і небезпечні добавки, заборонені у багатьох країнах).

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

E-Dobavki – веб-сервіс пошуку харчових добавок на Java та Spring Boot, написаний моїми студентами

Подібні проекти є. Можна також просто вбити добавку в Google, хоча він не завжди коректно показує інформацію.

Але оскільки проект навчальний, труднощі вищі не зупинили нас 🙂

Реалізація

Усі писали на Java, вихідний код проекту на Гітхабі.

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

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

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

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

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

Spring Boot дозволяє створити декілька профілів. Профіль – це файл із налаштуваннями.

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

Пошук та фільтрація

Важливий момент – це пошук та фільтрація. Людина в магазині повинна швидко тицьнути код добавки, або якусь із назв, і отримати результат.

Тому сутність добавки має кілька полів. Це код добавки, альтернативні назви, опис. Пошук йде по Like по всіх полях одночасно. І якщо ви введете [123] або [амарант], то отримаєте однаковий результат.

Робили це на основі специфікацій (Specification). Це частина Spring, яка дозволяє описати базові умови пошуку (як по якомусь полю, наприклад), а потім комбінувати ці умови (OR або AND).

Написавши десяток специфікацій, можна ставити складні запити виду «всі небезпечні добавки-барвники, які мають в описі слово [червоний]».

У плані роботи з БД Spring мені здається дуже зручним. Особливо це проявляється у разі роботи зі складними запитами. Я розумію, що це дає свій оверхід, і вручну написаний та оптимізований SQL запит буде виконуватися швидше.

Але також я дотримуюся погляду, що не потрібно все оптимізувати заздалегідь. Перша версія має запуститися, працювати, і допускати можливість заміни окремих частин. А якщо піде навантаження — ось ці окремі частини потрібно переписувати.

Безпека

Все просто. Є користувачі за участю 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: 1GB RAM, 1 CPU (за частоту не знаю), 20GB SSD. Для нашого проекту цього вистачає із головою.

Проект збирається звичайним mvn clean package. Виходить fat jar - файл, що виконується з усіма залежностями.

Щоб трохи автоматизувати все це, я написав пару баш скриптів.

Перший скрипт видаляє старий jar файл і збирає новий.

Другий скрипт запускає зібраний jar, передаючи йому ім'я потрібного профілю. У цьому профілі містяться відомості про підключення до БД.

БД - MySQL на цьому ж VPS.

Разом перезапуск проекту включає:

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

Займає цю процедуру три хвилини. Мені це видається розумним вибором для такого невеликого проекту.

складнощі

Основні складнощі під час створення проекту були організаційного характеру.

Є група людей, які начебто й уміють програмувати, але не дуже. Щось знають, але застосувати до ладу ще не можуть. І ось потрібно, щоби вони зробили проект за місяць.

Я виділив умовного тимлід у цій групі. Він вів Гугл док зі списком завдань, роздавав завдання, контролював їх прийняття. Також він приймав пул реквести.

Також я попросив студентів, щоб щовечора вони писали короткий звіт щодо зробленої роботи з проекту. Не зробили нічого — ок, то й пишіть «не зробив нічого». Це чудова практика, яка змушує трохи напружитися. Не всі це правило слідували, на жаль.

Мета всієї цієї движухи була проста. Сформуватиме команду, нехай і на короткий час, працюватиме разом.

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

Перший тиждень-два було розгойдування. Мляво робилися сутності, невеликі комміти. Потроху я все ж таки їх розворушив, і робота пішла веселіше. Спілкування у чаті стало жвавіше, студенти пропонували свої доповнення.

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

Висновки

Навчання – це цікаво.

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

Приємно, коли група, яку навчаю, доходить до фіналу. Особливо круто, коли хлопці пишуть «я влаштувався працювати, все норм, спасибі». Нехай це джуніор, хай не найбільші гроші спочатку. Але найголовніше — вони зробили крок назустріч своїм бажанням, і це їм вийшло.

Стаття хоч і вийшла досить об'ємною, але всі моменти, звичайно, розкрити не вийшло. Тому пишіть у коментарях ваші запитання.

Джерело: habr.com

Додати коментар або відгук