Skip to content

Blogs de Développeurs: Aggrégateur de Blogs d'Informatique sur .NET, Java, PHP, Ruby, Agile, Gestion de Projet

Forum Logiciel

Forum Logiciel : diffusion de connaissance et d’informations sur toutes les activités liées au développement d’applications informatiques en entreprise.

Agrégateur de flux

Xebia soigne ses seniors : formation Coding Architect

En ces temps de grands froids, il est important de prendre soin de ses seniors … Chez Xebia, plutĂ´t que de les vacciner contre la grippe, nous avons dĂ©cidĂ© de parfaire leurs compĂ©tences sur les sujets clĂ©s de notre mĂ©tier.

Qu’est-ce qu’un coding architect ?

Coding Architect est une des Ă©volutions possibles pour un dĂ©veloppeur lorsqu’il poursuit une carrière technique. Il va progressivement acquĂ©rir des responsabilitĂ©s et rĂ©aliser de plus en plus de missions dites « de conseil » :

  • Proposer des architectures logicielles homogènes, compatibles et cohĂ©rentes avec les exigences d’urbanisme.
  • DĂ©finir les orientations techniques en anticipant les Ă©volutions futures.
  • Concevoir et accompagner la rĂ©alisation d’architectures systèmes et logicielles complexes.
  • Analyser les architectures existantes et formaliser des recommandations stratĂ©giques pour l’amĂ©lioration ou la refonte.
  • Conseiller les Ă©quipes de dĂ©veloppement au sujet de la stratĂ©gie logicielle : bus applicatifs, micro services, etc.
Certains reconnaitront la dĂ©finition d’un architecte logiciel. NĂ©anmoins, nous insistons sur le prĂ©fixe « Coding » : nous sommes convaincus que pour correctement rĂ©aliser des missions d’architecture, l’architecte doit avant tout rester opĂ©rationnel et ĂŞtre capable de prototyper ses idĂ©es, d’accompagner l’Ă©quipe qui les mettra en musique, voire de redevenir pour quelques mois le dĂ©veloppeur sĂ©nior qu’il n’a jamais cessĂ© d’ĂŞtre. Comment, alors rĂ©aliser la transition entre le mĂ©tier de dĂ©veloppeur et celui de Coding Architect ? Rien ne remplace l’expĂ©rience …

Certes, mais on se retrouve vite dans le cas du serpent qui se mord la queue : pour aller sur une mission complexe, il faut avoir de l’expĂ©rience, mais pour accumuler de l’expĂ©rience, il faut enchainer les missions complexes.

Nous avons décidé de prendre le taureau par les cornes, et de massivement partager notre expérience. Nous avons décidé de réunir pendant 3 jours une dizaine de consultants seniors, trois CTOs, notre directeur général et le responsable de Xebia Studio afin de tous apprendre les uns des autres (comme un super XKE).

Cette « formation », massivement basĂ©e sur l’Ă©change, est orientĂ©e autour de cinq piliers techniques : la donnĂ©e, la scalabilitĂ©, le DevOps, les architectures rĂ©actives et le Cloud.

Mais le mĂ©tier de Coding Architect ne s’arrĂŞte pas Ă  la technique, et ce sont les compĂ©tences pĂ©riphĂ©riques qui sont souvent les plus difficiles Ă  acquĂ©rir. C’est pour cette raison que nous nous sommes longuement attardĂ©s sur les arcanes de la rĂ©alisation de schĂ©mas d’architecture, sur la rĂ©daction de propositions commerciales, sur les arts oratoires de la soutenance, et sur tous les trucs et astuces que nous avons pu collecter lors de la rĂ©alisation de nos missions de conseil.

Nous avons conclu par une mise en pratique, en ressortant de nos cartons des appels d’offre reçus l’annĂ©e passĂ©e, qui nous ont permis d’utiliser Ă  bon escient l’expĂ©rience accumulĂ©e durant ces 3 jours.

Le dĂ©but d’une belle aventure

Cette première session a fait le bonheur de tous les participants, et nous sommes prĂŞts Ă  rapidement renouveler l’expĂ©rience avec une nouvelle « promotion » de seniors (l’expĂ©rience mĂ©diane chez Xebia dĂ©passant les 7,5 ans, nous avons encore quelques expĂ©rimentĂ©s sous le coude) !

Catégories: Blog Société

Remettre la pyramide des tests sur sa base

– Ah tiens, salut. Tu as vu le rapport sur la typologie des tests dans nos projets ?
– Ah oui… tu sais moi les rapports…
– C’est de la foutaise ce rapport.
– Oh?
– Pour le projet XXL, le rapport dit qu’on fait 250 fois plus de tests d’intĂ©gration que de tests unitaires.
– Ah bon.
– Et pour cause : on n’en fait pas des tests unitaires. Et donc la figure sur le rapport se prĂ©sente comme une pyramide inversĂ©e. Et Denis nous a fait remarquer qu’elle n’allait pas manquer de se casser la g… et qu’il fallait y faire quelque chose.
– C’est qui Denis?
– Le nouveau manager en charge de la coordination du projet XXL.
– OK.
– Foutaises. C’est juste une thĂ©orie la pyramide des tests de toutes façons.
– Plus une observation qu’une thĂ©orie, si tu veux mon avis…
– Sur le projet XXL, on a besoin de tester rapidement que ça marche ! C’est sĂ»r on pourrait s’amuser Ă  Ă©crire des tests unitaires pendant des semaines, et ça prouverait quoi ?
– Dis-donc ça a l’air de te contrarier cette histoire de pyramide…
– Je vois pas l’intĂ©rĂŞt, franchement.
– Mais si. C’est une analogie. Ça permet de te rappeler que si tu veux construire un système stable, tu as intĂ©rĂŞt Ă  valider les parties qui composent l’application avant de valider l’ensemble.
– Mais non : en validant l’application, je valide aussi les composants.
– Bon. Alors suppose qu’on construise une pyramide en Lego. Justement, on a une boite de Lego ici, qu’on utilise pour faire des lego scrums.
– Ah bon ?
– Oui. Alors vas-y. Je te passe les briques, et toi tu construis la pyramide. Ne la fais pas trop grande, on n’a pas cent mille Legos non plus.
– OK. Passe moi des briques.
– Tiens.
– Ok. VoilĂ  une base de 8 sur 8. Je ne vois pas ton point, lĂ .
– Tiens.
– Eh, passe moi plutĂ´t des briques de 4 par 2, pas des plaques.
– OK.
– Deuxième Ă©tage. Tu la veux d’une seule couleur au fait ta pyramide ?
– Ah bah clairement. On veut une pyramide, pas une mosaĂŻque.
– Alors pourquoi tu me passes des briques de couleurs diffĂ©rentes…
– Ah, OK. VoilĂ . Tiens.
– Eh, non ça c’est pas une brique, c’est un chapeau de figurine. Concentre toi un peu.
– Oups. Sorry.
– Bon.
– Tiens.
– Une bille ? Qu’est-ce que tu veux que j’accroche une bille sur la pyramide ?
– Ah pardon..
-…
– Ok. VoilĂ , pyramide finie.
– Parfait !
– Donc c’est quoi ton point ?
– Je t’ai regardĂ© construire la pyramide..
– Et ?
– Eh bien j’ai observĂ© que chaque pièce que je te passe, tu la vĂ©rifies avant de la poser sur la pyramide.
– Quoi ?
– Tu prends la pièce, tu la regardes, et si elle ne te convient pas, tu la rejettes. Ou si elle semble convenir, tu regardes oĂą tu pourrais la poser sur la pyramide, et seulement après tu la poses.
– OK. Si tu le dis.
– Tu ne t’en rends pas compte tellement c’est rapide, de l’ordre du rĂ©flexe. Tu vĂ©rifies d’abord la pièce avant de la poser. Pourquoi tu procèdes de cette façon ?
– Pour Ă©viter d’avoir Ă  dĂ©monter la pyramide après coup, tiens !
– VoilĂ . C’est pareil avec le soft. La pyramide des tests dit que les diffĂ©rentes sortes de tests rĂ©pondent Ă  diffĂ©rentes questions, et qu’il vaut mieux se poser certaines questions avant d’autres :

  • tests unitaires : est-ce que le code de chaque composant de l’application rĂ©pond Ă  l’intention du programmeur ou bien est-ce qu’il y a des dĂ©fauts dans ces composants ?
  • tests d’intĂ©gration : est-ce que les diffĂ©rentes parties fonctionnent ensemble ou bien est-ce qu’il y a des dĂ©fauts d’intĂ©gration ?
  • tests de recette : est-ce que l’ensemble de l’application rĂ©pond Ă  ce qui Ă©tait attendu par le client ?
  • tests exploratoires : est-ce que l’application comporterait des dĂ©fauts de fonctionnement auxquels on n’aurait pas pensĂ© jusqu’ici ?

– C’est lĂ  que ton analogie ne marche pas : pourquoi perdre du temps Ă  tester unitairement un programme si l’utilisateur peut te dire en un test de recette que son besoin n’est pas satisfait ?
– Parce que son test de recette est très loin de couvrir tous les chemins d’exĂ©cutions possibles. Lorsque tu passes Ă  un utilisateur un programme non testĂ© unitairement c’est comme si tu lui disais :

Je te laisse le soin de vérifier que ce programme répond à ton besoin. Il ne contient a priori pas de bugs. Ou du moins il ne contient pas de bugs que tu ne pourrais pas détecter lors de ta vérification.

Or tu sais bien que c’est faux. Demain je change une ligne dans le code de votre projet, et tout le monde n’y verra que du feu. Les tests de recette passeront. L’application ira en production.
– Ce n’est pas sĂ»r que ça produirait un bug, du coup…
– Alors c’est comme si tu lui disais :

Je te laisse le soin de vĂ©rifier que ce programme rĂ©pond Ă  ton besoin. Il ne contient a priori pas de bugs. Ou du moins il ne contient pas de bugs que tu ne pourrais pas dĂ©tecter lors de ta vĂ©rification. S’il en contenait que tu n’as pas dĂ©tectĂ©, ce serait probablement quelque chose de non-critique. On verra bien.

– Tu pousses l’argument un peu loin quand mĂŞme !
– Alors dis moi, c’Ă©tait quoi, la dernière anomalie en recette que vous avez reçue ?
– Hmm, laisse moi regarder… VoilĂ :

ticket 4807: j’appuie sur le bouton Valider et rien ne se passe. Merci de revoir.

– Bon c’est un mauvais exemple.
– C’est un excellent exemple. Pourquoi rien ne se passe ?
– Le code du bouton lance bien la mĂ©thode de mise Ă  jour, mais celle-ci plante.
– Pour quelle raison la mĂ©thode de mise Ă  jour plante ?
– Le service appelĂ© ne rĂ©pond pas.
– Pourquoi le service appelĂ© ne rĂ©pond-il pas ?
– Il appelle une fonction de formattage, mais celle-ci renvoie une erreur NPE.
– Pour quelle raison ?
– Un problème de logique dans un if else… On peut remonter assez loin comme ça. OĂą est-ce que tu veux en venir ?
– Est-ce que c’est l’utilisateur qui a dĂ©couvert tout ça ?
– Non malheureusement, tu penses.
– Et ça vous a pris combien de temps ?
– Hmm, ça nous a bien pris 4 heures, vu que le debuggeur ne marchait pas sur la configuration de JĂ©rĂ©mie.
– Et si vous aviez posĂ© un test unitaire sur cette fonction de formattage ?
– Je suis d’accord, en fait.
– Alors tu es d’accord avec la pyramide des tests.

Pour en savoir plus:
Sortie de la carte de rĂ©fĂ©rence OCTO sur les tests d’applications Front End

Lightning Talk Meetdup SWC : La Pyramide des Tests

Culture Code: notre ouvrage de rĂ©fĂ©rence sur l’Artisanat Logiciel

Catégories: Blog Société

Revue de Presse Xebia

revue de presse Xebia

La revue de presse hebdomadaire des technologies Big Data, DevOps et Web, architectures Java et mobilité dans des environnements agiles, proposée par Xebia

Agilité Estimer en Story Point pour les nuls http://www.gravatar.com/avatar/f402435a634a03c285bdacdde70ec54chttp://blog.xebia.fr/author/ppbeaucheminhttp://twitter.com/PP_Beaucheminhttp://github.com/ppbeaucheminPar Pierre-Philippe Beauchemin

Lorsqu’une nouvelle équipe agile se forme, il est parfois difficile d’appréhender le concept des Story Points. Surtout si certaines mauvaises habitudes d’estimation en jours/homme sont toujours présentes.

L’article Story Point Estimations in Sprints, paru sur le site Scrum Alliance, livre une technique concrète d’estimation en vulgarisant les Story Points comme étant une combinaison de taille et de complexité/risques. Il ne reste plus qu’à reporter le résultat obtenu dans une matrice pour connaitre l’estimation.

