Hej, Habr. Vi genomförde spontant vÄr första interna hackathon. Jag ville dela med mig av mina smÀrtor och insikter om förberedelserna under tvÄ veckor, samt de projekt som kom till stÄnd.

TrÄkiga delen för dem som Àr intresserade av marknadsföring
Jag börjar med en liten historia.
Början av april. PÄ vÄrt kontor pÄgÄr den första hackathonen för MskDotNet Community. Slaget om Tatooine Àr i full gÄng, i vÄr galax den hÀr gÄngen. Lördag. 20 lag. Pizza. Allt Àr mycket gemytligt (). En uppblÄsbar R2-D2 syns i rummet. Lag skriver de mest korrekta algoritmerna för att klara av det farligaste loppet pÄ kartan. Vi skjuter pÄ starten för de första loppen. Kakor och kaffe rÀddar oss. Vi, arrangörerna, trodde att mÄnga skulle gÄ hem efter lunch pÄ lördagen. Men nej. 12 timmar kodning bakom oss. Finalen. NÄgot faller bort, nÄgot startar inte. Men alla Àr glada. VÄrt lag vinner. Vi Àr glada dubbelt.
Jag delar glÀdjen i Slack och fÄr en idé: "Vi mÄste göra vÄr egen hackathon". Jag skriver till vÄr CTO Sasja. Tystnad.
Morgon. Jag dricker kaffe pÄ kontoret. Jag ser Sasja nÀrma sig bakifrÄn. "Liza, det hÀr Àr utmÀrkt! Vi har precis den 21 april en viktig datum. LÄt oss göra det!" Vad!? SÄ snabbt? Va? Jag mÄste flyga till Syktyvkar för praktik i mitten av april. Men skit i det! LÄt oss köra.
TvĂ„ veckor kvar. Jag har aldrig varit ensam arrangör av en hackathon. Ăven om det Ă€r en intern. Jag lĂ€ser artiklar om det. Hep. Det krĂ€vs flera mĂ„nader. Det krĂ€vs flera personer. Man mĂ„ste tĂ€nka pĂ„ merch, priser, förutsĂ€ttningar, schema, intressera, förstĂ„ syftet, budgetar. Kanske till och med grĂ€va i livets mening. Jag kommer definitivt inte att hinna. Och medan du lĂ€ste och förberedde dig har redan en vecka gĂ„tt. Det Ă€r hög tid att sluta lĂ€sa artiklar och börja göra nĂ„got.
HÀr Àr vÄr checklist för att arrangera en intern hackathon pÄ en vecka
- Plan: sÀtt dig lugnt ner och skriv en lista över vad som mÄste göras för hackathonen. 30 minuter.
- Uppgift: deltagarna föreslÄr sjÀlva och vÀljer projekt de vill skapa i Google Sheets. Bakgrundsuppgift, 2 timmar.
- Schema: skriver snabbt en kort tidsplan med hÀnsyn till 3 pauser och finalen. 20 minuter.
- Kommandon: publicera meddelandet om hackathonen med schemat frÄn CTO i IT-kanaler i Slack/e-post/etc och skapa en separat kanal för hackathonen. I den delar alla upp sig i lag, och de som Àr osÀkra gör det inom de första 5 minuterna av hackathonen. Bakgrundsuppgift, 2 timmar.
- Fördelar: du kommer pÄ merch med tvÄ utvecklare, ger det till designern för illustration, fÄr det klart. Bakgrundsuppgift, 3 dagar.
- Hackathon: du kommer till kontoret, koordinerar alla i början, sysslar med dina grejer, lÀser Reddit, med ett viktigt uttryck meddelar du varje paus om ny pizza, fotograferar solnedgÄngen, annonserar finalen, röstar tillsammans och vÀljer vinnaren. 1 dag.
- Under stjÀrnorna: sjÀlvklart tÀnker du hela tiden pÄ att allt ska gÄ bra. SjÀlvklart fÄr inte alla se ditt meddelande och med vissa Àr det bÀttre att prata personligen. SjÀlvklart, om nÄgon hjÀlper dig, blir allt dubbelt sÄ enkelt (jag fick fantastisk hjÀlp av Alena).
Mindre trÄkig del om hackathonets datum
Varför den 21 april? Denna dag Àr viktig för oss. Exakt ett Är sedan, den 21 april, kollapsade vi under belastning under de första helgerna efter starten av den Federala Reklamekampanjen. Dagen efter, pÄ söndagen, var vÄrt team pÄ jobbet frÄn klockan 8 pÄ morgonen. DÄ skapade vi en Trello-tavla som hette sundayhackathon och veckan av 12 timmars skiftarbete började. Situationen var sÄ kritisk att vi inte ens hade tid att Àta och andra team matade oss.

