Bună, Habr. Am organizat spontan prima noastră hackathon intern. Am decis să împărtășesc cu voi durerile și concluziile mele despre pregătirea pentru acesta în ultimele 2 săptămâni, precum și proiectele care au rezultat.

Partea plictisitoare pentru cei interesați de marketing
Încep cu o mică poveste.
La începutul lui aprilie. La biroul nostru are loc primul hackathon al comunității MskDotNet. Bătălia pentru Tatooine este în toi, în galaxia noastră de data aceasta. Sâmbătă. 20 de echipe. Pizza. Totul foarte prietenos (). R2-D2 umflabil se furișează prin sală. Echipele scriu cele mai corecte algoritmi pentru a finaliza cea mai periculoasă cursă de pe hartă. Am întârziat startul primelor curse. Biscuiții și cafeaua ne salvează. Noi, cu organizatorii, ne așteptam ca sâmbătă mulți vor pleca după-amiază. Dar nu. 12 ore de codare au trecut. Finalul. Ceva se oprește, ceva nu pornește. Dar toți sunt fericiți. Echipa noastră câștigă. Suntem fericiți de două ori.
Împărtășesc bucuria în Slack și îmi vine o idee: „Trebuie să organizăm hackathon-ul nostru”. Îi scriu CTO-ului nostru, Sasha. Tăcere.
Dimineața. Beau cafea la birou. Îl văd pe Sasha apropiindu-se din spate. „Liza, este grozav! Tocmai avem o dată importantă pe 21 aprilie. Haide să organizăm!” WTF!? Așa de repede? Huh? Trebuie să plec în Syktyvkar pentru un stagiu la mijlocul lui aprilie. Dar ce contează! Haide.
Mai rămân 2 săptămâni. Nu am fost niciodată organizator unic al unui hackathon. Chiar dacă este unul intern. Citesc articole pe această temă. Groaznic. Ai nevoie de câteva luni. Ai nevoie de câțiva oameni. Trebuie să te gândești la merchandise, premii, condiții, program, să implici, să înțelegi scopul, bugetele. Poate chiar să îți dai seama de sensul vieții. Cu siguranță nu voi reuși. Și în timp ce citeai și te pregăteai, a trecut deja o săptămână. E momentul să ne concentrăm pe acțiune și să facem ceva.
Primiți lista noastră de verificare pentru organizarea unui hackathon intern în 1 săptămână
- Plan: te așezi liniștit și scrii lista cu ceea ce trebuie realizat pentru hackathon. 30 de minute.
- Sarcină: participanții propun și aleg singuri proiectele pe care doresc să le creeze în Google Sheets. Sarcina de fond, 2 ore.
- Programul: scrii rapid o scurtă despărțire pe timp cu 3 pauze și finalul în minte. 20 de minute.
- Comenzi: publici un mesaj despre hackathon cu programul de la CTO în canalele IT din Slack/email/etc. și creezi un canal separat pentru hackathon. Acolo, toți se împart în echipe, iar cei care nu s-au decis fac asta în primele 5 minute ale hackathon-ului. Sarcina de fond, 2 ore.
- Beneficii: creezi merch cu doi dezvoltatori, îl predai designerului pentru ilustrare, primești finished. Task de fond, 3 zile.
- Hackathon: ajungi la birou, coordonezi pe toată lumea la început, te ocupi de treburile tale, citești Reddit, comunici cu importantă despre pizza proaspătă la fiecare pauză, fotografiezi apusul, anunți finala, votați împreună și alegeți câștigătorul. 1 zi.
- Sub stea: desigur, te gândești constant că totul va decurge bine. Desigur, nu toată lumea va vedea mesajul tău și cu unii este mai bine să discuți personal. Desigur, dacă cineva te ajută, va fi de două ori mai ușor (m-a ajutat minunata Alena).
Partea mai puțin plictisitoare despre data hackathonului
De ce 21 aprilie? Această zi este semnificativă pentru noi. Exact acum un an, pe 21 aprilie, am căzut sub încărcătură în timpul primelor weekenduri după startul Campaniei Federale de Publicitate. A doua zi, duminică, echipa noastră a fost la lucru de la 8 dimineața. Atunci am creat în Trello tabloul sundayhackathon și a început săptămâna de muncă în ture de 12 ore pe zi. Situația era atât de critică încât nu aveam timp nici măcar să mâncăm și am fost hrăniți de colegii din alte echipe.

