E-Dobavki - вэб-сэрвіс пошуку харчовых дабавак на Java і Spring Boot, напісаны маімі студэнтамі

Увядзенне

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

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

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

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

E-Dobavki - вэб-сэрвіс пошуку харчовых дабавак на Java і Spring Boot, напісаны маімі студэнтамі

Праект з'яўляецца навучальным, не змяшчае якой-небудзь рэкламы. Як я зразумеў з гэтай публікацыі, можна даваць спасылкі на такія праекты.

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

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 пайсці вучыцца змогуць не ўсё. Пакуль гэта на стадыі канцэпта, але крок відавочна правільны.

А другая прычына – гэта як на малюнку ніжэй:

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, якая дазваляе апісаць базавыя ўмовы пошуку (like па нейкім полі, напрыклад), а потым камбінаваць гэтыя ўмовы (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: 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

Займае гэтая працэдура тры хвіліны. Мне гэта падаецца разумным выбарам для такога невялікага праекту.

складанасці

Асноўныя цяжкасці пры стварэнні праекту былі арганізацыйнага характару.

Ёсць група людзей, якія нібыта і ўмеюць праграмаваць, але не вельмі. Нешта ведаюць, але прымяніць толкам яшчэ не могуць. І вось трэба, каб яны зрабілі праект за месяц.

Я вылучыў умоўнага тымліда ў гэтай групе. Ён вёў гугл док са спісам задач, раздаваў задачы, кантраляваў іх прыняцце. Таксама ён прымаў пул рэквесты.

Таксама я папрасіў студэнтаў, каб кожны вечар яны пісалі кароткую справаздачу па зробленай працы па праекце. Не зрабілі нічога - ок, так і пішыце "не зрабіў нічога". Гэта выдатная практыка, якая прымушае крыху напружыцца. Не ўсё гэтаму правілу прытрымліваліся, на жаль.

Мэта ўсёй гэтай дзвіжухі была простая. Сфарміраваць каманду, няхай і на кароткі час, будзе працаваць разам.

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

Першы тыдзень-два было разварушванне. Млява рабіліся сутнасці, невялікія коміты. Патроху я ўсё ж іх разварушыў, і праца пайшла весялей. Зносіны ў чаце сталі больш жыва, студэнты прапаноўвалі свае дапаўненні.

Я лічу, што мэта дасягнута. Праект зроблены, невялікі досвед працы ў камандзе хлопцы атрымалі. Ёсць бачны адчувальны вынік, які можна паказаць сябрам, можна далей развіваць.

Высновы

Навучанне - гэта цікава.

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

Прыемна, калі гурт, які я навучаю, даходзіць да фіналу. Асабліва крута, калі хлопцы пішуць "я ўладкаваўся на працу, усё нормаў, дзякуй". Няхай гэта джуніёр, няхай не самыя вялікія грошы спачатку. Але самае галоўнае - яны зрабілі крок насустрач сваім жаданням, і ў іх гэта атрымалася.

Артыкул хоць і атрымаўся даволі аб'ёмным, але ўсе моманты вядома ж раскрыць не атрымалася. Таму пішыце ў каментарах вашыя пытанні.

Крыніца: habr.com

Дадаць каментар