En mer detaljerad berÀttelse kan du lÀsa pÄ (vÄr CEO). Sedan dess har vi förÀndrat mycket, men datumet kommer vi definitivt inte att glömma.
I Är bestÀmde vi oss för att detta evenemang förtjÀnar att bli ihÄgkommet och i bÀsta tradition arrangerade vi det första interna hackathonet i Dodo-historien som pÄgick i 10 timmar.
Den mest spÀnnande delen om hackathonprojekten
Disclaimer: alla beskrivningar skrevs av killarna sjÀlva, sÄ textens författarskap Àr inte mitt.
Oleg Learning (maskininlÀrning)
Dima Kochnev, Sasha Andronov (@alexandronov)
Vi ville skapa ett neuronnĂ€t som kunde avgöra vilken pizza som fanns pĂ„ fotot utan nĂ„gra förkunskaper. Slutresultatet blev en vĂ€ldigt enkel och leksaksliknande â den kĂ€nner igen 10 olika pizzor, vi fick en ungefĂ€rlig förstĂ„else för hur allt fungerar, sĂ„ lĂ„ngt det Ă€r möjligt pĂ„ en dag (~10 timmar).

Specifikt förstod vi att industrin har nÄtt en nivÄ dÀr en vanlig utvecklare kan ta fÀrdiga bibliotek, lÀsa dokumentationen och trÀna sitt neuronnÀt utan djupgÄende Àmneskunskaper. Och det fungerar tillrÀckligt bra för att lösa verkliga problem.
Verktygen som anvÀndes:
- â ett bekvĂ€mt och enkelt bibliotek för arbete med maskininlĂ€rning och datorseende.
- Vi testade tvĂ„ modeller â ResNet50, Yolo.
- Koden skrevs, förstÄs, i Python.
Vi hade 11000 bilder, men bland dem visade sig nĂ€stan 3/4 vara skrĂ€p, och bland de Ă„terstĂ„ende var det olika, olĂ€mpliga vinklar. SĂ„ smĂ„ningom anvĂ€nde vi en fĂ€rdig modell (som bara kan hitta pizza) och med dess hjĂ€lp sorterade vi ut det mest usla. Dessutom, i bildens namn fanns namnet pĂ„ pizzan â sĂ„ vi delade upp dem i mappar, men det visade sig att namnen inte överensstĂ€mde med verkligheten och hĂ€r fick vi hĂ„lla pĂ„ och rensa för hand. I slutĂ€ndan Ă„terstod cirka 500-600 bilder, det Ă€r uppenbart att detta Ă€r en försvinnande liten mĂ€ngd, men Ă€ndĂ„ var det tillrĂ€ckligt för att sĂ€rskilja 10 pizzor frĂ„n varandra.
För att trÀna nÀtverket anvÀnde vi den billigaste virtuella maskinen i Azure pÄ NVIDIA Tesla K80. Vi trÀnade den i 100 epoker, men det var tydligt att nÀtverket översvÀmmat redan efter 50 epoker, pÄ grund av att datasetet var litet.
Problemet ligger helt enkelt i bristen pÄ bra data.

Vi kanske blandade ihop termerna lite, men man mÄste ta hÀnsyn till att vi överhuvudtaget inte har nÄgon erfarenhet av att arbeta med allt detta.
GUI för NOOBS (terminal för att bestÀlla pizza)
Misha Kumachev (), Zhenya Bikinin, Zhenya Vasiliev
Vi byggde en prototyp av en konsolapplikation för nördar, som gör att man kan bestÀlla pizza via terminalen eller kommandoraden, eller till och med integrera den i deploy-pipelinen och vid framgÄngsrik release leverera pizza till kontoret.

Arbetet delades upp i flera delar: vi hade problem med att förstÄ hur vÄr API för mobilappar var uppbyggd, vi samlade vÄrt eget CLI med hjÀlp av och konfigurerade publiceringen av vÄrt skapade paket. Den senaste uppgiften var relaterad till nÄgra obehagliga minuter nÀra slutet av hackathonet. Allt fungerade lokalt och till och med Àldre publicerade versioner av paketet fungerade, men de nya (dÀr fler coola funktioner och emojis lades till) ville inte fungera. Vi spenderade ungefÀr 40 minuter för att förstÄ vad som hade gÄtt fel, men till slut fungerade allt magiskt av sig sjÀlv).
VÄrt maxmÄl för hackathonet var att göra en verklig pizzaorder till kontoret via vÄrt CLI. Vi testade det flera gÄnger pÄ testservern, men jag var fortfarande nervös nÀr jag skrev in kommandon pÄ produkten.