O poveste mai detaliată puteți citi pe (CEO-ul nostru). De atunci, am făcut multe schimbări, dar acum nu vom uita cu siguranță data.
Anul acesta am decis că acest eveniment merită să fie păstrat în memorie și, în cele mai bune tradiții, am organizat primul hackathon intern în istoria Dodo, care a durat 10 ore.
Partea cea mai puțin plictisitoare despre proiectele hackathonului
Disclaimer: toate descrierile au fost scrise de colegi, deci autoratul textului nu este al meu.
Oleg Learning (învățare automată)
Dima Kočnețev, Sasha Andronov (@alexandronov)
Au vrut să creeze o rețea neurală care să determine ce pizza este în fotografie fără cunoștințe anterioare. În cele din urmă, au făcut una foarte simplă și jucăușă – recunoaște 10 tipuri de pizza, aproximativ au înțeles cum funcționează totul, cât de mult este posibil într-o zi (~10 ore).

În special, am înțeles că industria a ajuns la un nivel în care un dezvoltator obișnuit poate lua librării gata făcute, citi documentația și să-și antreneze rețeaua neurală fără cunoștințe profunde de subiect. Și va funcționa destul de bine pentru a rezolva probleme reale.
Instrumente utilizate:
- — o bibliotecă convenabilă și simplă pentru lucru cu învățarea automată și viziunea computerizată.
- Am încercat două modele – ResNet50, Yolo.
- Codul a fost scris, bineînțeles, în Python.
Am avut 11000 de fotografii, dar dintre ele aproape 3/4 s-au dovedit a fi de calitate slabă, iar în cele rămase – unghiuri diferite și necorespunzătoare. În cele din urmă, am folosit un model gata făcut (care doar știe să identifice pizza) și cu ajutorul acestuia am eliminat cele mai slabe imagini. Apoi, în denumirea fotografiei era numele pizzei — așa am organizat totul în foldere, dar s-a dovedit că numele nu coincid cu realitatea și a trebuit să curățăm manual. În cele din urmă, au rămas aproximativ 500-600 de fotografii, e clar că este o cantitate nesemnificativă, dar totuși a fost suficient pentru a distinge 10 tipuri diferite de pizza.
Pentru antrenarea rețelei am folosit cea mai ieftină mașină virtuală din Azure cu NVIDIA Tesla K80. Pe aceasta am antrenat timp de 100 de epoci, dar era clar că rețeaua s-a saturat deja după 50 de epoci, din cauza faptului că setul de date era mic.
Practically, întreaga problemă este lipsa datelor de calitate.

Poate că am amestecat puțin terminologia, dar trebuie să ținem cont că nu avem deloc experiență în ceea ce privește toate aceste activități.
GUI pentru NOOBS (interfața pentru comanda de pizza)
Misha Kumachev (), Zhenya Bikkinin, Zhenya Vasiliev.
Am adunat un prototip de aplicație console pentru pasionați, prin care se poate comanda pizza direct din terminal sau linia de comandă, sau chiar să o integrăm în pipeline-ul de implementare, livrând pizza în birou la un release reușit.

Munca a fost împărțită în mai multe părți: am studiat cum funcționează API-ul nostru pentru aplicațiile mobile, am construit propriul nostru CLI folosind și am configurat publicarea pachetului adunat de noi. Ultima sarcină a fost legată de câteva momente neplăcute spre sfârșitul hackathon-ului. Totul funcționa local și chiar versiunile vechi publicate ale pachetului erau operaționale, dar cele noi (în care au fost adăugate mai multe caracteristici interesante și emoticoane) refuzau să funcționeze. Am petrecut aproximativ 40 de minute încercând să înțelegem ce s-a întâmplat, dar în cele din urmă, totul a funcționat ca prin magie).
Obiectivul nostru principal la hackathon a fost de a realiza o comandă reală de pizza în birou prin CLI-ul nostru. Am testat de zeci de ori pe un mediu de testare, dar mi se învârtea totuși stomacul când introduceam comenzile în producție.

