Offre à Londres en une journée: comment l'obtenir et quoi faire après un déménagement

Bonjour, Habr!

Nous avons de grands projets pour 2020. Nous avons l'intention de développer activement Badoo et Bumble, nous élargissons donc sérieusement l'équipe technique. Et aujourd'hui, nous annonçons l'embauche massive de développeurs PHP dans notre bureau de Londres. 

En 2017, nous avons essayé un nouveau format de recherche - événement d'embauche: nous amenons des développeurs sympas à Moscou, réalisons des entretiens en une journée et faisons immédiatement une offre aux candidats appropriés. Bien entendu, toutes les dépenses pour un voyage dans la capitale sont engagées.

Le format a bien fonctionné, et nous avons à nouveau de nombreux postes ouverts, nous annonçons donc un nouvel événement d'embauche PHP. 

Les règles sont les mêmes: afficher un résultat de test élevé avant le 1er mars, passer avec succès l'entretien le 21 ou 22 mars à Moscou - et recevoir le même jour une offre au bureau de Badoo à Londres. 

UPD: le test est terminé, merci à tous les participants! Nous avons déjà notifié les finalistes et averti que les dates de l'entretien sont reportées sine die pour le confort et la sécurité des candidats.



Sous la coupe, je vais vous dire:

  • en savoir plus sur le test;
  • dans quels projets nous sommes engagés: optimisation de photos, streaming vidéo, apprentissage automatique pour les lettres, transition vers de nouvelles versions de PHP et bien plus encore.

Si vous êtes un shnik PHP et que vous souhaitez déménager à Londres, bienvenue chez kat!


Comment réussir le test


Le test comprend cinq tâches. Exactement 90 minutes sont allouées à la décision: cela ne fonctionnera pas pour retarder ou interrompre le processus. Avant de commencer, assurez-vous d'avoir suffisamment de temps. 

Dans trois tâches, vous devez écrire du code / des requêtes SQL, et dans les deux autres, nous nous attendons à voir des réponses détaillées aux questions. Test publié sur HackerRank. Nous vous recommandons de vous entraîner sur les tâches de test de la plateforme afin de vous familiariser avec l'interface. 

Les décisions sont prises jusqu'au 2020-03-01 23:59:59 UTC. Sur la base des résultats du test, nous sélectionnerons environ 60 candidats que nous inviterons à Moscou pour un entretien. 

La société prend en charge toutes les dépenses liées à un voyage à Moscou, ainsi que les dépenses liées au déménagement à Londres. Nous aidons à obtenir des visas de travail pour les membres de la famille de notre nouveau collègue, payons le vol, louons une maison pour la durée de la recherche, payons une prime en espèces pour le déménagement et aidons à améliorer l'anglais. Vous pouvez vous familiariser avec l'équipe dès le stade de l'entretien: les développeurs eux-mêmes conduisent des entretiens lors de la location.

Ce que fait l'équipe de développement du serveur 


Nous sommes responsables du backend des services de rencontres Badoo et Bumble. En plus de balayer vers la gauche et la droite pour trouver un partenaire, les applications ont le streaming vidéo, le chat avec des messages audio, la recherche de personnes à proximité, l'intégration avec les services de paiement et bien plus encore. Une interface relativement simple cache beaucoup de logique en PHP et Go (et cela devient de plus en plus). 

Notre équipe compte plus de 40 personnes. Le travail peut être divisé en deux grandes parties:

  • nouvelles fonctionnalités dans les applications,
  • projets techniques - amélioration des outils, optimisation, travail avec dette technique.

Je vais parler des projets les plus intéressants que nous avons mis en œuvre au cours des deux dernières années.

Chips fraîches dans le produit


Le marché des applications de rencontres est dynamique et compétitif, notre objectif principal est donc le développement du produit: il doit rester intéressant et sûr pour les utilisateurs. 

J'ai appris à cacher des photos trop «personnelles»


Certains utilisateurs envoient des photos de chat à caractère érotique, même si l'interlocuteur n'a pas demandé de tels cadeaux. 

