dotScale 2014

Introduction

Première édition de dotScale, petit frère des dotConférences. Encore une fois, ça avait lieu dans un endroit magnifique, qu'est le théatre de Paris. La salle était loin d'être complétement remplie, ce qui permet à chacun de s'installer où il le souhaite. Et c'est tant mieux, car comme souvent dans ce genre de théatre, toutes les places ne sont pas égales. Et pour peu que vous ayiez envie d'être installé confortablement et de prendre des notes sur votre laptop, ça devient compliqué.

Néanmoins, j'ai pu me trouver une place dans l'une des loges VIP sur la gauche de la scène, ce qui me donnait une vue parfaite et plongeante sur les présentations.

Retour d'expérience sur healthcare.gov

Robert Kennedy, employé Google, nous a fait le deuxième retour d'expérience de la conférence. Il est allé aidé le projet healthcare.gov, dont vous avez sans doute déjà tous entendu les déboires. Je ne connaissais pas le détail technique de pourquoi ça s'était cassé la gueule, et c'était intéressant d'avoir ce retour de cette horror story vue de l'intérieur.

Le projet complet de réforme du système de santé repose sur le bon fonctionnement du site web. Le fait que le site soit dans les choux pour une durée indeterminée dès le jour de son lancement à fait les unes des journaux.

Globalement le site était dispo, il pouvait recevoir du traffic, mais il était complétement instable. Plusieurs éléments de son archit étaient des SPOF et il n'était pas conçu pour scaler aisement.

Au moment où notre gars est intervenu, ils avaient une nouvelle deadline, quelques mois plus tard, où le site allait devoir ouvrir, à plus de monde encore, et donc faire face à un afflux encore plus important.

La majorité des problèmes ne venaient pas réellement de mauvais choix techniques, mais plus de problèmes humains. Le projet avait été splitté en une douzaine de modules différents commandés à autant d'agences différentes. Chacune faisait son affaire dans son coin, avec des niveau de qualité différents, mais surtout personne n'était en charge de faire fonctionner les modules ensemble. L'idée était que si chacun faisait correctement son travail, alors tous les bouts allaient magiquement s'emboiter à la fin. Comment dire ? non.

Ils n'avaient pas non plus de monitoring centralisé des modules. Certains avaient fait leurs propres outils (en console, en web view, sous forme d'export régulier) mais la plupart n'avait absolument aucune idée de si leur système était up ou down à part en vérifiant manuellement. L'une des premières choses qu'ils ont mis en place a été d'aggréger en une vue simplifie les infos les plus importantes qu'ils avaient : nombre de requetes, % d'erreurs et consommation CPU. Ils l'ont enrichi au fur et à mesure avec les datas qu'ils arrivaient à récupérer des différents modules.

A chaque fois que le site était down, il leur fallait quand même aller voir chaque responsable un par un en leur demandant si leur partie était bien opérationnelle.

D'un point de vue archi, leur infra n'est pas trop déconnante. Un frontal web qui tape vers un gateway qui s'occupe de l'authentication, et si ok renvoie vers la couche métier. Celle-ci s'occupe d'aggréger des résultats de service de plein d'API d'autres ministères et organismes pour calculer ce à quoi l'internaute à droit. Le processus métier étant long et complexe, dans certains cas les internautes doivent le faire en plusieurs fois, le temps que leur demande soit manuellement traitée. Il faut donc sauvegarder dans un coin l'état de leur demande pour qu'ils puissent y retourner plus tard. Ils stockent donc tout ça dans une DB en xml.

Apparemment, ils avaient un système de cache mal configuré là dedans qui créait dans certains cas plus de requetes qu'il n'en absorbait. Rajoutons à cela qu'ils ont eu besoin de stocker des fichiers, beaucoup de fichiers, ils ont donc commandé des serveurs pour ça, et les X modules se sont mis à écrire dessus jusqu'à remplir le serveur. Ils en ont donc rachetés de nouveaux, et rebelote. Au final, ils avaient 19 serveurs de stockage de fichiers où les X modules qui constituent l'application écrivaient leurs infos. Chacun de ces 19 serveurs était un SPOF car il contenait potentiellement des infos nécessaires à tous les modules... Rajoutons à cela que si l'un deux plante, ils n'ont aucune procédure automatique pour les ramener à la vie (et bien sur aucune redondance), du coup il fallait manuellement se connecter sur les machines pour remonter le filesystem manuellement. Et bizarrement, on ne pouvait pas remonter les machines dans n'importe quel ordre, il fallait forcément les remonter dans un certain ordre, sans que l'on sache pourquoi, mais au moins on connait l'ordre... ça faisait un peu vaudou...

Ensuite, l'une des histoires les plus intéressantes de toute la conf est celle du jour où ils ont pu voir sur leurs outils que toutes les requetes entrantes retournaient des erreurs, et que la latence moyenne avait baissée de 200ms à 10ms. Comme ils n'avaient toujours pas d'outils vraiment précis pour isoler le problème, ils ont déduit qu'il y avait un soucis avec la DB (la DB est généralement la partie qui cause la plus grande latence, si celle-ci droppe à 0, ça veut dire qu'elle n'est sans doute plus sollicitée).

Comme d'hab, il font manuellement le tour de tout le monde pour leur demander si leur système est up. Les gars de la DB s'apercoivent que depuis 10h30 le matin, toutes leurs requetes en DB leur retournent une permission denied error.

J'ai oublié de le dire précédemment, mais pour faciliter encore les choses, les différentes agences sont réparties à 3 endroits des USA différents, et ont une pieuvre de conf-call allumée en permanence pour discuter. Voyant l'erreur, ils demandent donc aux deux autres permanences s'ils ont modifié quelque chose à 10h30 ce jour là. Silence. Non, non, personne n'a rien changé.

En fait, il y a bien un développeur qui a changé les droits d'accès de l'user principal en vu d'un processus de batch qui allait arriver, mais au lieu de mettre à jour les anciens droits, il a simplement écrasé les anciens par les nouveaux, rendant l'accès initial à la base impossible. Plutot que de dire "Oui c'est moi, j'ai du me tromper, venez m'aider à régler", il a préféré ne rien dire en esperant que ça passe inaperçu et qu'on ne sache pas que c'était lui. Manque de bol, ils ont réussi à retrouver que c'était lui et... ils l'ont viré.

Et c'est là toute la différence de culture entre, par exemple, Google et la cellule du gouvernement en charge de mettre en place le site. A Google, on aurait dit "Mince, je crois que j'ai fait une connerie, le site est en rade, que quelqu'un qui maitrise vienne vite m'aider". Là, ils savent que s'ils se font chopper à faire une erreur, ils se font virer. Au final, plus personne ne veut prendre d'initiative car dans le cas où ils se trompent, ils ont tout à y perdre.

Notre speaker disait que lui il avait le beau role, vu qu'il venait de l'exterieur pour aider, même s'il se plantait, au pire il retournait travailler à Google et eux restaient avec leur problème, ca n'avait pas la même pression que sur les autres. Au final, tout le monde était donc incité à ne rien faire, par peur des représailles en cas d'échec. Alors que dans l'équipe, il y avait des gens très compétents, qui savaient très bien comment faire, mais qui ne voulaient pas prendre le risque.

Au final ils se retrouvaient donc dans une situation où ils viraient les gens les plus compétents parce qu'ils se trompaient parfois, et gardaient des gens qui ne faisaient rien de peur de se tromper. Si déjà ce genre de comportement est en vigueur dans la société en situation normale, il est exacerbé en situation de stress comme c'était le cas ici. Si les devs n'ont pas la liberté d'essayer, de se tromper, et de demander de l'aide, alors le jour où il se passe vraiment quelque chose de grave, tout le monde est démuni parce que personne ne veut prendre de risques. Et finalement, qui est-ce qui passe pour un incompétent aux yeux du monde ? La société/ministère, pas les développeurs internes.

