Ahoj, Habr. Náhodou jsme uspořádali náš první interní hackathon. Rozhodla jsem se podělit o své potíže a závěry z přípravy na něj během 2 týdnů a také o projektech, které vznikly.

Nudná část pro ty, kdo se zajímají o marketing
Začnu malým příběhem.
Začátek dubna. Na našem kancelářském prostoru probíhá první hackathon MskDotNet Community. Bitva o Tatooine je v plném proudu, tentokrát v naší galaxii. Sobota. 20 týmů. Pizza. Všechno je velmi přátelské (). Nafukovací R2-D2 se potuluje po místnosti. Týmy píší ty nejpřesnější algoritmy, aby zvládly nejnebezpečnější závod na mapě. Posouváme start prvních závodů. Sušenky a káva zachraňují. S organizátory jsme očekávali, že v sobotu mnozí odejdou po obědě. Ale ne. 12 hodin kódování je za námi. Finále. Něco vypadává, něco se nespouští. Ale všichni jsou šťastní. Naše tým vítězí. Jsme šťastní dvojnásob.
Sdílím radost na Slacku a do hlavy se mi dere myšlenka: „Musíme uspořádat svůj hackathon.“ Píšu našemu CTO Sašovi. Ticho.
Ráno. Piji kávu v kanceláři. Vidím Sašu přicházejícího zezadu. „Liza, to je skvělé! Právě máme 21. dubna důležitý datum. Dělejme to!“ Cože!? Tak rychle? Co? Musím letět do Syktyvkaru na stáž v polovině dubna. A co na tom záleží! Jdeme do toho.
Zbývají 2 týdny. Nikdy jsem nebyla jediným organizátorem hackathonu. Ať už je interní. Čtu články na toto téma. Hrůza. Potřebuje to několik měsíců. Potřebuje to několik lidí. Je potřeba promyslet merč, ceny, podmínky, rozvrh, zaujmout, pochopit cíl, rozpočty. Možná se dokonce i vyrovnat se smyslem života. Určitě to nestihnu. A zatímco jsi čtení a připravoval se, už uplynul týden. Je nejvyšší čas hodit články za hlavu a začít něco dělat.
Tady máte náš checklist pro konání interního hackathonu za 1 týden
- Plán: v klidu si sednete a napíšete seznam toho, co je třeba udělat pro hackathon. 30 minut.
- Úloha: účastníci sami navrhují a vybírají projekty, které chtějí vytvořit, v Google Sheets. Pozadí úkolu, 2 hodiny.
- Rozvrh: na koleni píšete krátké časové rozčlenění s ohledem na 3 přestávky a finále. 20 minut.
- Príkazy: publikujete zprávu o hackathonu s rozvrhem od CTO v IT kanálech na Slacku/poště/etc a vytváříte zvláštní kanál pro hackathon. V něm se všichni rozdělují do týmů, zatímco ti, kdo se nerozhodli, to udělají během prvních 5 minut hackathonu. Pozadí úkolu, 2 hodiny.
- Dárečky: vymyslíš merch s dvoma vývojármi, odovzdáš ho dizajnérovi na spracovanie, dostaneš hotový. Pozadia úloha, 3 dni.
- Hackathon: prídeš do kancelárie, na začiatku koordinuješ všetkých, venuješ sa svojim záležitostiam, čítaš Reddit, s dôležitým výrazom oznamuješ počas každého prestávku čerstvú pizzu, fotografuješ západ slnka, vyhlasuješ finále, spoločne hlasujete a vyberáte víťaza. 1 deň.
- Pod hviezdičkou: samozrejme, neustále myslíš na to, aby všetko prebehlo hladko. Samozrejme, nie všetci uvidia tvoju správu a s niektorými je lepšie hovoriť osobne. Samozrejme, ak ti niekto pomôže, všetko bude dvakrát jednoduchšie (pomoc mi poskytla skvelá Alena).
Menej nudná časť o dátume hackathonu
Prečo 21. apríla? Tento deň je pre nás významný. Presne pred rokom, 21. apríla, sme zlyhali pod záťažou počas prvého víkendu po spustení Federálnej Reklamnej Kampane. Na druhý deň, v nedeľu, bola naša tím v práci od 8 ráno. Vtedy sme v Trello vytvorili nástenku sundayhackathon a začal týždeň zmennej práce po 12 hodín denne. Situácia bola tak kritická, že sme nemali čas ani na jedlo a boli sme kŕmení chlapcami z iných tímov.

