Hallo, Habr. Wir haben spontan unseren ersten internen Hackathon durchgefĂŒhrt. Ich wollte meine Schmerzen und Schlussfolgerungen zur Vorbereitung innerhalb von 2 Wochen mit euch teilen, sowie die Projekte, die entstanden sind.

Langweilige Teile fĂŒr diejenigen, die sich fĂŒr Marketing interessieren
Ich beginne mit einer kleinen Geschichte.
Anfang April. In unserem BĂŒro findet der erste Hackathon der MskDotNet Community statt. Der Kampf um Tatooine ist eröffnet, diesmal in unserer Galaxie. Samstag. 20 Teams. Pizza. Alles ist sehr herzlich (). Ein aufblasbarer R2-D2 schwebt durch den Raum. Die Teams schreiben die besten Algorithmen, um das gefĂ€hrlichste Rennen auf der Karte zu gewinnen. Wir verschieben den Start der ersten Rennen. Kekse und Kaffee retten uns. Wir, die Organisatoren, hatten erwartet, dass viele am Samstag nach dem Mittagessen gehen wĂŒrden. Aber nicht. 12 Stunden Programmierung liegen hinter uns. Finale. Etwas fĂ€llt aus, etwas startet nicht. Aber alle sind glĂŒcklich. Unser Team gewinnt. Wir sind doppelt glĂŒcklich.
Ich teile meine Freude in Slack und mir kommt die Idee: "Wir sollten unseren eigenen Hackathon veranstalten". Ich schreibe unserem CTO Sascha. Stille.
Morgen. Ich trinke Kaffee im BĂŒro. Ich sehe Sascha von hinten auf mich zukommen. "Lisa, das ist groĂartig! Wir haben genau am 21. April ein wichtiges Datum. Lass es uns machen!" WTF!? So schnell? HĂ€? Was? Ich muss Mitte April nach Syktyvkar zur Ausbildung fliegen. Egal, lass es uns machen.
Es bleiben 2 Wochen. Ich war noch nie die alleinige Organisatorin eines Hackathons. Auch nicht eines internen. Ich lese Artikel zu diesem Thema. Wahnsinn. Man braucht mehrere Monate. Man braucht mehrere Personen. Man muss Merchandise, Preise, Bedingungen, einen Zeitplan ausdenken, Interesse wecken, Ziel verstehen, Budgets. Vielleicht muss ich sogar den Sinn des Lebens herausfinden. Es wird ganz sicher nichts. Und wÀhrend du gelesen und dich vorbereitet hast, ist bereits eine Woche vergangen. Es ist die höchste Zeit, die Artikel zu ignorieren und mit der Arbeit zu beginnen.
Hier ist unsere Checkliste zur DurchfĂŒhrung eines internen Hackathons in 1 Woche.
- Plan: Du setzt dich ruhig hin und schreibst eine Liste von Dingen, die fĂŒr den Hackathon erledigt werden mĂŒssen. 30 Minuten.
- Aufgabe: Die Teilnehmer schlagen selbst die Projekte vor und wÀhlen sie aus, die sie in Google Sheets erstellen möchten. Hintergrundaufgabe, 2 Stunden.
- Zeitplan: Du schreibst schnell einen kurzen Zeitplan mit 3 Pausen und dem Finale. 20 Minuten.
- Befehle: Du veröffentlichst eine Nachricht ĂŒber den Hackathon mit dem Zeitplan vom CTO in den IT-KanĂ€len in Slack/E-Mail/etc. und erstellst einen separaten Kanal fĂŒr den Hackathon. Dort teilen sich alle in Teams auf, und diejenigen, die sich nicht entschieden haben, tun dies in den ersten 5 Minuten des Hackathons. Hintergrundaufgabe, 2 Stunden.
- Anreize: Du planst Merchandise mit zwei Entwicklern, gibst es dem Designer zur Ausarbeitung und erhÀltst das Ergebnis. Hintergrundaufgabe, 3 Tage.
- Hackathon: Du kommst ins BĂŒro, koordinierst am Anfang alle, kĂŒmmerst dich um deine eigenen Sachen, liest Reddit, informierst mit ernstem Gesicht ĂŒber jede Pause ĂŒber frische Pizza, machst Fotos vom Sonnenuntergang, kĂŒndigst das Finale an, wĂ€hlst zusammen und wĂ€hlt den Gewinner aus. 1 Tag.
- Unter dem Sternchen: NatĂŒrlich denkst du stĂ€ndig daran, dass alles gut verlĂ€uft. NatĂŒrlich werden nicht alle deine Nachricht sehen und mit einigen ist es besser, persönlich zu sprechen. NatĂŒrlich, wenn dir jemand hilft, wird alles doppelt so einfach (mir hat die wunderbare Aljena geholfen).
Der weniger langweilige Teil ĂŒber das Datum des Hackathons
Warum der 21. April? Dieser Tag ist fĂŒr uns bedeutend. Genau vor einem Jahr, am 21. April, sind wir wĂ€hrend der ersten Osterferien nach der Start der Bundeswerbungskampagne unter Last zusammengebrochen. Am nĂ€chsten Tag, am Sonntag, war unser Team ab 8 Uhr morgens bei der Arbeit. Damals haben wir im Trello-Board sundayhackathon erstellt, und die Woche mit 12-Stunden-Schichten begann. Die Situation war so kritisch, dass wir nicht einmal Zeit zum Essen hatten und uns von Leuten aus anderen Teams verpflegt wurden.