L’inconvĂ©nient de cette mĂ©thode est que l’Ă©quipe doit se mettre d’accord sur 2 chiffres avant d’avoir le rĂ©sultat, ce qui va automatiquement doubler la durĂ©e du Planning Poker.

ING’s agile transformation http://www.gravatar.com/avatar/37a6259cc0c1dae299a7866489dff0bdhttp://blog.xebia.fr/author/nullhttp://twitter.com/fontgregoryPar GrĂ©gory Fontaine

Mi-2015, ING Netherlands s’est lancĂ© dans une transformation organisationnelle agile de grande envergure. La transformation a concernĂ© environ 3500 personnes. A peine deux ans plus tard Bart Schlatmann, Chief Operating Officer, et Peter Jacobs, Chief Information Officer font le point. Ils nous prĂ©sentent leur approche, partagent leurs recettes, et tĂ©moignent des effets bĂ©nĂ©fiques de cette transformation Ă  l’Ă©chelle de l’entreprise. L’article « ING’s agile transformation » est Ă  lire (en anglais) sur le site de McKinsey.

Mobilité Fabric is Joining Google http://blog.xebia.fr/author/scivettahttp://twitter.com/viteinfinitehttp://github.com/viteinfinitePar Simone Civetta

Avec un communiquĂ© sur le blog, Fabric a annoncĂ© le rachat par Google. Construit Ă  partir de Crashlytics, achetĂ© par Twitter en 2013, Fabric a su rapidement s’imposer sur le marchĂ© grâce Ă  son outil de remontĂ© de bugs, Ă  sa plate-forme de distribution d’applications Beta, et plus rĂ©cemment grâce Ă  la publication de Answers, un système d’Analytics developer-friendly et prĂ©sentant une interface particulièrement efficace.

Fabric rejoint la team Firebase et va sûrement étoffer une solution de plus en plus complète proposée aux développeurs mobiles par Google. Il ne faudra pas oublier, cependant, de lire les nouvelles Conditions Contractuelles de Fabric, qui sont déjà disponibles dans une page dédiée.

En octobre 2015, Fabric a Ă©galement annoncĂ© l’embauche de Felix Krause, le dĂ©veloppeur de Fastlane. Selon des informations qui circulent actuellement en ligne, Google semble intĂ©ressĂ© pour poursuivre les investissements sur Fastlane, qui est un projet Open Source sous license MIT et dont la propriĂ©tĂ© intellectuelle est dĂ©tenue par les committeurs sur le projet.

Front « Opera Neon », le futur des navigateurs internets ? http://www.gravatar.com/avatar/0473884a2a2b3788cd94d0932dde4e58http://blog.xebia.fr/author/asudrehttp://twitter.com/asudrehttp://github.com/asudrePar Arthur Sudre

Opera vient de sortir un nouveau navigateur, « Opera Neon », le futur des navigateurs internet ?

Quels sont les plus ? Entre autres la possibilitĂ© de contrĂ´ler la lecture d’une vidĂ©o ou d’une musique provenant de n’importe quel onglet en un endroit unique, la facilitĂ© d’afficher deux fenĂŞtres cĂ´tes Ă  cĂ´tĂ©s, les vidĂ©os qui restent visibles mĂŞme en quittant le navigateur et pleins d’effets Ă©lĂ©gants. Un autre bon point, on retrouve Chromium sous le capot, les performances sont aussi au rendez-vous. C’est disponible Ă  cette adresse : http://www.opera.com/fr/computer/neon, faites le test !

Webpack 2 est sorti en version finale http://www.gravatar.com/avatar/1e0ca9963bcd96ba434e5e4ffd972c2fhttp://blog.xebia.fr/author/aletaxin1http://twitter.com/ModuloMPar Antoine Le Taxin

Un grand nombre d’entre-nous l’utilise dĂ©jĂ  la version bĂ©ta, mais c’est maintenant officiel : une version stable de Webpack 2 vient d’ĂŞtre publiĂ©e. En suivant la spĂ©cification semver, c’est mĂŞme une version 2.2.0 qui a vu le jour. La feature la plus attendue est le tree shaking, qui permet d’exclure (sous certaines conditions) du bundle final les mĂ©thodes non utilisĂ©es d’un module. Cependant moins puissant que celui de Rollup, il peut demander un peu de configuration pour qu’il soit efficace (gestion des librairies tierces et de Babel).

La migration depuis la version 1 se fait vraiment très facilement, très peu de breaking changes Ă©tant Ă  noter. Un guide très dĂ©taillĂ© explique pas Ă  pas comment s’y prendre.

Avec cette version, l’Ă©quipe a sorti un tout nouveau site (qui utilise la librairie Preact) ainsi qu’une nouvelle documentation. Vous pouvez Ă©galement votez et influencer la road map de la futur version.

Back Backpack, créer un projet Node.js avec zéro configuration http://www.gravatar.com/avatar/1e0ca9963bcd96ba434e5e4ffd972c2fhttp://blog.xebia.fr/author/aletaxin1http://twitter.com/ModuloMPar Antoine Le Taxin

InspirĂ© par create-react-app, Next.js et Nodemon, Backpack est un outil qui permet de crĂ©er très rapidement, sans configuration, une application Node.js moderne. L’outil prĂ©-configure Webpack 2 de manière Ă  fournir au dĂ©velopeur tout le confort de son dev-server : live-reload, file-watching, re-bundeling automatique. De plus, toutes les features ES6 / ES2015 sont directement exploitables. Il est Ă©galement possible de customiser toutes les configurations par dĂ©faut. Quelques petits plus supplĂ©mentaires : de meilleurs messages d’erreurs et un CLI.

Cette solution est cependant très rĂ©cente et comporte quelques limitations. Mais c’est une très bonne initiative qui facilitera certainement l’adoption de Node.js.

Data Intel rend open-source BigDL http://www.gravatar.com/avatar/88c5baa59087dfc25e2581c332069ca6http://blog.xebia.fr/author/slequeuxhttp://twitter.com/slequeuxPar Sylvain Lequeux

Intel a publiĂ© le code source de sa librairie de Machine Learning BigDL. Cette librairie souhaite se placer comme un concurrent direct aux autres Frameworks tels que TensorFlow, Torch ou bien Caffe. Elle s’exĂ©cute sur Spark (Ă  partir de sa version 1.5). ImplĂ©mentĂ©e en Scala, elle ne propose pour l’instant qu’une API dans ce langage, et Python n’est pas encore supportĂ©.

L’APi est inspirĂ©e de celle de Torch et pour l’instant, seuls quelques algorithmes sont disponibles pour l’instant. Intel a par contre mis Ă  disposition des exemples d’utilisation  de ces algorithmes.

Catégories: Blog Société

JIRA REST API – how it’s done

Le blog de Valiantys - jeu, 01/19/2017 - 11:34

As consultant, I usually use JIRA REST API to execute repetitive tasks like creating issues with attachments in bulk, or when developing add-ons for JIRA. I’ve also seen some of our clients use REST API to create a specific report or to sync JIRA issues with other systems. So let’s take brief look into JIRA REST API. What exactly ...

The post JIRA REST API – how it’s done appeared first on Valiantys Blog - Atlassian Expert.

Catégories: Blog Société

ScreenCast sur Interface Segregation Principle

Dans cette vidĂ©o, je vais illustrer la mise en place de l’un des principes SOLID : The Interface Segregation Principle.

Les principes SOLID sont 5 grands principes proposĂ©s par R. Martin (sobrement connu sous le nom d’Uncle Bob) dans les annĂ©es 2000 afin de garantir la qualitĂ© des applications orientĂ©es objets:

    • Single responsibility principle
    • Open close principle
    • Liskov principle
    • Interface segregation principle
    • Dependency inversion principle

La sĂ©grĂ©gation des interfaces consiste Ă  ne pas dĂ©pendre de fonctionnalitĂ©s dont on n’a pas l’utilitĂ©.

Soit :

  • Une classe ne doit pas avoir accès aux mĂ©thodes dont elle n’a pas l’utilitĂ©.
  • Une classe ne doit pas ĂŞtre obligĂ©e de proposer des mĂ©thodes pour lesquels elle n’a pas les compĂ©tences.

Respecter ce principe permet de réduire efficacement le couplage des classes entre elles.

Les sources sont disponibles sur notre github.

Catégories: Blog Société

La signature d’images Docker sur une Registry avec Notary

La Registry Docker est un composant incontournable dès que le besoin de distribuer ses images Docker se fait sentir. Ce composant en est actuellement à sa deuxième version et reste fidèle à la philosophie Unix : “faire une chose et la faire bien”, il stocke des images Docker et le fait bien. Le problème de la signature des images afin d’en garantir la provenance et le contenu doit donc être traité par d’autres moyens.

Plusieurs solutions existent pour ajouter ce niveau de garantie. Parmis elles, il en existe une développée par les membres de la communauté open source Docker : Notary.

Notary est un mécanisme de signatures cryptographiques qui permet de certifier le contenu des images mises à disposition sur une Registry. Il permet d’éviter qu’une personne tierce altère le contenu d’une image avant qu’elle soit instanciée sur un environnement de production par exemple.

Notary n’est ni un système de contrôle d’accès, ni un outil de gestion de clés privées et certificats (Public Key Infrastructure, PKI). Il ne requiert pas non plus une PKI ou l’utilisation de TLS (HTTPS).

Distinction entre Notary et Docker Content Trust

Notary est une implémentation réalisée par la communauté Docker d’une partie de la spécification “The Update Framework” (TUF), qui décrit un système de signatures destiné à sécuriser la diffusion de logiciels. Son implémentation a été pensée pour être indépendante de la Registry Docker : il est possible d’utiliser Notary avec d’autres dépôts de fichiers, paquets, etc.

Docker Content Trust, introduit avec la version 1.8 de Docker Engine, s’appuie sur Notary pour fournir un mĂ©canisme de certification et de validation des images provenant d’une Registry Docker.

Architecture et composants

La communauté Docker a fait en sorte de rendre l’intégration de Notary avec Docker la plus transparente possible. Après l’activation du mode Docker Content Trust, l’utilisation des commandes docker pull et docker push ne change pas mais le contenu manipulé est soumis au serveur Notary (vérification au pull et signature au push).

Un client Notary est inclus dans Docker Engine. Lorsque Docker Content Trust est activé (désactivé par défaut), Docker Engine effectue directement et de manière transparente pour l’utilisateur les appels au serveur Notary pour vérifier la validité d’une image Docker.

Exemple avec l’opération docker pull :

En revanche, les opĂ©rations de gestion des donnĂ©es de Notary (gestion des clĂ©s et des mĂ©tadonnĂ©es, dĂ©lĂ©gation de droits, …) se font avec un client en ligne de commande spĂ©cifique : notary.

Le recours à ce client spécifique peut se justifier :

  • par la volontĂ© de ne pas modifier le flux d’utilisation des commandes Docker.
  • par la possibilitĂ© d’utiliser Notary de manière indĂ©pendante de Docker.

Exemple pour l’opération de rotation des clés :

Activation de Docker Content Trust

L’activation de Docker Content Trust se fait via des variables d’environnement lors de l’utilisation du client Docker en ligne de commande. Elle ne modifie pas le flux de travail standard et n’ajoute pas d’opérations spécifiques.

Une fois le mode sécurisé activé, les commandes docker pull et docker push effectueront des actions supplémentaires :

  • docker pull vĂ©rifiera auprès du serveur Notary les signatures des images tĂ©lĂ©chargĂ©es depuis des Registry et refusera le pull si le tag demandĂ© n’est pas signĂ© ou la signature est invalide.
  • docker push tentera de signer l’image Ă  pousser sur une Registry en cherchant dans les clĂ©s Notary disponibles localement une clĂ© autorisĂ©e Ă  signer des tags dans le repository visĂ©.

Si aucune information de signature n’est enregistrée sur le serveur Notary, Docker initialisera les clés nécessaires à la signature et les publiera dans Notary.

Après activation de Docker Content Trust, toutes les opérations effectuées utiliseront ce mode. La récupération d’images non signées ne sera possible qu’après désactivation du mode.

Exemple de code pour activer le mode sécurisé dans Docker :

1
export DOCKER_CONTENT_TRUST=1

Docker échangera alors des informations de signature auprès du même serveur que le serveur de Registry (cas nominal dans l’offre Docker Trusted Registry de Docker Inc.).

Si le serveur Notary est accessible à une URL particulière, elle peut être fixée à l’aide d’une autre variable d’environnement :

1
export DOCKER_CONTENT_TRUST_SERVER=https://notaryserver:4443
Publication de la première image signée

Si ce n’est pas déjà fait, Docker Engine va créer les clés permettant de construire les métadonnées de certification dans Notary.

À la publication de l’image, Docker Engine échange avec Notary pour effectuer les opérations de signature.

