Slide 1

Slide 1 text

10 choses que j’ai apprises depuis que je travaille chez Deezer Christopher Maneu Mobile Developer & Engineering Effectiveness Lead, Deezer.com @cmaneu – maneu.net 42 Paris – 01/06/2016

Slide 2

Slide 2 text

9 choses que j’ai apprises depuis que je travaille chez Deezer Christopher Maneu Mobile Developer & Engineering Effectiveness Lead, Deezer.com @cmaneu – maneu.net 42 Paris – 01/06/2016

Slide 3

Slide 3 text

La localisation, c’est compliqué La neutralité du net Naviguer à large échelle Le petit-déjeuner, le repas le plus important de la semaine Wifi Camping Paradis Travailler comme un dev quand on n’est pas dev Les artistes ne sont pas bavards Le firmware qui reboot Les opérateurs nous mentent

Slide 4

Slide 4 text

La localisation 180 pays 31 langues 5+ plateformes

Slide 5

Slide 5 text

La localisation Français Anglais Espagnol 23 Langues Installations de l’application Deezer par langue

Slide 6

Slide 6 text

Pourquoi localiser est compliqué ?

Slide 7

Slide 7 text

Un stage @ Deezer ? Dev web symfony/django/node reactjs http://dzr.fm/bocal42 Produit / UX / Développement Projet opensource

Slide 8

Slide 8 text

La neutralité du net

Slide 9

Slide 9 text

La neutralité du net Un pic sur les commentaires du store “Depuis ce week-end, l’application est marquee comme hors connexion, alors que je suis en 4G” La télémétrie ne montre rien Pas de nouvelles exceptions, pas de pics Notre jeu de test en local fonctionne bien

Slide 10

Slide 10 text

La neutralité du net Après quelques jours, un utilisateur mentionne le nom d’un opérateur dans un commentaire du store Des tests sur certaines cartes SIM de cet utilisateur fonctionnent, pas d’autres.

Slide 11

Slide 11 text

La neutralité du net private async Task HasAccessToDeezer() { … httpClient.Timeout = TimeSpan.FromMilliseconds(3500); using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, new Uri("http://api.deezer.com/robots.txt"))) …

Slide 12

Slide 12 text

La neutralité du net private async Task HasAccessToDeezer() { if (disableCache) { request.Headers.Add("If-Modified-Since", DateTime.UtcNow.ToString("R", CultureInfo.InvariantCulture)); } httpClient.Timeout = TimeSpan.FromMilliseconds(3500); using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, new Uri("http://api.deezer.com/robots.txt"))) …

Slide 13

Slide 13 text

La neutralité du net Sur les cartes SIM concernées, toute requête avec le header HTTP If-Modified-Since a une latence supérieure à 10 secondes.

Slide 14

Slide 14 text

La neutralité du net

Slide 15

Slide 15 text

La neutralité du net

Slide 16

Slide 16 text

La neutralité du net - Learnings La télémétrie ne fait pas tout Surveiller les commentaires du store (appbot) Détecter si on a du réseau ou non est une tâche plus compliquée qu’il n’y paraît

Slide 17

Slide 17 text

Wifi Camping Paradis

Slide 18

Slide 18 text