Eine detailliertere Geschichte kannst du auf (unserem CEO) lesen. Seitdem haben wir viel verÀndert, aber das Datum werden wir jetzt ganz sicher nicht vergessen.
In diesem Jahr haben wir beschlossen, dass dieses Ereignis in Erinnerung bleiben sollte, und in bester Tradition organisierten wir den ersten internen Hackathon in der Geschichte von Dodo, der 10 Stunden dauerte.
Der interessanteste Teil ĂŒber die Projekte des Hackathons
Haftungsausschluss: Alle Beschreibungen wurden von den Jungs selbst geschrieben, daher gehört das Urheberrecht nicht mir.
Oleg Learning (Machine Learning)
Dima Kochnev, Sasha Andronov (@alexandronov)
Wir wollten ein neuronales Netzwerk erstellen, das erkennt, welche Pizza auf dem Foto abgebildet ist, ohne irgendwelche Vorkenntnisse. Am Ende haben wir ein sehr einfaches und spielerisches gemacht â es erkennt 10 Pizzen und wir haben ungefĂ€hr verstanden, wie alles funktioniert, so gut es eben an einem Tag (~10 Stunden) möglich ist.

Insbesondere haben wir verstanden, dass die Branche einen Punkt erreicht hat, an dem ein gewöhnlicher Entwickler fertige Bibliotheken nutzen, die Dokumentation lesen und sein eigenes neuronales Netzwerk ohne tiefgehende Fachkenntnisse trainieren kann. Und es wird ausreichend gut fĂŒr die Lösung realer Aufgaben funktionieren.
Die Werkzeuge, die wir verwendet haben:
- â eine benutzerfreundliche und einfache Bibliothek fĂŒr maschinelles Lernen und Computer Vision.
- Wir haben zwei Modelle ausprobiert â ResNet50, Yolo.
- Der Code wurde, wie sollte es auch anders sein, in Python geschrieben.
Wir hatten 11.000 Fotos, aber fast 3/4 davon waren unbrauchbar, und bei den verbleibenden gab es verschiedene ungeeignete Perspektiven. Letztendlich haben wir ein fertiges Modell genommen (das einfach in der Lage ist, Pizza zu erkennen) und damit den gröĂten Schrott aussortiert. Danach war im Namen des Fotos der Name der Pizza enthalten â so haben wir sie in Ordner sortiert, aber es stellte sich heraus, dass die Namen nicht mit der RealitĂ€t ĂŒbereinstimmten, sodass wir manuell nacharbeiten mussten. Letztendlich blieben etwa 500-600 Fotos ĂŒbrig, was zwar eine verschwindend kleine Menge ist, aber trotzdem reichte, um 10 Pizzen voneinander zu unterscheiden.
FĂŒr das Training des Netzes haben wir die gĂŒnstigste virtuelle Maschine in Azure auf NVIDIA Tesla K80 genommen. Darauf wurde ĂŒber 100 Epochen trainiert, doch es war nach 50 Epochen schon zu sehen, dass das Netzwerk gesĂ€ttigt war, da der Datensatz klein war.
Das eigentliche Problem besteht in der Abwesenheit guter Daten.