Som resultat â vi gjorde det faktiskt!

CourierGo
Anton Bruzhmelëv (författare), Vanya Zverev, Gleb Lesnikov (), Andrey Sarafanov
Vi tog idén "App för kuriren".
Bakgrundshistorien om förberedelserna.Jag började med att tÀnka pÄ vilka funktioner som kan finnas i appen? Det blev ungefÀr en sÄdan lista med funktioner:
- Appen loggar in i leveranssystemet med en kod.
- I appen syns omedelbart tillgÀngliga bestÀllningar, de bestÀllningar som mÄste hÀmtas.
- Kuriren markerar bestÀllningen och tar den med pÄ resan.
- Han fÄr se berÀknad tid och om han hinner eller inte.
- Kunden ser att kuriren har gett sig av.
- Kunden börjar se kurirens position pÄ kartan och berÀknad tid.
- Kuriren kan skriva till kunden i chatten frÄn appen.
- Kunden kan skriva till kuriren i chatten frÄn appen.
- Fem minuter innan ankomst fÄr kunden ett meddelande att kuriren Àr nÀra, var beredd.
- Kuriren markerar i appen att han har anlÀnt och vÀntar.
- Kuriren kan ringa frÄn appen med ett klick och informera att (han kommit, Àr pÄ vÀg, etc.)
- Kunden accepterar bestÀllningen och anger pin-koden frÄn appen eller SMS för att bekrÀfta leveransen. (som ett digitalt kvitto) SÄ att kuriren inte kan avsluta leveransen i förvÀg om han Àr sen.
- BestÀllningen markeras som levererad i systemet.
Plus ett par alternativa scenarier:
- Kuriren kan markera bestÀllningen som ej levererad och vÀlja anledning.
- Kuriren kan, vid försening, skicka ett elektroniskt certifikat via SMS med ett klick. Eller sÄ kommer certifikatet automatiskt vid överskridande av leveranstiden.
KĂ€nslan av potential och behovet av detta projekt gav verkligen energi.
NÀsta dag gick vi med teamet pÄ lunch och diskuterade hur den minimala funktionen av appen skulle se ut.
Resultatet blev följande lista över vad som skulle göras under hackathonet:
- Inloggning i leveranssystemet.
- Visa aktuell position.
- Skicka data till extern API (koordinater, plockade bestÀllningar, levererade bestÀllningar).
- HÀmta data frÄn extern API (aktuella bestÀllningar för kuriren).
- Skicka en hÀndelse om att en bestÀllning har tagits för leverans/levert.
- Visa kurirens aktuella position pÄ kartan pÄ webbplatsen.
Huvudarbetet, som jag sĂ„g det, skulle vara att skapa backend, sjĂ€lva appen (efter diskussioner valde vi ReactNative för utveckling av appen, nĂ€rmare bestĂ€mt ett paket ovanför det â , vilket gör att man nĂ€stan inte behöver skriva nĂ„gon egen kod). NĂ€r det gĂ€ller backend fanns det frĂ„n början förhoppningar pĂ„ Vanya Zverev, som Ă€r erfaren i arbetet med vĂ„r tjĂ€nstmall och k8s (det arbete som han tog pĂ„ sig). ReactNative testade jag och Andrei Sarafanov.
Jag beslutade mig för att försöka skapa ett arbetsrepository för sjÀlva projektet direkt. Vid midnatt stötte jag pÄ problemet att geolokalisering fungerar dÄligt i bakgrunden i ReactNative utan att skriva nativ kod, vilket gjorde mig lite frustrerad. Men jag lugnade mig nÀr jag insÄg att jag lÀste dokumentationen för expo.io-ramverket istÀllet för ReactNative. I slutet av kvÀllen förstod jag hur jag skulle fÄ den aktuella positionen i expo.io och rita separata skÀrmar (för inloggning, visning av bestÀllningar osv.).

PÄ morgonen pÄ hackathonet drogs Gleb in i deras superlovande projekt. De skissade snabbt upp en plan för vad som behövde göras.

