Bonjour, Habr. Nous avons spontanément organisé notre premier hackathon interne. J'ai décidé de partager avec vous mes douleurs et mes conclusions sur la préparation qui a duré deux semaines, ainsi que sur les projets qui ont émergé.

Partie ennuyeuse pour ceux qui s'intéressent au marketing
Je vais commencer par une petite histoire.
Début avril. Notre bureau accueille le premier hackathon de la communauté MskDotNet. La bataille pour Tatooine est en cours, dans notre galaxie cette fois. Samedi. 20 équipes. Pizza. Tout est trÚs convivial (). Un R2-D2 gonflable se dresse dans la salle. Les équipes écrivent les algorithmes les plus précis pour réussir la course la plus périlleuse sur la carte. Nous avons retardé le lancement des premiÚres courses. Les biscuits et le café sauvent la mise. Nous, les organisateurs, nous attendions à ce que beaucoup de personnes s'en aillent aprÚs le déjeuner. Mais non. 12 heures de codage derriÚre nous. Finale. Des choses qui se déconnectent, d'autres qui ne démarrent pas. Mais tout le monde est heureux. Notre équipe gagne. Nous sommes doublement heureux.
Je partage ma joie sur Slack et l'idée me vient : « Il faut faire notre propre hackathon ». J'écris à notre CTO Sasha. Silence.
Matin. Je bois un café au bureau. Je vois Sasha s'approcher par derriÚre. « Liza, c'est génial ! Nous avons une date importante le 21 avril. Allons-y ! » Quoi !? Si vite ? Hein ? Je dois m'envoler pour Syktyvkar pour un stage à la mi-avril. Peu importe ! Allons-y.
Il reste deux semaines. Je n'ai jamais Ă©tĂ© l'organisatrice unique d'un hackathon. MĂȘme s'il est interne. Je lis des articles sur le sujet. Horreur. Il faut plusieurs mois. Il faut plusieurs personnes. Il faut penser au merchandising, aux prix, aux conditions, Ă l'emploi du temps, intĂ©resser les gens, comprendre l'objectif, les budgets. Peut-ĂȘtre mĂȘme rĂ©flĂ©chir au sens de la vie. Je suis sĂ»re que je ne vais pas y arriver. Et pendant que tu lisais et te prĂ©parais, une semaine est dĂ©jĂ passĂ©e. Il est temps d'abandonner les articles et de commencer Ă faire quelque chose.
Voici notre checklist pour organiser un hackathon interne en une semaine
- Plan: assieds-toi tranquillement et fais une liste de ce qu'il faut faire pour le hackathon. 30 minutes.
- La tĂąche: les participants proposent et choisissent eux-mĂȘmes les projets qu'ils souhaitent crĂ©er dans Google Sheets. TĂąche de fond, 2 heures.
- Calendrier: tu écris sur le pouce un bref programme horaire en tenant compte de 3 pauses et de la finale. 20 minutes.
- Commandes: tu publies un message sur le hackathon avec le calendrier du CTO dans les canaux IT sur Slack/email/etc. et tu crées un canal séparé pour le hackathon. Dans celui-ci, tout le monde se divise en équipes, et ceux qui ne sont pas encore décidés le font dans les 5 premiÚres minutes du hackathon. Tùche de fond, 2 heures.
- Avantages: tu crées des produits dérivés avec deux développeurs, tu les envoies à un designer pour la création, tu reçois le produit fini. Tùche de fond, 3 jours.
- Hackathon: tu arrives au bureau, tu coordonnes tout le monde au début, tu t'occupes de tes affaires, tu lis Reddit, avec un air sérieux tu annonces chaque pause la livraison de la nouvelle pizza, tu photographies le coucher de soleil, tu annonces la finale, vous votez ensemble et choisissez un gagnant. 1 jour.
- Sous les Ă©toiles: bien sĂ»r, tu penses constamment Ă ce que tout se passe bien. Ăvidemment, tout le monde ne verra pas ton message et il est prĂ©fĂ©rable de parler en personne avec certains. Ăvidemment, si quelqu'un t'aide, tout devient deux fois plus facile (la merveilleuse Alena m'a aidĂ©).
La partie moins ennuyeuse sur la date du hackathon
Pourquoi le 21 avril ? Ce jour est significatif pour nous. Il y a exactement un an, le 21 avril, nous avons Ă©tĂ© submergĂ©s par la charge pendant le premier week-end aprĂšs le lancement de la Campagne Publicitaire FĂ©dĂ©rale. Le lendemain, dimanche, notre Ă©quipe Ă©tait au travail dĂšs 8 heures du matin. Ă ce moment-lĂ , nous avons créé un tableau sundayhackathon dans Trello et a commencĂ© une semaine de travail par shifts de 12 heures par jour. La situation Ă©tait si critique que nous n'avions mĂȘme pas le temps de manger et nous Ă©tions nourris par des gars d'autres Ă©quipes.

Vous pouvez lire un récit plus détaillé sur (notre PDG). Depuis, nous avons fait beaucoup de changements, mais nous n'oublierons plus la date.
Cette annĂ©e, nous avons dĂ©cidĂ© que cet Ă©vĂ©nement mĂ©rite d'ĂȘtre gravĂ© dans les mĂ©moires et, dans la meilleure tradition, nous avons organisĂ© le premier hackathon interne de Dodo, qui a durĂ© 10 heures.
La partie la moins ennuyeuse sur les projets du hackathon
Avertissement : toutes les descriptions ont Ă©tĂ© rĂ©digĂ©es par les gars eux-mĂȘmes, donc la paternitĂ© du texte ne m'appartient pas.
Oleg Learning (apprentissage automatique)
Dima Kochnev, Sasha Andronov (@alexandronov)
Nous voulions crĂ©er un rĂ©seau neuronal qui puisse dĂ©terminer quelle pizza se trouve sur la photo sans aucune connaissance prĂ©alable. Au final, nous avons créé un modĂšle trĂšs simple et ludique â il reconnaĂźt 10 types de pizzas, et nous avons Ă peu prĂšs compris comment tout fonctionne, autant que possible en une journĂ©e (~10 heures).

En particulier, nous avons compris que l'industrie a atteint un niveau oĂč un dĂ©veloppeur ordinaire peut utiliser des bibliothĂšques prĂȘtes Ă l'emploi, lire la documentation et former son propre rĂ©seau neuronal sans connaissances approfondies. Et cela fonctionne assez bien pour rĂ©soudre des problĂšmes rĂ©els.
Outils que nous avons utilisés :
- â une bibliothĂšque pratique et simple pour le travail avec l'apprentissage automatique et la vision par ordinateur.
- Nous avons essayĂ© deux modĂšles â ResNet50, Yolo.
- Le code a été écrit, bien sûr, en Python.
Nous avions 11000 photos, mais presque 3/4 se sont rĂ©vĂ©lĂ©es inutilisables, et parmi les restantes, il y avait diffĂ©rents angles inappropriĂ©s. En fin de compte, nous avons utilisĂ© un modĂšle prĂȘt (qui sait simplement identifier des pizzas) pour sĂ©parer les images les plus inutilisables. Ensuite, le nom de l'image comportait le nom de la pizza â nous les avons donc classĂ©es dans des dossiers, mais il s'est avĂ©rĂ© que les noms ne correspondaient pas Ă la rĂ©alitĂ© et il a donc fallu faire un nettoyage manuel. Au final, il restait environ 500 Ă 600 photos, ce qui est un nombre insignifiant, mais nĂ©anmoins, cela s'est avĂ©rĂ© suffisant pour distinguer 10 pizzas les unes des autres.
Pour entraßner le réseau, nous avons pris la machine virtuelle la moins chÚre sur Azure avec un NVIDIA Tesla K80. Nous avons entraßné pendant 100 époques, mais il était clair que le réseau était devenu saturé aprÚs 50 époques, car le jeu de données était petit.
En fait, tout le problÚme provient du manque de bonnes données.

Nous avons peut-ĂȘtre un peu mĂ©langĂ© les termes, mais il faut comprendre que nous n'avons absolument aucune expĂ©rience dans tout cela.
GUI for NOOBS (console pour commander des pizzas)
Misha Kumachyov (), Zhenya Bikkinin, Zhenya Vasiliev
Nous avons créé un prototype d'application console pour les geeks, qui permet de commander une pizza via le terminal ou la ligne de commande, ou mĂȘme de l'intĂ©grer dans un pipeline de dĂ©ploiement afin de livrer la pizza au bureau aprĂšs un dĂ©ploiement rĂ©ussi.

Le travail a Ă©tĂ© divisĂ© en plusieurs parties : nous avons explorĂ© la façon dont notre API pour les applications mobiles fonctionne, avons construit notre propre CLI avec et avons configurĂ© la publication de notre paquet. La derniĂšre tĂąche a donnĂ© lieu Ă plusieurs minutes dĂ©sagrĂ©ables vers la fin du hackathon. Tout fonctionnait localement et mĂȘme les anciennes versions publiĂ©es du paquet marchaient, mais les nouvelles (qui contenaient plus de super fonctionnalitĂ©s et d'Ă©moticĂŽnes) refusaient de fonctionner. Nous avons passĂ© environ 40 minutes Ă comprendre ce qui s'Ă©tait mal passĂ©, mais finalement, tout a fonctionnĂ© comme par magie).
Notre objectif principal lors du hackathon Ă©tait de passer une commande de pizza rĂ©el au bureau via notre CLI. Nous avons passĂ© tout en revue une dizaine de fois sur notre environnement de test, mais j'avais quand mĂȘme les mains tremblantes lorsque je tapais les commandes en production.

Au final â nous l'avons quand mĂȘme fait !

CourierGo
Anton Bruzmelëv (auteur), Vania Zvereva, Gleb Lesnikov (), Andrey Sarafanov
Nous avons pris l'idée d'une « Application pour les livreurs ».
Contexte sur les préparations.Au départ, j'ai réfléchi aux fonctionnalités possibles de l'application. Voici une liste approximative des fonctionnalités :
- L'application se connecte Ă la caisse de livraison par un code.
- Dans l'application, les commandes disponibles et les commandes à prendre sont immédiatement visibles.
- Le livreur marque la commande et part avec.
- Il voir le temps estimé et s'il sera à l'heure ou non.
- Le client voit que le livreur est en route.
- Le client peut voir la position du livreur sur la carte et le temps estimé.
- Le livreur peut écrire au client dans le chat de l'application.
- Le client peut écrire au livreur dans le chat de l'application.
- Cinq minutes avant son arrivĂ©e, le client reçoit un message indiquant que le livreur est proche, soyez prĂȘt.
- Le livreur marque dans l'application qu'il est arrivé et attend.
- Le livreur peut appeler depuis l'application d'un clic et informer qu'il (arrive, est lĂ , etc.)
- Le client accepte la commande et saisit le code pin de l'application ou reçu par SMS pour confirmer la livraison (comme une signature). Pour empĂȘcher le livreur de terminer la livraison Ă l'avance s'il est en retard.
- La commande est marquée comme livrée dans le systÚme.
Plus quelques scénarios alternatifs :
- Le livreur peut marquer la commande comme non livrée et choisir la raison.
- En cas de retard, le livreur peut émettre un bon électronique par SMS d'une seule pression. Ou le bon arrive automatiquement en cas de non-respect des délais de livraison.
La perspective et l'utilité de ce projet étaient évidemment motivantes.
Le lendemain, l'équipe est allée déjeuner et a discuté de la maniÚre dont les fonctionnalités minimales de l'application seraient.
Au final, voici la liste des tĂąches Ă accomplir lors du hackathon :
- Connexion Ă la caisse de livraison.
- Afficher la position actuelle.
- Envoyer des données à une API externe (coordonnées, commande prise, commande livrée).
- Obtenir des données d'une API externe (commandes actuelles du livreur).
- Envoyer un événement signalant que la commande a été prise pour livraison / livrée.
- Afficher la position actuelle du livreur sur la carte sur le site.
Le principal travail, comme il se voyait, Ă©tait la crĂ©ation du backend et de l'application elle-mĂȘme (aprĂšs discussions, nous avons choisi ReactNative pour le dĂ©veloppement de l'application, plus prĂ©cisĂ©ment l'enveloppement autour â , permettant de ne pas Ă©crire de code natif en gĂ©nĂ©ral). En ce qui concerne le backend, il y avait initialement de l'espoir en Vanya Zverev, en tant qu'expert travaillant avec notre modĂšle de service et k8s (le type de travail qu'il a pris en charge). J'ai touchĂ© Ă ReactNative avec Andrey Sarafanov.
J'ai décidé d'essayer de créer directement un dépÎt de travail pour le projet. à 12h, je me suis rendu compte que la géolocalisation dans ReactNative ne fonctionnait pas bien en arriÚre-plan sans écrire de code natif, ce qui m'a un peu frustré. Puis, cela s'est calmé quand j'ai compris que je lisais la documentation du framework expo.io, et non celle de ReactNative. Au final, en une soirée, j'avais déjà compris comment obtenir la position actuelle dans expo.io et dessiner des écrans séparés (pour la connexion, l'affichage de la commande, etc.).

Le matin du hackathon, nous avons séduit Gleb dans notre projet ultra-prometteur. Nous avons rapidement esquissé un plan de ce qu'il fallait faire.

Nous avons fait une erreur en essayant de faire communiquer en suivant le modĂšle du projet non pas via HTTP, mais via GRPC, car personne ne savait comment assembler un client GRPC pour JavaScript. Au final, aprĂšs avoir passĂ© environ une heure et demie lĂ -dessus, nous avons abandonnĂ© cette idĂ©e. Ă cause de cela, les gars ont commencĂ© Ă retravailler le serveur prĂȘt sur le backend de GRPC Ă WebApi. AprĂšs une demi-heure, nous avons enfin pu Ă©tablir la communication entre l'application et le backend, quel miracle. Mais Ă ce moment-lĂ , Gleb presque terminĂ© le dĂ©ploiement dans k8s et le dĂ©ploiement automatique lors de chaque commit sur master. đ
Comme stockage, nous avons choisi MySQL pour ne pas prendre de risques avec la base (nous avons envisagé CosmosDb).

En résumé :
- Nous avons mis en Ćuvre la sauvegarde des coordonnĂ©es actuelles du livreur Ă partir de l'application dans la base.
- Nous avons intégré RabbitMQ et nous nous sommes abonnés aux messages concernant la prise de commandes par le livreur, afin d'afficher immédiatement la commande pour le livreur dans l'application.
- Nous avons commencé à enregistrer dans notre base l'heure de livraison de la commande, aprÚs que le livreur ait appuyé sur le bouton dans l'application. Nous n'avons pas réussi à ajouter l'envoi de l'événement de retour à RabbitMQ indiquant que la commande a été livrée.
- J'ai affiché une carte sur la page currentorder du site avec la position actuelle du livreur. Mais cette fonctionnalité est restée légÚrement inachevée, car nous n'avons pas réussi à configurer CORS pour obtenir les coordonnées de notre nouveau service.
M87
Roma Bukin, Gosha Polevoy (), Artyom Trofimushkin
Nous souhaitions mettre en Ćuvre un fournisseur OpenID Connect, car actuellement nous utilisons un protocole d'authentification dĂ©veloppĂ© en interne, ce qui crĂ©e plusieurs difficultĂ©s : bibliothĂšques clientes personnalisĂ©es, travail compliquĂ© pour les partenaires externes, et potentiellement des problĂšmes de sĂ©curitĂ© (tout de mĂȘme, OAuth2.0 et OpenID Connect dans leur mise en Ćuvre de rĂ©fĂ©rence peuvent ĂȘtre considĂ©rĂ©s comme sĂ©curisĂ©s, mais en ce qui concerne notre solution â j'ai des doutes).