Pour fournir les diffĂ©rentes garanties de TUF, plusieurs clĂ©s sont utilisĂ©es, certaines locales et d’autres gĂ©rĂ©es par le serveur Notary. Les images restent quant Ă  elles stockĂ©es sur la Registry.

Quatre clés différentes interviennent dans le processus de signature :

  • La root_key : il s’agit de la clĂ© “maĂ®tre”. Son rĂ´le est de signer les autres clĂ©s. Elle n’est utilisĂ©e qu’en cas de crĂ©ation de nouvelles clĂ©s ou de rĂ©vocation de clĂ©s compromises. C’est la clĂ© la plus sensible, elle doit absolument ĂŞtre stockĂ©e hors-ligne.
  • La targets_key : elle signe les mĂ©tadonnĂ©es garantissant que l’association d’un tag Ă  une image dans la Registry est valide.
  • La snapshot_key : elle permet de certifier l’ensemble des mĂ©tadonnĂ©es signĂ©es par la targets_key et la root_key, afin de garantir l’intĂ©gritĂ© de chaque nouvelle version de ces mĂ©tadonnĂ©es.
  • La timestamp_key : elle permet d’horodater les mĂ©tadonnĂ©es de snapshot afin de garantir leur fraĂ®cheur.
Récupération d’une image certifiée

Lors de la récupération ultérieure de cette image, Docker Engine récupère auprès de Notary les dernières métadonnées du repository visé.

Docker Engine refusera d’effectuer le pull si les métadonnées de tagging récupérées ne correspondent pas à l’image proposée par la Registry ou si ces métadonnées sont absentes.

Lorsqu’un client interagit avec Notary au sujet d’un repository pour la première fois, il établit la confiance avec les clés publiques présentée par Notary (notamment la root_key). Toutes les interactions suivantes vérifieront que les nouvelles métadonnées reçues sont cohérentes avec l’état précédemment connu de celles-ci. Par exemple le client n’acceptera pas un changement de root_key non signé par la root_key précédente.

Ce modèle de confiance établie lors de la première interaction avec Notary est appelé “Trust On First Use” (TOFU).

Stockage conjoint de tags certifiés et non certifiés

Il est important de noter que la Registry n’est pas informée des données de signature : elle stocke indifféremment des tags signés et non signés.
Une version signée et non signée d’un tag peuvent même cohabiter.

Un utilisateur ayant activé le mode Docker Content Trust récupérera toujours le dernier tag signé depuis la Registry. Là où un utilisateur n’ayant pas activé le mode Docker Content Trust récupérera le dernier tag pushé, qu’il soit signé ou non.

Délégation du droit de publication d’une image

TUF prévoit un mécanisme pour déléguer l’autorisation de signature à des personnes tierces. Ce mécanisme de délégation a également été implémenté dans Notary.

Le mécanisme de délégation est le suivant :

  • Si ce n’est pas dĂ©jĂ  fait, le dĂ©lĂ©gataire crĂ©e sa paire de clĂ©s privĂ©e et publique et gĂ©nère une CSR (Certificate Signing Request).
  • Il fournit ensuite cette CSR Ă  la personne qui dispose de l’autoritĂ© de certification (CA) de son choix (par exemple celle de son organisation, ou sa propre clĂ©) pour la signer et produire un certificat x509.
  • Le propriĂ©taire de la clĂ© de signature du repository (qui possède la targets_key) signe et enregistre la dĂ©lĂ©gation dans Notary en rĂ©fĂ©rençant le certificat produit prĂ©cĂ©demment.

Exemple de code pour enregistrer la délégation de signature dans Notary :

1
2
3
# l’utilisateur possède son certificat signé dans le dossier courant sous le nom de user.crt
notary delegation add <registry>/<repository> targets/releases user.crt --all-paths
notary publish <registry>/<repository>

Une fois cette délégation effectuée, la clé délégataire peut signer les tags du repository de la même façon que la targets_key, à la différence près que cette délégation peut être révoquée simplement par la targets_key, alors que la révocation de cette dernière nécessite la root_key.

Lorsque plusieurs utilisateurs signent des images, chaque signataire doit avoir la snapshot_key pour signer les métadonnées qu’il publie. Afin d’éviter cela, il est possible de confier la snapshot_key au serveur Notary pour qu’il signe lui même les métadonnées lors de leur publication.

Organisation de la confiance autour de Notary

Le cas simple d’organisation consiste à avoir une seule et même personne qui développe et gère les droits de signature sur une image.

Dans ce cas cet utilisateur détient à la fois la root_key, la targets_key et la snapshot_key (la timestamp_key est toujours détenue par le serveur) et signe directement ses tags avec la targets_key.

Pour mieux répondre au besoin de séparation des rôles et responsabilités au sein d’une entreprise ou d’un projet open source, il est toutefois souhaitable de répartir les clés de la manière suivante :

  • Un administrateur ayant accès Ă  la root_key et utilisant la targets_key pour dĂ©lĂ©guer les droits de signature aux dĂ©veloppeurs.
  • Des dĂ©veloppeurs disposant uniquement de leurs clĂ©s permettant de signer les tags qu’ils poussent.

Comme vu précédemment, il est alors préférable de confier également la snapshot_key au serveur Notary pour ne pas avoir à la diffuser à tous les développeurs.

Take away

Docker Content Trust permet :

  • De garantir la provenance, l’intĂ©gritĂ© et la fraĂ®cheur de l’image associĂ©e Ă  un tag dans une Registry Docker.
  • D’être adoptĂ© progressivement en autorisant :
    • La cohabitation de tags signĂ©s et non signĂ©s sur une Registry standard, y compris des versions signĂ©es et non signĂ©es d’un mĂŞme tag
    • L’activation ou non du mode Docker Content Trust au niveau de la ligne de commande Docker

Docker Content Trust ne permet pas :

  • De contrĂ´ler l’accès Ă  une Registry. Cet aspect est gĂ©rĂ© par le schĂ©ma d’autorisation OAuth2 configurable dans la Registry
  • De gĂ©rer une PKI

En synthèse, si vous avez besoin de certifier les images que vous utilisez, Notary est tout indiqué. L’utilisation d’un serveur Notary avec une Registry interne ou la Registry publique sera rapide à mettre en oeuvre : Son intégration dans Docker Engine et l’absence d’intervention sur la Registry permettent d’ajouter à peu de frais une couche de confiance sur votre Registry.

Dans le cas où vous souhaitez exploiter plusieurs serveurs Notary associés à plusieurs Registry ou mettre en place le mécanisme de délégation, un travail plus important devra être fourni (de routage des requêtes pour le premier cas et d’administration de Notary pour le second).

Si l’intĂ©gration “sans couture” de Notary dans le client Docker est plutĂ´t rĂ©ussie, il ne faut pas sous estimer le travail d’apprentissage nĂ©cessaire pour l’administrer de manière sĂ©curisĂ©e et effectuer des opĂ©rations avancĂ©es (par exemple: gestion des clĂ©s, dĂ©lĂ©gations). De plus, la communautĂ© Docker a fait le choix d’adopter dans Notary la terminologie du framework TUF, il est donc nĂ©cessaire de comprendre cette terminologie et notamment le parallèle avec la terminologie Docker (repository, tag, …).

Catégories: Blog Société

Git : Dépôts distants sans accès réseau

L’open space Ă©tait inhabituellement calme aujourd’hui. Après 4 heures de code en TDD il est temps de lever la tĂŞte, car c’est vendredi soir et votre TGV part dans 37 minutes.

Vous utilisez Git pour enregistrer votre progression par des commits rĂ©guliers. Vous n’avez plus qu’Ă  pousser vos changements sur le dĂ©pĂ´t de votre organisation.

$ git push origin master
fatal: unable to access 'https://github.com/votre-login/votre-code.git/': Could not resolve host: github.com

Damned. Le réseau est HS. Une dernière chose : vous ne le savez pas encore, mais lundi matin le SSD de votre ordinateur aura lâché.

La suite de cet article explique comment vous sortir de ce mauvais pas avec élégance grâce à quelques commandes Git et à la clé USB qui repose au fond de votre besace.

La solution candide

La solution la plus simple est la suivante :

  1. Brancher votre clé USB
  2. Copier votre répertoire projet

Cette approche est appropriée pour la sauvegarde initiale de votre code. Cependant, lors des sauvegardes ultérieures, elle ne vous permettra pas de tirer parti de Git pour la gestion des changements.

Du reste, votre historique de commits ne sera conservé que si vous pensez à copier le contenu du répertoire .git. Encore une fois, pas de problème pour une sauvegarde initiale, mais ça sera plus difficile la prochaine fois.

La solution « élégante »

La solution suivante vous permettra de conserver votre historique de commits et de bénéficier de la gestion de changements de Git.

  1. Brancher votre clé USB
  2. Initialiser un dépôt Git sur la clé
  3. Ajouter celui-ci en tant que dépôt distant de votre dépôt de travail
  4. Pousser vos changements
En résumé (TL; DR)

Ouvrez un terminal et exécutez les commandes suivantes :

# Trouver le chemin de la clé USB, par exemple :
cd /media/votre-login/votre-disque-externe

# Initialiser le dépôt de sauvegarde
mkdir votre-code.git
cd votre-code.git
git init --bare

# Ajouter le dépôt distant
cd /chemin/vers/votre-code
git remote add backup /media/votre-login/votre-disque-externe/votre-code.git

# Pousser les changements
git push backup master

Pour restaurer votre dépôt plus tard :

# Clôner le dépôt de sauvegarde
cd /chemin/vers/autre-repertoire
git clone /media/votre-login/votre-disque-externe/votre-code.git

Tout est là. Pour des explications plus détaillées, continuez la lecture.

Trouver le chemin de la clé USB

Dès qu’elle est branchĂ©e, nous avons besoin de son chemin de montage. Sous macOS c’est dans /Volumes/[VOLUME_NAME] et sous Linux le plus souvent /media/[USER]/[VOLUME_NAME].

Vous trouverez le chemin exact grâce à la commande df -h qui affichera clairement les disques connectés :

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
[...]
/dev/sdb7       171G   46G  125G  27% /media/votre-login/votre-disque-externe
Initialiser le dépôt de sauvegarde

La commande à lancer est git init --bare :

  • Commande init pour initialiser un dĂ©pĂ´t dans le rĂ©pertoire courant. C’est lĂ  que Git va enregistrer votre historique de commits.
  • Option --bare pour indiquer que le dĂ©pĂ´t ne contiendra pas un rĂ©pertoire de travail, mais uniquement une base de changements. Ça permet notamment de gagner de l’espace disque. On parle d’un dĂ©pot « nu ».
  • Le contenu d’un dĂ©pĂ´t nu est le mĂŞme que celui du rĂ©pertoire .git d’un dĂ©pĂ´t de travail
$ cd /media/votre-login/votre-disque-externe
$ mkdir votre-code.git
$ cd votre-code.git

$ git init --bare
Initialized empty Git repository in /media/votre-login/votre-disque-externe/votre-code.git/

$ ls
branches  config  description  HEAD  hooks  info  objects  refs
Ajouter le dépôt distant

Maintenant vous allez associer votre dĂ©pĂ´t de sauvegarde avec votre dĂ©pĂ´t de travail. La commande git remote add [alias] [target] attribue un alias Ă  un dĂ©pĂ´t cible. Ici, l’alias sera « backup » et le dĂ©pot cible est votre dĂ©pĂ´t de sauvegarde.

Vous pourrez ensuite afficher des informations dĂ©taillĂ©es sur vos dĂ©pĂ´ts distants grâce Ă  la commande git remote (afficher la liste) et l’option -v (informations dĂ©taillĂ©es).

$ cd /chemin/vers/votre-code
$ git remote add backup /media/votre-login/votre-disque-externe/votre-code.git

$ git remote -v
backup /media/votre-login/votre-disque-externe/votre-code.git (fetch)
backup /media/votre-login/votre-disque-externe/votre-code.git (push)
origin https://github.com/votre-login/votre-code.git (fetch)
origin https://github.com/votre-login/votre-code.git (push)
Pousser les changements

Il ne reste plus qu’Ă  pousser vos changements sur le dĂ©pĂ´t de sauvegarde. C’est une commande que vous utilisez quotidiennement : git push [alias] [branch].

  • Ici vous devez prĂ©ciser l’alias de votre dĂ©pĂ´t de sauvegarde en argument
  • Le push initial peut ĂŞtre long car il envoie tout le contenu de votre dĂ©pĂ´t de travail
  • Pour le push initial il faut spĂ©cifier une branche (master)
$ git push backup master
Counting objects: 3, done.
Writing objects: 100% (3/3), 208 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /media/votre-login/votre-disque-externe//votre-code.git
 * [new branch]      master -> master
Clôner le dépôt de sauvegarde

Vous ĂŞtes de retour de weekend, et votre ordinateur ne dĂ©marre pas, panne de disque. Je vous l’avais dit. Vous avez rĂ©ussi Ă  vous procurer un ordinateur de remplacement et vous brandissez votre fidèle clĂ© USB.