La tâche que nous devions résoudre était d'enseigner à l'application à distinguer les photos «privées» (18+) des photos ordinaires et à les montrer discutées dans le chat, permettant au destinataire de décider lui-même s'il voulait les voir dans leur intégralité. 

En collaboration avec l'équipe R&D, nous avons créé un service on Go avec un réseau de neurones qui peut reconnaître des photos "privées". Si la probabilité que la photo soit érotique soit supérieure au seuil défini, un indicateur spécial est placé dans le message et le client gère cette situation en conséquence: affiche un talon flou demandant si le destinataire veut voir ce qu'il y a à l'intérieur. 

Nous exécutons toutes les tâches à travers des tests A / B, et couvrons également soigneusement les points clés de la nouvelle fonctionnalité avec des statistiques. Ainsi, nous avons découvert qu'environ 200 000 photos par jour sont envoyées par jour et que - souvent, ces photos sont toujours vues et ne se plaignent pas de l'expéditeur.  

Ajout de messages de chat audio et vidéo


Au cours des deux dernières années, nous avons élaboré des fonctionnalités pour les messagers avancés et donné aux utilisateurs la possibilité d'échanger des messages multimédias. L'implémentation de cette option côté serveur a été assez simple grâce à l'architecture flexible de l'API mobile et de son propre CDN.

Lors de la conception de messages multimédias dans le chat, nous avons transféré le téléchargement de fichiers de l'API client-serveur principale vers les services HTTP distincts situés à l'intérieur du CDN. Nous utilisons un référentiel unique, donc du point de vue de la prise en charge du code, cette solution n'a posé aucun problème. Mais cela a permis d'utiliser des outils optimisés pour la nature de la charge:

  • l'API mobile (protocole binaire) est aiguisée par l'échange de commandes courtes et au pic passe par elle-même plus de 100 000 requêtes par seconde;
  • CDN est réglé pour fonctionner avec le multimédia et est capable de fournir 200 000 photos par seconde (nous avons parlé des optimisations CDN en détail lors de la conférence Uptime day).

Du point de vue de CDN, le type de fichier téléchargé n'a pas beaucoup d'importance, et nous avions déjà une conversion vidéo. Nous n'avons pu traiter correctement que les nouveaux types (audio et vidéo) dans le protocole de l'API mobile.

Appris comment construire des modèles ML sans R&D


En 2018, nous avons créé notre propre framework pour automatiser la formation des modèles sur nos données. Désormais, tout développeur dorsal peut créer indépendamment un modèle adapté à son application, sans attirer de collègues de la R&D. 