Nous avons créé un service distinct Ă©mulant un service de stockage de donnĂ©es personnelles, afin de crĂ©er un petit modĂšle de fournisseur d'authentification Country-Agnostic, qui irait chercher des donnĂ©es personnelles dans un service distinct (ce qui Ă terme permettrait d'avoir un service unique, avec lequel on pourrait se connecter avec un compte dans n'importe quel pays, tout en respectant le RGPD et d'autres lĂ©gislations). Cette partie a Ă©tĂ© rĂ©alisĂ©e, tout comme le fournisseur, et nous les avons liĂ©s avec succĂšs. Ensuite, il fallait crĂ©er une API qui serait protĂ©gĂ©e par des jetons dĂ©livrĂ©s par le fournisseur, supporter leur introspection via le fournisseur et donner des donnĂ©es protĂ©gĂ©es si la demande satisfaissait les politiques d'autorisation (nous vĂ©rifions que l'utilisateur est authentifiĂ© par le schĂ©ma Bearer, que son jeton contient un certain scope + que l'utilisateur lui-mĂȘme a un droit autorisant l'exĂ©cution de l'appel). Cette partie a Ă©galement Ă©tĂ© rĂ©alisĂ©e. Le dernier composant Ă©tait le client JavaScript, Ă qui un jeton serait dĂ©livrĂ©, grĂące auquel il appellerait l'API protĂ©gĂ©e. Nous n'avons pas eu le temps de finaliser cette partie. Ainsi, toute la partie fonctionnelle Ă©tait prĂȘte, mais la partie front-end pour dĂ©montrer le fonctionnement de l'ensemble du systĂšme ne l'Ă©tait pas.
E-E-E (petit jeu)
Dima Afonchenko, Sasha Konovalov
Nous avons fait un mini-jeu sur Unity oĂč de petites mains lancent de la saucisse sur une pizza. Si tu lances mal la saucisse, un message triste apparaĂźt Ă l'Ă©cran « RejetĂ©e », et si la saucisse est bien placĂ©e, un fait alĂ©atoire sur la pizza apparaĂźt.

Nous voulions faire un deuxiĂšme niveau avec des tomates, mais nous n'avons pas eu le temps.

BrÚve suite : qui a gagné ?
Avant le hackathon, nous avons discuté avec les gars et j'ai demandé quel prix ils aimeraient recevoir s'ils gagnaient. Il s'est avéré que le prix le plus prisé serait « un accÚs en production ».

Ainsi, attendez-vous bientĂŽt Ă une annonce de notre jeu avec des petites mains qui ajoutent des pepperonis sur la pizza.
Comme un lecteur attentif a pu le remarquer, l'équipe «E-E-E (jeu)» a gagné. Félicitations aux gars !
Seuls les utilisateurs enregistrés peuvent participer au sondage. , s'il vous plaßt.
Quel projet vous a le plus plu ?
Oleg Learning (apprentissage automatique)
GUI pour NOOBS
CourierGo
M87
E-E-E
5 utilisateurs ont voté. 3 utilisateurs se sont abstenus.
Source : habr.com