Cette histoire est celle qui m'a le plus marquée parce que c'est celle qu'on retrouve (à plus petite échelle) bien trop souvent. Le fiasco qu'à été healthcare.gov et l'ampleur que ça a pris dans les médias sont de bons exemples pour expliquer les dérives qu'impliquent de telles cultures.

La suite du talk était un ensemble d'autres WTF sur le projet. C'est toujours bon à prendre, donc je le rajoute ici :

Ils avaient par exemple l'un de leur module qui avait bien un système de reporting de ses erreurs mais, il y a avait en fait toujours des erreurs, si bien que plus de la moitié des composants étaient toujours au rouge. Mais bon, le parcours critique semblait quand même fonctionner donc on oubliait un peu les indicateurs et le rouge devenait normal. Sauf le jour où il y a vraiment eu un problème, il est passé inapercu dans la masse. Impossible de se logguer en ssh sur les machines, un des serveurs était passé en read-only, plus aucune écriture dans la DB n'était possible. Ils n'ont jamais compris d'où le bug venait, et ils ont pris du temps à le remarquer, et encore plus à le corriger.

Ils avaient aussi eu des soucis de configuration de leur Load Balancer qui envoyait la moitié des requetes dans le warp, vers des IP qui n'existaient pas.

Globalement pourquoi ce projet a tourné à la catastrophe ? Parce que personne n'avait de vision générale de tous les éléments, personne n'était là pour les faire fonctionner ensemble, chacun faisait sa partie dans son coin en se disant que "si je suis les specs, il ne peut rien m'arriver de mal".

Ils ont mis en prod directement le jour de la sortie, sans faire de pre-prod avant. Le grand saut directement. Bien sur ça a planté, et s'en est suivi une grande période de stress pour toute l'équipe. Déjà qu'il était difficile de faire les choses correctement en période normale, c'était encore plus dur en stress. L'inaction était récompensée, car si on cassait quelque chose, on se faisait virer, mieux valait ne rien faire. Chaque équipe était dans son silo, sans partager ni ses informations sur son module, ni les responsabilités. Le management les incitait même à cela, pour qu'ils se concentrent sur leur sujet, sans se laisser distraire par les autres. Ils faisaient aussi bien trop confiance aux produits "tout fait". Après tout, il suffit d'aller acheter une DB au magasin Oracle et de la poser dans l'archi et tout marche, non ?

Bon, le point positif, c'est qu'ils ont quand même beaucoup appris de cette expérience et qu'ils vont changer leur culture de l'IT pour la suite, pour ne pas avoir de second épisode comme celui-ci.

Scaling One Direction

Entre plusieurs talks de présentation d'outils extraordinaire, on a eu le droit à un petit REX très intéressant.

L'histoire est ici celle de l'équipe en charge de réaliser l'infra qui devait supporter live stream video du concert de 7h des One Direction. Un boys band est un très bon exemple des problèmatiques de scaling : il y a des millions de fans à travers le monde qui vont tous faire la même chose en même temps en fonction de ce que fait le groupe sur scène.

Ici la problèmatique n'était pas vraiment le streaming live de 7h de vidéo à plusieurs dizaines de millions de personnes à travers le monde. C'est pas quelque chose de facile, mais ça a déjà été fait avant.

Non, la difficulté vient d'autre part. Pendant le concert étaient diffusées, toutes les 10 minutes, des questions sur le groupe, auxquelles les fans devaient répondre avec l'appli mobile dédiée. En terme de pic de charge ça veut dire que pendant 9 minutes il ne se passe rien, puis en 1 minutes l'infra doit absorber des dizaines de millions de hits concentrés. Puis silence radio à nouveau pendant 9 minutes. Et nouveau pic. Et ça, pendant 7h.

Après chaque question, des stats étaient affichées en temps réel sur scène, avec le pays où les fans avaient le mieux répondu aux questions, et à la fin du concert, LE fan absolu, celui qui avait répondu bon à toutes les questions depuis le début, et le plus vite possible avait son nom affiché sur écran géant et droit à un petit mot du groupe. La classe.

Bon, et comment on fait l'infra pour ça ? Déjà on estime ce qu'on pense recevoir comme hits. On se prends une marge basse et une marge haute, et on calcule les machines qu'il va nous falloir pour absorber ça. Ensuite on calcule combien ça coute, et là on s'évanouie parce que c'est énorme. Mais comme on a ces 9 minutes d'inactivité, on sait qu'on peut diminuer la facture par 10 si seulement on ne commissionne des machines que durant les tranches où on en a besoin.

Citation très importante à ce moment : "Scaling is as much getting bigger and bigger than getting smaller and smaller in a short period of time".