Podrobnejší príbeh si môžete prečítať na (nášho CEO). Odvtedy sme veľa zmenili, ale na tento dátum určite nezabudneme.
Tento rok sme sa rozhodli, že tento event stojí za to uchovať v pamäti budúcich generácií a v najlepších tradíciách sme usporiadali prvý v histórii Dodo interný hackathon, ktorý trval 10 hodín.
Najzábavnejšia časť o projektoch hackathonu
Návrh: všetky popisy písali samotní chalani, takže autorsk právny text nie je môj.
Oleg Lörning (strojové učenie)
Dima Kochnyev, Sasha Andronov (@alexandronov)
Chceli sme vytvoriť neurónovú sieť, ktorá by určovala, aká pizza je na fotografii bez akýchkoľvek znalostí. Nakoniec sme vytvorili veľmi jednoduchú a hračku – rozpoznáva 10 pizz, zhruba sme sa zorientovali, ako to všetko funguje, čo je možné za deň (~10 hodín).

Konkrétne sme pochopili, že priemysel dosiahol úroveň, keď bežný vývojár môže vziať hotové knižnice, prečítať si dokumentáciu a vytrénovať svoju neurónovú sieť bez hlbokých znalostí predmetu. A bude dostatočne dobre fungovať pri riešení reálnych úloh.
Nástroje, ktoré sme používali:
- — pohodlná a jednoduchá knižnica na prácu s strojovým učením a počítačovým videním.
- Vyskúšali sme modely – ResNet50, Yolo.
- Kód sme písali, samozrejme, v Pythone.
Mali sme 11000 fotiek, ale medzi nimi sa takmer 3/4 ukázali ako odpad, a v tých zostávajúcich boli rôzne nevhodné uhly. Nakoniec sme zobrali hotový model (ktorý len dokáže nájsť pizzu) a s jeho pomocou sme oddelili ten najhorší materiál. Následne sme podľa názvu fotky, ktorý obsahoval názov pizze, rozdelili do priečinkov, ale ukázalo sa, že názvy sa s realitou nezhodujú, a tak sme museli popracovať ručne. Nakoniec ostalo asi 500-600 fotiek, čo je jasne zanedbateľné množstvo, ale aj tak to bolo dosť na to, aby sme oddelili 10 píz z jednej od druhej.
Na školenie siete sme vzali najlacnejšiu virtuálnu mašinu v Azure s NVIDIA Tesla K80. Na nej sme trénovali počas 100 epoch, ale bolo vidno, že sieť už po 50 epochách stratila svoju kapacitu, kvôli malému dátovému súboru.
Vlastne – celým problémom je nedostatok kvalitných dát.

Možno sme trošku zamieňali termíny, ale treba brať do úvahy, že vôbec nemáme skúsenosti so všetkými týmito vecami.
GUI for NOOBS (terminál pre objednávku pizze)
Misha Kumačov (), Ženya Bikkinin, Ženya Vasiliev
Vytvorili sme prototyp konzolovej aplikácie pre geekov, vďaka ktorej si môžete objednať pizzu cez terminál alebo príkazový riadok, alebo ju dokonca integrovať do deploy pipeline a pri úspešnom releese doručovať pizzu do kancelárie.

Práca sa rozdelila na niekoľko častí: zaoberali sme sa tým, ako funguje náš API pre mobilné aplikácie, vytvorili sme vlastný CLI s pomocou a nastavovali zverejnenie námi vytvoreného balíka. S poslednou úlohou bolo niekoľko nepríjemných minút bližšie ku koncu hackathonu. Všetko nám fungovalo lokálne a dokonca aj staré publikované verzie balíka, ale nové (v ktorých bolo pridaných viac skvelých funkcií a smajlíkov) nechceli fungovať. Strávili sme asi 40 minút snažením sa pochopiť, čo sa pokazilo, ale nakoniec to magicky začalo fungovať samo).
Našim maximálnym cieľom počas hackathonu bola skutočná objednávka pizze do kancelárie cez našu CLI. Desaťkrát sme všetko prehnali na testovacom prostredí, ale aj tak sa mi trasli ruky, keď som zadával príkazy v produkcii.

