Fin mars à Novossibirsk, le 10e anniversaire du
CodeFest est décédé . Comme toute conférence, probablement, CodeFestX a laissé aux participants un tas d'impressions différentes de «mes jambes ne seront plus là» à «comment acheter un abonnement à vie?». Je ne décrirai pas comment c'était,
il y a déjà des critiques et, je pense, apparaitra toujours. Je veux partager l'histoire de la façon dont nous avons lancé
une version alternative pour le programme Codefest (
mieux regarder depuis un téléphone mobile ): de l'idée au résultat.

Idée
Je participe à Codefest depuis 2010 et cette année était ma 9e conférence. Pour moi, Codefest est une tradition, et cette fois je voulais faire quelque chose d'utile. Avant l'événement, en lisant le chat de la conférence, je me suis rendu compte que le calendrier pouvait certainement être amélioré. Codefest est un événement mouvementé dont tout le monde aimerait tirer le meilleur parti, j'ai donc décidé d'aider à créer un autre calendrier personnalisé.
Les objectifs étaient les suivants:
- Pour les visiteurs - pour donner la possibilité d'obtenir des informations plus pertinentes sur les événements actuels et de créer leur propre flux d'intérêts. De plus, tous les visiteurs de la conférence ont eu l'occasion de venir sur notre stand et de classer toute fonctionnalité manquante ou de corriger un bug;
- Pour Codefest , il s'agit d'un canal supplémentaire pour la distribution d'un programme «populaire»;
- Pour nous, en tant qu'entreprise , il s'agit bien sûr d'un atout supplémentaire dans la marque Employeur.

Le concept d'un calendrier «pompé» est venu aux organisateurs de Codefest. J'ai partagé l'idée chez Wrike et j'ai rapidement trouvé des personnes partageant les mêmes idées et désireuses de se connecter. Nous avons commencé par la recherche, examiné les sites de conférence et les applications mobiles. En général, nous avons lancé le
processus d'épicerie habituel chez Wrike.
À la suite de l'élaboration de l'arriéré, nous avons déterminé que les fonctionnalités nécessaires étaient nécessaires comme ceci:
- Le calendrier principal de la conférence avec la possibilité de filtrer les rapports et la recherche;
- Favoris et notifications sur l'approche des événements sélectionnés;
- Un programme populaire avec les mêmes fonctionnalités que le principal, ainsi que la possibilité pour les partenaires et les militants d'ajouter des événements à ce programme.
Il y avait des tâches moins prioritaires:
- Discussions sur le rapport afin que les utilisateurs autorisés puissent échanger des opinions et discuter;
- Aime et rapports d'évaluation populaires;
- Carte, as CodeFest est génial et la navigation est très importante.
Il y avait encore des tâches avec la troisième priorité, où nous avons encore un tas de vaisseaux spatiaux enterrés, mais je crois que leur temps viendra.
Implémentation
Nous avons décidé de prendre ce que nous utilisons dans le développement de notre produit comme une pile pour le projet, pour donner l'occasion de voir comment le frontend est construit dans Wrike. Nous écrivons sur
Dart (
et déjà expliqué pourquoi: ici et ici ) et pour l'instant pour les grands projets web comme le nôtre, il n'y a que Angular (
voici 5 minutes d'inspiration de bunopus ). Le référentiel de notre projet se trouve ici
github.com/wrike/codefestx .
Dans notre application Angular, nous avons ajouté
Redux . Il existe plusieurs implémentations pour Dart: nous avons pris
Redux.dart et
Redux Epics pour les effets. Dans notre projet, le code lié à Redux se trouve ici
github.com/wrike/codefestx/tree/master/lib/src/redux .
Pour travailler avec un
état immuable, nous avons pris les
packages built_value et
built_collection , ce qui simplifie bien le travail. Par exemple, nous créons une classe pour l'état de notre application -
CodefestState , et les packages génèrent un
générateur .
Une astuce simple est utilisée pour communiquer Angular et Redux (
dans le composant principal - github.com/wrike/codefestx/blob/master/lib/app_component.dart ):
Et nous les lions ensemble à travers un
flux de gart standard:
_dispatcher.onAction.listen((action) => _store.dispatch(action)),
_store.onChange.listen((_) => _zone.run(_cdr.markForCheck)),
Autrement dit, lorsque vous créez une action dans le gestionnaire (
elles sont toutes ici ), elle entre dans le référentiel Redux. Il est en cours de traitement et l'état change, ce qui provoque un cycle de détection de changement angulaire.
Nous avons fait 2 mécanismes pour envoyer des notifications: pour les notifications de l'occurrence d'événements, car c'est important, intégré à
PushWoosh et reçu un push système (
malheureusement sans support pour les navigateurs sur iOS ). Pour les événements moins critiques, par exemple, la sortie d'une nouvelle version, un socket a été
déclenché et
socket_io_client a été utilisé sur le client.

En général, la structure de l'application est simple et, à mon avis, compréhensible. Si vous avez des questions, nous pouvons discuter de solutions spécifiques dans les commentaires ou sur github.
L'infrastructure
Dans le monde moderne, pour télécharger un fichier JS pour un usage général,
k8s est indispensable. Mais sérieusement, l'une des caractéristiques de notre service est sa révision dès la conférence elle-même (
dont plusieurs Dartiziens ont profité parmi les visiteurs et non, ils ne sont pas de Wrike :) ).