Pour reprendre oĂą vous en Ă©tiez, clĂ´nez votre dĂ©pĂ´t de sauvegarde. C’est la mĂŞme commande que pour clĂ´ner un dĂ©pot Git classique par http. La commande clone accepte un chemin local  comme une URL.

$ git clone /media/votre-login/votre-disque-externe/votre-code.git
Cloning into 'votre-code'...
done.

Attention, dans votre nouveau dépôt de travail le clone configure un dépôt distant par défaut origin, qui pointe vers votre dépôt de sauvegarde. Pour retrouver votre configuration de travail initiale, renommez ce dépôt distant et pensez à ajouter le dépôt distant de votre organisation.

$ cd votre-code
$ git remote -v
origin /media/votre-login/votre-disque-externe/votre-code.git/ (fetch)
origin /media/votre-login/votre-disque-externe/votre-code.git/ (push)
 
$ git remote rename origin backup
$ git remote -v
backup /media/votre-login/votre-disque-externe/votre-code.git/ (fetch)
backup /media/votre-login/votre-disque-externe/votre-code.git/ (push)
 
$ git remote add origin https://github.com/votre-login/votre-code.git
$ git remote -v
backup /media/votre-login/votre-disque-externe/votre-code.git/ (fetch)
backup /media/votre-login/votre-disque-externe/votre-code.git/ (push)
origin https://github.com/votre-login/votre-code.git (fetch)
origin https://github.com/votre-login/votre-code.git (push)
Conclusion

Vous venez d’utiliser Git pour sauvegarder votre code sur une clĂ© USB. Mais vous avez surtout eu l’occasion de sortir de votre train-train quotidien de pull/commit/push en manipulant les concepts suivants :

  • Initialisation d’un dĂ©pĂ´t nu avec git init --bare
  • Manipuler des dĂ©pĂ´ts distants avec git remote add, git remote -v, git remote rename
  • Pousser vos changements vers un dĂ©pĂ´t spĂ©cifique avec git push [alias] [branch]

Voici d’autres usages des dĂ©pĂ´ts distants :

  • Stocker un dĂ©pĂ´t distant sur votre Google Drive ou Dropbox
  • Ajouter un dĂ©pĂ´t distant pointant sur GitHub par https ou ssh
  • ClĂ´ner un projet en lecture seule depuis GitHub. Pour pousser des changements, il est possible de faire un fork, ajouter le dĂ©pĂ´t distant correspondant et prĂ©parer une pull request.
  • Ajouter un dĂ©pĂ´t distant pointant sur le dĂ©pĂ´t local d’un collègue en SSH
  • CrĂ©er un dĂ©pĂ´t nu sur un rĂ©pertoire partagĂ© avec vos collègues
Catégories: Blog Société

TechLabs : Event Storming DDD

Participez Ă  notre premier TechLabs le 20 fĂ©vrier Ă  19h30 chez SOAT !   Vous est-il dĂ©jĂ  arrivĂ© de devoir faire travailler des personnes qui n’ont pas le mĂŞme vocable sur un mĂŞme produit ? Vous est-il dĂ©jĂ  arrivĂ© de ne pas savoir par quel bout traiter un problème ? Avez-vous dĂ©jĂ  souffert d’un fossĂ© […]
Catégories: Blog Société

Scaling an Atlassian instance from 50 to 5,000 users

Le blog de Valiantys - mar, 01/17/2017 - 10:30

Many companies start using Atlassian tools within a small team. Then they soon see the number of end users grow exponentially: 50, 250, 2,000, 5,000… So how hard is scaling an Atlassian instance as it grows within your organisation? What challenges will arise on your journey, and more importantly, how do you ensure you’re well ...

The post Scaling an Atlassian instance from 50 to 5,000 users appeared first on Valiantys Blog - Atlassian Expert.

Catégories: Blog Société

Foreign data wrappers ou comment interroger une base distante avec PostgreSQL ?

L'actualité de Synbioz - mar, 01/17/2017 - 00:00

Il y a quelques semaines, je vous ai présenté quelques fonctionnalités méconnues de PostgreSQL et comment, à l’aide d’une bonne indexation de ses données, on peut tirer parti de la puissance de ce SGBD.

Je vous propose aujourd’hui de découvrir une autre fonctionnalité de PostgreSQL qui nous a été d’un grand secours, il y a peu, sur l’un de nos projets. Mais avant toute chose, précisons un peu le contexte.

Lire la suite...

Catégories: Blog Société

LCC 161 - Personne n'est gros ici !

Les Cast Codeurs sont rejoints par la moitié de Ninja Squad pour discuter poids de la JVM, Java gratuit ou payant, Angular 34, ransomware, TDD = t’es plus lent, Skynet est mort vive Google Brain et Facebook.

Enregistré le 12 janvier 2017

Téléchargement de l’épisode LesCastCodeurs-Episode–161.mp3

News

Comment poser des crowdquestions

Langages

Implementation des traverse d’arbre en Java 8 streams
StreamUtils by José Paumard

La JVM n’est pas lourde
Golan, arrête de te la péter avec ton GC
Les options de lancement de la JVM
Joining the Big Leagues: Tuning Jenkins GC For Responsiveness and Stability

L’affaire Oracle qui fait payer Java

Jigsaw, le point de vue de JBoss

Chris Lattner, créateur de Swift et LLVM, rejoint Tesla après 11 ans chez Apple

Web

Alors Google exécute le Javascript de nos sites ou bien ?
Angular 4 est en beta
VueJS 2 en 2016: surtout intéressant pour le financement du projet. Le dév principal a un Patreon financé par la communauté à 9200$/mois.

Middleware

Spring 5 et Kotlin
La structure de stockage des index Lucene
La dernière enquête sur Java EE 8 la communauté et les priorités
Microprofile chez Eclipse
Java EE ne peut pas faire de cloud native d’après Gartner
Gartner est à la ramasse d’après un développeur

Ninja Squad

Cédric Exbrayat vous avait parlé de notre ebook sur Angular dans l’épisode 142 : 3500 lecteurs, français/anglais, sans DRM, à prix libre, et avec dons à l’EFF.

Depuis, il existe une Ă©dition professionnelle, le Pack Pro :

  • ~30 exercices, une application complète
  • Ă©noncĂ©, squelette du projet, et tests unitaires fournis Ă  chaque Ă©tape
  • analyse de votre code, score, et progression
  • toujours Ă  jour de chaque version d’Angular
  • et 6 exercices en essai libre

Réduction pour les auditeurs : –30% avec le code LesCastCodeursFontDuFrontend

Sécurité

Concepts de chiffrement
MongoDB Ă  son ransomware
Amazon’s Alexa started ordering people dollhouses after hearing its name on TV

Infrastructure et réseaux

2017 l’année du desktop Linux - premiers pas

La consistence des systèmes de fichier
QUIC - le remplacement de TCP

Pratiques de développement

TDD not always good?
Compliqué de calculer un % de coverage complet

Outillage

Asciidoc et IntelliJ IDEA
Atlassian rachète Trello

Sociétal

Pas d’email de 17h à 9h
Les sociétés data driven et l’aveuglement
The Great A.I. Awakening, by The New York Times: How Google used artificial intelligence to transform Google Translate, one of its more popular services — and how machine learning is poised to reinvent computing itself
AlphaGo est de retour, et il est en forme (50 victoires en ligne contre les meilleurs mondiaux)
Utiliser l’intelligence artificielle pour déchiffrer nos cerveaux (une équipe de recherche arrive à reconnaitre certains mots auxquels les sujets pensent)
Des employés du tertiaires remplacés par un intelligence artificielle au Japon
Get your loved ones off Facebook: all the scary dirty tricks that Facebook uses or may use against you.

Outil de l’épisode

Des peintures en fond d’écran

Les astuces Eclipse par Thomas Leplus (crowdcasting)

  • quick tips
  • revenir en arrière debugger
Conférences

Le ParisJUG se lance dans adopt-a-JSR: un message en crowdcast

Meetup sur Kubernetes et Traefik le 23 janvier
Snowcamp les 8–10 fevrier
Devoxx France les 5–7 avril 2016
Mix-IT les 20–21 avril 2017
Breizhcamp les 19–21 avril 2017
RivieraDev les 11–12 mai 2017
Voxxed Days au CERN
Voxxed Days Luxembourg le 22 juin 2017
DevFest Lille 9 juin - inscriptions et CfP ouvert

Nous contacter

Faire un crowdcast ou une crowdquestion
Contactez-nous via twitter https://twitter.com/lescastcodeurs
sur le groupe Google https://groups.google.com/group/lescastcodeurs
ou sur le site web https://lescastcodeurs.com/
Flattr-ez nous (dons) sur https://lescastcodeurs.com/
En savoir plus sur le sponsoring? sponsors@lescastcodeurs.com

 

Catégories: Blog Individuel

Event Sourcing : comprendre les bases d’un système évènementiel

Depuis plusieurs mois, l’Event Sourcing et les systèmes Ă©vènementiels sont sur toutes les lèvres. L’annĂ©e passĂ©e a sans nul doute marquĂ© l’avènement des systèmes dits « rĂ©actifs » ou « dirigĂ©s par les Ă©vènements ». Bien que leur prĂ©sence ne date pas d’hier, peu d’applications en tirent aujourd’hui bĂ©nĂ©fice. Durant la dernière Xebicon, Xebia a proposĂ© un retour d’expĂ©rience sur la mise en place de ce pattern d’architecture au sein d’une banque d’investissement française que nous avons accompagnĂ©e durant plus de trois ans. 

Cet article a pour but de revenir sur :

  • Les concepts clĂ©s de l’Event Sourcing.
  • Les points d’attention Ă  suivre lors de son implĂ©mentation.

Qu’est-ce que l’Event Sourcing ?

L’Event Sourcing est un pattern d’architecture qui propose de se concentrer sur la sĂ©quence de changements d’Ă©tat d’une application qui a amenĂ© cette dernière dans l’Ă©tat oĂą elle se trouve. L’idĂ©e n’est plus de savoir oĂą nous sommes mais de garder trace du chemin parcouru pour y arriver.

En tant que pattern d’architecture, il possède un avantage de taille : vous ne dĂ©pendez d’aucun framework, langage ou librairie pour l’implĂ©menter.
Quels que soient vos outils de prĂ©dilection, vous serez en mesure d’en tirer profit.

L’exemple le plus courant et le plus simple pour illustrer ce concept est votre compte bancaire :

Date Débit Crédit 14/05/2016 100€ 14/05/2016 -20€ 16/05/2016 -30€ 24/05/2016 380€ 01/06/2016 -70€ Total -120€ 480€ Solde 360€

Votre banque ne se contente pas de vous communiquer le solde de ce dernier (Ă©tat courant) et vous propose Ă©galement toutes les opĂ©rations de dĂ©bit et crĂ©dit qui se sont produites pour y parvenir (sĂ©quence de changements d’Ă©tats). Ces changements d’Ă©tats, ce sont les Ă©vènements. Ces derniers sont par nature « mĂ©tiers » : ils doivent avoir du sens pour vos utilisateurs et experts mĂ©tier.

Les plus perspicaces d’entre-vous se sont probablement rendu compte d’une propriĂ©tĂ© intĂ©ressante : ces opĂ©rations de dĂ©bit/crĂ©dit, couplĂ©es au solde initial, permettent de retrouver l’Ă©tat courant. C’est lĂ  l’un des avantages de l’Event Sourcing : on se concentre sur le comportement du système duquel on pourra dĂ©duire l’Ă©tat actuel. Il est en effet bien plus facile de faire la synthèse d’un ensemble d’Ă©vènements plutĂ´t que de retrouver ces derniers Ă  partir d’un Ă©tat.

Pourquoi l’utilise-t’on ?

Puisque l’on capture tous les Ă©vènements mĂ©tiers produits, nous obtenons des capacitĂ©s accrues en termes :

  • d’audit : il est aisĂ© de retrouver les effets d’actions du passĂ©. Cela a beaucoup de valeur dans les contextes mĂ©tiers oĂą les rĂ©gulateurs prennent une place importante (la finance, par exemple).
  • d’analyse/debug : il est aisĂ© de comprendre les Ă©vènements qui ont amenĂ© Ă  tel ou tel bug. Quand on sait que le temps consacrĂ© Ă  la correction d’un bug est majoritairement perdu dans des tentatives de reproductions infructueuses…
  • de reprise de donnĂ©es : que ce soit en cas de panne (revenir dans l’Ă©tat prĂ©cĂ©dent la panne) ou pour reproduire un bug sur un autre environnement.

D’autre part, les systèmes Ă  base d’Ă©vènements sont majoritairement asynchrones et basĂ©s sur des composants de type bus de messages. Cela permet de plus facilement les mettre Ă  l’Ă©chelle en cas de besoin de performance mĂŞme si cela dĂ©pendra nĂ©cessairement de votre architecture et de votre implĂ©mentation.