Wifi Camping Paradis Pic des exceptions via la télémétrie Deezer.Runtime.DeezerRuntimeException: DZ0110: Could not retrieve settings, server error (data='

Slide 19

Slide 19 text

Wifi Camping Paradis

Slide 20

Slide 20 text

camping-peyroche.com

Slide 21

Slide 21 text

Wifi Camping Paradis

Slide 22

Slide 22 text

Wifi Camping Paradis - Learnings Ne pas se fier uniquement au statut HTTP ou au Content-Type dans vos clients HTTP Ayez un système de filtre des exceptions envoyées à la télémétrie (loghash.com)

Slide 23

Slide 23 text

Le Firmware qui reboot

Slide 24

Slide 24 text

Le firmware qui reboot Nos serveurs Achat de matériel & installation Mise à jour du hardware Mise à jour de l’OS Mise à jour des frameworks, runtimes, etc… Déploiement du code Monitoring …

Slide 25

Slide 25 text

Le firmware qui reboot Configuration « propre » des updates Recherche automatique des updates (contrôleurs RAID, etc…) Installation lors du reboot de la machine Les iDRAC sont mis à jour séparément

Slide 26

Slide 26 text

Le firmware qui reboot Campagne de mise à jour des iDRAC Passage de 2.1x à 2.2x En parallèle, la version 2.3 est sortie. Tests sur quelques serveurs de la 2.3 => OK

Slide 27

Slide 27 text

Le firmware qui reboot Lancement de la procédure de vérification Le bios des machines en 2.2 ont chargées la configuration des iDRAC Ils ne sont pas censés la prendre en compte

Slide 28

Slide 28 text

Le firmware qui reboot

Slide 29

Slide 29 text

Le firmware qui reboot - learnings Les updates automatiques ne doivent pas être planifiées en même temps sur tous les serveurs Site Reliability Engineering, O’Reilly http://www.opsschool.org/

Slide 30

Slide 30 text

Le petit déjeuner, le repas le plus important de la semaine

Slide 31

Slide 31 text

Le petit déjeuner, le repas le plus important de la semaine 0 50 100 150 200 250 300 350 400 450 2013 2014 2015 2016

Slide 32

Slide 32 text

Le petit déjeuner, le repas le plus important de la semaine Lead Mobile Lead Android Dev Android Dev Android Lead iOS Dev iOS Dev iOS Lead Windows Dev Windows Dev Windows

Slide 33

Slide 33 text

Le petit déjeuner, le repas le plus important de la semaine Team Ads Dev Android Dev iOS Dev Web Team User Engagement Dev iOS Dev Android Dev Data Science Team Playback Dev iOS Dev Android

Slide 34

Slide 34 text

Le petit déjeuner, le repas le plus important de la semaine Team Ads Dev Android Dev iOS Dev Web Team User Engagement Dev iOS Dev Android Dev Data Science Team Playback Dev iOS Dev Android

Slide 35

Slide 35 text

Le petit déjeuner, le repas le plus important de la semaine

Slide 36

Slide 36 text

Le petit déjeuner, le repas le plus important de la semaine Deezer Weekly Breakfast Mobile Weekly Breakfast Tech Meetings Chan Slack Brown Bag Lunch …

Slide 37

Slide 37 text

Naviguer à large échelle

Slide 38

Slide 38 text

No content

Slide 39

Slide 39 text

Naviguer à large échelle Les vues ne doivent pas naviguer vers des vues Une méthode unifiée d’accéder aux vues Pouvoir “deeplinker” une vue Pouvoir changer la vue cible en live (gatekeeping, A/B testing, …) S’intègre bien dans les frameworks natifs

Slide 40

Slide 40 text

Naviguer à large échelle http://www.deezer.com/artist/144227 = deezer://www.deezer.com/artist/144227

Slide 41

Slide 41 text

L’importance des deeplinks Faire revenir les utilisateurs dans l’application Transférer le trafic web vers les apps Gérer élégamment du contenu dynaique

Slide 42

Slide 42 text

Naviguer à large échelle Utiliser un UriMapper deezer://www.deezer.com/artist/144227 => ArtistPageActivity / ArtistPageController

Slide 43

Slide 43 text

Naviguer à large échelle √ Les vues ne doivent pas naviguer vers des vues √ Une méthode unifiée d’accéder aux vues √ Pouvoir “deeplinker” une vue × Pouvoir passer un objet à une vue √ Pouvoir changer la vue cible en live (gatekeeping, A/B testing, …) √S’intègre bien dans les frameworks natifs

Slide 44

Slide 44 text

Naviguer à large échelle I want to navigate to a view / an URI _navigationService.Navigate("deezer://www .deezer.com/artist/12741", null); I want to navigate to a view, but I already have this object _navigationService.Navigate(PageTokens.Ar tistPage, currentArtist);

Slide 45

Slide 45 text

Naviguer à large échelle

Slide 46

Slide 46 text

Naviguer à large échelle

Slide 47

Slide 47 text

Naviguer à large échelle - Learnings Lister précisément les routes de vos apps Toujours utiliser un UriMapper Toutes vos pages/controler/activity doivent gérer un chargement avec un objet ou un id/paramètres

Slide 48

Slide 48 text

Les artistes ne sont pas bavards

Slide 49

Slide 49 text

Les artistes ne sont pas bavards

Slide 50

Slide 50 text

Les artistes ne sont pas bavards

Slide 51

Slide 51 text

Les artistes ne sont pas bavards http://scotthurff.com/posts/why-your-user-interface-is- awkward-youre-ignoring-the-ui-stack

Slide 52

Slide 52 text

Les artistes ne sont pas bavards

Slide 53

Slide 53 text

Les artistes ne sont pas bavards

Slide 54

Slide 54 text

Les artistes ne sont pas bavards Le livre du design et de l’ergonomie pour le développeur https://vimeo.com/88650145 Designing products people Love, O’Reilly Sprint, Jake Knapp (Google Ventures)

Slide 55

Slide 55 text

Les opérateurs nous mentent (les téléphones portables aussi)

Slide 56

Slide 56 text

Les opérateurs nous mentent Plusieurs commentaires du store Des retours d’autres employés Deezer « J’ai de la 4G, mais l’app Deezer est offline »

Slide 57

Slide 57 text

Les opérateurs nous mentent

Slide 58

Slide 58 text

Les opérateurs nous mentent http://www.apple.com/pr/library/2010/07/02Letter-from-Apple-Regarding-iPhone-4.html

Slide 59

Slide 59 text

Les opérateurs nous mentent https://www.igvita.com/2015/01/26/resilient-networking/

Slide 60

Slide 60 text

Les opérateurs nous mentent

Slide 61

Slide 61 text

Les opérateurs nous mentent - Learnings Les utilisateurs 4G sont parfois des utilisateurs 3G 3G > 2G, 2G > 0 L’erreur de connexion doit être la norme Les requêtes « interactives » doivent respecter le temps perçu Ces règles sont valables pour les devs web (services worker FTW)

Slide 62

Slide 62 text

Travailler comme un dev quand on n’est pas dev

Slide 63

Slide 63 text

Travailler comme un dev quand on n’est pas dev

Slide 64

Slide 64 text

Travailler comme un dev quand on n’est pas dev

Slide 65

Slide 65 text

Travailler comme un dev quand on n’est pas dev

Slide 66

Slide 66 text

Q&A Suivez nous sur Twitter @DeezerDevs @cmaneu

Slide 67

Slide 67 text

Merci code by Bernar Novalyi from the Noun Project Wireframe by Yu luck from the Noun Project