Ako výsledok – predsa sme to dokázali!

CourierGo
Anton Bruzmelëv (author), Vanya Zverev, Gleb Lesnikov (), Andrey Sarafanov
We took the idea of "Courier Application."
Background preparation.Initially, I considered what features could be in the application. A list of functionalities emerged:
- The application logs into the delivery service with a code.
- Available orders and orders that need to be picked up are displayed in the app.
- The courier marks the order and takes it on the trip.
- They are shown the estimated time and whether they will make it on time.
- The client sees that the courier has departed.
- The client starts seeing the courier's location on the map and the estimated time.
- The courier can chat with the client from the app.
- The client can chat with the courier from the app.
- Five minutes before arrival, the client receives a message that the courier is close, please be ready.
- The courier marks in the application that they have arrived and are waiting.
- The courier can call from the app with one click and inform that they are arriving.
- The client accepts the order and enters the pin code from the app or SMS to confirm delivery (like a signature). This is to prevent the courier from completing the delivery early if they are late.
- The order is marked as delivered in the system.
Plus a couple of alternative scenarios:
- The courier can mark the order as undelivered and choose a reason.
- If the courier is late, they can issue an electronic certificate via SMS with one button. Or the certificate is automatically sent if the delivery deadline is not met.
The sense of the project's potential and necessity surely energized us.
The next day, we went to lunch with the team and discussed what the minimal functionality of the application would look like.
In the end, the following list of tasks that needed to be accomplished at the hackathon emerged:
- Login to the delivery service.
- Display the current location.
- Send data to the external API (coordinates, order picked up, order delivered).
- Receive data from the external API (current orders of the courier).
- Send an event indicating that the order has been picked up for delivery/delivered.
- Display the current location of the courier on the map on the website.
The main work, as it seemed, was to create the backend, the application itself (after discussions, we chose ReactNative for the application development, specifically a framework over it — , čo umožňuje vôbec nepísať natívny kód). Z hľadiska backendu bola pôvodne nádej na Vaniu Zvereva, ako skúseného v práci s našou šablónou služby a k8s (čo si vzal na seba). ReactNative sme vyskúšali s Andrejom Sarafanovom.
Rozhodol som sa okamžite vytvoriť pracovný repozitár pre samotný projekt. O polnoci som narazil na problém, že geolokácia v ReactNative zle funguje na pozadí, ak nepíšete natívny kód, trochu ma to frustrovalo. Potom ma to pustilo, keď som si uvedomil, že čítam dokumentáciu nie pre framework expo.io, ale pre ReactNative. Nakoniec som už v ten večer pochopil, ako získať aktuálnu polohu v expo.io a vykresliť samostatné obrazovky (pre prihlásenie, zobrazenie objednávky atď.).

Ráno nás na hackathone do svojho ultraperspektívneho projektu vtiahol Gleb. Rýchlo sme spísali plán toho, čo je potrebné urobiť.

Urobili sme chybu, keď sme sa v súlade so šablónou projektu pokúsili robiť komunikáciu nie cez HTTP, ale cez GRPC, pretože nikto nevedel zostaviť GRPC klienta pre JavaScript. Nakoniec, po približne hodine a pol, sme túto myšlienku opustili. Z tohto dôvodu chlapci začali na backende prestavovať existujúci server z GRPC na WebApi. Po pol hodine sme nakoniec dokázali nastaviť komunikáciu aplikácie s backendom, ó zázrak. Ale zároveň Gleb takmer dokončil nasadenie do k8s a automatické nasadenie po commite do masteru. 🙂
Ako úložisko sme si vybrali MySQL, aby sme aspoň neriskovali s databázou (mali sme myšlienky na CosmosDb).