Ca rezultat — totuși, am reușit!

CourierGo
Anton Brujmeliev (autor), Vania Zverev, Gleb Lesnikov (), Andrei Sarafanov
Am luat ideea „Aplicație pentru curier”.
Povestea de fond despre pregătire.Inițial m-am gândit ce funcționalități ar putea avea aplicația. A apărut o listă aproximativă a funcționalităților:
- Aplicația se loghează în sistemul de livrare prin cod.
- În aplicație sunt vizibile imediat comenzile disponibile, comenzile care trebuie preluate.
- Curierul marchează comanda și o ia în călătorie.
- I se arată timpul estimat și dacă va ajunge la timp sau nu.
- Clientul este informat că curierul a plecat.
- Clientul poate vedea pe hartă poziția curierului și timpul estimat.
- Curierul poate scrie clientului în chat din aplicație.
- Clientul poate scrie curierului în chat din aplicație.
- Cu cinci minute înainte de sosire, clientul primește un mesaj că curierul este aproape, să fie pregătit.
- Curierul marchează în aplicație că a sosit și așteaptă.
- Curierul poate suna din aplicație cu un singur click și să informeze că (se ridică, a ajuns etc.)
- Clientul acceptă comanda și introduce codul PIN din aplicație sau SMS pentru confirmarea livrării. (ca o semnătură) Pentru a preveni curierul să finalizeze livrarea prea devreme, dacă este întârziat.
- Comanda este marcată în sistem ca livrată.
Plus câteva scenarii alternative:
- Curierul poate marca comanda ca nedistribuită și alege un motiv.
- Curierul, în caz de întârziere, poate emite un certificat electronic prin SMS cu un singur click. Sau certificatul vine automat în cazul nerespectării termenului de livrare.
Sentimentul de perspective și utilitate al acestui proiect, desigur, a energizat.
A doua zi, am mers cu echipa la prânz și am discutat despre cum va arăta funcționalitatea minimă a aplicației.
În final, s-a format următoarea listă a ceea ce trebuia să facem la hackathon:
- Logare în sistemul de livrare.
- Afișarea locației curente.
- Trimiterea datelor către un API extern (coordonate, comanda preluată, comanda livrată).
- Obținerea datelor dintr-un API extern (comenzile curente ale curierului).
- Trimiterea unui eveniment despre faptul că a preluat comanda pentru livrare/ a livrat.
- Afișarea poziției curierului pe hartă pe site.
Principala muncă, după cum se vedea, urma să fie în crearea backend-ului, a aplicației (după discuții, am ales ReactNative pentru dezvoltarea aplicației, mai precis o legătură deasupra acesteia — , care permite să nu scrii deloc cod nativ). În ceea ce privește backend-ul, inițial existau speranțe în Vania Zverev, ca fiind un expert în lucrul cu șablonul nostru de serviciu și k8s (ceea ce el a și preluat). Eu și Andrei Sarafanov am început să lucrăm cu ReactNative.
Am decis să încerc să creez imediat un depozit funcțional pentru proiect. La miezul nopții, am descoperit că geolocația în ReactNative funcționează prost în fundal, dacă nu scrii cod nativ, ceea ce m-a făcut puțin frustrat. Apoi mi-a trecut când am realizat că citesc documentația pentru cadrul expo.io, nu pentru ReactNative. În cele din urmă, în această seară mi-a fost clar cum să obțin poziția actuală în expo.io și să creez ecrane separate (pentru login, afișarea comenzii etc.).

Dimineața, la hackathon, l-am atras pe Gleb în proiectul nostru extrem de promițător. Am schițat rapid un plan pentru ce trebuie să facem.