Vi gjorde ett misstag nĂ€r vi, enligt projektmallen, försökte kommunicera inte via HTTP utan via GRPC, eftersom ingen visste hur man skulle bygga en GRPC-klient för JavaScript. Till slut, efter att ha lagt cirka en och en halv timme pĂ„ det, övergav vi den idĂ©n. PĂ„ grund av detta började killarna i backend renovera den fĂ€rdiga servern frĂ„n GRPC till WebApi. Efter en halvtimme lyckades vi Ă€ntligen stĂ€lla in kommunikationen mellan applikationen och backend, vilket var en otrolig lĂ€ttnad. Men under samma tid höll Gleb pĂ„ att fĂ„ klar sin deployment till k8s, plus autodeployment vid commit till master. đ
Som lagring valde vi MySQL för att inte riskera med databasen (vi hade tankar om CosmosDb).

Slutsatsen:
- Vi implementerade sparandet av kurirens aktuella koordinater frÄn applikationen till databasen.
- Vi kopplade in RabbitMQ och anmÀlde oss till meddelanden om att kuriren tagit emot en bestÀllning, för att omedelbart visa bestÀllningen för kuriren i applikationen.
- Vi började spara tiden för leverans av bestÀllningen i vÄr databas, efter att kuriren tryckt pÄ knappen i applikationen. Vi hann inte lÀgga till att skicka tillbaka hÀndelsen till RabbitMQ om att bestÀllningen var levererad.
- Jag gjorde en kartvisning pÄ sidan currentorder pÄ webbplatsen med kurirens aktuella position. Men denna funktionalitet förblev nÄgot ofullstÀndig, eftersom vi pÄ miljön inte lyckades stÀlla in CORS för att hÀmta koordinater frÄn vÄr nya tjÀnst.
M87
Roma Bukin, Gosha Polevoy (), Artyom Trofimushkin
Vi ville implementera en OpenID Connect-leverantör, eftersom vi för nÀrvarande anvÀnder ett autentiseringsprotokoll av egen utveckling, vilket skapar en rad svÄrigheter: skrÀddarsydda klientbibliotek, besvÀrlig hantering frÄn externa partners och eventuella sÀkerhetsproblem (Àven om OAuth2.0 och OpenID Connect i sin standardimplementation anses vara sÀkra, Àr jag osÀker pÄ vÄr lösning).

Vi skapade en separat tjÀnst som emulerar en tjÀnst för lagring av personuppgifter, för att skapa en liten modell av en land-agnostisk autentiseringstjÀnst, som skulle hÀmta personuppgifter frÄn en separat tjÀnst (detta skulle i framtiden möjliggöra att ha en tjÀnst med vilken man kan logga in med ett konto i vilket land som helst, samtidigt som man följer GDPR och andra lagar). Denna del byggde vi, liksom leverantören, och kopplade dem framgÄngsrikt samman. NÀsta steg var att göra ett API som skulle skyddas med tokens som tillhandahÄlls av leverantören, stödja deras introspektion via leverantören och ge ut skyddade data om förfrÄgan uppfyllde behörighetsvillkoren (vi verifierar att anvÀndaren Àr autentiserad enligt Bearer-schemat, att deras token innehÄller en specifik scope + att anvÀndaren har tillstÄndet som tillÄter anropet). Denna del genomfördes ocksÄ. Den sista komponenten var en JavaScript-klient, som skulle fÄ en token, med hjÀlp av vilken den skulle anropa det skyddade API:et. Denna del hann vi inte klart med. Det vill sÀga, hela den funktionella delen var förberedd, men den front-end del som behövdes för att demonstrera systemets funktionalitet var inte klar.
E-E-E (spel)
Dima Afontjenko, Sasha Konovalov
Vi gjorde en mini-lek pÄ Unity dÀr snabba hÀnder slÀnger korv pÄ pizzan. Om du slÀnger korven felaktigt visas en sorglig text pÄ skÀrmen "Ogiltig", men om hela korven slÀngs korrekt dyker en slumpmÀssig faktum om pizza upp.

Vi ville göra en andra nivÄ dÀr man slÀnger tomater, men hann inte.

Kort fortsÀttning: vem vann?
Innan hackathonet pratade vi med killarna och jag frÄgade vad för pris de skulle vilja ha om de vann. Det visade sig att det mest vÀrdefulla priset skulle vara "vÀgen till produktion".

DÀrför kan ni snart förvÀnta er en tillkÀnnagivande av spelet med kontrollen som kastar pepperoni pÄ pizzan.
Som uppmÀrksamma lÀsare kanske har lagt mÀrke till, vann laget "E-E-E (spelet)". Grattis till grabbarna!
Endast registrerade anvÀndare kan delta i omröstningen. , tack.
Vilket projekt gillade du mest?
Oleg Learning (maskininlÀrning)
GUI för NOOBS
CourierGo
M87
E-E-E
5 anvÀndare röstade. 3 anvÀndare avstod.
KĂ€lla: habr.com