Enfin, les Ă©vènements sont un excellent moyen de synchroniser ou notifier diffĂ©rentes applications mĂ©tiers, notamment au travers d’un autre pattern d’architecture nommĂ© CQRS (Command Query Responsibility Segregation).

Les concepts clés

Note : les schĂ©mas ci-après sont inspirĂ©s de l’excellent blog de Jeremie Chassaing, voie portante et bien connue de l’Event Sourcing depuis de nombreuses annĂ©es.
Ce dernier regorge de bons conseils sur l’implĂ©mentation d’un tel système, notamment dans ses liens avec le DDD (Domain Driven Design) et CQRS.

Votre système

L’implĂ©mentation du pattern Event Sourcing prend place au sein de votre application : celle-ci renferme notamment votre logique mĂ©tier.
Elle est composée de 2 fonctions que nous allons détailler ensemble dans quelques paragraphes :

  • la fonction de dĂ©cision;
  • la fonction d’Ă©volution.
La commande

Une commande reprĂ©sente une intention provoquĂ©e par l’extĂ©rieur (utilisateur, système) sur votre application.
En ce sens, elle est exprimĂ©e Ă  l’impĂ©ratif pour marquer cette intention.

Ex: ReceivePrice

Elle contient tous les paramètres nécessaires à sa description (elle est autosuffisante).

L’Ă©vènement

Un Ă©vènement est un fait qui s’est produit dans le passĂ©. Il est immuable, c’est Ă  dire qu’il ne peut pas changer.
En ce sens, il est exprimé à la voie passive pour marquer cette immutabilité.

Ex: PriceReceived

Il contient tous les paramètres nécessaires à sa description (il est autosuffisant).

L’immutabilitĂ© d’un Ă©vènement est primordiale car c’est elle qui confère tous les avantages vus prĂ©cĂ©demment.
Nous verrons dans la suite de cet article que ces derniers s’Ă©vaporent sitĂ´t qu’elle n’est plus assurĂ©e.

L’event store

L’event store (ou magasin d’Ă©vènements) sert Ă  stocker l’ensemble des Ă©vènements produits par l’application.
Il est le plus souvent persisté afin de permettre les reprises de données évoquées précédemment.

La fonction de décision

Lorsqu’une commande parvient Ă  votre système, elle active la fonction de dĂ©cision.

La fonction de dĂ©cision correspond au coeur de votre mĂ©tier et contient l’ensemble de vos règles de gestion.
A partir de l’Ă©tat courant ainsi que de la commande reçue, elle produit une liste d’un ou plusieurs Ă©vènements.
On peut la reprĂ©senter Ă  l’aide de la signature suivante:

(State, Command) => List[Event]

Les Ă©vènements produits sont ensuite stockĂ©s dans « l’event store ».
Ceci fait, on dĂ©clenche la fonction d’Ă©volution pour chacun d’entre eux.

La fonction d’Ă©volution

La fonction d’Ă©volution a pour objectif de faire muter l’Ă©tat courant de l’application.
Elle ne contient aucune logique mĂ©tier et c’est très important qu’il en soit ainsi.
C’est une fonction « bĂŞte et mĂ©chante » !

A partir de l’Ă©tat courant et d’un Ă©vènement, elle produit un nouvel Ă©tat courant.
On peut la représenter avec la signature suivante:

(State, Event) => State
L’action

Jusqu’Ă  maintenant, nous avons vu que la rĂ©ception d’une commande activait la fonction de dĂ©cision.
Cette dernière produit une liste d’Ă©vènements qui sont stockĂ©s puis, pour chacun d’entre eux, la fonction d’Ă©volution est appelĂ©e afin de muter l’Ă©tat courant.

Il s’agit en fait de la première boucle de notre système d’Event Sourcing. En effet, la mutation de l’Ă©tat courant consĂ©cutive Ă  l’application d’Ă©vènements peut donner lieu Ă  une rĂ©action de notre système. Cette dernière se matĂ©rialise sous la forme d’une action qui n’est autre qu’une commande interne.

Une action reprĂ©sente une rĂ©action initiĂ©e par votre application (on parle de système rĂ©actif). En ce sens, elle est exprimĂ©e Ă  l’impĂ©ratif pour marquer cette intention.

Ex: ForwardPrice

Elle contient tous les paramètres nécessaires à sa description (elle est autosuffisante) et déclenche un second tour de boucle, identique au premier.

L’effet de bord

Lorsque les deux tours de boucle sont terminĂ©s et qu’en consĂ©quence, votre application se trouve dans un Ă©tat stable, l’ensemble des Ă©vènements produits sont transmis vers l’extĂ©rieur. On parle alors d’effets de bord. Ces derniers caractĂ©risent Ă  l’extĂ©rieur de votre système ce qui s’est produit Ă  l’intĂ©rieur.

Couramment, les Ă©vènements produits sont Ă©mis sur un bus oĂą souscrivent les systèmes en charge de l’envoi de messages vers l’extĂ©rieur.
C’est Ă©galement Ă  partir de ce bus d’Ă©vènements que l’on pourra construire les vues de lecture d’un système CQRS.

Points d’attention Ne confondez pas Event Sourcing et Command Sourcing

L’Event Sourcing apporte des capacitĂ©s de reprise de donnĂ©es par le re-jeu des Ă©vènements stockĂ©s.
Selon la littérature, il en existe deux variantes selon que vous sauvegardiez vos évènements (Event Sourcing) ou vos commandes (Command Sourcing).
Or, les consĂ©quences de ce choix sont fortes et rarement maĂ®trisĂ©es; Jeremie Chassaing avait d’ailleurs publiĂ© un article en ce sens dès 2013.

Re-jeu dans le cadre de l’Event Sourcing

Si vous dĂ©cidez de sauvegarder vos Ă©vènements, le re-jeu ne fera intervenir que la fonction d’Ă©volution :

 

Ainsi, vous n’aurez pas Ă  rejouer la fonction de dĂ©cision (donc vos règles mĂ©tiers) et aucun effet de bord ne sera produit vers l’extĂ©rieur.
Il suffit de partir de l’Ă©tat initial et d’appliquer la fonction d’Ă©volution Ă  chacun des Ă©vènements sauvegardĂ©s pour revenir dans l’Ă©tat courant.

Re-jeu dans le cadre du Command Sourcing

Si vous dĂ©cidez de sauvegarder vos commandes, le re-jeu fera intervenir l’ensemble de votre système.
C’est-Ă -dire que la fonction de dĂ©cision sera rejouĂ©e et que des effets de bords seront produits vers l’extĂ©rieur.

Cela pose plusieurs problèmes majeurs :

  1. Comment vos partenaires font-ils pour distinguer un Ă©vènement classique d’un Ă©vènement de re-jeu ?
  2. Que se passe-t-il si, entre la commande initiale et le re-jeu, vos règles de gestion ont évolué ?

Le premier point nĂ©cessite d’avoir des partenaires idempotents, c’est-Ă -dire qui sont capables de recevoir une ou plusieurs fois le mĂŞme message. Ce qui, sur le terrain, est rarement le cas.

Le second point est plus impactant encore. Voyez l’exemple ci-après :

La commande initiale, reçue en 02/2016, a produit un évènement à priori immuable avec une marge de 0,10€.
Lors du re-jeu de cette commande en 07/2016, la règle de gestion a changĂ© et l’Ă©vènement produit n’est plus le mĂŞme: il a dorĂ©navant une marge de 0,20€.

En modifiant malencontreusement le passĂ© de la sorte, on perd toute capacitĂ© d’audit ou d’analyse/debug car l’on n’est plus Ă  mĂŞme d’assurer que les Ă©vènements se sont rĂ©ellement produits. Des solutions existent, comme celles mentionnĂ©es par Martin Fowler dans son article « Event Sourcing », mais leur impact sur la maintenabilitĂ© est non-nĂ©gligeable.

De ce fait, veillez Ă  sauvegarder vos Ă©vènements et non vos commandes Ă  moins d’avoir une excellente raison de ne pas le faire.

Nommer un Ă©vènement n’est pas chose aisĂ©e

Nous l’avons vu au dĂ©but de cet article, les Ă©vènements de votre système sont par nature « mĂ©tier ». Ils doivent donc avoir du sens pour vos utilisateurs et ĂŞtre exprimĂ©s dans un langage partagĂ© par tous (mĂ©tier, dĂ©veloppeurs, testeurs). De plus, nous souhaitons les exprimer Ă  la voie passive pour marquer le fait qu’ils se sont produits dans le passĂ© et sont en ce sens immuables. C’est d’autant plus vrai que ces Ă©vènements ont vocation Ă  ĂŞtre publiĂ©s et visibles, notamment si vous associez votre architecture Ă  un système CQRS. Publier des Ă©vènements laissant place au doute est dangereux et Ă  Ă©viter. Il faut ĂŞtre le plus explicite possible et c’est loin d’ĂŞtre Ă©vident.

Prenons par exemple l’Ă©vènement RequestForwarded. Celui-ci laisse place Ă  de nombreuses interprĂ©tations. De quelle requĂŞte parle-t’on? A qui a-t’elle Ă©tĂ© envoyĂ©e ?
Ainsi, il faut préférer des noms tels que PriceForwaredToClient qui lèvent toute ambiguïté.

De mĂŞme, Ă©vitez les verbes trop gĂ©nĂ©riques, principalement ceux utilisĂ©s dans l’acronyme CRUD (Create Read Update Delete).
Préférez les verbes portant la sémantique de votre métier.

Ex: ClientCreated vs ClientRegistered.

Si le sujet vous intéresse, nous vous conseillons cet excellent article de Miroslaw Praglowki, « The anatomy of Domain Event ».

Conclusion: vous pouvez (devez ?) faire sans framework

Nous l’avons vu ensemble, les concepts derrière l’Event Sourcing sont relativement simples.
En ce sens, implémenter un tel système peut se faire sans framework ni bibliothèque.

Cela vous permettra de vous confronter au plus tĂ´t aux choix fondateurs d’une telle architecture tout en obtenant rapidement des rĂ©sultats exploitables.
Si la performance est un sujet d’importance pour vous, vous serez bien plus Ă  mĂŞme d’optimiser votre implĂ©mentation.

N’hĂ©sitez pas Ă  vous reporter Ă  l’excellent atelier Mixter pour vous accompagner dans cette tâche.
Vos questions sont Ă©galement les bienvenues ; n’hĂ©sitez pas Ă  poster un commentaire pour nous les poser.

Catégories: Blog Société

Une autre manière d’écrire du code asynchrone en Javascript

Ces dernières annĂ©es, l’écriture de code asynchrone a Ă©tĂ© grandement facilitĂ©e par l’utilisation des promesses. Elles permettent de multiplier les appels asynchrones tout en Ă©crivant du code lisible, maintenable et en rĂ©solvant le problème de Callback Hell. Le langage Javascript s’est enrichi avec les spĂ©cifications Ecmascript 6 (ou ES2015), ES2016 et la dernière en date […]
Catégories: Blog Société

OpenDaylight : Java au cœur des réseaux du futur le Jeudi 19 Janvier 2017

Alpes JUG - lun, 01/16/2017 - 11:27
Opendaylight

Il est rare maintenant de produire une application (Java ou autre) sans avoir besoin du rĂ©seau, mais encore trop souvent le rĂ©seau reste la partie la moins contrĂ´lable de nos dĂ©ploiements. Un projet (parmi d’autres) tente de simplifier la gestion des rĂ©seaux modernes, et de les rendre aussi facile Ă  gĂ©rer que les ressources de calcul et de stockage le sont dĂ©jĂ  : il s’agit d’OpenDaylight, une plateforme de SDN (« software-defined networking ») Ă©crite majoritairement en Java (avec Akka, OSGi, Spring, Shiro…). Nous dĂ©couvrirons ensemble les Ă©volutions Ă  venir des rĂ©seaux, quelques unes des nouvelles possibilitĂ©s, et le fonctionnement d’OpenDaylight (quoi ? du Java pour contrĂ´ler des rĂ©seaux ?).

 

Le conférencier

Je dĂ©veloppe en Java depuis 20 ans, et suis passionnĂ© d’informatique en gĂ©nĂ©ral et de logiciel libre en particulier. Je suis DĂ©veloppeur Debian, et je travaille chez Red Hat sur un projet collaboratif de la Linux Foundation, OpenDaylight, une plateforme de SDN (« software-defined networking », rĂ©seau dĂ©fini par logiciel). Je ne rate pas une occasion d’Ă©changer des signatures de clĂ© OpenPGP !

 

 

Inscriptions

https://www.meetup.com/fr-FR/AlpesJUG/events/236960225/

Cette soirée se déroulera sur le campus au Laboratoire LIG – Bâtiment CTL 7 allée de Palestine 38610 , GIERES, à partir de 19h