Ensuite, deuxième étape pour savoir sur quelle stack partir, ils sont allé voir le métier pour savoir exactement les métrics dont ils allaient avoir besoin. Il a fallu convaincre la BI (mais avec la simulation de la facture c'était pas dur), que garder toutes les données (nom, prénom, age, etc) de tous les participants c'était inutile, et qu'on n'en avait besoin que pour le top 10 à afficher à la fin. Ensuite, on n'a pas besoin de savoir exactement qui a répondu quoi, on a juste besoin de savoir combien de personnes ont répondu juste ou faux à une question, leur tranche d'age (séparée en 3) et leur pays.

Sachant cela, les archi ont laissé tombé les bases SQL et sont partis sur du memcache. L'event étant un oneshot, il n'y a pas d'intéret à garder les données après coup, donc une base inmemory est adaptée. Les écritures sont rapides et simple, mais on est limité à une structure clé/valeur.

Ils ont alors commencé à trouver la meilleure manière de nommer leurs clées pour répondre à ce besoin spécifique. La logique de nommage étape par étape est la suivante :

Comme il ne leur faut que le nombre de bonnes et mauvaises réponses à chaque question, ils ont créés des clés nommées q1wrong, q1right, q2wrong, q2right pour stocker les bonnes/mauvaises réponses aux questions 1 et 2.

Bon, ça faisait quand même beaucoup d'écritures en séquence sur la même clé, du coup ils ont opéré un sharding manuel. Ils généraient un nombre random entre 1 et 100 qu'ils suffixaient à la clés : q1wrong42, q2right67, etc. Ainsi, les écritures étaient un peu réparties et ce n'était pas toujours la même plage mémoire qui trinquait.

Ensuite ils devaient gérer la tranche d'age de l'utilisateur (séparée en 3 buckets possibles), ils l'ont donc rajouté dans la clé : q1age2wrong66, q2age3right01.

Il doivent aussi connaitre les scores par pays, et là ca se complique. Certains pays sont largement plus représentés que d'autres, donc ajouter simplement le nom du pays à la clé ferait encore trop d'écriture sur les mêmes clés. Ils ont donc défini les pays qu'ils pensaient être les plus représentés ('uk', 'us', 'unknown'). Et si le pays de l'appelant est dans cette liste, il rajoutent un nouveau sharding numérique entre 1 et 15. Si c'est un autre pays (donc moins représenté), il ne font un sharding que sur 1 à 3.

Au final, leur archi-one shot a tenue. On ne sait pas exactement combien de memcache répliqués étaient utilisées mais je doute que tout tienne sur un seul (ou peut-etre que si ?).

Après l'évenement, ils sont donc allé feter ça au bar pour la soirée et la facture des boissons était plus élévée que leur facture de cloud. Ce qui est un bon indicateur de réussite de scaling !

Consul

Mitchell Hashimoto, le créateur de Vagrant nous a parlé de son dernier projet : Consul.

Consul cherche à régler le problème de la découverte et de la configuration de machines dans un réseau. Pour pouvoir gérer son infra au mieux, on a besoin de savoir où se trouvent (ip) les différents serveurs, s'ils sont up ou down, et comment ils sont configurés. On doit aussi pouvoir en ajouter ou en enlever au système et que les autres soient au courant. Généralement pour cela on utilise un serveur centralisé qu'on peut interroger pour répondre à ces questions mais que se passe-t'il quand ce serveur là est down ?

Consul permet de répondre à toutes ces questions par un système distribué et hautement disponible. Il n'a pas pu nous dire pourquoi et comment Consul était si hautement disponible, parce que sinon il allait en parler pendant des heures, mais nous a juste indiqué que c'est la priorité numero 1 : que les infos soient toujours dispos même si des noeuds tombent. Chaque serveur fait tourner en local une instance du système, donc même s'il est coupé du réseau, il possède quand même un cache des infos et il se resynchronise avec le reste dès que la connection revient.

Chacunes de ces instances distribuées expose une API dispo en curl/dig qui permet de récupérer l'ip d'une machine à partir de son nom (ou vice-versa). L'API permet aussi de savoir si la machine est up (par défaut il ne retourne que des services ups, mais on peut taper sur un autre endpoint pour avoir la totalité des services). Avec quelques simples appels curl on peut aussi récupérer la config de telle ou telle machine.

Comme je disais plus haut, le mode de fonctionnement est local par défaut (chaque machine possède les infos de la totalité du réseau) mais se synchronise en cas de changement. Un (ou plusieurs) datacenters peuvent être identifiés comme maitre de la donnée, où les autres se tournent pour avoir des infos plus fraiches.

Et bien sur, il existe une console web pour voir tous les noeuds, leur dispo et leur config, mais aussi un outil en ligne de commande pour intéragir avec eux.

Connaissant la qualité de Vagrant, Consul a l'air très prometteur.

Flynn

Jeff Lindsay nous a présenté un truc assez flou où à la fin de la présentation on ne savait pas si le projet dont il parlait existait réellement ou non. Il faut dire que les speakers avaient comme consigne de ne pas faire de conférences commerciales, donc parfois c'était assez flou.

Bref, Jeff Lindsay a un CV assez impressionant d'ops chez Digital Ocean, dotCloud, la NASA, et Twilio.

L'histoire qu'il nous raconte est celle d'une société qui commence son proto et l'héberge sur heroku. Tout est facile, en quelques clics on choisit ce qu'on installe et tout est disponible directement.

Mais quand la société grandit et qu'elle a besoin de scaler, elle va vite atteindre les limites d'heroku. Avec de la chance, toute la stack technique dont elle a besoin est fournie par heroku, mais si jamais ce n'est pas le cas elle est obligée de tout migrer sur une nouvelle infra, et de rattraper un gros retard from scratch en réecrivant tout sous Chef ou Puppet.

Et ça arrive souvent. Les serveurs évoluent, les besoin techniques aussi, on a besoin d'ajouter de nouveaux noeuds, ou de splitter des noeuds existants, ou de merge plusieurs noeuds ensemble. Il faut mettre une API en frontal, rajouter des load balancers, du cache, des master/slaves, etc. Sans parler des serveurs annexes qui gravitent autour : le repo git, le master chef, l'outil de bug report, le jenkins, etc. Forcément, au bout d'un moment on va avoir plein de machines un peu partout.

Et si on n'avait plus besoin de machines finalement ? Et si tout ce qui nous intéressait c'était les services qui tournent dessus ?

Flynn, l'outil développé par le monsieur essaie d'abstraire la notion de serveurs pour se concentrer sur les modules qui tournent dessus. A base de containers dockers un peu partout, il fourni un outil pour développer son propre heroku-like privé. La notion même de host disparait, et tout ce qui nous intéresse sont les process.

C'était une idée vachement intéressante et qui fait voir les choses sous un autre angle, mais le projet n'est qu'à l'état d'embryon actuellement.

https://flynn.io/

Lightning Talks

Après la pause déjeuner, on a eu le droit à une sessions de lightning talks.

Le premier nous a parlé de son projet Nephorider qui permet de dresser une carte graphique des différentes machines d'un cloud : qui est relié à quoi, avec quelle ip, etc. Ils fonctionnent avec plusieurs providers, mais essentiellement Amazon, Rackspace et Google Compute Engine. Son talk parlait surtout des différentes API que ces trois fournisseurs exposent pour obtenir les infos nécessaires à la conception de son graph.

Chez AWS, il faut une cinquantaine de requetes, pour questionner toutes les régions, toutes les zones et aggréger toutes les infos. Chez Rackspace, on se limite à une vingtaine. Chez Google il en faut 3-4 parce que leur API permet de sélectionner les clés que l'on désire, et permet d'aggréger plusieurs requetes en une seule, et de les chainer avec un seul appel. Ca c'est de l'API !

Peter Szilagyi, le suivant nous a parlé de son projet Iris. J'ai eu un peu de mal à suivre exactement de quoi il retournait mais de ce que je comprends c'est un projet de messaging au sein d'une infra, de manière à faire communiquer des nodes ou groupes de nodes de même nature les uns avec les autres. Ca peut aussi bien être du broadcast générique que du pub/sub que du classique request/reply ou du stream d'un node à un autre. C'est resté assez flou.

Finalmeent Steeve Morin (@steeve) nous a parlé de boot2docker, qui utilise un kernel linux le plus petit possible, juste suffisant pour lancer docker et qui permet ainsi d'avoir une instance docker complete (kernel, OS, docker) pour seulement 53mo, et qui se lance la première fois en 3s, téléchargement de l'iso inclus. Vu que la stack initiale est read-only, on peut même booter depuis une clé USB. Un projet intéressant.

openZFS

Premier talk d'un haut niveau technique par Matt Ahrens, j'ai un instant eu peur que toutes les confs soient de cet acabit, mais c'était plutot l'exception.

Il nous parle des filesystems en général et d'openZFS en particulier. Comme dans pas mal de systèmes, il y a toujours un tryptique où on ne peut choisir que deux points parmis trois et pour les filesystems le choix se porte entre rapide, sûr et bon marché. Il nous parle d'un problème courant dans les datacenters où certains disques d'une baie sont moins performants que d'autres, et qu'on a beau les remplacer par des neufs, c'est toujours celui qui est à la même place qui souffre. Comme c'est du matériel mine de rien assez fragile, il suffit qu'il y ait des vibrations à cet endroit dans la pièce (à hauteur de voix parce qu'on est obligé de crier dans un datacenter à cause du bruit) et la tete de lecture se décale et crée des incohérence dans les données écrites sur le disque.

Généralement ces incohérences sont corrigées par le software qui va lire le disque, mais openZFS prends un autre partie en gérant ce genre de problèmes au niveau hardware. Les données sont écrites à plusieurs endroits dans le filesystem afin d'assurer une redondance et donc une meilleure intégrité des données. Ils font aussi des checksums de ce qu'ils écrivent afin de s'assurer de l'intégrité de la donnée. Un serveur qui utilise openZFS peut bien crasher d'un coup, les données sont assurées d'être écrites correctement, les disques ne peuvent pas se retrouver dans des états instables qui nécessittent de passer un coup de fsck.

openZSF est fait pour tourner sur du commodity hardware, des tas de disques bons marchés sur lesquels on replique la donnée et on se moque si l'un est plus lent que les autres ou non, il suffira alors de le changer si nécessaire, et on ne perdre pas l'intégrité de notre donnée.

Aujourd'hui, pour le même prix on peut avoir une capacité de stockage un million de fois supérieur à ce qu'on avait il y a 20 ans. Ce n'est donc pas intéressant de faire travailler du software pour régler des soucis d'incohérence et d'intégrité de donnée, il vaut mieux assurer ce travail au plus près du hardware pour avoir le moins de transit de donnée.

Note: Comme je disais en intro, ce talk était très technique, donc désolé si j'ai compris des trucs de travers, les experts pourront corriger.

Will PHP be hype again ?

Fabien Potencier (@fabpot), de Symfony nous a parlé de PHP. Il a commencé par évacuer les trolls d'entrée de jeu en disant que lui aussi, même s'il fait du PHP tous les jours, il n'aime pas le langage. Mais qu'il aime PHP pour la plateforme que c'est. Grand écosystème, facile de contribuer, server-side language qui a été pensé dans une optique de web dès le début et une pltéhore de frameworks disponibles (WordPress, Drupal, Joomla, Magento entre autres).

Le problème majeur de PHP est qu'il n'a jamais été pensé pour scaler. Toute nouvelle requete doit repasser par tout un cycle de traitement et de recompilation. Sur Symfony, ils essaient de déplacer certaines éléments de logique qui étaient initialement réexecutés à chaque requete, pour les déplacer à l'initialisation de PHP, histoire de gagner en performance. Ils se heurtent à pas mal de soucis inhérents à la conception initiale de PHP, comme par exemple le fait qu'une seule requete ne puisse être traitée en entrée à chaque fois et qu'une seule réponse ne puisse être retournée (ie. echo renvoie direct dans le corps de la réponse).

Bref, il est confiant que PHP puisse redevenir hype à nouveau ("après tout, c'est bien arrivé à Javascript"), grâce à la communauté qu'il a déjà derrière lui.

SaltStack

Thomas S. Hatch nous a parlé de nos infrastructures. On a plein de machines, déployées à travers le monde, qui communiquent les unes avec les autres. Pour réussir à scaler correctement, il faut aller vite; le scaling est essentiellement une question de vitesse. Et bien sur, chaque infra est différente et il n'y a pas de formule magique qui marche dans tous les cas.

Il y a donc différentes manières de considérer ses machines. Certains les voient comme des animaux domestiques, à qui on demande d'effectuer des taches, et qui reviennent avec le résultat. D'autres les chouchoutent comme des pierres précieuses, en les configurant aux petits oignons, mais de manière tellement précise qu'on n'ose plus y toucher de peur de briser quelque chose. De plus les voient aussi comme du bétail, un gros troupeau sans intelligence individuelle mais qui réagit à des ordre de déploiement supérieurs.

Mais la solution évoquée par le speaker est de les voir comme une armée de minions. On peut les diriger, leur donner des ordres, et compter sur eux pour faire ce qui est juste à un moment donnée pour arriver au but indiqué.

L'automatisation passe essentiellement par la communication entre les entités. Et vu la taille des architectures dont on parle, cette communication ne peut être qu'asynchrone, on ne peut pas attendre d'avoir la réponse aux questions qu'on a posées avant de passer à la suite. Si on rajoute à cela que tout ces systèmes ne parlent pas la même langue (différents protocoles, différentes implémentation, différents OS), il est impératif de trouver une manière de normaliser la communication.

Il a ensuite rapidement évoqué SaltStack, son produit qui serait une solution proposée à ce problème (http://www.saltstack.com/). Pour lui la solution passe par une modularisation (separation of concerns) des composants, et une abstraction par couche (pour simplifier chaque partie au maximum), mais surtout l'architecture doit être data-driven et non pas language-driven. Toute la configuration de qui parle avec qui pourquoi doit se trouver dans des fichiers de confs et pas dans des scripts d'un langage ou d'un autre. Ca permet de ne pas être bloqué avec un outil et de ne pas pouvoir en changer (un gars de WikiMedia dans une autre conf évoquait justement qu'ils restaient sur un vieil outil à cause des 20.000 lignes de code de déploiement qu'ils avaient dessus à cause du coup de migration).

Au final, il a peu parlé de sa solution et je ne sais pas trop ce qu'elle fait mais son analyse était intéressante.

And let's not forget Security

Alison Gianotto, alias @snipeyhead nous a fait un tour d'horizon et une piqure de rappel sur la sécurité informatique. C'est sujet récurrent dans à peu près toutes les conférences où je vais, mais c'est aussi un sujet tellement vaster qu'un peu d'évangélisation ne fait jamais de mal.

Elle a commencé par énoncer deux principes qu'il faut garder en tête à chaque fois que l'on tente de se protéger. Tout d'abord il est impossible d'anticiper tous les risques. Et deuxièmement, il est futile d'essayer de mitiger tous les risques. Sur ce premier constat pessimiste, on enchaine en se mettant dans la peau du hacker et de pourquoi il fait ça ?

Généralement c'est pour du profit, pour voler ou revendre des informations personnelles, des numéros de carte bleue, des informations secrètes. Ca peut aussi être tout simplement pour le fun, ou pour de l'hacktivisme. Parfois c'est par vengeance, ou pour de l'espionnage industriel. Il ne faut pas oublier tout le blackhat SEO (compromettre des sites pour faire monter son propre google juice).

Nos infrastructures sont aujourd'hui bien plus grandes qu'il y a 10 ans. Les infiltrations sont sans doute aussi nombreuses en proportion, mais la quantité de donnée volée est bien bien supérieure. On a eu plusieurs mega-breaches ces dernières années (ie. 10+ millions d'identitées récupéréres) : Adobe, PSN, etc.

Alors on essaie de se protéger, mais souvent ce qui semble une bonne idée de l'extérieur amène en fait plus de risques qu'initialement. C'est par exemple le cas de forcer ses utilisateurs à utiliser des mots de passes résistants en les forçant à suivre des règles drastiques (des chiffres, des lettres, des caracteres spéciaux, et devoir le changer régulièrement). Au final, le pass est tellement difficile à retenir que les utilisateurs vont le noter sur un post-it, et incrémenteront un numero tous les 3 mois.

Nos archis couvrent une telle surface que les intrusions peuvent venir de bien plus d'endroits qu'avant. Monitorer tout cela et se protéger devient très difficile. Sans compter qu'on fait face à une force de frappe qui est virtuellement illimitée : réseau de machines infectées qui peuvent bruteforcer ou DDOS. Ca coute beaucoup plus cher à une boite de se protéger de ces intrusions que cela ne coute à un attaquant (on peut louer des serveurs dans le cloud à la force de frappe énorme pour peu de sous).

Mais continuons à être pessimistes : les hackers ne sont pas nos seuls ennemis dans cette battaille. Nous sommes nous-même bien souvent la première faille du système. Nos systèmes devraient suivre le principe de CIA (rien à voir avec l'agence), c'est à dire : Confidentiality, Integrity and Availability.

Confidentiality signifie que l'accès aux données sensibles doit être limitée. 2 factor authentication, et destruction des anciennes données régulièrement. L'Integrity assure que l'information que l'on récupère est correcte et qu'elle n'a pas été modifiée. Et finalement Availability pour assurer que les personnes qui ont l'accès peuvent accéder à leurs infos à tout moment.

Elle a fini par quelques conseils génériques et une checklist de 20 items à faire tout de suite si ce n'est pas déjà fait. Tout d'abord, il faut étudier tous les composants de notre infra, et pour chacun étudier les chances qu'il puisse être la cible d'une attaque, et l'impact si jamais il venait à être compromis. Ensuite, il faut bien évidemment avoir un monitoring, comme toujours, de toutes les requetes et des comportements étranges. Et finalement, il faut lister tous les appels que l'ont fait vers des third party (API externes, progiciels, etc) pour identifier l'impact si l'un d'eux vient à tomber ou devient compromis.

Finalement, la vingtaine d'items à faire au plus vite :

  • Faire participer sa team à un jeu de CTR (Capture the Flag). Ce sont des jeux organisés en ligne où le but est de réussir à s'introduire dans des serveurs spécialements prévus à cet effet, mais utilisant des failles communes dans beaucoup de systèmes. C'est en se mettant à la place de l'attaquant qu'on voit toutes les informations intéressantes que l'on peut laisser derrière nous dans notre dev qui sont autant de levier pour assister une intrusion. Elle donne l'exemple typique de laisser le mode debug activé en prod, qui souvent laisse une stacktrace par défaut, et parfois même affiche les lignes de code incriminées : révélant au grand jour les login/password de la DB.

  • Ce conseil est rarement appliqué, mais est pour elle primordial : il faut mettre la sécurité sur la table dès le début du projet et ne jamais l'oublier. Ne jamais se dire que cela viendra dans un second temps, plus tard, comme une couche de vernis à appliquer sur un projet terminé. C'est quelque chose qui se passe à tous les étages et qui doit être gardé dans un coin de la tête de tous les acteurs du projet.

  • Liste toutes les potentielles cibles d'attaque exterieure : les frontaux publics, les bases de données, etc. Y attribuer une valeur de criticité s'ils tombent et une valeur de confiance qu'ils peuvent résister.

  • Avoir identifié à l'avance les conséquences du fail des third parties sur lesquels on se repose. Que faire si cette brique disparait du système, si on ne peut pas leur faire confiance. Est-ce que tout est bloqué, ou est-ce qu'on a un fallback en mode dégradé ?

  • Très important ! Faites confiance à votre instinct. Si quelque chose vous parait étrange, il y a de fortes chances que ce ne soit pas normal.

  • Gardez les systèmes le plus simples possibles. S'ils sont déjà complexes à comprendre en situation normale, une situation irrégulière d'intrusion risque de passer inaperçue.

  • Augmenter la transparence. Ne développez pas de système en boite noire, partagez la connaissance du fonctionnement de chaque outil au sein de l'équipe. Plus il est connu comment les choses fonctionnent, moins on risque de créer des failles par ignorance.

  • Automatisez tout. L'erreur est humaine, et les taches répétitives doivent êtres automatisées, ici aussi pour éviter d'insérer une faille par inadvertance.

  • Logguez presque tout. En gros, il faut tout logguer pour pouvoir déceler des comportements suspects, mais il ne faut jamais logguer les informations critiques comme les mots de passe ou les numeros de carte de crédit ou de sécurité sociale.

  • Utiliser le principe du least privilege par défaut : bloquez l'accès à tout le monde sauf à une whiteliste plutot que d'ouvrir tout et ne blacklister que certains points d'entrée/utilisateurs.

  • Ne gardez que l'information dont vous avez réellement besoin. Inutile de remplir des To de logs qui n'ont aucune valeur pour vous mais pourraient en avoir pour un attaquant.

  • Utilisez du two-factor authentication. C'est très simple à faire et il y a plein d'APIs disponibles pour aujourd'hui.

  • Prévoyez un plan de recovery en cas de crash, ou en cas de suspiscion d'intrusion, mais surtout TESTEZ LE !

  • Préparez toute la paperasse légale, faites les bonnes dépositions auprès des bons organismes pour indiquer le type de données que vous stockez, pourquoi et pour combien de temps. C'est long et laborieux, mais le jour où vous serez au grand jour pour une faille, ça limitera les dégats sur votre image.

  • Si vous utilisez un framework, utilisez ses mécanismes de validation/sanitization des inputs, ne développez pas les votre.

  • Faites faire des tests d'intrusions de l'intérieur, avec la connaissance du système, mais aussi de l'extérieur, sans connaissance du système, pour avoir deux points de vue différents.

  • Faites attention aux alerts. Si vous avez des erreurs régulières sur votre monitoring mais arretez d'y prêter attention, vous ne remarquerez pas l'erreur importante le jour où elle aura de la valeur.

  • Et le plus important : devenez un ambassadeur de la sécurité passionné, pour en parler à vos utilisateurs et à votre équipe.

HumanTalks Mai 2014

Introduction

HumanTalks chez Adobe, dans leurs magnifiques locaux. La "sécurité" à l'entrée était un peu longue à passer du coup les talks ont pris pas mal de temps à se lancer, et le manque de pizza pour combler nos estomacs à la fin s'est bien fait sentir.

Néanmoins les présentations étaient globalement très intéressantes.

Cache Manifest

Présentation trollesque sur cache manifest. Le speaker annoncait que les systèmes de cache natifs des browsers et des serveurs (ie. les entetes de cache HTTP) n'étaient pas assez robustes et que le cache manifest était donc la solution pour parfaitement avoir la main sur ce qui était caché et ce qui ne l'était pas. Il est même allé plus loin en parlant des développeurs qui désactivent automatiquement le cache avec les outils de dev de Firefox et de Chrome et qui mettaient ses serveurs à genoux en démultipliant les requetes et que le cache manifest encore une fois était la solution à ces problèmes.

La suite de son talk annoncait que le cache manifest avait même un effet bonus qui permettait le travail online, et que c'était facile de détecter si le browser était offline ou non avec navigator.onLine...

Mouais.

Je ne suis pas du tout convaincu par ces arguments, les mécanismes de cache HTTP du browser et du serveur sont parfaitement adaptés à mon gout une fois qu'on comprends bien l'utilité de chaque header. Idem pour navigator.onLine qui a un comportement tellement différent selon les navigateurs que cela le rends inutilisable.

Finalement la conférence était plus un pretexte à troller Windows, IE, Flash et compagnie plutot que d'apporter des arguments interessants pour l'utilisation du cache. Le plus frappant était surtout que j'avais vu deux conférences à la QCon (Steve Souder et un mec de Hoodie, qui sont quand même des pointures) dire à peu près tout le contraire : que le cache est une bonne idée dans la théorie mais que l'implémentation rends la chose très fragile -propos confirmés par deux collègues d'Octo qui y ont touché de près-.

Git Deliver

git deliver est un ensemble de scripts git et bash qui permettent de faire des déploiements facilement directement depuis git.

L'idée est d'utiliser les remotes de git pour y pusher du code. Plutot que de faire un git push, on fait un git deliver en spécifiant la remote et le sha/tag/branch que l'on souhaite pusher.

Le système se charge ensuite de mettre le working directory dans un dossier accessible et propose tout un tas de hooks pour effectuer différentes actions après le push, avant de mettre dans le working directory, à la fin, etc. Comme par exemple passez un validateur de code, lancer un process de build, jouer les tests, mettre à jour une config, etc. Si un de ces scripts retourne une erreur, le déploiement n'est pas effectué.

Il garde un historique de n déploiement précédents, et la possibilité de faire des rollback facilement.

C'est au final assez proche d'un outil comme Capistrano, mais son avantage est qu'il n'a besoin que de git et bash pour tourner, donc extremement facile à mettre en place.

C'est parfaitement adapté pour des technos comme PHP qui peuvent s'executer direct depuis le working directory, ou un site purement front. Pour d'autres technos ça demande un peu de tweaks des scripts de trigger (mais ils sont fait pour ça). Si jamais l'archi nécessite des déploiements sur plus d'un serveur, ça devient rapidement moins adapté.

La vie d'un manager

Un ancien développeur nous a raconté son parcours à travers plusieurs boites de différentes tailles, et comment il est passé de dev à manager et ce que c'est que d'être manager.

Globalement, son image c'est qu'on a le cul entre deux chaises. D'un coté des devs qui veulent s'éclater sur des technos interessantes et de l'autre des boss qui veulent rentabiliser leurs applis sur des technos plus anciennes. Le role du manager est de réussir à comprendre les envie des deux, les langues des deux, et les faire se comprendre.

La qualité la plus importante pour lui est d'instaurer la confiance, notamment au travers des 03 qui doivent être honnetes (pas de manipulation), confidentiels (ce qui se dit dans un O3 reste dans l'O3) et dans lesquels le manager doit réellement écouter.

Son conseil principal quand on est un dev et qu'on devient manager par la force des choses, c'est de commencer par NE RIEN FAIRE. Le travers des jeunes managers est de vouloir organiser trop de choses et devenir donc trop rigides.

Son devoir est aussi de cadrer les développeurs : booster celui qui est paresseux, challenger celui qui est trop confiant, donner confiance à celui qui est trop timide, et calmer celui qui est trop casse-cou.

A coté de ça, il lui faut présenter le travail de l'équipe aux boss, dans des termes qu'ils comprennent, et parfois sur des trucs très simples (la liste d'acronymes sans fin et de termes barbares qu'on emploie tous les jours). Il donnait l'anecdote du chef de projet qui avait un jour conseillé que "si les développeurs se mettaient à un par poste plutot qu'à binomer, ils iraient deux fois plus vite...".

Sinon un dernier truc assez vrai mais que je n'avais pas remarqué, c'est qu'on a une certaine réputation d'enfants gatés : on travaille dans un milieu où il est facile de trouver du travail, en plus on fait un métier peu fatiguant (rester assis devant un écran, c'est pas bien crevant), on a du matériel haut de gamme et on se plaint encore de pas avoir les dernières version. Et en plus, on fait nos autistes à travailler avec notre casque sur les oreilles. Tout ça donne une mauvaise image pour qui ne connait pas le métier, il faut donc faire attention à ne pas alimenter les clichés.

Il a finalement terminé en disant que le management, c'était basé essentiellement sur des ficelles de manipulation ("comme toutes les relations humaines"), savoir qui est influent, ce qui l'intéresse, ce qui le touche, ce qui l'embete, ce qui lui plait, etc, de manière à créer une cohésion de groupe qui ne se serait pas forcément créée d'elle-même.

Les nouveaux outils Adobe pour les Web Designers

La dernière conf', vu qu'on était chez Adobe, était sur les prochains produits et évolutions de produit Adobe. Présenté par @mchaize qui bosse là bas et qui a pu nous donner une vision honnete de ce qu'il se passe chez Adobe.

D'abord, c'est des améliorations dans la prochaine version de Photoshop. Photoshop est un logiciel vieux, au lourd passif de codebase legacy, qui n'était pas du tout destiné à faire du design web mais qui a du évoluer au fil des ans. Ils font ce qu'ils peuvent pour aider le travail des webdesigners et webdeveloper.

Et deux nouvelles features très interssantes : la première étant d'avoir des objets liés entre plusieurs .psd et .ai. On peut importer un fichier vectoriel .ai dans un .psd et quand le modifie, celui le mets automatiquement à jour dans le .psd (du moment que 'toshop peut accèder au fichier sur le disque). Ainsi, plusieurs designers peuvent travailler sur le même projet du moment qu'il est découpé en plusieurs fichiers.

Deuxième feature, carrément plus intéressante pour un webdev comme moi : Il suffit désormais de nommer ses calques avec des noms de fichiers pour qu'ils soient automatiquement exportés. Par exemple, un calque banner.jpg sera exporté automatiquement dans le même dossier que le psd, et mis à jour automatiquement dès qu'il est modifié dans le psd. Plus de galère pour retrouver le ou les calques à exporter à chaque modif du psd. On peut même spécifier la compression et/ou la qualité (ie. une version à 200% pour retina, une à 100% sinon). Ca accepte du jpg, gif, png et svg.

Dernière amélioration, c'est le Project Parfait, un site internet d'Adobe où on peut uploader un psd et le voir en live dans son browser. On peut alors survoler les éléments pour voir directement leurs dimensions et leur positionnement sur la page. On a la liste des couleurs utilisées avec leur code hexa. Selectionner un élément de texte nous donne automatiquement les règles CSS associées (font, size, color, shadow, etc). Sélectionner deux éléments indique leur espacement, etc. Bref, un gain de temps sur toutes les fonctionnalités qu'on doit faire et refaire quand on doit intégrer un psd en CSS/HTML. Et le super effet kisscool bonus c'est que ça permet de faire directement sauter aux yeux les incohérences des designs ("pourquoi la marge est de 6px ici et de 4px là ?", "Pourquoi y a 12 gris différents et 6 polices ?").

J'ai aussi appris que photoshop possédait une API pour le piloter en headless avec plein de plugins dispos.

ngParis #10

Introduction

Premier meetup angular pour moi. Dans les locaux d'eNovance. On a parlé du centre d'appel pour AutoLib qui est fait avec Angular et on a ensuite parlé de tests avec Protractor.

Le centre d'appel AutoLib avec AngularJS

Présenté par Stéphane Raimbault

Le centre d'appel AutoLib est ouvert 24/7, avec 40 conseillers qui gèrent les appels, dans plusieurs villes de France. Le système a été développé par 20 devs, essentiellement en python (Django), avec un peu de JS pour la couche client.

Les devs ne faisaient pas de front au début, ils ont commencé à ajouter du jQuery, et ça marchait bien. Mais plus il y avait de feature à ajouter et plus les modifications leur coutait cher en temps de dev. Ils ne pouvaient pas tester unitairement leur code, donc ils ont investi dans des tests selenium pour s'assurer qu'il n'y avait pas de regression. Finalement, ils ont sauté le pas pour passer à Angular, et depuis ils prennent plaisir à développer du JS.

Sur le poste de chaque téléconseiller tourne un applet Java et un "soft phone". Dès qu'un appel arrive, son numero de téléphone est envoyé à l'applet, qui fait un lookup pour savoir à quel client et à quelle ville il correspond. L'applet lance ensuite un navigateur en spécifiant l'url à ouvrir (contenant l'id du client). La page web ainsi affichée est divisée en 3 parties.

  1. Destinée aux RH. Compte le temps des appels, le temps avant la prochaine pause, etc.
  2. Partie toujours affichée, avec un champ libre pour laisser des informations sur l'appel, mis à jour en temps réel, pas besoin de validation.
  3. Partie de navigation : itinéraire, solde, informations sur la voiture, etc.

Toutes les informations remplies dans les $scope sont automatiquement stockées dans le localStorage avec ngStorage. Ainsi, toutes les pages ouvertes pointent vers le même utilisateur (pour éviter au téléconseiller d'avoir plusieurs onglets sur des utilisateurs différents et les confondre). Attention, le localStorage est stocké sur le profil Chrome de l'utilisateur, qui peut être stocké sur le cloud, donc attention à la consommation en bande passante.

La partie RH et la partie client font appel à deux SI différents, sur deux domaines différents. Ils ont donc du gérer les soucis de CORS (Cross Origin Request Sharing). Pour cela, le serveur distant (nginx, apache) doit accepter le verbe OPTIONS. Chrome possède une politique de cache aggressive sur ce verbe, attention aux erreurs lors du debug. Le serveur doit aussi répondre le header Access-Control-Allow-Origin, et angular doit envoyer les credential BasicAuth avec $httpProvider.defaults.withCredentials = true

Pour faire leurs tests, ils générent des grappes de jeux de données avec FactoryBoy (en python) qui leur créé des utilisateurs avec des contracts, des voitures, etc, dans à peu près tous les états possibles. Ils mélangent les tests Selenium avec des tests plus techniques (ex. vérifier qu'une donnée est bien modifiée en DB après une interaction dans le browser).

A posteriori, ils sont contents d'avoir switché à Angular mais ils regrettent de devoir dupliquer de la logique (vue/controlleur codé en front doit aussi être codé en back), le support de l'i18n en Angular est assez limité. Ils sont par contre très content d'avoir quitté jQuery, et leurs devs aiment désormais faire du JS.

Protractor

Protractor est un outil qui permet de faire de tests fonctionnels en Angular (aussi appellés tests end to end, test d'intégration web, tests de gui, acceptance tests, etc). Ils permettent de tester toutes les couches de l'appli, depuis le GUI jusqu'aux interactions avec la DB.

Il se base sur Selenium, qui lui-même utilise l'API WebDriver pour "parler" aux différents browsers. Initialement Selenium utilisait une solution full-js, mais cela limitait les interactions, désormais WebDriver communique avec chaque browser dans une syntaxe qui lui est propre mais abstrait ça sous une couche commune. Protractor utilise l'implémentation nodeJS de WebDriver, nommée sans grande surprise WebDriverJS (il en existe aussi en ruby, java, etc).

Protractor est parfaitement lié avec Angular, il sait donc quand un appel est en cours, quand il est revenu, ou quand un cycle de digest est en cours et attends donc qu'ils soient terminés pour continuer son execution. Ca évite de devoir mettre des sleep() partout. Il permet bien sur de selectionner des éléments à partir de sélecteurs CSS, mais aussi à partir de selecteurs propres à Angular (comme sur le nom des bindings, des models, des controlleurs, etc). Pour finir, il s'intégre avec SauceLabs.

ngScenario est l'ancetre de protractor, aujourd'hui deprecated, qui pilotait l'appli en full js, sans selenium. Nightwatch est une autre solution de tests e2e mais n'est pas spécifique à Angular. CasperJS quand à lui est uniquement pour les moteurs headless (phantom, slimer).

Protractor s'installe depuis npm. Il suffit ensuite de mettre à jour le driver selenium avec node ./node_modules/protractor/bin/webdriver-manager update et de lancer le serveur selenium avec start dans un terminal, puis de switcher dans un autre et lancer les tests protractor. Il existe bien sur une tache grunt pour faire ça automatiquement. Le fichier de config selenium indique l'url où tourne selenium, la liste des browsers à tester (avec potentiellement les arguments à passer pour les lancer, comme par exemple un profil spécifique) et l'url du site à tester.

Pour écrire des tests Protractor, on utilise essentiellement trois objets

  1. browser, et browser.driver qui est l'API webdriver, pour reload, charger des pages, resizer la page, etc
  2. element pour intéragir avec les éléments du DOM
  3. by pour faire des sélection XPath, ou selon les sélecteurs Angular

Globalement la doc est pourrie. Il vaut mieux regarder les fichiers de tests de Protractor directement pour voir comment l'utiliser. Pour le debug, on peut utiliser browser.pause() pour arreter l'execution du test et faire du step by step. Sinon il existe un autre script livré avec, elementexplorer.js qui permet d'utiliser Protractor de manière intéractive, comme une console, avec autocompletion, ce qui permet de débugguer au fur et à mesure.

Le fichier de config possède aussi une méthode onPrepare qui peut être executé avant de lancer les tests (par exemple pour identifier l'utilisateur sur la page de login). (Tip : element n'est pas dispo dans cette méthode, il faut utiliser browser.driver.findElement). On peut ensuite faire une boucle browser.driver.wait jusqu'à ce que le user soit correctement identifié avant de lancer les tests suivants. Si nécessaire, on peut aussi passer des variables globales aux tests depuis cette méthode avec browser.params.

Les tests e2e prennent du temps, car ils simulent de vraies intéractions utilisateurs, latence comprise. C'est donc un peu plus compliqué d'intégrer ça dans une démarche d'intégration continue. Les prochaines versions de Protractor permettront de sharder les tests sur plusieurs serveurs.

Attention aussi aux applications qui font du long-polling. Comme Protractor attends la fin des requetes pour passer à la suite, il restera bloqué sur un appel comme ça. Il faut alors soit trouver une autre méthode, soit désactiver le long-polling pour les tests. Attention aussi, Protractor (v0.2.11) n'est pas encore compatible avec IE11.

Finalement, un conseil : Les tests e2e sont fragiles, ils sont très dépendents de l'UI et cassent facilement. Une bonne pratique est de rajouter un middleware orienté métier, avec des méthodes comme "selectLoginButton", "fillUserName", etc qui sont les méthodes exposées aux équipes chargées des tests, et si l'UI change il suffit de le modifier à un seul endroit facilement, sans avoir à changer tous les tests. En plus, cela permet aux testeurs de se concentrer sur la feature à tester sans devoir se farcir les détails d'implémentation.

HumanTalks Avril 2014

Introduction

La session avait lieu chez Mobiskill, 43 rue Beaubourg. Ils sont "experts dans le recrutement mobile et web".

Aggregation pipeline pour mongoDB

Aggregation pipeline est un framework intégré à mongodb depuis la 2.2. Il permet de chainer des opérations de find sous forme de pipe, un peu à ma manière d'un map/reduce.

  • $match permet de retrouver des éléments qui matchent un certains selecteur
  • $project permet de définir la liste de champs à garder, exclure ou renommer
  • $unwind pour applatir le résultat
  • $group pour... grouper les résultats par critères
  • $sort pour les trier

En pratique, on utilise tout ces selecteurs chainés en pipe, plusieurs fois les mêmes, pour arriver à un résultat filtré sur mesure.

Ca reste du mongo, donc il n'y a toujours pas de jointure. Il y a des types de valeurs qui ne sont pas traitable (int, float, string et autres types de bases sont parfaitement traités). Et une autre limitation inhérente à mongo est que les flux ne doivent pas dépasser 16Mo (limite en dur dans mongo).

La speakeuse indiquait que l'implémentation était facile, plus aisée à prendre en main que map/reduce, et qu'il y avait encore plus d'opérateurs que ceux présentés.

Ca supporte officiellement les collections shardées mais il vaut mieux avoir une machine bien puissante pour que ça fonctionne correctement.

Programatoo

Initiative de deux développeuses de chez Sfeir qui aiment l'informatique depuis qu'elles sont petites mais n'ont jamais trouvé dans les cursus nationaux de quoi satisfaire leur demande. L'informatique à l'école se limite à du Word/Excel ou alors englobe trop de choses sous le label "multimédia" ("C'était le buzzword il y a 10 ans, aujourd'hui c'est BigData").

Ont organisé un "coding gouter" avec les enfants des employés Sfeir, et les plus jeunes ont beaucoup aimé, mais les plus vieux (12-15 ans) se pensaient déjà au dessus de ça, que "l'informatique, ils maitrisent". En fait, ils connaissent youtube et facebook mais ça ne va pas plus loin.

Elles ont donc proposé des cours d'informatiques pour jeunes dans différentes écoles et font aujourd'hui ça à Nanterre, pour transmettre leur passion et remettre à jour les définitions des conseillères d'orientation sur le métier de "Développeur".

Les langages utilisés sont Scratch, SmallBasic et Kids Ruby (par ordre croissant de difficulté). D'autres initiatives du même genre existent aussi : CoderDojo, KCC, je.code(), Devoxx4Kids.

Elles ont remarqué qu'il y avait beaucoup plus de réticence à apprendre l'outil informatique de la part des enseignants (à qui cela fait peur) qu'aux enfants.

Programmation par contrats

Jean Baylon de Soat nous a parlé de programmation par contrat. C'est un type de programmation défensive où on spécifie dans le code ce qu'on attends comme input (pre-conditions) et comme output (post-conditions).

Ca permet d'éviter les commentaires (qui ont peu de valeur et sont souvent oubliés dans le refactoring), et s'utilise en parallelle de tests unitaires.

Par exemple, si on veut implémenter une fonction de racine carrée, on testera l'input pour s'assurer qu'il est positif (comme ça on s'assure, dans le code même de la méthode que les inputs négatifs ne donneront rien). Mais on teste aussi le retour de la méthode avant de le retourner, dans cet exemple en vérifiant qu'en multipliant le retour par lui-même, on retrouve bien l'input initial.

Il existe des frameworks pour Java, Python, .NET et C. Ca permet de faire des preuves formelles que le code est juste, un genre de try/catch amélioré.

Quelques exemples étaient donnés pour mieux comprendre le systeme. Si on souhaite implémenter une Liste, on vérifie dans le constructeur que l'objet retourné à a bien une length de 0. Quand on ajoute un élément, on vérifie avant la sortie que la nouvelle liste a une length supérieure à la length initiale, et on vérifie que le dernier élément est bien celui passé en input et que le reste de la liste est égal à la liste initiale. Par contre pour la méthode qui permet de récupérer un élément dans une liste on aimerait vérifier que l'élément retourné était bien dans la liste initiale, mais on ne peut pas vérifier cela car ça nous ferait partir dans une boucle infinie de récursion.

Ca pompe un peu sur les performances, mais la majorité des frameworks possèdent un switch qui permet de désactiver les contrats en prod. On les laisse donc en pre-prod, qu'on fait tourner pendant quelques temps avec de vraies données et qui nous permet de catcher les problèmes, puis on désactive pour la prod.

Ca peut être utilisé aussi quand on développe une bibliothèque qui sera utilisée par des tiers. On ne sait jamais comment les autres vont appeller les méthodes, s'ils vont suivre la doc, etc. On peut comme ça générer des warnings quand les paramètres sont mal passés et donner des indications sur la bonne manière de faire l'appel. Ca permet une "découverte" de la libraire plus facilement.

La programmation par contrat est à la fois un ensemble d'outils et une rigueur dans le développement. C'est proche des TU dans l'esprit mais ça diffère essentiellement au niveau du refactoring. Il est très simple de refactorer un code testé, il est plus long de refactoré un code avec des contrats car les contrats sont assez liés à l'implémentation. Refactorer le code peut induire de modifier grandement les contrats. Par contre, si le refactoring consiste "simplement" à déplacer des méthodes d'une classe à une autre sans modifier le code interne, les contrats permettent de le faire très facilement car tous les inputs/outputs sont testés au sein même de la méthode.

Paris Tech Talks #6

Introduction

Le premier Tech Talk que je faisais, et sans doute le dernier. Tout était trop commercial. Bon ok, ça se passait chez Critéo dont le business model est basé sur la pub, mais quand même. D'ailleurs, il n'y avait bien que la présentation de Critéo qui était interessante, les autres étaient essentiellement des présentations commerciales pour vendre son produit, elle-même coupées par des pages de pub (des gens qui montent 2-3 minutes sur scène pour présenter leur produit).

Je sais que les organisateurs ont essayé de faire des efforts pour les sessions suivantes, mais je n'y suis pas retourné pour autant.

Machine Learning at Criteo

Criteo achete de l'espace publicitaire sur les sites internet et gagnent de l'argent quand quelqu'un clique bel et bien sur la publicité en question. Ils ont donc besoin de grosses capacités de machine learning pour savoir s'ils doivent acheter une publicité ou non. Leur calcul est un calcul de probabilité pour savoir si un utilisateur va cliquer s'ils leur affiche une publicité, et si l'investissement vaut le coup par rapport au prix de la publicité. Tout leur business est basé sur le modèle de prédiction et la vitesse à laquelle ils peuvent répondre.

Ils ont besoin de choisir la couleur, la font, l'image, le produit à mettre en avant dans la publicité en quelques millisecondes le temps que la page soit chargée. Ca représente environ 30 milliars de requetes par jour.

Ca leur créé donc une base de parametres énormes, dans laquelle ils font de l'analyse pour trouver les corrélation de tout ces paramètres pour réussir à deviner ce qui marchera bien ou non. Leur élément principal est la vitesse de réponse. L'algo n'a pas besoin d'etre parfait à 100%, mais il a besoin d'etre rapide. Au pire, afficher une pub qui ne crée pas de transformation alimente quand même leur modèle prédictif sur ce qui ne marche pas et leur permet d'apprendre. Cette notion d'apprentissage n'est pas manuelle, il y a bien trop d'éléments à prendre en compte pour réussir à ce qu'un humain puisse les modéliser, tout est automatisé.

Plus ils envoient de données à leur moteur, plus celui-ci prends du temps à les traiter. Ils apprennent donc progressivement quelles sont les données qui ont de la valeur et celles qui n'en ont pas pour ne garder que les données qui rentrent dans leur modèle.

Pour rajouter un peu de difficulté, ce n'est pas parce qu'un utilisateur va cliquer qu'il va acheter pour autant. Ils donnent l'exemple des petites culottes, qui sont un article sur lequel tout le monde va facilement cliquer, mais peu de personnes vont finalement les acheter. Pour pouvoir valider leur modèle de prédiction, il doivent attendre 30 jours pour savoir si un achat a bien été effectué après le clic. Leur modèle de prédiction se prends donc une latence de 30 jours automatiquement.

Globalement le talk permettait rapidement d'expliquer à une audience qui n'y connait pas grand chose en big data et machine learning (moi, donc) quelles étaient leur problématique et de voir ce que ça implique. Ca parait très intéressant et ils en ont profité pour passer une annonce de recrutement. Si travailler dans la publicité ne fait pas de mal à votre éthique, les challenges techniques sont très très interessants.

Hadoop

Je passe très vite sur la présentation d'un commercial de Google qui nous parle d'Hadoop, mais qui finalement ne fait que nous montrer le tutoriel du site en version accélérée (et qui plantait). Ca n'apportait pas grand chose, je serai allé plus vite à essayer moi-même le tuto.

Mobile Image Recognition

Puis vient un gars qui plonge directement dans le vif de son sujet en nous expliquant ses problèmes, avant même de nous expliquer ce que fait son appli. Il faut quelques minutes pour remettre les pièces du puzzle les unes avec les autres et on comprends que c'est une application de reconnaissance visuelle d'affiche de film. On lui envoie une photo d'une affiche, il en fait un hash, il le match dans une DB et il nous retourne des infos sur ce film.

Ils ont des soucis de latence pour envoyer l'image pour la processer sur le serveur. Du coup, ils déportent une grosse partie de la logique sur le client. La reconnaissance et la création du hash est créée directement sur le device, et ils gardent une DB locale des films les plus demandés directement en local. Comme ça la connection n'est utilisées que pour les cas les moins connus.

La core library est en C99 pour pouvoir être utilisée aussi bien sur iOS que sur Android. C'est extrémement rapide, il leur faut environ 30ms pour traiter 10.000 images. Leur core est donc portable, indépendant de la technologie, ce qui leur a permis de coder une appli google glass en une demie-journée.