Wir haben möglicherweise bei den Begriffen etwas durcheinandergebracht, aber man muss berĂŒcksichtigen, dass wir in dieser Hinsicht keinerlei Erfahrung haben.
GUI fĂŒr NOOBS (Konsole zum Bestellen von Pizza)
Misha Kumachev (), Zhenya Bikkinin, Zhenya Vasiliev
Wir haben einen Prototyp eines Konsolenanwendungs fĂŒr Nerds entwickelt, mit dem man ĂŒber das Terminal oder die Eingabeaufforderung Pizza bestellen kann, oder sogar in die Deployment-Pipeline integrieren kann, um bei erfolgreichem Release Pizza ins BĂŒro zu liefern.

Die Arbeit wurde in mehrere Teile gegliedert: Wir haben herausgefunden, wie unser API fĂŒr mobile Anwendungen funktioniert, und haben unser eigenes CLI mit Hilfe von gebaut und die Veröffentlichung des von uns erstellten Pakets konfiguriert. Bei dieser letzten Aufgabe gab es gegen Ende des Hackathons einige unangenehme Minuten. Bei uns hat alles lokal funktioniert und sogar die alten veröffentlichten Versionen des Pakets liefen, aber die neuen (in denen mehr coole Funktionen und Smileys hinzugefĂŒgt wurden) weigerten sich, zu funktionieren. Wir haben etwa 40 Minuten damit verbracht zu klĂ€ren, was schiefgelaufen ist, aber am Ende hat alles auf magische Weise von selbst funktioniert.)
Unser gröĂtes Ziel beim Hackathon war eine echte Pizza-Bestellung ins BĂŒro ĂŒber unser CLI. Wir haben das zehnmal auf der Testumgebung durchgespielt, aber meine HĂ€nde zitterten trotzdem, als ich die Kommandos im Produktivsystem eingab.

Am Ende â wir haben es trotzdem geschafft!