Par conséquent, nous avons décidé de faire un CI honnête. Nous avons examiné les possibilités d'intégration de
GitHub et y
avons trouvé
Google Cloud Build : puisque nous utilisons des produits Google, nous ne devons pas quitter cette piste. L'intégration fonctionne comme ceci: toute validation dans le référentiel appelle l'assembly
cloudbuild.yaml . Nous avons suivi le chemin de l'assemblage d'un conteneur Docker avec une application prête à l'emploi (
il existe un modèle de concentrateur pour le dart - hub.docker.com/r/google/dart ), puis nous le lançons dans k8s afin de pouvoir annuler les versions, mettre à l'échelle et prévoir d'autres hypothèses. la situation. D'après ce qui n'était pas suffisant, c'était la possibilité de faire un comportement différent en fonction de la branche où nous nous engageons, c'est-à-dire que le maître construisait et se déployait pour la bataille, et pour les branches restantes, des étapes minimales devaient être effectuées sans k8. Il y a une discussion active sur ce sujet
ici , et nous avons profité de la solution de cette discussion. CI a parfaitement fonctionné et n'a jamais échoué.
Voler dans la pommade
En plus de nos succès, bien sûr, il y a quelque chose qui pourrait être fait différemment. Par exemple, n'obligez pas les gens à se connecter lorsqu'ils votent pour des rapports - certains n'aiment pas cela (en
particulier dans les services à court terme ). En conséquence, nous n'avons pas obtenu beaucoup de «j'aime» pour les rapports, mais nous avons néanmoins félicité les conférenciers champions.

Nous avons également, dans le courage du développement Web, oublié les limites strictes d'iOS et qu'il n'y a
aucun moyen de faire pression pour le Web . Il s'est avéré que près de la moitié des utilisateurs de notre service étaient avec l'iPhone. Malheureusement, nous n'avons pas pu leur envoyer d'avis.
Et quoi d'autre a bouleversé l'équipe, comme je l'ai déjà mentionné, - nous n'avons pas réussi à faire tous nos plans. Certaines fonctionnalités ont été déployées lors de la conférence, et certaines vivent toujours dans l'arriéré.
Résultats
Merci aux organisateurs que le lien vers le programme ait été ajouté à la note du participant à la conférence. Pendant la conférence, plus de 1100 utilisateurs ont utilisé le service. Au programme principal de ~ 120 événements, nous avons ajouté un autre ~ 50 "folk". Environ 75% des sessions se sont déroulées sur des appareils mobiles, nous avons envoyé plus de 500 notifications push, publié 3 communiqués au cours de la conférence elle-même et reçu beaucoup de plaisir du processus et du résultat.

Ce fut une grande expérience, et nous continuerons à développer le projet, au moins pour les événements internes et les conférences Wrike. Si vous avez visité Codefest et utilisé notre calendrier, nous apprécions vos commentaires dans les commentaires.