Am făcut o greșeală când, conform șablonului proiectului, am încercat să facem comunicația nu prin HTTP, ci prin GRPC, deoarece nimeni nu știa să construiască un client GRPC pentru JavaScript. În cele din urmă, după ce am pierdut aproximativ o oră și jumătate, am abandonat această idee. Din această cauză, băieții au început să refacă serverul existent de la GRPC la WebApi. După o jumătate de oră, în sfârșit am reușit să configurăm comunicarea aplicației cu backend-ul, minunat. Dar în același timp, Gleb aproape finalizase deploy-ul în k8s și plus auto-deploy-ul pe commit-ul în master. 🙂
Ca stocare, am ales MySQL pentru a nu risca cu baza (erau gânduri despre CosmosDb).

În concluzie:
- Am implementat salvarea coordonatelor curente ale curierului din aplicație în bază.
- Am adăugat RabbitMQ și ne-am abonat la mesajele despre acceptarea comenzii de către curier, pentru a putea afișa imediat comanda în aplicație.
- Am început să salvăm în baza noastră timpul de livrare a comenzii, după ce curierul apăsa butonul în aplicație. Nu am reușit să adăugăm trimiterea unui eveniment înapoi în RabbitMQ despre faptul că comanda a fost livrată.
- Am realizat afișarea hărții pe pagina currentorder de pe site cu poziția curentă a curierului. Dar această funcționalitate a rămas puțin neterminată, deoarece în mediu nu am reușit să configurăm CORS pentru a obține coordonatele din noul nostru serviciu.
M87
Roma Bukin, Gosha Polevoy (), Artem Trofimushkin
Am dorit să implementăm un furnizor OpenID Connect, deoarece în prezent utilizăm un protocol de autentificare dezvoltat intern, iar acest lucru creează o serie de dificultăți: biblioteci client personalizate, interacțiune incomodă din partea partenerilor externi, posibil probleme de securitate (totuși, implementarea standard a OAuth2.0 și OpenID Connect poate fi considerată sigură, iar în ceea ce privește soluția noastră – nu sunt sigur).

Am creat un serviciu separat care emulează un serviciu de stocare a datelor personale, pentru a construi un model mic de furnizor de autentificare indiferent de țară, care să acceseze datele personale într-un serviciu separat (aceasta, pe termen lung, ar permite să existe un singur serviciu prin care să te conectezi cu un cont din orice țară și, în același timp, să respectăm GDPR și alte reglementări). Am realizat această parte, la fel ca și furnizorul, și le-am legat cu succes. Apoi, a fost necesar să facem un API, care să fie protejat prin token-uri emise de furnizor, să susținem introspecția acestora prin furnizor și să returnăm datele protejate, dacă cererea respecta politicile de autorizare (verificăm că utilizatorul este autentificat conform schemei Bearer, token-ul său conține un anumit scope + utilizatorul în sine are permisiunea care permite executarea apelului). Această parte a fost de asemenea realizată. Ultimul component a fost un client JavaScript, căruia îi va fi emis un token, cu ajutorul căruia acesta va apela API-ul protejat. Această parte nu am reușit să o completăm. Așa că toată partea funcțională a fost gata, dar partea de front-end pentru demonstrerea funcționalității întregului sistem nu a fost pregătită.
E-E-E (joc)
Dima Afoncenko, Sasha Konovalov
Am realizat un mini-joc în care mânuțele rapide pun cârnați pe pizza. Dacă ai pus cârnații greșit, pe ecran apare mesajul trist „Respins”, iar dacă toți cârnații sunt puși corect, apare un fapt aleator despre pizza.

Am vrut să facem un al doilea nivel cu aruncarea roșiilor, dar nu am reușit.

Scurtă continuare: cine a câștigat?
Înainte de hackathon, am avut o discuție cu băieții și am întrebat ce premiu și-ar dori să primească în cazul în care câștigă. S-a dovedit că cel mai valoros premiu ar fi „drumul în producție”.

Așadar, așteptați în curând de la noi un anunț despre jocul cu mâinile care aruncă peperoni pe pizza.
După cum a observat cititorul atent, echipa «E-E-E (jocul)» a câștigat. Felicitări băieților!
Numai utilizatorii înregistrați pot participa la sondaj. , vă rugăm.
Care proiect v-a plăcut cel mai mult?
Oleg Learning (învățare automată)
GUI pentru NOOBS
CourierGo
M87
E-E-E
5 utilizatori au votat. 3 utilizatori s-au abținut.
Sursa: habr.com