Catégories: Association

#PortraitDeCDO – Juliette De Maupeou – Total

#PortraitDeCDO – Juliette De Maupeou – Total

DĂ©couvrez pour le cinquième #PortraitDeCDO, avec le portrait de Juliette De Maupeou Digital Officer Industry de Total. Vous allez pouvoir dĂ©couvrir les enjeux du numĂ©rique pour son entreprise, ses contraintes au quotidien ou encore son rĂ´le au sein de sa sociĂ©tĂ© pour faire bouger les lignes du digital. Des insights prĂ©cieux que vous pourrez comparer au fur et Ă  mesure que les portraits s’Ă©graineront dans les semaines Ă  venir.

total

En une phrase, comment définiriez-vous la notion de transformation digitale ?
La capacité de tirer parti des innovations digitales à des fins de création de valeurs.

Cette transformation a un impact sur notre relation client, nos processus industriels, nos modes de travail mais également sur nos relations avec notre écosystème.

Comment décririez-vous votre rôle de CDO ?
Il est difficile à résumer mais je dirais que je cumule un rôle d’animateur, de facilitateur, d’accoucheur et chef d’orchestre. Parfois un peu mouche du coche mais toujours avec le sourire.

Quelles difficultés rencontrez-vous au quotidien ?
La vraie valeur du CDO va être de permettre à l’entreprise d’accélérer le déploiement des projets digitaux et leur passage à l’échelle.

Cela passe forcément par une priorisation des sujets qui peut parfois être vue comme contradictoire avec le développement de l’innovation.  Donc le challenge est pour moi d’arriver à encourager un certain foisonnement et l’innovation participative tout en réussissant à dégager des projets prioritaires qui vont permettre cette transformation.

Un autre challenge pour moi est que nous sommes le point de rencontre entre les modes de fonctionnements de l’écosystème digital (start up, lab, fab, incubateur…) et les processus de travail de nos grands groupes parfois moins souples.

Pensez-vous qu’il faille être technophile pour exercer le métier de CDO ?
Compte tenu de mon parcours (juriste puis RH), je pense pouvoir affirmer qu’il n’y a pas besoin d’être un spécialiste IT pour tenir cette fonction.

Je pense qu’il est nécessaire d’avoir une appétence pour les sujets technologiques, être curieux et ensuite savoir travailler main dans la main avec des profils plus techniques quand vient le besoin.

Pensez-vous que CDO est un métier d’avenir ?
J’espère qu’il ne durera pas car notre priorité est bien une intégration de ces préoccupations par les business unit ou les métiers. Néanmoins, dans les groupes industriels, nous avons encore un rôle à jouer pour s’assurer que le déploiement a bien lieu. Encore quelques beaux jours devant nous !

Quelle est pour vous la prochaine innovation qui risque de chambouler votre secteur d’activité ?
L’IOT et les technologies du type advanced analytics ou machine learning nous permettent de repenser la façon dont nous conduisons nos opérations industrielles.

Quels sont les enjeux de digitalisation de votre entreprise à l’heure actuelle ?
Les activités commerciales et marketing du Groupe ont pris le sujet digital à bras le corps il y a quelques temps déjà. Tout l’enjeux pour le Groupe est maintenant de transformer le reste de ses activités dont le périmètre industriel. Nous pensons que le digital peut adresser nos enjeux de sécurité, d’optimisation de notre production et de réductions des coûts. Ensuite, si on lit la question à un autre niveau, l’enjeux est de dépasser les POCs et Pilotes et de lancer des programmes structurant sur ce domaine, tâche à laquelle nous nous attelons en ce moment grâce à une vision et une feuille de route que nous avons co-construites au premier semestre.

Citez-moi une marque/entreprise qui, pour vous, a clairement réussi à adresser les enjeux du digital ?
Dans le secteur du service, je trouve qu’Accor a très bien réagi et pris un virage digital très clair. On voit aussi que la culture de l’entreprise est une donnée clé de cette transformation.

Dans le secteur industriel, difficile de ne pas parler de General Electric qui s’est doté d’une véritable ambition digitale et d’une organisation dédiée.

Sans contrainte, vous avez la possibilité de commencer 3 projets de transformation dans votre entreprise : quels seraient-ils ?
Sur le périmètre industriel, de gros investissements sont nécessaires pour mettre nos données en état d’être exposées et pour couvrir nos sites avec du réseau. Mes deux premières priorités seraient clairement celles-ci. Ce travail permettrait d’accélérer le déploiement des autres usages tels que la mobilité ou le data analytics, la création d’environnement collaboratifs etc.

Par ailleurs, je suis convaincue qu’on ne peut pas parler de transformation digitale sans travailler sur l’évolution des modes de travail et des pratiques managériales. Je ferai évoluer les espaces de travail pour permettre ces nouvelles pratiques collaboratives, de travail en mode projet et je lancerai un chantier sur le management à l’heure du digital.

Quel projet de transformation vous semble le plus risqué et pourquoi ? Celui qui apporterait le plus de valeur et pourquoi ?
Nous avons un projet autour de l’asset lifecycle management qui va nous permettre de créer un jumeau virtuel de nos sites. C’est un projet extrêmement structurant qui va permettre de gagner en temps et en efficacité sur nos projets et sur nos sites. Il va aussi améliorer la qualité de la donnée exposée dans nos différents services digitaux. Il va nécessiter de revoir la façon dont nous travaillons avec les données en interne mais aussi dont nous collaborons avec nos fournisseurs ou contracteurs. C’est un projet de longue haleine.

Quel est l’impact de la transformation sur la culture et l’organisation de votre entreprise ?
Le premier impact est de permettre de transcander les organisations existantes dans l’entreprise. Un bon exemple est l’organisation digitale elle-même qui n’est pas calquée sur nos business unit mais bien sur des finalités (rapport client, opérations industrielles, travail sur la sub-surface).

Demain, qu’est-ce qui vous fera dire que votre entreprise a réussi sa transformation ?
Quand on n’aura plus besoin de nous !

Quel livre vous a récemment le plus influencé ?
Le dernier livre que j’ai lu sur le digital est « Exponential Organizations » à lire pour comprendre le phénomène de rupture apporté par les nouvelles entreprises du type UBER, Netflix, AirBnB… et le challenge que nos entreprises devraient relever pour passer d’un modèle linéaire à exponentiel.

Par ailleurs, j’ai été très positivement influencée par le livre « Lean In » de Sheryl Sandberg que j’offre à toutes les femmes actives que je connais.

LinkedIn : https://fr.linkedin.com/in/juliettedemaupeou/en
Site Internet : http://www.total.fr/home.html

#PortraitDeCDO – Jueliette De Maupeou from OCTO Technology

Retrouvez les derniers #PortraitDeCDO

#PortraitDeCDO – Rodolphe Roux – Wiko from OCTO Technology

#PortraitDeCDO – Magali Noé – CNP Assurances from OCTO Technology

#PortraitDeCDO – JĂ©rĂ©my Giacomini – Foncia from OCTO Technology

Catégories: Blog Société

Trouver oĂą vous vous sentez le mieux pour innover

Se sentir Ă  l’aise avec l’innovation….selon ses envies et son tempĂ©rament

Dans un article prĂ©cĂ©dent nous Ă©voquions comment aider « les intrapreneurs » Ă  se positionner en Ă©voquant le casting des Ă©quipes selon l’horizon de l’innovation Innovation : le bon casting au bon moment
Voici en un dessin une illustration des enjeux qui vous aidera peut ĂŞtre Ă  comprendre et Ă  vous positionner dans votre entreprise. Merci Maxence pour l’illustration. Notez le parapluie en horizon 1 ;-)

Un dessin valant mieux qu’un discours

3-horizons-pour-innover. Src: bloculus

Pour aller plus loin Articles Formations MeetUp StartMeUp
Catégories: Blog Société

iOS : DĂ©velopper la keynote interactive de Xebicon

Xebicon’16 a Ă©tĂ© l’occasion pour les Ă©quipes mobiles Xebia de relever un challenge : permettre Ă  plus de 700 personnes d’utiliser leurs terminaux mobiles pour interagir en temps rĂ©el avec la keynote du train de l’innovation.

Aujourd’hui nous vous dĂ©crivons Ă  travers ce tutoriel les dessous de fabrication du module de la keynote pour iOS.

Nous verrons :

  1. La création du module
  2. Son intĂ©gration dans une application existante, en l’occurrence Xebicon
  3. Comment communiquer à l’aide de Push Notifications
La keynote

Voici, résumé en quelques points, le déroulé de la keynote :

  1. Les spectateurs s’installent dans la salle et tĂ©lĂ©chargent l’application Xebicon depuis l’App Store.
  2. Une fois la keynote débutée sur scène, l’application révèle un onglet « keynote ». L’expérience interactive peut commencer !
  3. Les spectateurs peuvent choisir entre deux trains (Bordeaux et Lyon) qui les amèneront à la destination finale : la gare Xebicon. L’application affiche alors un écran de vote.
  4. Une fois les votes clos, les trains partent et divers événements se produisent au cours de la keynote (animal sur les voies, panne…). Tout ceci est retranscrit en temps réel sur le téléphone des spectateurs via des Push Notifications.
  5. Le train arrive à la Xebicon. La keynote est terminée !
Un module intégrable via CocoaPods

La keynote d’ouverture est une nouveautĂ© de Xebicon’16. Elle doit apparaĂ®tre dans l’application existante disponible sur App Store.

Avant de commencer Ă  coder, il convient de se demander comment faire pour l’intĂ©grer dans l’application. Plusieurs choix s’offrent Ă  nous :

  • Écrire le code directement dans l’application.
  • DĂ©velopper un module sĂ©parĂ©, et l’importer dans l’application.

La solution retenue est la dernière. En effet, la keynote Ă©tant totalement indĂ©pendante (elle s’affiche dans son propre onglet et n’interagit pas avec le reste de l’application), il est aisĂ© de la dĂ©velopper Ă  part.

Pour l’intĂ©grer, nous avons fait le choix de crĂ©er un podspec CocoaPods.

# Notre podspec final
# Il est placé à la racine de notre repository
Pod::Spec.new do |s|
  s.name           = 'KeynoteVote'
  s.version        = '1.1.2'
  s.summary        = 'Vote module for xebicon 2016'
  s.platforms      = { :ios => "9.0" }
  s.source         = { :git => 'git@github.com:xebia-france/xebicon.git' }
  s.source_files   = 'ios-vote/KeynoteVote/**/*.swift'
  s.resources      = ['ios-vote/KeynoteVote/Assets.xcassets', 'ios-vote/KeynoteVote/**/*.strings', 'ios-vote/KeynoteVote/**/*.storyboard']
  s.homepage       = 'https://github.com/xebia-france/xebicon/tree/master/ios-vote/KeynoteVote'
end

Nous n’aurons plus qu’Ă  l’ajouter au Podfile de l’application Xebicon pour l’importer :

source 'xxx' # notre repo privé qui contient le podspec

...
pod 'KeynoteVote'
L’architecture ModĂ©lisation

 La keynote se dĂ©roule selon une succession d’Ă©vènements : dĂ©but, ouverture/fermeture des votes, dĂ©part des trains, etc. Le nombre d’Ă©tats possible est figĂ© et connu Ă  l’avance, et la keynote ne peut ĂŞtre que dans un seul Ă  la fois (exemple : impossible d’avoir ouverture et fermeture des votes en mĂŞme temps). Nous allons donc la modĂ©liser en utilisant un enum.

public enum KeynoteState: String {
  case Welcome = "KEYNOTE_START"
  case End = "KEYNOTE_END"
  case TrainVote = "VOTE_TRAIN_START"
  case TrainVoteEnd = "VOTE_TRAIN_END"
  case TrainDeparture = "TRAIN_DEPARTURE_START"
  case TrainDepartureEnd = "TRAIN_DEPARTURE_END"
  case XebiconArrival = "TRAIN_POSITION"
  case HotDeploymentStart = "HOT_DEPLOYMENT_START"
  case HotDeploymentEnd = "HOT_DEPLOYMENT_END"
  case AvailabilityStart = "AVAILABILITY_START"
  case AvailabilityEnd = "AVAILABILITY_END"
  case Obstacle = "OBSTACLE"
  case ObstacleCleared = "OBSTACLE_CLEARED"
}

Le changement d’Ă©tat (passer de HotDeploymentStart Ă  HotDeploymentEnd) se fera via un objet tiers, KeynoteEvent, qui contiendra les donnĂ©es associĂ©es :

public struct KeynoteEvent {
  public var state: KeynoteState?
  public var message: String?
  public var destination: TrainDestination? = nil // destination du train
  public var obstacle: Obstacle? // obstacle détecté
    
  public init() {}
}

public enum TrainDestination: Int {
  case bordeaux = 1
  case lyon = 2
}

public struct Obstacle {
    let blocked: Bool
    let animalImage: UIImage?