Ce cadre est capable de collecter des centaines de métriques, à la fois universelles (sexe, âge, activité dans l'application), et spécifiques, significatives pour chaque modèle spécifique. Les algorithmes de construction des modèles ML sont configurés de manière flexible et les graphiques des résultats sont disponibles pour des analyses «prêtes à l'emploi». En sortie, le framework fournit un modèle de travail qui répond assez rapidement (dans un délai de 10 à 100 ms) afin qu'il puisse être appelé directement depuis PHP dans les requêtes des utilisateurs sans sacrifier l'UX.

L'année dernière, nous avons intégré le cadre dans différentes parties de notre application: les systèmes anti-spam, l'évaluation de l'application et quelques autres. Mail ML est l'une des applications les plus réussies: le modèle prédit la probabilité d'un clic sur le lien dans l'e-mail pour un utilisateur spécifique. Le modèle apprend des données des autres utilisateurs, similaires au destinataire de l'e-mail avec des attributs «importants», et «l'importance» est calculée automatiquement par le framework.

Après avoir évalué les résultats, nous avons cessé d'envoyer des e-mails avec le moins de chances de cliquer sur les liens. Pour cette raison, nous: 

  • fidélité accrue des utilisateurs, ce qui a permis d'améliorer les mesures d'activité du service: les gens n'aiment pas les lettres «désespérées»;
  • augmentation du taux de boîte de réception dans les expéditeurs clés: services de messagerie comme les expéditeurs avec un CTR élevé.

Streaming vidéo lancé


Nous recherchons toujours de nouvelles opportunités de développement. Lorsque le streaming vidéo a commencé à prendre de l'ampleur, nous avons décidé de l'intégrer dans notre application. Il n'a pas été facile de prédire le succès du projet, afin de réduire les coûts, nous n'avons pas plongé tête baissée dans le développement de notre solution, mais avons trouvé une entreprise qui fournissait à la plateforme et au SDK les fonctionnalités dont nous avions besoin.

Nous étions tenus de créer une logique de fonctionnalités, une interaction client-serveur, de mettre en œuvre des options pour l'envoi et le paiement de cadeaux, de fournir une modération rapide du contenu (à la fois le flux vidéo et les commentaires) et de tout couvrir avec des mesures. Nous avons réuni une équipe interfonctionnelle de différents départements et divisions: développement client, développement serveur, facturation, plateforme, back office, analyse BI, conception et gestion de produit. Tous se sont installés dans un seul bureau - et le travail a commencé à bouillir.

Nous avons déterminé la fonctionnalité de la première version (MVP) - et un mois plus tard, nous avons lancé une fonctionnalité dans un pays après l'autre. Pendant plusieurs semaines, nous l'avons déployé dans différents pays, et aujourd'hui le streaming vidéo est disponible partout. 

Diffuser des messages utilisateurs sur l'Arbat


C'était une promotion très inhabituelle: tout le mois d'octobre, les utilisateurs de Badoo ont envoyé des messages à un immense panneau d'affichage vidéo situé sur Novy Arbat à Moscou. En un mois, 23 000 messages nous ont été envoyés, dont 12 000 ont été modérés avec succès et ont frappé l'écran.

Un panneau d'affichage est une telle télévision intelligente avec un navigateur et notre client JavaScript à l'intérieur. Des publicités de cinq minutes ont été montrées à l'écran, dans chacune desquelles trois minutes nous ont été accordées. 



Bien sûr, tous les utilisateurs voulaient voir le message envoyé à l'écran de leurs propres yeux. Pour rendre cela possible, nous avons dû répondre à la question lorsque chacun des messages y apparaît.

Nous devons informer l'utilisateur du délai d'affichage après la modération. Techniquement, à ce stade, le message est tombé dans notre calendrier interne avec une heure de début claire pour le spectacle et une durée calculée dynamiquement: de 30 secondes à cinq minutes (selon le nombre d'expéditeurs). 

La difficulté était que le fournisseur, pour sa part, ne fournissait pas la possibilité de contrôler et de suivre l'heure de la publicité, il était donc nécessaire de synchroniser astucieusement notre calendrier avec le calendrier du fournisseur, de surveiller et d'ajuster en permanence si nécessaire. Cela nous a aidés que nous avons remarqué (la journalisation est notre tout!) Que quelques dizaines de secondes avant la prochaine vidéo, la smart TV recharge la page. Il était impossible de se concentrer sur cette heure, mais là-dessus, on pouvait remarquer des changements d'horaire, qui atteignaient parfois 15 à 30 secondes. Nous avons mis en place le suivi des équipes de notre côté et au moment de l'opération nous avons commencé à demander l'heure du spectacle le plus proche au prestataire. 

Dans le processus de mise en place de ce système, notre ingénieur, qui travaillait dans un café en face du panneau d'affichage, a mangé une quantité impressionnante de croissants et a bu beaucoup de tasses de café, mais grâce à lui, la diffusion des messages des utilisateurs s'est bien déroulée et il n'y a eu aucun incident grave. 

Projets techniques


Malgré le volume important de travail d'épicerie, nous consacrons beaucoup de temps aux projets techniques. La plupart d'entre eux concernent la performance de nos applications, ainsi que le développement et l'amélioration des outils internes.

Liveprof Open Source Project


Nous avons depuis longtemps la possibilité d'activer XHProf en production pour une demande spécifique, mais ce n'est pas toujours suffisant. Les demandes sont différentes, mais pour un travail systématique sur les performances, je veux voir la situation dans son ensemble pour toutes les demandes. Par conséquent, une telle idée est née: lancer automatiquement XHProf sur une petite partie des requêtes et agréger les résultats. C'est ainsi que le projet Liveprof est apparu , que nous avons mis en libre accès.

Dans le processus de traitement de la demande, il existe une logique qui, en fonction des probabilités et de la méthode API, décide de démarrer XHProf. Les résultats de profilage sont écrits sur le disque, puis livrés à un serveur distinct, où ils sont placés sous forme brute dans MySQL. 

Une fois par jour, un script est exécuté qui regroupe les résultats pour chaque marque, plate-forme et méthode API. Ainsi, nous pouvons voir les résultats du profilage pour des demandes spécifiques de Badoo iOS (à la fois sous la forme d'un arbre et sous la forme d'un graphique de flamme), nous pouvons voir quel pourcentage du cluster il faut pour appeler une fonction individuelle (par exemple, combien coûte la collecte d'une URL pour une photo), et récemment ajouté la sortie de ces informations directement à PhpStorm.

Migration vers PHP 7.4


Les nouvelles versions de PHP sont satisfaites de l'amélioration des performances. Au cours des deux dernières transitions (de 7,0 à 7,2 et de 7,2 à 7,4), notre service était responsable.

La transition commence bien avant la sortie officielle. Tout d'abord, nous exécutons manuellement les tests avec la nouvelle version et ... nous sommes confrontés à un grand nombre de problèmes. Certains d'entre eux sont facilement résolus, tandis que d'autres nécessitent un certain temps. 

Lorsque la plupart des problèmes ont été résolus, nous passons à la nouvelle version dans l'environnement de développement, pendant un certain temps, nous surveillons les journaux d'erreurs et collectons les commentaires des développeurs et des ingénieurs d'assurance qualité. Au moment de la sortie officielle de la version stable, nous sommes prêts à tester en production: nous l'exécutons d'abord sur une machine et l'étalons progressivement sur les autres.

Mais une fois la nouvelle version distribuée sur tous les serveurs, la transition ne s'arrête pas: nous continuons à vérifier la syntaxe avec les deux versions de PHP (nouvelle et précédente). Ainsi, nous sommes convaincus que les développeurs n'ont pas commencé à utiliser la nouvelle syntaxe et que nous pouvons basculer vers l'ancienne version à tout moment si des problèmes inattendus surviennent dans la nouvelle. Par exemple, avant les vacances du Nouvel An, nous avons découvert un petit problème avec une fuite de mémoire en PHP 7.4, décidé de ne pas le risquer et retourné à la version précédente avant les vacances. Après les vacances, après avoir réglé le problème, nous avons de nouveau déployé la version 7.4 et nous l'utilisons toujours. 

Accédez à l'agrégation des demandes


Avec la mise à jour PHP, notre lutte pour les performances ne s'arrête pas là. Nous avons un framework puissant qui fait beaucoup de travail au début: de l'initialisation aux différents contrôles requis pour chaque requête. 

Nous avons décidé de mener une expérience simple. Nous avons sélectionné une partie des commandes pour lesquelles la réponse du serveur n'est pas critique (par exemple, l'envoi de statistiques à partir du client ou le choix de l'option «Non» dans le jeu de balayage), et avons écrit un service sur Go qui accepte ces demandes, les enregistre, puis les envoie au serveur dans un paquet ( pour chaque utilisateur). Ainsi, nous pouvons très facilement économiser sur l'initialisation de l'application sans réécrire le code principal.

L'expérience s'est avérée réussie: selon nos estimations, nous pouvons économiser quelques pour cent du CPU (qui dans notre cas est plus de dix serveurs) sans réécrire le code principal, mais au prix de compliquer le fonctionnement et la logique du travail. Pour compléter le tableau, nous avons décidé d'attendre les résultats d'expériences avec la précharge PHP 7.4 et RoadRunner afin de choisir la solution optimale en fonction du ratio de gains et de la complexité de mise en œuvre. 

Optimisation photo


L'activité des utilisateurs dépend directement de certains projets techniques. Par exemple, plus nous montrons des photos rapidement, plus les gens glissent activement, plus il y a de correspondances, plus de nouvelles paires se forment, etc. 

En octobre 2018, l'une de nos marques, Bumble, a décidé de pénétrer le marché indien. Comme nous ne savions rien de la vitesse de l'Internet local, nous avons décidé de mener une série d'expériences sur la qualité et la taille des photographies.

Nous lançons toutes les expériences techniques sous tests A / B. Cela vous permet de voir non seulement la différence dans le comportement et l'activité des différents groupes, mais aussi des statistiques sur le fonctionnement de l'application sur le client, ventilées par options. Nous voulions du temps pour télécharger des images et du temps pour le décodage et l'affichage. 

Infrastructure, en plus des serveurs de stockage, nous allouons un cluster de caches photo - ce sont les serveurs qui stockent les images les plus couramment utilisées. Étant donné qu'il existe un grand nombre de smartphones avec différents écrans dans le monde, nous stockons des photos dans plusieurs tailles de base et les convertissons à la volée à la taille et au format demandés par le client. 

La tâche que nous voulions résoudre était de choisir le format optimal (JPEG, WebP, PJPEG), la taille et la qualité d'image. En théorie, le format WebP devrait être le meilleur, mais c'est le plus cher en termes de conversion à la volée: au lieu d'économiser du trafic, vous devez acheter plus de serveurs de cache photo. Parallèlement à cela, nous avons décidé de tester comment les CDN dans la région contribueront à améliorer l'expérience utilisateur.

Plusieurs de nos ingénieurs y ont été envoyés pour lancer un projet en Inde. Nous avions donc non seulement des chiffres secs, mais aussi des personnes qui pouvaient tester l'application sur différents opérateurs sur place, comparer son travail avec le travail d'autres applications, etc.

Les résultats des expériences nous ont permis de choisir les meilleures options pour la qualité et la taille des photographies. Par exemple, nous avons vu que la logique de préchargement des photos sur le client joue un rôle important dans l'activité de l'utilisateur. Et malgré le fait que les photos dans WebP se téléchargent plus rapidement, l'effet positif n'était perceptible que dans les navigateurs mobiles. La même histoire avec CDN: nous avons testé trois services CDN externes et, malgré l'accélération de la livraison de contenu, nous n'avons vu aucun changement positif dans l'activité. En conséquence, nous avons activé WebP pour les navigateurs mobiles et économisé de l'énergie, laissant tous les autres clients au format JPEG.

Propre streaming vidéo


Comme je l'ai mentionné ci-dessus, la première version du streaming vidéo a été lancée à l'aide d'un service externe. L'expérience a été considérée comme réussie - et nous avons commencé à préparer le logiciel et l'infrastructure pour le lancement dans nos centres de données. 

Avec l'aide d'un transcodeur prêt à l'emploi (pour extraire le flux vidéo de l'utilisateur) et de serveurs Edge (pour distribuer le flux à l'utilisateur), nous avons dû assembler un système similaire à une solution en boîte externe. Et, bien sûr, beaucoup de choses devaient être finalisées avec un «fichier» sur le pouce.

Par exemple, initialement chaque serveur Edge connecté à chaque serveur transcodeur, ce qui compliquait la mise à l'échelle et augmentait le trafic interne. Nous avons écrit l'équilibrage des clients de manière à ce que les clients d'un flux accèdent au moins de serveurs Edge, en tenant compte de la popularité de chaque flux particulier. 

Un autre exemple, quand nous avons dû être rapides d'esprit, est la logique de changer la qualité du flux dans WebRTC: en raison du fait que nous utilisons deux options de qualité, l'algorithme standard a été démoli et il n'a fonctionné que pour diminuer le débit binaire. J'ai dû aller plus loin et éditer l'algorithme utilisé dans la bibliothèque WebRTC.

De plus, la signalisation WebRTC, par défaut, a transmis trop d'informations sur les hôtes du réseau au client. La solution était un serveur proxy sur Go, qui ne donne au client que ce qu'il a besoin de savoir, et recueille en outre de nombreuses informations utiles sur les clients connectés. 

Du début de la recherche à sa mise en œuvre complète, le projet a duré plus de six mois, mais nous avons ainsi pu réduire considérablement les coûts en abandonnant les services externes. 

Optimisation des performances


Ce n'est pas un projet ponctuel pour notre équipe - c'est un domaine important auquel nous accordons également beaucoup d'attention. Notre cluster principal servant les demandes d'applications se compose de centaines de serveurs, et il est donc rentable pour nous d'investir du temps dans le travail d'optimisation de l'application: chaque pourcentage gagné nous coûte plusieurs serveurs physiques. 

Nous surveillons en permanence la charge totale sur notre cluster et la charge pour chaque appel d'API spécifique. Si un certain seuil est dépassé, nous commençons à rechercher et à optimiser les goulots d'étranglement. Plus l'excédent est important, plus les gens s'impliquent. Cette approche est pleinement justifiée: au cours des deux dernières années, le taux de croissance du cluster a été la moitié du taux de croissance de l'audience de nos services. 

Nous partageons activement les connaissances acquises lors des travaux d'optimisation lors des conférences et réunions. Plus de détails sur nos projets et études peuvent être trouvés dans les articles et rapports de Pasha Murzakov: 


Contrôle sur le code ancien et inutilisé


Nous avons un développement assez intensif, et le rythme de lancement des tâches et des expériences de produits augmente également à mesure que la société se développe. Dans de telles conditions, la base de code devient plus complexe et moins contrôlée. La situation est exacerbée par plusieurs plates-formes et utilisateurs disposant d'anciennes versions d'applications et de systèmes d'exploitation. 

Nous essayons de garder notre base de code «propre» afin de maintenir un rythme de travail élevé:

  • créer automatiquement des tâches pour supprimer le code après la fin de l'expérience produit;
  • suivi automatisé des anciennes versions des applications et des systèmes d'exploitation et des branches de code qui y sont utilisées;
  • Outils introduits pour rechercher automatiquement le code inutilisé.

Vous pouvez en savoir plus sur nos résultats lors du Meetup PHP Badoo , qui se tiendra ce samedi 15 février. 

Bien sûr, ce ne sont pas tous les projets dont je veux parler. Au cours des deux dernières années, nous avons lutté contre les spammeurs et les snappers, scié notre plug-in pour PhpStorm, testé divers référentiels KV (et choisi Aerospike), expérimenté beaucoup, partagé des connaissances dans des articles, lors de conférences et pas seulement.

Mais si vous décidez que nous travaillons uniquement, ce n'est pas le cas. Chaque équipe a son propre budget de consolidation d'équipe. Nos collègues ont visité Amsterdam, Édimbourg, Prague et d'autres villes. Et l'année dernière, nous avons organisé une réunion générale du département en Croatie:


Et nous savons aussi comment faire des photoshop.

Sur le déménagement à Londres et le bureau de Soho nous l'avons déjà dit, nous ne nous attarderons donc pas sur les détails de cet article - montrez simplement quelques photos.



Grande photo










L'événement d'embauche est le moyen le plus simple et le plus rapide de rejoindre notre équipe. Nous acceptons les réponses au test jusqu'au 1er mars inclus. Ensuite, nous prendrons une semaine pour analyser les résultats et appeler ceux qui ont fait face aux tâches. 
 
Si vous souhaitez travailler pour nous à Londres, mais ne voulez pas passer le test, il existe une autre option: il suffit de répondre aux offres d'emploi sur notre site Web , cette opportunité est toujours disponible.

Si vous avez des questions, n'hésitez pas à les poser dans les commentaires ou à m'envoyer des messages privés. 

Bonne chance

Source: https://habr.com/ru/post/undefined/


All Articles