Nakoniec:
- Realizovali sme ukladanie aktuálnych súradníc kuriéra z aplikácie do databázy.
- Pripojili sme RabbitMQ a prihlásili sa na správy o prevzatí objednávky kuriérom, aby sme ju ihneď zobrazili kuriérovi v aplikácii.
- Začali sme si do databázy ukladať čas doručenia objednávky, po tom, čo kuriér stlačil tlačidlo v aplikácii. Nestihli sme pridať odosielanie udalosti späť do RabbitMQ o tom, že objednávka bola doručená.
- Urobil som zobrazenie mapy na stránke currentorder na stránke s aktuálnou polohou kuriéra. Ale táto funkcia zostala trochu nedokončená, pretože sa nám na prostredí nepodarilo nastaviť CORS na získanie súradníc z našej novej služby.
M87
Roma Bukin, Goša Polevoj (), Artyom Trofimushkin
Chceli sme implementovať poskytovateľa OpenID Connect, pretože momentálne používame vlastný autentifikačný protokol, čo spôsobuje niekoľko ťažkostí: prispôsobené klientské knižnice, nepríjemná spolupráca zo strany externých partnerov a potenciálne problémy s bezpečnosťou (napokon, OAuth2.0 a OpenID Connect v štandardnej implementácii môžeme považovať za bezpečné, ale čo sa týka nášho riešenia, nie som si istý).

Vytvorili sme samostatnú službu, ktorá emuluje službu na ukladanie osobných údajov, aby sme vytvorili malý model Country-Agnostic poskytovateľa autentifikácie, ktorý by získaval osobné údaje z oddelenej služby (toto by v budúcnosti umožnilo mať jednu službu, prostredníctvom ktorej by bolo možné prihlásiť sa pomocou účtu v akejkoľvek krajine a zároveň splniť GDPR a iné zákony). Túto časť sme urobili, rovnako ako poskytovateľa, a úspešne ich prepojili. Ďalej bolo potrebné vytvoriť API, ktoré by bolo chránené tokenmi vydávanými poskytovateľom, podporovať ich introspekciu cez poskytovateľa a odovzdávať chránené údaje, ak by požiadavka vyhovovala autorizačným politikám (kontrolujeme, že používateľ je autentifikovaný podľa schémy Bearer, v jeho tokene sa nachádza určitý scope + sám používateľ má povolenie na vykonanie volania). Táto časť bola tiež úspešne dokončená. Poslednou súčasťou bol JavaScript klient, ktorý by bol vybavený tokenom, ktorý by používal na volanie chráneného API. Túto časť sme nestihli urobiť. To znamená, že celá funkčná časť bola pripravená, ale nebola hotová front-endová časť na demonštráciu funkčnosti celého systému.
E-E-E (hračka)
Dima Afončenko, Sasha Konovalov
Vytvorili sme mini-hračku na yunke, kde hravé ruky hádžu klobásku na pizzu. Ak si klobásku hodil nesprávne, na obrazovke sa objaví smutný nápis 'Zamietnuté', a ak je celá klobása správne pridaná, objaví sa náhodný fakt o pizzi.

Chceli sme spraviť druhú úroveň s pridávaním paradajok, ale nestihli sme to.

Krátke pokračovanie: kto vyhral?
Pred hackatónom sme sa rozprávali s chlapcami a pýtala som sa, akú cenu by chceli získať, ak vyhrajú. Ukázalo sa, že najcennejšou cenou by bola 'cesta do produkcie'.

Preto v blízkej dobe očakávajte od nás oznámenie hry so zápalkami, ktoré posypávajú pizzu pepperoním.
Ako mohol všimnúť pozorný čitateľ, vyhral tím „E-E-E (hra)“. Gratulujeme chlapcom!
Len registrovaní používatelia sa môžu zúčastniť prieskumu. , prosím.
Ktorý projekt sa vám páčil najviac?
Oleg Lörning (strojové učenie)
GUI pre NOOBs
CourierGo
M87
E-E-E
Hlasovalo 5 používateľov. Zdržali sa 3 používatelia.
Zdroj: habr.com