    init(type: String, blocked: Bool) {
        self.blocked = blocked
        self.animalImage = UIImage(named: type, in: Bundle().currentBundle(), compatibleWith: nil)
    }
}
Design

Chaque state de la keynote est représenté par un écran. Reportez-vous au fichier Storyboard.storyboard du code source (ou laissez libre cours à votre imagination !)

Par la suite nous aurons besoin de rĂ©fĂ©rencer les ViewController de notre storyboard. PlutĂ´t que d’Ă©crire du code redondant, nous conseillons d’utiliser SwiftGen qui crĂ©era deux classes : Storyboard et StoryboardScene.

Routing

Nous avons notre KeynoteState et les écrans associés. Il nous faut maintenant pouvoir dérouler les écrans.   

Pour ce faire, nous avons crĂ©Ă© un routeur minimaliste qui affiche l’Ă©cran du dernier state connu.

protocol Route {
  var viewController: UIViewController { get }
}

class Router<T: Route> {
  let navigationController: UINavigationController
  var didNavigate: (UIViewController) -> Void = { _ in }
  
  init(navigationController: UINavigationController) {
    navigationController = navigationController
  }
  func navigate(_ route: T) {
    DispatchQueue.main.async {
      let controller = route.viewController
      navigationController.setViewControllers([controller], animated: false)
      didNavigate(controller)
    }
  }
}

Nous ferons la navigation en fonction d’un state (KeynoteState). Il va donc nous falloir Ă©tendre KeynoteState pour y implĂ©menter Route.

// Note : StoryboarScene et Storyboard sont les classes générées par SwiftGen pour notre Storyboard.storyboard
extension KeynoteState: Route {
  var viewController: UIViewController {
    switch(self) {
    case .Welcome, .End:
      return StoryboardScene.Storyboard.instantiateKeynoteWelcome()
    case .TrainVote:
      return StoryboardScene.Storyboard.instantiateTrainVote()
    case .TrainVoteEnd:
      return StoryboardScene.Storyboard.instantiateTrainVoteComplete()
    case .TrainDeparture:
      return StoryboardScene.Storyboard.instantiateTrainRideStart()
    case .TrainDepartureEnd:
      return StoryboardScene.Storyboard.instantiateTrainRideEnd()
    case .AvailabilityStart:
      return StoryboardScene.Storyboard.instantiatePurchaseStart()
    case .AvailabilityEnd:
      return StoryboardScene.Storyboard.instantiatePurchaseEnd()
    case .HotDeploymentStart:
      return StoryboardScene.Storyboard.instantiateDeploymentStart()
    case .HotDeploymentEnd:
      return StoryboardScene.Storyboard.instantiateDeploymentEnd()
    case .Obstacle:
      return StoryboardScene.Storyboard.instantiateObstacle()
    case .ObstacleCleared:
      return StoryboardScene.Storyboard.instantiateObstacleCleared()
    case .XebiconArrival:
      return StoryboardScene.Storyboard.instantiateKeynoteEnd()
    }
  }
}
Interactions

Le module de vote possède deux interactions avec l’utilisateur : voter pour un train, et acheter des boissons au wagon-bar. Les deux sont sensiblement similaires, nous nous intĂ©resserons donc uniquement au premier.

Dans le ViewController, nous allons donc ajouter une action pour gérer le train sélectionné :

protocol TrainVoteViewDelegate {
 func didVote(_ vote: TrainDestination)
}

class TrainVoteViewController : UIViewController, TrainVoteViewDelegate {
 func viewDidLoad() {
  super.viewDidLoad()
  guard let view = self.view as? TrainView else { fatalError("Wrong view type") }
  view.delegate = self
 }

 func didVote(_ train: TrainDestination) {
  // Envoyer le vote au serveur
   }
}

extension TrainVoteView {
 @IBAction func bdxVoteSelected() {
  voteButton.isHidden = true
  delegate?.didVote(.bordeaux)
 }

 @IBAction func lyonVoteSelected() {
  voteButton.isHidden = true
  delegate?.didVote(.lyon)
 }
}

API publique

Nous ajoutons une classe qui fera office de façade. Ce sera notre interface publique depuis l’extĂ©rieur pour intĂ©ragir avec notre module de vote. Elle nous permettra :

  • d’initialiser le composant
  • de changer d’Ă©tat via des KeynoteEvent
public protocol KeynoteVoteCenterDelegate {
    func willStart(keynote: KeynoteVoteCenter)
    func didReceive(state: KeynoteState, keynote: KeynoteVoteCenter)
}

open class KeynoteVoteCenter : NSObject {
    fileprivate var started = false
    fileprivate let router: Router<KeynoteState>
    public var delegate: KeynoteVoteCenterDelegate?

    open var viewController: UIViewController {
        return router.navigationController
    }

    override public init() {
        self.router = Router(navigationController: StoryboardScene.Storyboard.initialViewController())
        super.init()
    }

    open func requestStateChange(_ payload: KeynoteEvent) -> Bool {
        guard let state = payload.state, started else {
            return false
        }
        navigate(state)
        return true
    }

    public func start() {
        if !started {
            delegate?.willStart(keynote: self)
        }
        started = true
    }

 func navigate(_ state:KeynoteState) {
        delegate?.didReceive(state: state, keynote: self)
        router.navigate(state)
    }
}
Integration

Maintenant que notre module est prĂŞt, nous pouvons l’intĂ©grer dans notre application, en commençant par l’importer via CocoaPods.

Ensuite, dans l’AppDelegate, nous instancions le module et l’attachons Ă  l’application.

// Application conteneur
class AppDelegate : UIApplicationDelegate {
 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
  setupKeynote()
  return true
 }

 func setupKeynote() {
  voteCenter = KeynoteVoteCenter()
 }

 func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
  voteCenter.start()
 }

 func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping  (UIBackgroundFetchResult) -> Void) {
  var keynoteEvent = KeynoteEvent()
        
        try? keynoteEvent.map(userInfo)
        voteCenter.requestStateChange(keynoteEvent)
 }
}

Notre KeynoteVoteCenterDelegate nous permettra d’afficher le module keynote dans la tabbar de notre application, et uniquement lorsque celle-ci est en cours :

extension MainViewController : KeynoteVoteCenterDelegate {
 public func willStart(keynote: KeynoteVoteCenter) {
    }

    public func didReceive(state: KeynoteState, keynote: KeynoteVoteCenter) {
        DispatchQueue.main.async {
            switch(state) {
            case .End:
                self.removeKeynote(keynote.viewController)
            case .Welcome:
                self.addKeynote(keynote.viewController)
                self.selectedViewController = keynote.viewController
            default:
                self.addKeynote(keynote.viewController)
                
            }
        }
    }

 func removeKeynote(_ controller: UIViewController) {
        let controllers = viewControllers ?? []
        setViewControllers(controllers.filter { $0 != controller }, animated: true)
    }

 func addKeynote(_ controller: UIViewController) {
        var controllers = viewControllers ?? []
        let hasKeynote = (controllers.filter { $0 == controller }.count > 0)

        if !hasKeynote {
            controllers.append(controller)
            setViewControllers(controllers, animated: true)
            let tabBarImage = UIImage(named: "tabBarRail")
            controller.tabBarItem = UITabBarItem(title: "Keynote", image: tabBarImage, tag: 0)
            controller.tabBarItem.image = tabBarImage?.withRenderingMode(.alwaysTemplate)
            controller.tabBarItem.selectedImage = UIImage(named: "tabBarRailSelected")
        }
    }
}

// À ajouter dans setupKeynote de AppDelegate
func setupKeynote() {
  voteCenter.delegate = window.rootViewController as? KeynoteVoteCenterDelegate
}

Nous pouvons maintenant lancer notre application. On n’aura plus qu’Ă  envoyer des Push Notifications pour faire apparaĂ®tre la keynote !

Catégories: Blog Société

[Session Mensuelle] 2017 : Nouveau format & sondage

Agile Nantes - ven, 01/13/2017 - 14:05
Qui dit nouvelle annĂ©e, dit nouveautĂ©s Ă  l’Agile Nantes et notamment sur les sessions mensuelles ! Format des sessions Comme chaque annĂ©e, vous allez pouvoir retrouver les futures sessions mensuelles sur la page dĂ©diĂ©e Ă  cet effet. Le groupe bĂ©nĂ©vole qui organise ces sessions est toujours directement joignable via le mail suivant : orga-sm-nantes@googlegroups.com Pour vous [...]
Catégories: Association

Codeurs en seine 2016, dans l’oeil du craftsman et de l’agiliste

Codeurs en seine est une confĂ©rence (gratuite) ayant lieu tous les ans en novembre, Ă  l’universitĂ© de Rouen. Cette annĂ©e, la confĂ©rence fĂŞtait ses 10 ans !

 

Retours des amphis pour une agiliste du craft

Tout au long de la journĂ©e du jeudi, 4 amphis Ă©taient proposĂ©s en parallèle, soit au final pas loin de 20 talks diffĂ©rents tout au long de la journĂ©e ! C’est pourquoi j’ai dĂ©cidĂ© d’orienter ma journĂ©e autour d’un angle : l’agile et le craftsmanship.

Qui a volĂ© l’orange?

Par Frédéric Leguédois (1h)

Comment la recherche du blâme conduit Ă  la perte d’innovation dans l’entreprise.

L’un des points les plus difficiles Ă  interprĂ©ter du Manifeste Agile est certainement : « La collaboration avec les clients plus que la nĂ©gociation contractuelle ». Les interprĂ©tations de ce point sont en effet assez variables :

  • certains agilistes le traduisent par « ĂŞtre souple par rapport aux contrats lĂ©gaux signĂ©s avec le client »,
  • d’autres y voient plutĂ´t une redite du point du manifeste « Les individus et leurs interactions plus que les processus et les outils ».

Alors que le message original est plutĂ´t de « ne pas chercher Ă  punir ceux qui se trompent, chercher plutĂ´t des solutions. »

Le problème est que face Ă  une erreur, lorsque l’on cherche un coupable : nous cherchons alors Ă  appliquer une sanction (rĂ©elle ou symbolique), plutĂ´t qu’Ă  trouver une solution.

Cela aboutit Ă  des effets dĂ©lĂ©tères : les accusĂ©s accusent d’autres personnes Ă  leur tour, crĂ©ant des conflits et des tensions qui tendent Ă  faire oublier le problème original. Cela entraĂ®ne une ambiance de culpabilisation, qui amène Ă  la dissimulation et au mensonge. Ce climat gĂ©nĂ©ral aboutira Ă  une perte de confiance au sein de l’Ă©quipe d’une part, puis entre l’Ă©quipe et le manageur d’autre part, qui mettra en place des reportings, coĂ»teux en Ă©nergie et en temps.

Un autre effet de bord de la recherche des coupables, c’est que, Ă  terme, cela revient Ă  fĂ©liciter les personnes qui ne se trompent jamais. Soit celles qui, bien souvent, sont les personnes qui ne prennent pas d’initiative, ou alors qui tendent Ă  fuir leurs responsabilitĂ©s.

Comment éviter la recherche de coupables, au détriment de la recherche de solutions ?

  • Exprimer clairement qu’on est dans la recherche de solutions, pas de coupables.
  • Le management et la hiĂ©rarchie doivent jouer le jeu (ne pas chercher de coupable non plus)
  • …mais le manager doit donner l’exemple : Ă  savoir admettre quand il se trompe lui-mĂŞme.
  • L’important Ă©tant de ne jamais accuser les autres, mĂŞme sur les points importants, mais de toujours ĂŞtre transparent sur ses propres erreurs.
  • La prise d’initiative doit ĂŞtre autonome : les dĂ©veloppeurs doivent avoir suffisamment de marge de manĹ“uvre pour tenter des choses sans en avoir Ă  demander l’autorisation Ă  leur manageur.
  • Face a une erreur, mĂŞme importante, insistez sur la recherche d’une solution, et s’y tenir, ne partez pas sur la recherche d’un coupable.

Ces prĂ©conisations permettent au final de favoriser l’initiative. Il est important de favoriser toutes les prises d’initiative, mĂŞme si toutes n’aboutissent pas et certaines échouent, afin de pouvoir conserver ce climat d’initiative.

Lao-Tseu, Software-Craftsman

par Gautier Mechling (1h) (slides)

Cette présentation se base sur comment la pensée de Lao Tseu, sage Chinois du milieu du VIe siècle, illustre les préconisations des mouvements craftsmanship et agiliste, notamment dans son livre Tao Tö King, « livre de la voie et de la vertu ».

Gautier Mechling fait ainsi le lien entre la parole de Lao et des sujets plus modernes tels que le mentoring, la gestion du code légacy, les principes SOLID, les pratiques agiles, la gestion de la dette technique, le crash monitoring et la conteneurisation.

 

Petit guide de survie dans la complexitĂ© d’un projet Web

par Bastien Jaillot