CourierGo
Anton Bruzhmeljow (Autor), Wanja Zverev, Gleb Lesnikow (), Andrei Sarafanow
Wir haben die Idee "App fĂŒr Kuriere" aufgegriffen.
Die Vorgeschichte zur Vorbereitung.ZunĂ€chst habe ich ĂŒberlegt, welche Funktionen die App ĂŒberhaupt haben könnte. Es entstand ungefĂ€hr folgende Liste an Funktionen:
- Die App loggt sich mit einem Code in die Lieferkasse ein.
- In der App sind sofort die verfĂŒgbaren AuftrĂ€ge sichtbar, die AuftrĂ€ge, die abzuholen sind.
- Der Kurier markiert den Auftrag und nimmt ihn mit auf die Fahrt.
- Es wird ihm die geschÀtzte Ankunftszeit angezeigt und ob er es rechtzeitig schafft oder nicht.
- Der Kunde sieht, dass der Kurier losgefahren ist.
- Der Kunde sieht die Position des Kuriers auf der Karte sowie die geschÀtzte Ankunftszeit.
- Der Kurier kann dem Kunden ĂŒber einen Chat in der App schreiben.
- Der Kunde kann dem Kurier ĂŒber einen Chat in der App schreiben.
- FĂŒnf Minuten vor der Ankunft erhĂ€lt der Kunde eine Nachricht, dass der Kurier in der NĂ€he ist, seien Sie bereit.
- Der Kurier markiert in der App, dass er angekommen ist und wartet.
- Der Kurier kann mit einem Klick aus der App anrufen und mitteilen, dass er (kommt, angekommen ist usw.)
- Der Kunde nimmt den Auftrag an und gibt den PIN-Code aus der App oder der SMS zur BestĂ€tigung der Lieferung ein. (wie eine Unterschrift) Damit der Kurier die Lieferung nicht vorzeitig abschlieĂen kann, wenn er verspĂ€tet ist.
- Der Auftrag wird im System als geliefert markiert.
AuĂerdem ein paar alternative Szenarien:
- Der Kurier kann den Auftrag als nicht geliefert kennzeichnen und einen Grund auswÀhlen.
- Bei verspÀteter Lieferung kann der Kurier auf Knopfdruck ein elektronisches Zertifikat per SMS ausstellen. Oder das Zertifikat wird automatisch versendet, wenn die Lieferfrist nicht eingehalten wird.
Das GefĂŒhl der Perspektive und Notwendigkeit dieses Projekts hat natĂŒrlich motiviert.
Am nÀchsten Tag sind wir mit dem Team zum Mittagessen gegangen und haben besprochen, wie die minimalen Funktionen der App aussehen werden.
Letztendlich entstand folgende Liste von Aufgaben, die wir wÀhrend des Hackathons erledigen sollten:
- Login in die Lieferkasse.
- Aktuelle Position anzeigen.
- Daten an eine externe API senden (Koordinaten, Auftrag angenommen, Auftrag geliefert).
- Daten aus einer externen API abrufen (aktuelle AuftrÀge des Kuriers).
- Ereignis senden, dass der Auftrag zur Lieferung angenommen wurde / geliefert wurde.
- Aktuelle Position des Kuriers auf der Karte auf der Webseite anzeigen.
Die Hauptarbeit, wie ich es sah, lag in der Erstellung des Backends, der App selbst (nach Diskussionen entschieden wir uns fĂŒr ReactNative zur Entwicklung der App, genauer gesagt fĂŒr die Bindung ĂŒber â , die es ermöglicht, ĂŒberhaupt keinen nativen Code zu schreiben). In Bezug auf das Backend gab es zunĂ€chst die Hoffnung auf Wanja Zwerew, als einen erfahrenen, der mit unserer Servicemuster und k8s arbeitet (die Arbeit, die er ĂŒbernommen hat). ReactNative haben Andrej Sarafanov und ich ausprobiert.
Ich beschloss, sofort ein Arbeitsrepository fĂŒr das Projekt zu erstellen. Um 12 Uhr nachts stieĂ ich darauf, dass die Geolokalisierung in ReactNative im Hintergrund schlecht funktioniert, wenn man keinen nativen Code schreibt, was mich ein bisschen frustrierte. SpĂ€ter lieĂ es nach, als ich merkte, dass ich nicht die Dokumentation des Frameworks expo.io las, sondern die von ReactNative. Am Ende des Abends war mir bereits klar, wie ich bei expo.io die aktuelle Position abrufen und separate Bildschirme (fĂŒr die Anmeldung, die Anzeige von Bestellungen usw.) erstellen kann.

Am Morgen beim Hackathon wurde Gleb in unser vielversprechendes Projekt hineingezogen. Schnell skizzierten wir einen Plan, was zu tun ist.

Wir haben einen Fehler gemacht, als wir versuchten, die Kommunikation nicht ĂŒber HTTP, sondern ĂŒber GRPC gemÀà dem Projektschema zu realisieren, da niemand wusste, wie man einen GRPC-Client fĂŒr JavaScript erstellt. Letztendlich haben wir etwa anderthalb Stunden darauf verwendet und die Idee aufgegeben. Deshalb begannen die Jungs auch im Backend, den fertigen Server von GRPC auf WebApi umzubauen. Nach einer halben Stunde konnten wir dann endlich die Kommunikation zwischen der App und dem Backend einrichten, welch Wunder. Aber zur gleichen Zeit war Gleb fast mit dem Deployment auf k8s fertig und zudem mit dem Autodeploy bei einem Commit in den Master. đ
Als Speicher haben wir MySQL gewĂ€hlt, um nicht wenigstens in Bezug auf die Datenbank zu riskieren (es gab Ăberlegungen zu CosmosDb).