Comment Ă©viter les crises au quotidien au sein de votre Ă©quipe grâce Ă  l’agilitĂ©.

Dans la pratique, la mise en place des bonnes pratiques et prĂ©conisations n’est pas toujours aisĂ©e au sein de la vie d’une Ă©quipe.

A commencer par la dette technique. En thĂ©orie, tout le monde est d’accord sur la dĂ©finition : un emprunt fait Ă  la qualitĂ© du code. Mais Ă  la diffĂ©rence d’un emprunt fait Ă  une banque, il est ici largement aisĂ© de dĂ©passer son seuil de paiement, au risque de rendre l’application in-maintenable.

En fait, la dette technique, c’est plus une accumulation de code sĂ©dimentaire, « auquel personne ne touche », de fonctionnalitĂ©s qui n’auraient jamais du apparaĂ®tre et d’Ă©conomies Ă  court terme.

Mais comment prĂ©dire cette apparition ? Par la prĂ©vention : Ă©vitez (ou dĂ©-priorisez) les fonctionnalitĂ©s inutiles : elles n’aboutiront qu’Ă  salir le code, dĂ©motiver l’Ă©quipe et engendrer une surcharge de travail et un effet tunnel. Il faut ĂŞtre capable de dire non Ă  son client (ou la version polie « pas maintenant »).

Concernant la prise de dĂ©cision au sein d’une Ă©quipe, il est conseillĂ© d’avoir le moins d’intervenants possible entre l’Ă©quipe dĂ©cisionnelle et les techniciens.

Fonctionner en itĂ©ration permet Ă©galement d’avoir une meilleure tolĂ©rance aux Ă©checs.

Un petit pas pour le développeur, un grand pas pour la qualité

par Christophe Hermann (15 min)

Comment faire de la qualité rapide et productive ?

L’un des problèmes de nos jours, est que l’on a tendance Ă  tout vouloir : du code de qualitĂ©, rapide, et pour pas cher.

Or, dans la pratique, il faut choisir:

 

 

Bien souvent, la priorité sera mise sur de faibles coûts. Et ensuite sur la rapidité. Pourtant, au fond, les manageurs souhaitent également du code de qualité. Ils veulent juste que cette qualité soit rapide et pas chère.

Voici une liste exhaustive des solutions:

  • une couverture de tests efficaces permet une qualitĂ© pour pas cher : en effet une erreur coĂ»tera toujours moins si elle est dĂ©tectĂ©e par les tests que par la recette, une rĂ©gression coĂ»tera toujours moins si elle est dĂ©tectĂ©e par les tests que sur la prod.
  • Industrialisez les tâches qui peuvent l’ĂŞtre afin d’augmenter la qualitĂ© et Ă©viter les erreurs humaines (tests, processus de build, de release)
    • …Mais ne tombez pas dans le piège de la sur-industrialisation (typiquement, si votre automatisme est peu-utilisĂ© ou doit ĂŞtre mis Ă  jour Ă  chaque utilisation)
    • Utilisez des checklists afin de documenter tous les processus qui ne peuvent ĂŞtre industrialisĂ©s.
  • Ecrivez un squelette « propre » d’application, que vous rĂ©utiliserez Ă  chaque nouvelle crĂ©ation
    • … avec en place un environnement de tests, des metrics, un README sur les Ă©ventuelles opĂ©rations Ă  faire pour intĂ©grer le projet dans le process (par exemple, ajouter le projet dans l’outil d’intĂ©gration continue)
    • …avec les dĂ©pendances et technologies prĂ©conisĂ©es ( par exemple, tous vos projets utiliseront spring-boot 1.2.3 et hibernate 3.4.5)
    • avec des exemples de configuration
    • Pensez Ă  mettre Ă  jour ce squelette rĂ©gulièrement.
  • RĂ©diger des conventions de nommage, de structure, d’architecture, de syntaxe, etc.
    • … et faites-les accepter par toute votre Ă©quipe

Enfin, souvenez-vous que votre prochain projet ne doit pas être parfait, il doit juste être mieux que le précédent.

15 ans de qualité Web : stop ou encore ?

par Élie Sloïm, (30 min)(15 ans de qualité Web : stop ou encore ?)

Comment en est-on venu, dans l’univers flamboyant du dĂ©veloppement logiciel, Ă  parler de qualitĂ© ?

Au dĂ©but des annĂ©es 2000, personne ne faisait de la qualitĂ© dans le domaine de l’informatique. Les opportunitĂ©s de croissance semblaient infinies, le but Ă©tait de faire du chiffre. Puis la bulle a explosĂ©. Le marchĂ© est devenu plus restreint, les clients plus difficiles Ă  sĂ©duire, Ă  maintenir. Et seules les entreprises centrĂ©es sur la qualitĂ© sont parvenues Ă  perdurer.

C’est pour cela qu’Elie SloĂŻm nous prĂ©sente OPQUAST, un ensemble de checklist universel des bonnes pratiques de dĂ©veloppement et organisme de certification qualitĂ©.

Conduire un Retour d’EXpérience projet

par  Delphine Malassingne (1h)

MĂ©thodologie du REX : retour d’expĂ©rience d’un retour d’expĂ©rience

Un REX (Retour d’EXpĂ©rience) est un processus de rĂ©flexion mis en oeuvre pour tirer des enseignements et des axes d’amĂ©liorations d’un projet (en cours ou terminĂ©).

Idéalement il est effectué par

  • quelqu’un d’externe au projet,
  • neutre et bienveillant,
  • Ă  l’aise dans l’animation,
  • transverse,
  • toujours la mĂŞme personne, afin de pouvoir comparer les diffĂ©rents REX entre eux, et vĂ©rifier que les enseignement et axes d’amĂ©liorations ont bien Ă©tĂ© suivis.

Un REX suit plusieurs Ă©tapes :

  • IdĂ©alement, il doit ĂŞtre prĂ©vu dès l’avant vente du projet, afin de faciliter la collecte d’informations
  • Chaque participant au projet remplit un questionnaire (anonyme, mais qui permet d’indiquer sa place dans l’Ă©quipe). Y compris les manageurs, commerciaux, personnes restĂ©es seulement une semaine. Le but n’est pas tant de faire une moyenne exacte que d’avoir tous les points de vue.
  • Une fois les questionnaires remplis et analysĂ©s, faire une rĂ©union avec les diffĂ©rents intervenants pour discuter des diffĂ©rents points mis en Ă©vidence par le questionnaire et Ă©laborer un plan d’action
  • Lors de ce point, il est important que les questions soient posĂ©es et que les opinions sur le sujet soient brassĂ©es, mais surtout que les diffĂ©rentes interventions soient notĂ©es par Ă©crit.
  • Ensuite un compte-rendu et un plan sont rĂ©alisĂ©s, mais le compte-rendu ne sera publiĂ© que lorsque plusieurs REX auront Ă©tĂ© effectuĂ©s, afin de pouvoir les mettre en perspective et voire les Ă©volutions. En revanche, le plan d’action est publiĂ© et applicable de-suite.

Le but des REX n’est pas d’avoir une Ă©valuation finale Ă  un projet unique, mais plutĂ´t de mettre en place une amĂ©lioration globale continue.

Dev vs Wild

par  Yoann Ono Dit Biot (slides)

Quelles sont les conséquences de vos failles de sécurité sur votre application en général, et sur vous en particulier ?

 

Il est difficile de l’admettre, mais la sĂ©curitĂ© informatique ne semble pas ĂŞtre la prioritĂ© de tous les devs. Nous entendons souvent :

  • « Personne ne m’attaque »
    • alors que la majoritĂ© des attaques sont automatiques et non ciblĂ©es.
    • alors qu’il faut en moyenne 200 jours pour identifier une faille ou ne serais-ce que de dĂ©tecter une potentielle attaque passĂ©e.
  • « Moi, je n’ai rien Ă  cacher »
      • alors que l’objectif de la majoritĂ© des attaques n’est pas vos donnĂ©es, mais vos ressources serveurs.
      • … avec un risque de dĂ©nis de service
      • … voire de crypto lock : quelqu’un prend en otage votre serveur et vous le rend contre une rançon
  • Mais au final, qu’est-ce que la sĂ©curitĂ© en informatique?
  • Elle passe par 3 points:
    • ConfidentialitĂ©
    • IntĂ©gritĂ©
    • DisponibilitĂ©

Le but de la sĂ©curitĂ© informatique est de garantir ces 3 points, de protĂ©ger l’utilisateur, le SI, et enfin de proposer des solutions en cas de problèmes

Ce n’est pas:

  • uniquement un problème de sysadmin : la meilleure sĂ©curitĂ© du monde ne pourra pas rattraper l’incompĂ©tence d’un dĂ©veloppeur
  • magique : ce n’est pas une silver bullet, il faut comprendre prĂ©cisĂ©ment les failles et les processus de sĂ©curitĂ©
  • rĂ©troactif : une fois que le mal est fait, il est difficilement rattrapable
  • sĂ»r à 100%

Comment la mettre en place:

  • DĂ©finissez un niveau de risque minimal
  • Formez et communiquez avec les Ă©quipes de dĂ©veloppement
  • DĂ©finissez les rĂ´les au sein des Ă©quipes : qui vĂ©rifie le code, qui teste, qui vĂ©rifie si une attaque a eu lieu
  • Analysez les risques
    • anticipez les impacts
    • MĂ©thode e-BIOS
    • MĂ©thode MEHARI (MĂ©thode harmonisĂ©e d’analyse des risques)
  • DĂ©finissez la surface d’attaque (les accès depuis l’extĂ©rieur par lĂ  oĂą l’attaque va s’effectuer)
  • Renseignez-vous rĂ©gulièrement sur les recommendations OWASP
  • Mettez en place des tests de sĂ©curitĂ© automatisĂ©s.
  • Faites appel Ă  des audits de sĂ©curitĂ©, voir Ă  un Bug Bounty

En bref, tous les ingrédients pour une conférence bien remplie.
Beaucoup de craft, d’agilitĂ© ! mais ça serait oublier les autres slots, tels que

Les Pipelines Jenkins dans la vraie vie, Deep Learning et Intelligence Artificielle : mythes et rĂ©alitĂ©s, vue.js, j’avais pas vu !, Criteo, Why What Who How ?, Concevoir une expĂ©rience Mobile plus accessible, DĂ©placer une Application Monolithique vers une Architecture Microservices,  Angular2 et les standards du web,  etc.

Vivement l’annĂ©e prochaine !

BONUS : la key-note Codeurs du monde

par Agnes Crepet et Cyril Lacote(1h) (retranscription) (Codeurs du Monde)

Du bonheur d’ĂŞtre dĂ©veloppeur dans les diffĂ©rents pays du globe

Ce duo revient sur leurs expériences professionnelles dans différents pays, et sur les conditions de vie des développeurs, partout dans le monde :

Ils ont ainsi organisé des meetups au Togo, où les conférences étaient rares et certains spectateurs, très motivés, dépensaient une journée de salaire et faisaient des heures de transport pour venir les voir.

Ils ont Ă©galement Ă©tĂ© en Malaisie, oĂą l’accent est mis sur l’enseignement et la formation. Puis ils sont allĂ©s enseigner Ă  Jakarta (IndonĂ©sie), Ă  des Ă©tudiants très pro-actif-e (50 % de filles !) et engagĂ©(e)s, prĂŞt(e)s Ă  crĂ©er leur startup Ă  peine sortie de l’Ă©cole (voire avant pour certain(e)s).

Ils ont ensuite mis en place un pod-cast à San Francisco, où il existe un gap entre la vision très idéalisée du métier de développeur dans la Silicon Valley, et la réalité (les salaires ne suffisent pas à payer les loyers, tensions avec les populations locales).

Ils ont ensuite travaillĂ© Ă  Stockholm, oĂą l’accent est mis sur la balance entre la vie professionnelle et la vie personnelle.

Enfin ils sont devenus indépendants, puis ont créé leur propre société à St-Etienne : Ninja Squad 

Enfin Agnes et Cyril tirent cette conclusion sur l’Ă©panouissement: ce qui rend les dĂ©veloppeurs heureux, c’est principalement pouvoir choisir son destin. Et donc, ĂŞtre maĂ®tre de son cadre de travail.

 

Catégories: Blog Société

Keeping your JIRA issues linked and organised with Exocet

Le blog de Valiantys - jeu, 01/12/2017 - 17:00

  Keeping similar customer demands organised and associated when working in a multi-project JIRA environment can be quite a challenge. In this blog, we will show you how Exocet for JIRA can help you keep track of your linked issues by copying them from their original JIRA issue to a newly created one. Let’s imagine you have ...

The post Keeping your JIRA issues linked and organised with Exocet appeared first on Valiantys Blog - Atlassian Expert.

Catégories: Blog Société

Partagez la connaissance

Partagez BlogsdeDeveloppeurs.com sur les réseaux sociaux