Insgesamt:
- Wir haben die Speicherung der aktuellen Koordinaten des Kurier in der Datenbank aus der App realisiert.
- Wir haben RabbitMQ angeschlossen und uns auf Nachrichten ĂŒber das Annehmen von Bestellungen durch den Kurier angemeldet, um die Bestellung sofort im App des Kuriers anzuzeigen.
- Wir begannen, die Lieferzeit des Auftrags in der Datenbank zu speichern, nachdem der Kurier den Knopf in der App gedrĂŒckt hatte. Wir haben es nicht geschafft, das Ereignis zurĂŒck an Rabbit zu senden, dass die Bestellung geliefert wurde.
- Ich habe eine Kartenanzeige auf der Seite currentorder der Website mit der aktuellen Position des Kurier erstellt. Aber diese FunktionalitĂ€t blieb etwas unvollstĂ€ndig, da es uns nicht gelang, CORS in der Umgebung fĂŒr den Abruf der Koordinaten aus unserem neuen Dienst einzurichten.
M87
Roma Bukin, Gosha Polevoy (), Artyom Trofimushkin
Wir wollten einen OpenID Connect-Anbieter implementieren, da wir derzeit ein selbstentwickeltes Authentifizierungsprotokoll verwenden, was eine Reihe von Schwierigkeiten mit sich bringt: kundenspezifische Client-Bibliotheken, umstĂ€ndliche Zusammenarbeit mit externen Partnern und möglicherweise Sicherheitsprobleme (schlieĂlich kann man OAuth2.0 und OpenID Connect in ihrer Referenzimplementierung als sicher betrachten, aber bei unserer Lösung bin ich mir nicht sicher).

Wir haben einen separaten Dienst erstellt, der einen Dienst zur Speicherung personenbezogener Daten emuliert, um ein kleines Modell eines lĂ€nderunabhĂ€ngigen Authentifizierungsanbieters zu schaffen, der die personenbezogenen Daten von einem separaten Dienst abruft (das wĂŒrde perspektivisch die Möglichkeit bieten, sich mit einem Konto aus jedem Land anzumelden und dabei die DSGVO und andere gesetzliche Regelungen einzuhalten). Diese Teile haben wir gemacht, sowohl den Anbieter als auch die Integration erfolgreich umgesetzt. Als nĂ€chstes musste eine API erstellt werden, die durch Token geschĂŒtzt war, die der Anbieter ausgibt, die deren Inspektion ĂŒber den Anbieter unterstĂŒtzen und geschĂŒtzte Daten zurĂŒckgeben, wenn die Anfrage die Autorisierungsrichtlinien erfĂŒllte (wir prĂŒfen, ob der Benutzer nach dem Bearer-Schema authentifiziert ist, ob sein Token einen bestimmten Scope enthĂ€lt und ob der Benutzer eine Erlaubnis hat, den Aufruf auszufĂŒhren). Auch dieser Teil wurde umgesetzt. Der letzte Bestandteil war ein JavaScript-Client, dem ein Token ausgehĂ€ndigt wird, mit dem er die geschĂŒtzte API aufruft. Diese Funktion konnten wir nicht rechtzeitig umsetzen. Das heiĂt, der funktionale Teil war vollstĂ€ndig bereit, aber der Front-End-Bereich zur Demonstration der FunktionalitĂ€t des gesamten Systems war noch nicht fertig.
Ă-Ă-Ă (Spiel)
Dima Afonchenko, Sasha Konovalov
Wir haben ein Minispiel in Unity erstellt, in dem flinke HĂ€nde WĂŒrstchen auf eine Pizza legen. Wenn du das WĂŒrstchen falsch gelegt hast, erscheint auf dem Bildschirm die traurige Nachricht âAbgelehntâ, und wenn das gesamte WĂŒrstchen richtig platziert ist, wird eine zufĂ€llige Tatsache ĂŒber Pizza angezeigt.

Wir wollten eine zweite Stufe mit dem HinzufĂŒgen von Tomaten machen, aber das haben wir nicht geschafft.

Kurze Fortsetzung: Wer hat gewonnen?
Vor dem Hackathon haben wir mit den Jungs gesprochen und ich habe gefragt, welchen Preis sie gerne erhalten wĂŒrden, wenn sie gewinnen. Es stellte sich heraus, dass der wertvollste Preis âder Weg in die Produktionâ wĂ€re.

Deshalb erwarten Sie in naher Zukunft die AnkĂŒndigung eines Spiels mit HĂ€nden, die Peperoni auf die Pizza streuen.
Wie aufmerksame Leser bemerkt haben, hat das Team âĂ-Ă-Ă (Spiel)â gewonnen. Herzlichen GlĂŒckwunsch an die Jungs!
Nur registrierte Benutzer können an der Umfrage teilnehmen. .
Welches Projekt hat Ihnen am besten gefallen?
Oleg Learning (Machine Learning)
GUI fĂŒr NOOBS
CourierGo
M87
Ă-Ă-Ă
5 Nutzer haben abgestimmt. 3 Nutzer haben sich enthalten.
Quelle: habr.com
