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

Ippevent Young Blood jeudi 26 février : SASS, Spring, Dropwizard et Git

Blog d’Ippon Technologies - mar, 02/17/2015 - 10:30

Jeudi 26 fĂ©vrier, nous mettons Ă  l’honneur des consultants Ippon qui n’ont pas l’habitude d’ĂŞtre speaker mais qui ont nĂ©anmoins de très beaux sujets Ă  prĂ©senter. Ce seront donc quatre prĂ©sentations d’une quinzaine de minutes chacune sur des sujets allant du back au front.

La soirĂ©e aura lieu dans nos locaux, au 43-47 avenue de la Grande ArmĂ©e, 75116 Paris. Elle dĂ©butera Ă  19 heures et sera suivie d’un buffet pour Ă©changer avec les speakers.

Conception de CSS avec SASS et SMACSS – par Breixo Fernandez-Lopez

Dans un contexte de complexitĂ© croissante des interfaces web, nous allons Ă©tudier les caractĂ©ristiques des prĂ©processeurs CSS, les normes de bonne utilisation et voir comment ils peuvent nous aider Ă  maintenir la qualitĂ© de notre code. Dans un deuxième temps, nous verrons des concepts d’architecture modulaire basĂ©s sur les rĂ©flexions de Jonathan Snook dans son livre SMACSS.

Initiation Ă  Dropwizard – par Ludovic Chane Won In

Dropwizard est un framework apportant de nombreux services : remontĂ©e de mĂ©triques, health checks, support des tests… Cette session de live coding montrera comment dĂ©velopper une application depuis zĂ©ro avec Dropwizard.

Passer Ă  Git pour une Ă©quipe qui travaille tous les jours avec CVS – par Pierre Templier

De la migration technique au choix du workflow de travail en passant par l’accompagnement nĂ©cessaire, voici un retour d’expĂ©rience d’une migration de Git vers CVS. Nous dresserons le bilan des problèmes rencontrĂ©s ainsi que des bĂ©nĂ©fices retirĂ©s lors de cette migration.

Injection de dĂ©pendance et type-safe binding avec Spring – par Julien Sadaoui

Une des fonctionnalités les plus importantes de « Contexts and Dependency Injection » est l’injection de dépendance avec types (type-safe binding). Cette fonctionnalité est offerte par CDI via l’annotation @Qualifier de la JSR 330. Dans cette présentation, nous verrons comment obtenir avec Spring IOC un comportement similaire d’injection de dépendance grâce l’utilisation de l’annotation @Qualifier de Spring.

Billetterie en ligne pour Ippevent Young Blood : SASS, Spring, Dropwizard et Git réalisé par Eventbrite

Catégories: Blog Société

Chapitre 12 du livre de Sandro Mancuso sur le Software Craftsmanship

sandro_mansuco-book-xebia.png

Comme chaque semaine, nous vous proposons un rĂ©sumĂ© d’un chapitre de l’excellent livre de Sandro Mancuso Software Craftsmanship – Professionalism Pragmatism Pride. Nous vous proposons cette semaine le rĂ©sumĂ© du chapitre 12 dĂ©crivant l’importance pour une entreprise d’avoir des dĂ©veloppeurs qui s’amĂ©liorent continuellement.

Si vous ĂŞtes intĂ©ressĂ©s par la vision d’un craftsman sur son logiciel vous pouvez retrouver Sandro dans le catalogue de formation de Xebia Training.

Déjà publié :

  1. Software Development
  2. Agile
  3. Software Craftsmanship
  4. The Software Craftsmanship Attitude
  5. Heroes, Goodwill and Professionalism
  6. Working Software
  7. Technical Practices
  8. The Long Road
  9. Recruitment 
  10. Interviewing Software Craftsmen  
  11. Interview Anti-patterns 

The Cost of Low Morale

Ces dix dernières années, beaucoup d’entreprises ont connu une transformation agile sous une forme ou une autre, mais très peu avec succès, c’est-à-dire avec une capacité de livraison améliorée. Si les coachs agiles ont su améliorer les processus, ils ont eu beaucoup moins de succès pour améliorer les compétences techniques des développeurs. Dans beaucoup d’entreprises, les développeurs suivent mécaniquement les nouveaux processus, mais en développant exactement comme auparavant, car ils ne sont pas motivés pour s’améliorer continuellement.

Le coût d’employer des développeurs 9-à-5

Les dĂ©veloppeurs qui ne sont pas intĂ©ressĂ©s par leur travail n’auront pas la motivation nĂ©cessaire pour faire l’effort d’amĂ©liorer leurs pratiques et donc d’amĂ©liorer le produit final. Ce qui gĂŞne les dĂ©veloppeurs passionnĂ©s n’est pas l’absence de passion des membres de leur Ă©quipe ; c’est plutĂ´t leur rĂ©sistance au changement qui rend très difficile l’amĂ©lioration des choses. Cela aura un coĂ»t non nĂ©gligeable sur le projet, en temps comme en argent. Il n’y a pas beaucoup de solutions pour aller contre ça. La plus simpliste et souvent envisagĂ©e est de se sĂ©parer des dĂ©veloppeurs concernĂ©s, mais il y a aussi la possibilitĂ© de faire appel Ă  une intervention extĂ©rieure, avec des experts qui reprennent en main le projet pour une pĂ©riode de temps donnĂ©e.

Limité par le manque de motivation

Chaque employé peut facilement trouver une liste de choses à améliorer dans le fonctionnement d’une entreprise. Mais alors, pourquoi si peu agissent pour faire avancer les choses ? Les raisons avancées sont récurrentes : « je ne peux rien y faire », « trop dur », « les choses ne peuvent pas changer », « c’est juste un travail »… La raison profonde est le manque de motivation. Il est impossible de changer une organisation où les gens ne sont pas motivés et impliqués. Pour savoir si c’est vraiment le cas, il faut se poser les bonnes questions : « Sont-ils motivés pour faire du bon travail ? », « essaient-ils de s’améliorer en permanence ? »…

Avoir un impact

La différence entre un développeur traditionnel et un software craftsman est que le craftsman est en mission pour améliorer les choses et livrer de la valeur à ses clients. Les software craftsmen ne sont pas des managers ou des architectes qui dictent la manière de faire, mais plutôt des gens qui s’assoient à côté des autres développeurs pour partager leurs techniques et connaissances.

Catégories: Blog Société

Ecrire du code propre – Les piliers

Le « Clean Code » regroupe plusieurs règles et principes pour vous aider Ă  construire mais surtout refactorer votre code. En effet, comme le disait Michel dans son article sur les artisans du code, le respect de ces diffĂ©rentes règles Ă©noncĂ©es par Bob Martin a pour but d’offrir Ă  votre code, entres autres, simplicitĂ©, lisibilitĂ© et structuration pour qu’il soit le plus Ă©volutif et maintenable possible sur le long terme.

Ce premier article traite des piliers qui vous soutiendront dans votre pratique de l’amĂ©lioration de la qualitĂ© de votre code.

Préambule : Savoir détecter que notre code à un problème

En plus de l’utilisation d’outils d’analyse de code, il existe quelques indices simples pour nous aider Ă  dĂ©terminer si notre code doit ĂŞtre refactorĂ© :

  • Des mĂ©thodes trop longues (au delĂ  de ~20 lignes)
  • Des classes trop longues (au delĂ  de ~200 lignes)
  • Une incapacitĂ© Ă  lire le code « en diagonale » (il faut se plonger dans chacune des mĂ©thodes, des classes pour comprendre ce qu’elles font)
  • L’abus de mĂ©thodes statiques (qui dĂ©note souvent une violation du principe de la programmation orientĂ©e objet)
  • Plus de 2 niveaux d’indentation dans une mĂ©thode
  • Des objets sans mĂ©thodes (en dehors des getters/setters) (dans un contexte de POO)

Plus gĂ©nĂ©ralement, faites confiance Ă  votre intuition: si vous trouvez que du code est trop compliquĂ© Ă  lire ou Ă  comprendre, qu’il y a quelque chose de « bizarre », de « pas propre », c’est qu’il peut nĂ©cessairement ĂŞtre simplifiĂ©, amĂ©liorĂ©, refactorĂ© !

Les piliers de la pratique du Clean Code L’amĂ©lioration continue

Avant toute chose, pour avoir le code la meilleure qualitĂ© possible, il est nĂ©cessaire que l’ensemble de l’Ă©quipe soit convaincu de la mise en place d’une pratique d’amĂ©lioration continue. Sans ça, tout bon Lead Dev/Tech Lead que l’on soit, la plupart des pratiques que l’on poussera sera malheureusement vite abandonnĂ©e…

Tests automatisés

Afin de s’assurer que toute action de refactoring n’a aucune incidence sur le fonctionnement de l’applicatif, il est nĂ©cessaire de pouvoir s’appuyer sur un ensemble de tests automatisĂ©s suffisamment exhaustif pour remonter le moindre problème.

IDE « refactoring-friendly »

L’IDE a une importance non nĂ©gligeable dans la pratique du Clean Code. En effet, un bon IDE doit nous permettre de faire des micro-refactorings sans douleur (renommage ou extraction d’une variable ou d’une mĂ©thode par exemple), voire mĂŞme les faciliter fortement (rĂ©percussion automatique, aide Ă  la dĂ©cision, etc…).

A l’opposĂ©e, un IDE trop basique va avoir tendance Ă  provoquer l’inverse. En effet, si le refactoring est douloureux ou laborieux, le dĂ©veloppeur aura souvent tendance Ă  abandonner la pratique.

Boy Scout Rule

« A chaque fois que je parcours du code, je dois essayer de l’amĂ©liorer. » Cette amĂ©lioration peut ĂŞtre seulement une indentation, un saut de ligne ou le renommage d’une variable, du moment qu’il permet de rendre le code plus lisible, plus comprĂ©hensible.

Vous trouverez une définition plus complète à cette adresse et une illustration de sa mise en pratique dans ce précédent article.

Revue de code et/ou pair programming

En plus de la Boy Scout Rule, le meilleur moyen pour dĂ©tecter un problème dans votre code, c’est d’avoir l’avis d’un autre. Que ce soit via du pair programming oĂą vous aurez du feedback en direct ou via de la revue de code, par paire ou en en Ă©quipe, c’est vraiment la pratique qui fera la mieux apparaitre les axes d’amĂ©liorations de votre code. En effet, pour soi, quand on vient de finir une tâche, il est souvent difficile de prendre suffisamment de recul pour critiquer son travail parce qu’il est encore frais dans notre tĂŞte. A ce moment lĂ  de notre travail, notre code est souvent « simple » et « clair ».

Analyse de code automatisée

La mise en place d’un outil d’analyse de code, type SonarQube, va vous permettre de remonter toutes les violations aux standards du langage/du framework que vous utilisez (amendĂ© en gĂ©nĂ©ral pour correspondre aux standards de l’Ă©quipe), ainsi que le taux de duplication de votre code. Ces indicateurs vont souvent ainsi ĂŞtre les pointeurs d’un endroit oĂą vous pourrez appliquer les principes du Clean Code.

Ce genre d’outil fournit en gĂ©nĂ©ral un premier bon indicateur sur la maintenabilitĂ© du code. Un standard non respectĂ©, c’est dĂ©jĂ  une difficultĂ© pour  y rentrer et pour le modifier, le corriger. D’ailleurs, je ne saurai que trop vous conseiller de commencer votre analyse  en utilisant les standards dĂ©finis par dĂ©faut. En effet, ceux-ci correspondent gĂ©nĂ©ralement aux standards attendus par la plupart des dĂ©veloppeurs du langage/framework. Ça permet donc une meilleure entrĂ©e dans le code pour un nouvel arrivant.

Ces outils ne sont malheureusement pas suffisants. Les manques les plus flagrants concernent la pertinence des nommages (les variables/les mĂ©thodes/les classes sont-elles bien nommĂ©s ?), la structure des mĂ©thodes/ des classes(ma mĂ©thode/ma classe fait-elle trop de chose ?) et l’architecture du code (est-ce que j’utilise le bon design pattern ? Est-ce que j’hĂ©rite bien de la bonne interface ?). Pour combler ces manques, il est nĂ©cessaire de mettre en place des revues de code !

Teaser

Les prochaines semaines seront l’occasion pour moi de vous proposer les règles et les principes les plus importants du « Clean Code », illustrĂ©s et accompagnĂ©s d’astuces pour mieux dĂ©tecter des violations. PĂŞle-mĂŞle, j’y aborderai les règles de nommages, SOLID, la loi de DĂ©mĂ©ter… A la prochaine donc !

Catégories: Blog Société

Retour sur la conférence des Praticiens de l’Architecture d’Entreprise à Londres

Architecture Forum France (Open Group) - lun, 02/16/2015 - 15:56

Tous les trimestres, dans un pays différent, The Open Group organise une conférence internationale pour ses membres

Cet article Retour sur la confĂ©rence des Praticiens de l’Architecture d’Entreprise Ă  Londres est apparu en premier sur The Open Group France.

Catégories: Association

Qu’est-ce qui me motive en tant que développeur ?

Blog d’Ippon Technologies - lun, 02/16/2015 - 13:56

Je suis développeur. Je travaille pour l’ESN MaBoite et suis en mission depuis plusieurs mois chez MonClient. Il est 9h40, j’arrive chez MonClient en retard, déjà fatigué. Sans avoir fait la fête la veille, j’ai pourtant eu du mal à me lever ce matin, je n’avais pas envie.

Gérard passe à côté de moi sans même me regarder. Jérôme vient me demander d’implémenter une fonctionnalité en urgence. Je ne comprends pas l’objectif de sa demande et lui demande des précisions : « Ce n’est pas important, me répond-il, c’est pour les gogols du pôle métier qui ne comprennent rien à ce qu’ils font, comme d’habitude ». Lorsque j’envisage de leur demander directement les détails nécessaires, il me coupe : la fonctionnalité ne servira jamais, autant la réaliser comme ils l’imaginent, cela nous fera gagner du temps. S’il est sûr de lui, allons-y.

Avant de m’y mettre, je constate que les tests unitaires du module que j’ai réalisé la semaine dernière ne passent plus. Gérard étant à l’origine de la modification, je vais le voir. « Oui, j’ai repris des trucs, ça ne me plaisait pas et je voulais que ça marche », m’explique-t-il. Je repars avec l’injonction de remettre les tests d’aplomb en fonction de ce qu’il a écrit.

La journée passe, il est 18h. Au cours de la journée, je n’ai écrit que quelques lignes de code dont je ne suis pas satisfait. Je vois bien qu’il y a des choses à reprendre, que ça pourrait être plus « propre » mais j’ai du mal à identifier comment mieux faire. Je n’ai de toute façon pas l’énergie de m’y pencher. Qu’est-ce qui rend le travail si laborieux ? Pourquoi ma motivation est-elle si basse ?

Besoin de sens

Le sens est un composant indispensable de la motivation. Pour quoi (en deux mots) suis-je ici ? Quel est mon objectif ? Quel est l’objectif de ma mission ? Le sens peut être vu suivant trois dimensions :

  • le sens-sensation, qui nous ancre dans le rĂ©el ;
  • le sens-direction, le cap Ă  suivre ;
  • le sens-signification qui, sans direction, devient une idĂ©ologie – pensez Ă  des choses qui vous ont Ă©tĂ© imposĂ©es mais (du moins au premier contact) jamais justifiĂ©es : les tests unitaires, l’injection de dĂ©pendances… autant de choses, qui, prĂ©sentĂ©es de façon dogmatique, resteront perçues comme des obligations empiriques.

On peut lui poser comme conditions deux pré-requis (Jacques Lecomte) : le lien et la loi. L’équilibre des deux va engendrer de la cohérence et donner du sens.

Triangle de la résilience

Le lien est en partie de ma responsabilité : un lien de qualité dépend directement de mon savoir-être. Dans un cadre professionnel, on peut décrire (de façon non exhaustive) mon savoir-être par :

  • ma connaissance de mes besoins ;
  • ma capacitĂ© Ă  les communiquer sereinement ;
  • ma capacitĂ© Ă  entendre et Ă  me remettre en question (honnĂŞtetĂ© intellectuelle) ;
  • ma capacitĂ© Ă  reconnaĂ®tre humblement mes erreurs ;
  • ma capacitĂ© Ă  accepter de ne pas ĂŞtre parfait et que l’autre n’est pas non plus parfait ;
  • ma conscience du fait que je ne suis pas ce que je fais et que l’autre n’est pas ce qu’il fait.

Le lien de qualité, lui, se reconnaît à :

  • la convivialitĂ© des Ă©changes ;
  • mon sentiment d’appartenance au groupe (Ă  l’équipe, Ă  l’entreprise…) ;
  • la reconnaissance de mes pairs ;
  • mon sentiment d’être lĂ©gitime, respectĂ© et Ă  ma place.

Une fois créé, ce lien m’assure un sentiment de sécurité parce que je suis en confiance. Un tel sentiment encourage l’initiative et va m’aider à créer d’autres liens. En proposant du lien à l’autre, je lui permets de se sentir accueilli et pris en compte (cela participe à créer un cercle vertueux).

Revenons Ă  mon exemple. J’ai fait de mon mieux pour crĂ©er du lien avec GĂ©rard – qui est mon interlocuteur privilĂ©giĂ© chez MonClient – et pour lui montrer que je le respecte : je l’inclus dans les dĂ©parts Ă  la machine Ă  cafĂ©, je lui pose des questions ouvertes pour le faire parler de lui, je lui demande son avis au moment de choix techniques importants. Pourtant, GĂ©rard ne dit toujours pas bonjour le matin, ne me regarde pas et Ă©lude ou chasse mes questions liĂ©es au projet.

Même avec toute la bonne volonté du monde, il m’est parfois difficile de créer ou de maintenir ce lien : je ne suis jamais à l’abri d’une remarque blessante (même involontaire) ou de tomber sur un interlocuteur réticent. En cas de difficulté, je sais pourtant  qu’il ne sert à rien de « bouder » en évitant du jour au lendemain le rituel du café matinal par exemple. C’est néanmoins un instinct de survie naturel même si, au fond de moi, ce n’est pas ce que je désire.

Dans ce contexte, qui remarquera que j’arrive une demi-heure plus tard le matin ? Pourquoi m’ennuyer à me lever tôt et à me dépêcher, moi qui ne suis pas du matin, qui plus est pour travailler sur un projet dont je ne comprends pas l’objectif ? Si Gérard n’est pas disposé à établir un lien ni avec moi ni avec les autres, je ne peux rien faire. Je vais, finalement, me désinvestir progressivement de la vie d’équipe jusqu’au jour où j’arriverai à midi et où personne ne me demandera où j’étais.

Ma responsabilité là-dedans ? Admettre mes difficultés et demander de l’aide.

Le sens va aussi être soutenu par la loi (ici synonyme de jalons ou de cadre) : la poursuite d’un objectif mène à se donner des règles de conduite mais surtout à adhérer à un cadre (au sein d’une entreprise, d’une équipe, d’un projet), de s’en sentir acteur et de ne pas le subir. Il est nécessaire de comprendre le cadre pour se l’approprier : comment se prennent les décisions ? Comment suis-je consulté ou informé lors de la reconduction ou non de ma mission ? C’est aussi de cette façon que la confiance et le sentiment de sécurité se construisent.

Quand la loi devient obsolète ou qu’un désaccord s’installe, quand il faut remettre la loi en question, le lien de qualité permet une plus grande liberté dans l’échange. Quand je suis en réunion avec Gérard, je suis très mal à l’aise pour le contredire ou pour remettre en question les idées que je n’approuve pas.

Si la loi est cohérente, si le lien est de qualité, l’environnement est serein et constructif.

Besoin de paix

MaBoite est Ă  l’origine de la paix durable que je vis au quotidien chez MonClient ainsi que son garde fou : c’est elle qui cadre mon travail par l’intermĂ©diaire du contrat Ă©tabli avec MonClient ; c’est ce que je me dois de respecter, mais c’est aussi ce qui me protège.

Le chercheur Markus Weingardt a étudié les conditions nécessaires à l’instauration de la paix durable. Le « vivre ensemble » tel qu’il le décrit définit trois composantes qui permettent d’atteindre cette paix durable :

  • la transparence (qui permet la confiance) ;
  • la compĂ©tence ;
  • la proximitĂ© (le lien).

Triangle de la paix durable

Tout comme avec mes collègues du quotidien chez MonClient, un lien de qualité avec MaBoite (son image, ses salariés, sa direction) est également nécessaire à l’équilibre. Une ESN « classique » n’est pas un environnement propice à la proximité : les consultants sont « éclatés » chacun chez un client différent ou sur des missions différentes, ce qui peut entraîner un manque de lien. Néanmoins, cet éloignement peut être compensé : coding dojos, soirées d’équipe…

Une vigilance toute particulière est Ă  apporter aux outils de communication numĂ©rique (e-mail, messagerie instantanĂ©e, rĂ©seau social d’entreprise…). Ceux-ci ne permettent d’échanger que des mots : on « perd » tout le pan non-verbal de la communication (gestuelle, attitude, mimiques…) mais aussi le ton de la voix. Ceux-ci reprĂ©sentant la plupart du temps la proportion la plus importante de la communication, leur absence crĂ©e un grand risque de quiproquos ou d’incomprĂ©hensions qui peuvent se rĂ©vĂ©ler dĂ©vastateurs.

La transparence apporte honnêteté et clarté dans les échanges : « Plus j’en sais, même quand ça va mal, plus je fais confiance à l’autre ». Là aussi il s’agit du sentiment de sécurité : si on ne me cache rien, c’est que je suis digne de confiance, que je suis considéré comme un collaborateur et pas seulement comme un produit.
À l’inverse, le manque de transparence émousse la confiance. Comment sont attribuées les primes ou les augmentations ? Pourquoi la direction n’apporte-t-elle pas de réponse à certaines questions ? Comment avoir confiance en une direction qui semble nous cacher des choses ?
La réciproque est également applicable : je suis moi-même transparent pour gagner la confiance de ma direction et de mes collègues. Pourquoi « cacher » mon code et attendre une semaine avant de le partager ? Aurais-je du mal à assumer que je ne suis pas parfait ?

En tant que prestataire, ce sont avant tout mes compĂ©tences que mes clients recherchent. Si le client a recours Ă  un consultant, c’est que ce dernier a une compĂ©tence que le client n’a pas. Pourtant, GĂ©rard lance Ă  la machine Ă  cafĂ© : « Tous les prestas qu’on prend sont mauvais mais comme on n’a pas les moyens de payer plus cher pour en avoir des bons, on n’a pas le choix, on prend les mauvais ». Une telle remarque traduit un manque de confiance de sa part envers les prestataires – dont moi – et entame ma propre confiance en moi.

De façon générale, nos compétences sont interdépendantes :

  • elles entretiennent le sentiment d’appartenance entre les dĂ©veloppeurs – je serais plus fier de travailler avec des gens dont je reconnais les compĂ©tences ;
  • les commerciaux compĂ©tents trouvent des clients et des missions intĂ©ressantes ;
  • la compĂ©tence des dĂ©veloppeurs aide les commerciaux Ă  dĂ©marcher les clients ;
  • un service RH compĂ©tent aide Ă  entretenir la motivation des salariĂ©s ;
  • des salariĂ©s motivĂ©s et avec un fort sentiment d’appartenance aident au recrutement en diffusant une bonne image ;

Mais encore faut-il qu’elles soient reconnues à leur juste place.

Besoin d’autonomie et de reconnaissance

Pour que ses salariés se sentent reconnus, l’employeur a notamment la responsabilité de leur permettre d’être autonomes. On est autonome lorsque l’on est en mesure de se débrouiller seul sans craindre de perdre son identité lorsque l’on demande de l’aide.

Vincent Lenhardt structure l’autonomie autour de quatre niveaux décrits par le schéma qui suit.

Structure de l'autonomie en quatre niveaux selon Vincent Lenhardt

  • En situation de dĂ©pendance, on dit « oui » Ă  tout. On est incapable de prendre une dĂ©cision et on s’identifie Ă  la relation avec l’autre (un collègue ou MaBoĂ®te).
  • Progressivement, on se rebelle, on apprend Ă  dire « non » Ă  l’autre, on l’accuse : on est alors en situation de contre-dĂ©pendance.
  • Ă€ l’étape suivante, on ne demande plus rien Ă  l’autre, on se centre sur soi-mĂŞme et on n’accepte plus qu’une seule contrainte : celle de MonClient.
  • Enfin, on peut atteindre une situation d’équilibre dans laquelle on sait se dĂ©brouiller seul ou en groupe. On ne s’identifie pas Ă  la relation : il y a « soi », « l’autre » et « la relation entre l’autre et soi ». On est alors en mesure d’accepter la contrainte et de prendre en charge une autre personne.

L’autonomie permet d’accéder au sens de son travail.

Comme un humain

Si les composantes de la paix durable sont solides et équilibrées, le cadre est suffisamment sécurisant pour que, associé aux liens que je trouve en mission chez MonClient aussi bien que dans MaBoite, j’y trouve du sens.

Si mon employeur prend ses responsabilités pour créer un cadre sécurisant en tant que garant de la loi (cf. triangle de la résilience), associé au lien de qualité, je trouve le sens qui me donne envie de me lever le matin.

« Ce dont l’humain a besoin, ce n’est pas de vivre sans tension mais bien de tendre vers un but valable, de réaliser une mission librement choisie. Il a besoin non de se libérer de sa tension, mais plutôt de se sentir appelé à accomplir quelque chose » (Viktor E. Frankl, Découvrir un sens à sa vie avec la logothérapie, 1959, édition J’ai lu, p. 129).

Finalement, j’ai besoin de la même chose que tout être humain, ce n’est pas spécifique au métier de développeur : ce qui me motive en tant que développeur, c’est ce qui me motive tout court.

Catégories: Blog Société

Techdays 2015 – Jour 1 – Nos impressions

Du 10 au 12 FĂ©vrier ont eu lieu les TechDays, l’Ă©vĂ©nement annuel incontournable de Microsoft.
Le thème de cette annĂ©e étant « Ambient intelligence », nous retrouvons au programme les principaux thèmes : MobilitĂ©, Cloud, Big Data et Internet Of Things.
La première journée est dédiée aux développeurs, nous avons pu assister à des sessions plutôt techniques et pratiques. Voici donc un rapide compte-rendu des sessions que les Octos ont pu suivre ce jour.

Keynote d’ouverture : new Keynote() { cloudFirst=true, mobileFirst=true }.Connect();

Le format et le déroulement de la keynote étaient plutôt sympathiques et originaux. Le point de départ est une idée de projet qui nous est expliquée. Durant le reste de la keynote, différents intervenants vont alors se relayer pour expliquer la mise en place du projet sous ses différents aspects (Back / Front / ALM / Design / etc.)

Le projet « Heraclès », qui va servir de fil conducteur à cette keynote, vise Ă  amĂ©liorer l’expĂ©rience client, en facilitant l’enregistrement des confĂ©rences et meetings dans les locaux de Microsoft France. L’application sera dĂ©veloppĂ©e sous la forme d’une application Web « responsive ».

Voici un résumé des technologies mises en place pour ce projet :

  • Le BackOffice est dĂ©veloppĂ© en WebApi, hĂ©bergĂ© sur Azure Websites
  • Le FrontOffice est dĂ©veloppĂ© en ASP.NET vNext, aussi hĂ©bergĂ© sur Azure pour profiter de sa fonction d’autoscaling
  • Les utilisateurs peuvent faire des suggestions d’amĂ©liorations sur UserVoice, amĂ©liorations qui sont automatiquement remontĂ©es dans le Visual Studio Online de l’Ă©quipe grâce aux connecteurs VSO
  • Azure Website offre nativement la possibilitĂ© de faire de l’AB Testing entre diffĂ©rentes instances du site
  • Les commerciaux Microsoft disposent d’une application mobile utilisant Cortana (reconnaissance vocale des Windows Phone) pour accĂ©der aux fiches cliIMG_2272[1]ents
  • Les locaux de Microsoft sont modĂ©lisĂ©s en 3D dans une scène BabylonJS (l’occasion de prĂ©senter le nouveau navigateur « Spartan »)
  • DiffĂ©rents objets connectĂ©s (basĂ©s sur du Raspberry Pi et Gadgeteers) permettent de rĂ©cupĂ©rer des informations physiques (nombre de passages, tempĂ©ratures, etc.)
  • Ces donnĂ©es sont remontĂ©es sur un Bus Azure (Azure Events Hub). On nous annonce un million de messages par seconde
  • La scalabilitĂ© de l’architecture est mise Ă  l’Ă©preuve Ă  l’aide des Azure Web Jobs, qui permettent d’exĂ©cuter des applications sur le cloud en parallèle
  • Ces donnĂ©es sont traitĂ©es Ă  l’aide du service « Stream Analytics » encore sur Azure, et des notifications sont envoyĂ©es Ă  l’aide de l’Azure Notification Hub
  • La scène BabylonJS est finalement intĂ©grĂ©e dans Excel, agrĂ©mentĂ©e des donnĂ©es extraites,  à l’aide des nouvelles « Applications Office« 

Ce que j’en retiendrai :
A dĂ©faut de prĂ©senter des choses vraiment rĂ©volutionnaires, Microsoft nous prouve qu’il met Ă  disposition un vĂ©ritable Ă©cosystème, complet et cohĂ©rent, et avec un effort de mise en oeuvre visiblement faible.

Créer une expérience utilisateur pour tous les écrans avec les universal apps !

Par Benjamin Launay et Nathalie Belval

Cette session nous invite Ă  prendre soin du design de nos applications.
Après une rapide introduction sur la convergence des diffĂ©rentes plateformes et la multiplication des devices sur laquelle tournent nos applications, ils nous donnent des pistes concrètes sur leur manière de faire. Pour l’exercice, ils ont mis au point une application de dĂ©mo (disponible sur Codeplex).
La philosophie d’UX qu’ils prĂ©conisent est la stratĂ©gie « Mobile First » : penser mobile en prioritĂ©, puis repartir de cette base pour des devices plus grands. Ainsi, le tĂ©lĂ©phone devient un « first class citizen », sachant qu’il reste un des devices les plus utilisĂ©s actuellement.

Pour ce faire, la session continue sur des techniques et mĂ©thodes concrètes appliquĂ©es sur leur dĂ©mo d’une application universelle (donc Windows Phone + Windows Store).
En quelques points :

  • Penser « User Controls » pour augmenter la rĂ©utilisablitĂ© des composants
  • Utiliser les contrĂ´les spĂ©cifiques permettant de gĂ©rer des flux (WrapGrid, ViewBox)
  • Utiliser le « System Layout » : permet de gĂ©rer par le code de diffĂ©rents VisualStates, qui s’adaptent en fonction du device
  • Pour les ressources graphiques, toujours garder en tĂŞte qu’ils pourront ĂŞtre utilisĂ©s sur des devices très grands, et choisir en consĂ©quence le format (SVG / Font Icons / Bitmaps en plusieurs rĂ©solutions…)

Ce que j’en retiendrai :

  • « Mobile First » : j’ai Ă©tĂ© convaincu par la dĂ©monstration
  • D’ici peu, il sera normal pour une application de tourner sur des devices de 3 pouces.. Ă  40 pouces et plus !
Moteur de rendu Spartan

Par David Catuhe et David Rousset

Cette session est dédiée au nouveau navigateur de Microsoft « Spartan » qui sortira prochainement.

Cela ne signifie pas pour autant la mort d’Internet Explorer, rassurez-vous ! Les deux speakers nous ont beaucoup amusĂ©s avec leur lĂ©gendaire humour et leurs anecdotes sur le nommage de ce nouveau navigateur. Ils nous ont expliquĂ© comment le navigateur fonctionne et en quoi sa performance est bien meilleure que celle des prĂ©cĂ©dents navigateurs.

Aligné sur les autres navigateurs du marché, Spartan nous promet une grande compatibilité et veut faire oublier aux développeurs les difficultés d’intégration rencontrées dans le passé sur IE.

Spartan nous propose entre autre l’API GamePad (gestion des manettes de jeu) ainsi que le WebAudio (OpenAL: Open Audio Lib) pour un son spatialisé qui ouvre encore un peu plus le web au Gaming.

Les David mettent l’accent sur le TypeScript, un meta langage fortement typé permettant de générer du JavaScript propre et maintenable (comme le fait CoffeeScript). De nombreux exemples (class, extend etc.) nous montrent ce que va nous apporter le développement en mode objet coté navigateur.

Cette session nous réconcilie avec les navigateurs Microsoft et nous donne envie de tester Spartan. Il est déjà disponible sur Windows 10.

Ce que j’en retiendrai :

Un nouveau navigateur Microsoft plus compatible et plus performant. Une nouvelle gestion du son dans le navigateur avec l’OpenAL. Le développement en TypeScript.

Les nouveautés de C# 6

Mitsu Furuta nous prĂ©sente dans cette session les nouveautĂ©s qui vont arriver dans la prochaine mouture de C#. Il annonce d’emblĂ©e qu’ il n’y aura pas cette annĂ©e de grosse nouveautĂ© comme on a pu en voir prĂ©cĂ©demment. Il n’en reste pas moins quelques amĂ©liorations sympathiques, principalement rendues possibles grâce Ă  l’arrivĂ©e du compilateur Roslyn.
Plutôt que de le re-lister ici, je vous invite à lire cet article MSDN qui liste les différentes nouveautés présentées lors de la session.

Ce que j’en retiendrai :

  • Quelques fonctionnalitĂ©s me donnent envie de les utiliser, en particulier
    • les String Interpolations, permettant d’injecter directement des variables dans les chaĂ®nes
      • var s = $ »\{p.Name} is \{p.Age} year(s) old »;
    • le Null-Conditional Operator, permet d’arrĂŞter l’Ă©valuation des membres nullables
      • int? length = customers?.Length; // null if customers is null
  • C# 6 fait un nouveau pas vers un code plus concis (et plus fonctionnel)
La Magie des Pixels pour les nuls :

Par David Rousset, David Catuhe et Michel Rousseau

Si vous ne vous lancez pas dans le monde du développement 3D parce que vous trouvez cela bien trop compliqué et que vous n’êtes pas une tête en math, cette session était faite pour vous !

L’objectif de cette démo était de vulgariser un maximum le vocabulaire du développement 3D.  La salle a pu apprendre et se remémorer ce qu’est un Vertex, des vertices, vecteurs, frustum, et l’utilisation des matrices par exemple.

Nous avons eu des démos de code et de modélisation 3D sur l’utilisation de la camera et la gestion de la lumière dans les scènes 3D.

Ce que j’en retiendrai :

J’en retiendrai que crĂ©er une scène en 3D n’est pas rĂ©servĂ© Ă  une Ă©lite de personnes qui ne se comprennent qu’entre elles, mais que mĂŞme quelqu’un qui n’a pas bac + 7 en math peut faire de la 3D. Je retiens aussi que pour faire de la modĂ©lisation 3D, il faut en plus du talent, aimer cliquer !

Visual Studio Online

Session prĂ©sentĂ©e par JĂ©rĂ©my LANDON, Etienne Margraff et Arnaud Auroux, qui nous prĂ©sentent sous la forme d’une histoire les pĂ©riples rencontrĂ©s par John, qui souhaite mettre en place un rĂ©seau social pour chats ! On retrouvera dans cette session toute la partie ALM survolĂ©e rapidement lors de la keynote de manière plus dĂ©taillĂ©e :

  • Gestion du backlog
  • Gestion des builds
  • DĂ©ploiement sur Azure de la version de prod et de test (staging build)
  • Exemple de Work Items de type Cas de test / Bugs
  • Utilisation des Services Hooks : Visual Studio Online se synchrone automatiquement sur un Trello
  • IntĂ©gration de mĂ©triques Application Insight

Ce que j’en retiendrai :

Visual Studio Online n’est pas « juste » un Team Foundation Server sur le cloud. Les interactions possibles avec les systèmes extĂ©rieurs (Trello / Uservoice / DĂ©ploiement Azure / etc) apportent un plus non nĂ©gligeable.

Entity Framework 7 : nouvelle version majeure d’Entity Framework

Par Philippe Sentenac et SĂ©bastien Pertus

Session de prĂ©sentation de la nouvelle version d’Entity Framework, un vĂ©ritable « reboot » du framework. A l’instar de vNext, Entity Framework est devenu très lĂ©ger et minimaliste :

  • Le runtime « nu » est disponible via un nuget, et peut ĂŞtre complĂ©mentĂ© par d’autres nugets pour les providers
  • La gestion des modèles EDMX (Database First) est complètement supprimĂ©e
  • Chaque provider de datasource devra ĂŞtre importĂ© Ă  part

En parlant de providers, le catalogue est désormais bien étoffé, et permet des connexions à SqlServer, SQLite, Redis, Azure et InMemory
De ce fait, le framework est extrĂŞmement lĂ©ger, et pourra ĂŞtre embarquĂ© sur du mobile, et fonctionnera aussi sur d’autres OS (Linux et MacOs).
Les requĂŞtes SQL gĂ©nĂ©rĂ©es sont dĂ©sormais plus « propres », et tirent avantage des requĂŞtes SQL paramĂ©trĂ©es.
La session se termine sur une dĂ©mo d’une application console, incluant un schĂ©ma Entity Framework qui rĂ©cupère ses donnĂ©es d’Azure Storage, et qui tourne sur un Ubuntu. PlutĂ´t impressionnant !

Ce que j’en retiendrai :

Attention aux migrations de projets actuellement en EF 6.x. La disparition des schémas EDMX risque de poser soucis.
Le provider InMemory (pseudo-base de donnée en mémoire) devrait apporter une vraie facilité pour les tests unitaires.
Le framework a su se remettre en question, et nous revient sous une forme beaucoup plus souple !

BabylonJS, le moteur 3D webGL open source simple et performant

par David Catuhe, David Rousset et Michel Rousseau

Dans cette session les speakers nous montrent comment réaliser une scène 3D en BabylonJS : de la modélisation au développement. Ils nous ont montré comment optimiser et améliorer les performances. Ils nous ont aussi fait découvrir les nouveautés sur BabylonJS, la gestion du son 3D, de nouvelles informations sur les performances de la scène et les nouveaux filtres et fonctionnalités. Pas mal de démos dans cette session que je vous invite grandement à aller découvrir sur www.babylonjs.com.

Ce que j’en retiendrai :

Faire une scène 3D fluide se fait en collaboration avec le modéliste qui a un rôle primordial. Le moteur 3D BabylonJS  devient de plus en plus complet et permet de faire un maximum de choses.

Le futur technologique des interfaces

Par Greg Madison

Cette session animĂ©e par un ancien magicien devenu designer d’interaction, nous fait prendre du recul sur l’Ă©volution des interfaces homme-machine. Des objets connectĂ©s Ă  l’intelligence ambiante, de la rĂ©alitĂ© virtuelle à la crĂ©ation d’une rĂ©alitĂ© alternative miroir de notre monde et des donnĂ©es que l’on produit. C’est un vĂ©ritable voyage dans le futur des interfaces.

Ce que j’en retiendrai :

L’omniprĂ©sence des objets connectĂ©s et l’affluence de donnĂ©es sont une vĂ©ritable problĂ©matique et certains industriels profitent encore du buzz pour crĂ©er des objets Ă  la limite de l’inutile. La maturitĂ© va arriver et permettra de tirer partie des nouveaux capteurs pour crĂ©er un monde interactif et intelligent oĂą « la technologie [sera] suffisamment avancĂ©e et invisible pour ĂŞtre indissociable de la magie » (Arthur C Clarke).

Coding 4 Fun

Par David Catuhe, David Rousset, Etienne Margraff, Mitsu Furuta et Pierre Lagarde

Notre journĂ©e s’achève sur une des sessions mythiques des Techdays. Cette annĂ©e, elle Ă©tait retransmise en direct dans un second amphithéâtre. Pour ceux qui ne connaissent pas, l’objectif est un peu spĂ©cial : permettre de rĂ©unir les gens autour de leurs passions du code grâce à des dĂ©mos complètements folles.

Nous avons dĂ©couvert un Ă©qualiseur 3D avec un son variable selon le nombre tweets de l’assistance, un navigateur spĂ©cial poney pour les petites filles, un algorithme de morphing d’image : le « Boule-based Morphing » et pleins d’autres dĂ©mos très fun.

L’imagination des speakers est sans limite quand il s’agit de nous faire partager leur folie avec du code !

 

Articles suggested :

  1. Techdays 2015 – Jour 2 – Nos impressions
  2. TechDays 2015: Retrouvez toute l’actualitĂ© des technologies Microsoft avec OCTO
  3. TechDays 2014 : bilan de la première journée

Catégories: Blog Société

Principles of microservices


Lors de cette présentation, Sam Newman  consultant chez ThoughtWorks , souhaite partager avec nous ses réflexions sur les microservices. Il est également l’auteur du livre Building Microservices.

Sam commence par définir ce que sont les microservices : « small autonomous services that work together ». De cela il nous présente sept principes.

Modelled around business model

Cette règle rejoint les principes du Domain Driven Design. Le but est de définir des Bounded Context et d’isoler les règles métiers au sein des microservices. D’ailleurs Sam nous conseille de nous inspirer du livre Implementing Domain Driven Design de Vaughn Vernon.
principlesMicro.jpg

Culture of automation

Si l’on souhaite se lancer dans les microservices, Sam nous conseille de mettre de l’effort dans l’automatisation de l’infrastructure, des tests automatisés et le Continuous Delivery. Cela permet notamment d’avoir des boucles de feedbacks rapides pendant les phases de développement, et permet d’être très réactif lors de problèmes en production.

Hide implementation details 

En tant que consommateur d’un microservice, nous ne devons pas savoir les technologies sous-jacentes (langage, type de base, etc). De même nous n’avons pas à connaître le modèle interne et les entités associées.

Decentralise all the things

Le but ici est de laisser de l’autonomie à l’organisation et aux personnes. Pour fonctionner les mentalités doivent être changées. Un travail culturel est nécessaire dans les équipes. Il évoque notamment la loi de Conway :

«  organizations which design systems… are constrained to produce designs which are copies of the communication  structures of these organizations »

L’idée est de mettre en place une organisation à l’image des microservices (i.e petites équipes cross-fonctionnelles qui communiquent entre elles).

Deploy independantly

Sam affirme que c’est un point difficile. En effet avoir des microservices indépendants signifie gérer les versions de manière indépendante, et donc des appels entre services qui deviennent compliqués. Sam évoque la notion de Consumer Driven Contracts et nous présente l’outil Pact. Ce dernier permet de définir des contrats entre producteur et consommateur. Très pratique pour effectuer des tests.

Sam continue en nous parlant de la manière de déployer les services. Sam préfère l’approche un service sur un host. Par host, il entend un OS, une machine. Cela présente l’avantage d’être isolé des autres services (par rapport à une approche plusieurs services sur un même host).

Isolate failure

Dans un environnement microservice, beaucoup de messages (i.e évènements) transitent. De ce fait, suivre le cheminement d’un message à travers les services et détecter d’éventuelles erreurs devient rapidement un cauchemar.

Sam conseille de centraliser les logs et de les agréger. Des outils comme Kibana permettent de requêter et de retrouver facilement les données. Son autre conseil concerne le monitoring de services avec des statistiques (ratio de messages échangés par exemple). Sam nous conseille également d’utiliser des correlations Ids dans les logs. Cela permet de « tracer » les messages et de les retrouver plus simplement.

A travers cette présentation, nous voyons que la mise en place des microservices soulève beaucoup de challenges. Merci à Sam de nous avoir donné des éléments concrets pour avancer sur nos réflexions.

Catégories: Blog Société

LCC 118 - PĂ´le emploi

Il y a du changement chez les cast codeurs et dans l’industrie. On parle aussi de Java dans 20 ans, de formation, de bugs de sécurité, de pas mal de petits outils de l’épisode et des nombreuses conférences en France d’ici l’été.

Enregistré le 13 février 2015

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

News Ça bouge Au ParisJUG

Antonio cède sa place de président du ParisJUG après 7 ans de bons et loyaux services
Nicolas et Zouheir aussi et se concentrent sur l’organisation de devoxx.fr

Chez Pivotal

Groovy et Pivotal arrêtent leur PACS Les équipes Groovy et Grails cherchent une nouvelle “maison”
restlet

Chez Cloudbees

CloudBees lève 23 millions pour tester des Teslas si j’ai bien compris - ou embaucher Arnaud, va savoir :-)

Chez eXo

Arnaud quitte son poste, si le télétravail vous tente, eXo recrute …

Chez IBM

IBM et les licenciements
Encore in point de vue sur IBM
Et encore un autre sur IBM

Langages et JVM

Java il y a 20 ans
Le futur de la JVM: 2030

Java EE et standards

La spécification Data Grid retirée
JPA et le locking

Se former

Front End Dev Avengers À partir de rien, comment obtenir une boucle de feedback ultra-rapide (moins d’une demi-seconde) entre l’édition de ses fichiers sources (dans DevTools ou ailleurs) et leur exploitation live dans la page web en cours, même au travers d’une chaîne de build riche.
Formation AngularJS de NinjaSquad
Java est arrivé sur exercism.io (petit puzzle à résoudre en TDD)

Architecture

Introduction au stream processing (aka event sourcing, CQRS, …)

Infrastructure

Docker Ă©teint la musique
Docker 1.5.0 IPv6, ReadOnly, Stats, “Named DockerFiles” …
Bug de sécurité dans glibc - GHOST (CVE–2015–0235)

Outillage

Git et Eclipse - merci à Jérémie Bresson

Mode sans distraction d’IntelliJ IDEA (+ support SpringBoot, Docker, …)
Maintenance de l’outil de Benchmark JMH
Kibana 4 RC1

MĂ©thodologie

Le burn out après une fin de projet
Le client fait payer pour le temps passé à tester le software
Couper les ressources humaines en deux

Outils de l’épisode

Installer oh-my-git
Fish shell
Mackup
Analyser un query plan

Conférences

Spring Meetup Paris
Devoxx France du 8 au 10 avril à Paris - Le programme est annoncé
DevopsDays Paris du 14 au 15 avril à Paris. Fermeture du CFP le 27 février.
MixIt du 16 au 17 avril Ă  Lyon
RivieraDev le 11 et 12 juin 2015 au campus Sophia-Tech à Sophia-Antipolis. Son CFP est ouvert jusqu’au 15 Mars. - Présentation par Youri Bonnaffé. Merci à lui.

Nous contacter

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

Catégories: Blog Individuel

Microservices – The One with Polyglot Portfolio

Lors de cette présentation James Lewis, consultant chez ThoughtWorks et auteur de plusieurs articles sur les microservices, nous partage un retour d’expérience sur la mise en place de ces derniers.

James commence par nous présenter le contexte :

  • Une grande compagnie d’assurance amĂ©ricaine (gestion des assurances habitations, automobiles et vies)
  • Manque de communication entre les Ă©quipes techniques et business
  • Des cycles de releases de 3 Ă  6 mois
  • Base de code Ă©norme (des millions de lignes)
  • Langage VB.Net
  • Des règles mĂ©tiers Ă©parpillĂ©es et « oubliĂ©es »

Il poursuit en nous présentant les travaux réalisés sur deux principaux axes.

Organisationnel

James évoque la mise en place d’équipes cross-fonctionnelles, colocalisées : un Product Owner/ Business analyste, des développeurs, des testeurs et des opérationnels dans chaque équipe.

Cela n’est pas sans nous rappeler l’organisation en feature team.

Autre point, gagner la confiance du client. Son conseil est de commencer petit en attaquant des points avec de faibles risques.

Technique

James nous présente ensuite la nouvelle architecture. L’idée est de séparer fonctionnellement l’application. En résumé nous nous retrouvons avec trois services :

  • Assurance habitation
  • Assurance automobile
  • Assurance vie

De cette manière, ces derniers gèrent leurs propres règles métiers, leur cycle de vie et leurs technologies (i.e base de données, langage). James souligne avoir appliqué le Single Responsibility Principle à ces services. D’ailleurs il cite « as we chunk up domains, each domains should be small enough to fit in my head ».

James poursuit en nous expliquant que ces services sont basés sur la notion d’Event Sourcing et plus particulièrement CQRS. Il nous met en garde sur le fait que cette approche offre beaucoup de souplesse et devient rapidement difficile à gérer. En effet CQRS prône un modèle en écriture et un en lecture. Assurer de la consistance entre ces modèles demande beaucoup de rigueur.

Un autre avantage de ce découpage en microservices est le monitoring. James explique que l’approche évènementielle permet de collecter plus efficacement et de manière plus pertinente des données techniques et business. Cela a notamment permis de mettre en place des métriques sous forme de dashboards avec Graphites.

James nous présente ensuite la notion de RCA (Replaceable Component Architecture). L’idée est de prendre indépendamment chaque service et de faire évoluer les sous-composants.

Par exemple, concernant le service d’Assurance vie, ils se sont rendus compte qu’une base de données NoSql orientée document était plus pertinente qu’une base Sql classique.

James poursuit en expliquant que l’approche microservice renforce le concept de « the right tool to do the job ». En effet, au départ, l’application était composée uniquement du langage VB.Net et d’une base Sql Server. Au final, chaque application se retrouve avec son type de base de données, son ou ses langages (VB.Net, NodeJs, Erlang). Ces outils adressent des besoins spécifiques et permettent de résoudre des problématiques plus efficacement.

James termine sa présentation sur des feedbacks personnels :

  • L’approche Event Sourcing permet de rĂ©soudre beaucoup de problĂ©matiques
  • La mise en place de l’Event Sourcing peut devenir un cauchemar (With great power comes great responsibility)
  • Pouvoir utiliser plusieurs langages de programmation pour rĂ©soudre des problĂ©matiques spĂ©cifiques est efficace
  • Etre rigoureux dans le design d’API entre les microservices

A noter que que ce projet a pris du temps : 4 annĂ©es ont Ă©tĂ© nĂ©cessaires pour mettre en place l’organisation et la migration. James a bien insistĂ© sur le fait que des efforts considĂ©rables ont Ă©tĂ© effectuĂ©s au dĂ©but du projet. En effet, faire changer les mentalitĂ©s sur l’organisation des Ă©quipes et la manière de concevoir les services a Ă©tĂ© un prĂ©ambule nĂ©cessaire pour travailler efficacement.

Catégories: Blog Société

Passez à la vitesse supérieure et automatisez le refactoring avec AutoRefactor! le Mardi 24 Février 2015

Alpes JUG - ven, 02/13/2015 - 09:43

Le Mardi 24 Février nous accueillerons Jean-Noël Rouvignac pour nous parler de refactoring et de son outil AutoRefactor.

Présentation

codeRefactoringLe refactoring c’est super, mais comment refactorer tout ce code legacy? Comment garder son code lisible et moderne avec peu d’effort?

Refactoreur dans l’âme, Jean-NoĂ«l prĂ©sentera comment faire du refactoring efficacement pour amĂ©liorer le code. Cela marche bien mais reste un processus manuel qui demande beaucoup d’attention.

Pour se faciliter la vie, il a crĂ©Ă© AutoRefactor. C’est un plugin Eclipse qui refactore le code tout seul. Nous allons faire le refactoring d’une base de code complète en un clic! Finalement Jean-NoĂ«l expliquera son fonctionnement et rĂŞvera Ă  ce que son futur sera.

JNRConférencier

Jean-NoĂ«l Rouvignac est un dĂ©veloppeur passionnĂ© par Java et l’open source. Son expĂ©rience professionnelle chez Information Mosaic en Irlande et ForgeRock France l’emmène Ă  s’approprier de larges projets. Comme il aime le code simple et lisible, il pratique le refactoring Ă  profusion. Et il l’automatise sous la forme d’un projet open source : AutoRefactor.

 

Inscriptions Inscriptions : https://plus.google.com/u/0/events/c4jgakd5ed8l3hjvlu0ljfte60g Cette soirée se déroulera sur le campus à la Maison Jean Kuntzman le mardi 24 Février à partir de 19h00.
Catégories: Association

Un « reverse-proxy » http avec Nodejs

Exposer des services internes de notre SI ou bien encore des services partenaires au sein de nos API est un besoin rĂ©current dans le dĂ©veloppement de nos applications. Bien entendu, des outils comme nginx peuvent nous apporter des solutions Ă  cette problĂ©matique. NĂ©anmoins des modules node.js directement intĂ©grĂ©s Ă  votre application peuvent prendre en charge ce besoin. Plusieurs solutions s’offrent Ă  vous:

Je vous propose de voir quels en sont les avantages et inconvénients respectifs.

Pourquoi un proxy applicatif ?

Avec les outils standards de type proxy, nous obtiendrons les performances et la robustesse exigĂ©es pour peu qu’on en maĂ®trise la configuration. Alors pourquoi un proxy applicatif ?

Nous allons nous placer dans un cas particulier :

  • La fonctionnalitĂ© couverte tiendra aussi du reverse-proxy
  • Nous n’avons pas besoin d’un proxy/reverse proxy gĂ©nĂ©raliste mais uniquement du concept pour un pĂ©rimètre fonctionnel cadrĂ©

Dans cette situation, voilĂ  ce que nous reprochons aux proxies ou reverse-proxies :

  • Ils sont plus fait pour modifier/filtrer un accès technique (authentification gĂ©nĂ©rale sur le rĂ©seau, masquage de l’infrastructure sous-jacente, etc.).
  • Impact fort sur l’infrastructure : c’est un composant Ă  part entière Ă  gĂ©rer.
  • Ne protègent pas les composants "cachĂ©s derrière" de toutes les attaques car justement ils sont transparents.

En revanche, un proxy applicatif nous permettrait :

  • d’exposer une fonctionnalitĂ© d’un composant qu’on ne pourrait pas exposer frontalement en plus des services habituels de notre application
  • de crĂ©er nos propres règles de filtrage, de routage, d’authentification et de les garder cohĂ©rentes avec le reste de l’application exposĂ©e
  • de rĂ©aliser tout ça dans le langage de notre application !
  • de le faire dans le mĂŞme livrable que notre application

Un proxy ou reverse-proxy classique apportera des capacitĂ©s de configuration fine. Ă€ l’inverse, un proxy applicatif Ă©vitera l’ajout de nouveaux composants dans l’infrastructure nĂ©cessitant des compĂ©tences complĂ©mentaires. On rĂ©alise juste un pont lĂ©ger, maintenable et escamotable rapidement.

Un cas concret

Prenons deux routes de notre application, qui nĂ©cessitent de faire suivre la requĂŞte jusqu’Ă  un service tiers, et de renvoyer la rĂ©ponse au client.

Notre objectif est de protéger un service initialement exposé.

Voici la situation initiale : certains clients accèdent Ă  un serveur local, d’autres Ă  un serveur dans le cloud. Les deux serveurs sont identiques, l’application MyApp est installĂ©e des deux cĂ´tĂ©s.

Nous voyons que la situation de la première catégorie de clients oblige à exposer le service sensible publiquement. Nous souhaitons alors obtenir la situation suivante avec un "pont applicatif" :

De cette manière, il existe une route pour laquelle MyApp doit rĂ©pondre diffĂ©remment suivant qu’elle est installĂ©e dans le cloud ou localement.

  • Dans le cloud, la route peut appeler le service sensible via une connexion interne, elle possède donc la logique de traitement de la rĂ©ponse.
  • Sur le serveur local, la mĂŞme route appelle Ă  la place son homologue sur le serveur dans le cloud : dans ce cas, elle se contente d’implĂ©menter un proxy.
Node http, la pelle et la pioche

Avec ce module, aucun concept fonctionnel qui nous simplifierait la vie ne sera proposé. Pas de middleware bien pratique non plus. Nous devrons tout gérer nous-même.

Nous pourrions donc faire des erreurs ou des omissions involontaires… mais aussi des simplifications volontaires. Ce code peu sembler un peu verbeux car c’est du "Node natif", mais il a l’avantage d’ĂŞtre rapide Ă  mettre en place.

Une autre motivation qui m’a poussĂ© Ă  partager ce code est que la rĂ©ponse la plus proche Ă  mon problème validĂ©e sur stackoverflow ne fonctionnait pas pour nodejs 0.10.24 couplĂ© Ă  Express 3. Attention: Il faut savoir que si vous utilisez encore Express 3, vous pourriez rencontrer des problèmes venant du fait que cette bibliothèque modifie le prototype d’objets natifs dans Nodejs.

La solution exposĂ©e ici n’utilise pas la fonction pipe() bien pratique pour Ă©conomiser du code Ă  cause de ce petit bug : Node.js – pipe() to a http response results in slow response time on ubuntu.

Si on reprend le schĂ©ma avec les 2 MyApp Nodejs sĂ©parĂ©es par Internet, ce code est sur l’instance locale :

(function(req, res) {
  var err, forwardReq, options;
  try {
    //Options pour le client http : on recopie les paramètres de la requête reçue dans la request qu'on va envoyer
    options = {
      host: config.target.host,
      port: config.target.port, 
      //Chemin seul sans la query string :
      path: req.originalUrl.replace(/\?.*$/, ""), 
      method: req.route.method,
      //La query string est copiée ici
      query: req.query,
      headers: req.headers,
      //Force la création d'un nouveau "client"
      agent: false
    };
    
    //Instance de requête http créée avec les options précédente et une callback qui sera appelée quand la réponse sera reçue
    forwardReq = http.request(options, function(forwardRes) {
      //Ne pas propager les cookies du service réel pour éviter des conflits (exemple : authentification par cookie)
      delete forwardRes.headers["set-cookie"];
      //On recopie des headers de la réponse reçue du serveur distant dans la réponse renvoyée au client
      res.writeHead(forwardRes.statusCode, forwardRes.headers);
      
      //Pour le reste, on enregistre des fonctions qui prendront en charge les divers évènements: 
      //L'évènement "data" correspond à l'arrivée de nouvelles données : 
      forwardRes.on('data', function(chunk) {
        //On recopie simplement les données reçues dans la réponse renvoyée à notre client
        return res.write(chunk);
      });
      
      //"close" correspond Ă  une fermeture brutale de la connexion
      forwardRes.on('close', function() {
        //On met fin proprement à notre réponse vers le client
        return res.end();
      });
      
      //"end" correspond à une fin normale du dialogue HTTP (fin de la réponse)
      return forwardRes.on('end', function() {
        return res.end();
      });

    }).on('error', function(err) {
      //ici on voudra certainement logger
      res.writeHead(503, {
        'Content-Type': 'text/plain'
      });
      res.write("Service currently unvailable");
      return res.end();
    });

    //Ă€ ce stade on a une requĂŞte prĂŞte. Il reste Ă  y mettre un body.
    /*
     Simplification pour Ă©viter de lire la request du client
     avec l'API native de node.
    */
    forwardReq.write(JSON.stringify(req.body));

    /*
     Envoi définitif de la requête. 
     Après cette ligne la callback définie plus haut sera appelée avec la réponse.
    */
    return forwardReq.end();
  } catch (_error) {
    /*
     Si une erreur technique se produit pendant l'envoi de la requĂŞte,
     on tombe dans ce catch.
    */
    err = _error;
    logger.error('http request to service raised: ', err, {});
    try {
      return res.send(503, "Service currently unvailable");
    } catch (_error) {
      err = _error;
      return logger.error('Could not send error response: ', err, {});
    }
  }
});

Sur l’instance MyApp distante, qui a le droit d’accĂ©der au backend, la fonction qui sert la route est normale, avec ses middlewares (exemple : authentification), sa logique mĂ©tier, etc. C’est la fonction mĂ©tier cible.

Le code ci-dessus nécessite quelques précisions :

  • Il s’agit de code coffeescript traduit en javascript, d’oĂą les return systĂ©matiques et les variables intermĂ©diaires.
  • Le logger est winston.
  • http est obtenu par http = require('http').
  • config est supposĂ© ĂŞtre la configuration de l’application.
  • Le service exposĂ© reçoit des POST dont le contenu est du JSON et dont la rĂ©ponse est Ă©galement du JSON.
  • L’exemple est tirĂ© d’une application nodejs utilisant le framework Express 3.x, avec le middleware body-parser activĂ©. Vous observerez qu’en sĂ©rialisant request.body, on opère au final un aller-retour un peu coĂ»teux : body-parser rĂ©alise une dĂ©sĂ©rialisation du corps de la requĂŞte JSON, et nous faisons une sĂ©rialisation pour remplir le corps de la requĂŞte sortante. Normalement, il aurait fallu faire une recopie directe d’une requĂŞte Ă  l’autre en lisant le corps de la requĂŞte entrante avec l’API Node IncomingMessage.

Ce fonctionnement est simple car il ne gère pas les cookies. Pour gĂ©rer les cookies correctement, il aurait fallu faire bien Ă  attention Ă  traduire les valeurs d’hĂ´te pour les cookies qui doivent traverser et Ă  bien garder les valeurs des cookies qui sont spĂ©cifiques Ă  un dialogue (comme les cookies de session et d’authentification). Les cookies cryptĂ©s avec une clĂ© serveur symĂ©trique exigent que les deux instances de MyApp partagent la mĂŞme clĂ© secrète pour ĂŞtre modifiĂ©s. L’idĂ©al pour proxifier une route spĂ©cifique est qu’elle reprĂ©sente un service public oĂą on ne modifie pas les donnĂ©es.

Request, promesse non tenue

Quand on voit le code nécessaire pour jouer les intermédiaires, on cherche un module qui fait la même chose. Request nous promet la simplicité :

request.get('http://mysite.com/doodle.png').pipe(resp)

Ce code serait la seule ligne nécessaire pour répondre à la requête GET "/doodle.png" en faisant suivre la requête à un autre site. Exactement ce que nous voulons.

Le problème est que nous devons rĂ©pondre en POST. Cela nĂ©cessite d’enchaĂ®ner avec un appel Ă  form() pour dĂ©finir les paramètres du formulaire, auquel cas la requĂŞte n’est jamais envoyĂ©e. Ce point est une inconsistance de l’API. La documentation sur les
formulaires finit par un exemple de requĂŞte PUT personnalisĂ©e avec un corps JSON, ce qui nous conviendrait. Cependant, m’Ă©tant heurtĂ© Ă 
ce blocage de requĂŞte, j’ai prĂ©fĂ©rĂ© dans mon cas prendre la pelle et la pioche en utilisant
node http comme vu plus haut. On remarquera au passage
dans la doc de Request que dans le cas d’un personnalisation complète, on perd en concision.

Superagent l’omnipotent

Bien qu’Ă©tant affichĂ© "moins populaire" que Request selon le nombre d’Ă©toiles et de forks sous Github, Superagent reste nĂ©anmoins une solution bien suivie, maintenue et rĂ©alisĂ©e par la mĂŞme personne que les cĂ©lèbres jade et mocha. Superagent se targue de pouvoir faire aussi bien du client que du serveur (nodejs), permettant de rĂ©investir plus facilement l’effort d’apprentissage.

Cette solution a Ă©tĂ© mise en Ĺ“uvre sur un orchestrateur, un serveur nodejs qui sert de "front" Ă  deux applicatifs fournissant des webservices JSON, ces derniers n’Ă©tant pas exposĂ©s directement au public. Elle pourrait Ă©galement convenir pour le cas que nous avons exposĂ© au dĂ©but.

Suivant le service exposĂ© par l’orchestrateur, il peut ĂŞtre traitĂ© soit en appelant directement un des deux fournisseurs, soit en appelant les deux pour composer une rĂ©ponse cohĂ©rente en agrĂ©geant deux rĂ©ponses techniques.

Soit une route simple :

app.route('/product/:id').get(controller.rpGET);

Le contrĂ´leur :

var request = require('superagent');
//...
function copyResponse(res, targetError, targetResponse) {
  if (targetError) {
    res.send(500, targetError); //On peut aussi remplacer 500 par le status code original...
  } else {
    res.status = targetResponse.status;
    res.statusCode = targetResponse.statusCode;
    res.send(targetResponse.body);
  }
}

exports.rpGET = function (req, res) {
  request.get(getRedirectUrl(req))
    .set('MY-HEADER', 'Some value') //simple exemple de définition de header
    .end(function (error, response) {
      copyResponse(res, error, response);
    });
};

Le fonctionnement est simple et le code plus concis.

Dans le cas ci-dessus, nous avons choisi de ne pas traiter sur notre serveur local le GET sur un produit dont l’id est spĂ©cifiĂ© sur le chemin. Ă€ la place, nous confions la requĂŞte Ă  une fonction gĂ©nĂ©rique qui fait suivre toutes les requĂŞtes GET vers un serveur distant dont l’URL est fournie par la fonction "getRedirectUrl" (non dĂ©veloppĂ©e ici), puis renvoie la rĂ©ponse du serveur distant Ă  notre client sans modification.

Nous rajoutons juste un header avant de faire suivre la requĂŞte.

La fonction "rpGet" est donc gĂ©nĂ©rique et sera appelĂ©e par toutes les routes pour lesquelles nous souhaitons faire "passe-plat" et dĂ©lĂ©guer la requĂŞte au serveur distant. On notera qu’il existe des fonctions chaĂ®nables pour modifier la requĂŞte que l’on recopie. Il est donc facile de traiter Ă  la volĂ©e des problĂ©matiques nĂ©cessitant la modification ou le filtrage des requĂŞtes qu’on fait suivre.

Seul bĂ©mol : attention Ă  la cohĂ©rence du code, les objets request et response passĂ©s aux callbacks par superagent ne sont pas natifs. Comprendre que les attributs ne sont pas forcĂ©ment standards, d’oĂą la double gestion "status" et "statusCode" (l’un appartenant au module http natif et l’autre Ă  Superagent) afin d’Ă©viter que le dĂ©veloppeur non averti aille lire un attribut "undefined" plus loin dans le code…

Node-http-proxy, le couteau-suisse avec pelle et pioche intégrées

Le package npm http-proxy alias node-http-proxy (github), est une solution complète de proxying, supportant même les Websocket. Il fait plus que ce dont nous avons besoin, mais comparons-le aux autres modules pour notre tâche.

Tout d’abord, on observe que l’API est dans le style nodejs, avec des listeners d’Ă©vènements qu’on passe par callback. Cette manière de faire ressemble donc au module http, notamment dans sa verbositĂ©. Mais ce n’est pas tout !

On remarque en lisant la documentation que node-http-proxy est un serveur indépendant qui va écouter sur un port particulier. Ceci peut être une contrainte : pour que toutes les requêtes de notre application passent par le même port, il faut nécessairement mettre un serveur http devant. Ce cas nous intéresse beaucoup moins et nous ne le détaillerons pas ici. Nous retiendrons cependant certains éléments intéressants :

  • Ce module est un proxy complet, pas un "re-routeur".
  • Il crĂ©e un service http sur un port donnĂ©, indĂ©pendant du reste de l’application.
  • On peut lui adjoindre des routes express, ce qui en pratique s’avère nĂ©cessaire car l’API Ă©vènementielle est de bas niveau, comme node-http.
  • Par rapport Ă  un vrai reverse-proxy avec un fichier de configuration, ici le code peut rester avec le reste du code applicatif, ce qui facilite la maintenance et Ă©largit la population qui comprend ce qu’il fait au delĂ  des "ops" rompus Ă  nginx ou apache.

Contrairement aux autres modules, node-http-proxy n’est pas un module qui permet d’ajouter une simple route proxyfiĂ©e sur un conteneur applicatif. C’est au contraire un conteneur au mĂŞme titre que node-http, et on ne coupera pas Ă  l’adjonction d’express pour faciliter la dĂ©finition des routes comme pour un serveur http classique.

Conclusion

Nous avons vu que si Nodejs Ă©tait capable, de base, de faire tout ce que le protocole http permet (client, serveur, proxyfying…), en revanche il vaut mieux utiliser un module spĂ©cifique pour permettre un code de plus haut niveau.

On tombe alors dans la jungle du monde javascript oĂą mĂŞme un artefact avec des milliers d’Ă©toiles sous github peut ĂŞtre assez alĂ©atoire.

  • Bien que certains dĂ©veloppeurs aient rapportĂ© des astuces avec request, d’autres ont soumis des bugs… Mon expĂ©rience personnelle m’a forcĂ© Ă  abandonner très tĂ´t ce module.
  • Superagent a fait ses preuves, tout en ayant une syntaxe pratique.
  • node-http-proxy nous permettra d’Ă©crire une "application proxy" complète avec les mĂŞme outils qu’une application classique. Son usage est Ă  comparer Ă  celui d’un vrai reverse proxy et peut ĂŞtre une alternative viable.

Contrairement aux serveurs http classiques qui mettent l’accent sur les performances, une solution intĂ©grĂ©e Ă  Nodejs offre l’avantage de rendre lisible et maintenable par des dĂ©veloppeurs js ou Coffee le livrable "proxy". Cette solution est donc envisageable quand la configuration du serveur HTTP devant les serveurs applicatifs serait trop complexe et/ou avec des règles amenĂ©es Ă  Ă©voluer au grĂ© du cycle de vie de la webapp.

 

Catégories: Blog Société

[PO Dojo] Story mapping … la suite

Agile Nantes - jeu, 02/12/2015 - 15:31

Puisque vous aviez trouvĂ© la session prĂ©cĂ©dente trop courte pour apprĂ©hender entièrement la dĂ©marche « Story mapping », voici une 2e session ! ;o))

Nous voici donc avec 3 story maps pour notre logiciel de pilotage de la maison auto-nettoyante ! (1 story map par cible marketing). Nous devons maintenant les fusionner et prioriser l’ensemble pour poursuivre l’aventure.

Ces sessions PO Dojo s’adressent aux personnes connaissant dĂ©jĂ  l’agilitĂ© et souhaitant progresser dans ce rĂ´le de Product Owner.

podojo

Le PO Dojo est l’espace des Product Owners pour apprendre par la pratique. L’objectif est de rĂ©aliser les actions du product Owner pour passer d’une idĂ©e marketing Ă  une user story prĂŞte pour la planification.

A cette session, nous souhaiterions que chaque participant propose un icebreaker au groupe (titre et objectif). Un vote permettra de choisir et le participant pourra alors animer ce début de session permettant de découvrir chaque membre du groupe.

A bientĂ´t,

Le groupe PO Dojo nantais

OĂą et quand ?

> Où: Chez CBP 3 rue Victor Schoelcher à St herblain (en face du Quick et autres restaurants)

> Quand: jeudi 26 février de 19h à 21h

> Faut il s’inscrire ? Oui, par ici

L’association Agile Nantes

Catégories: Association

FinTech : concurrents ou partenaires ? FinTech Day le 25 mars


Dej-Banque-Digitale-blog (1)

A l’occasion de la parution de notre livre blanc, nous organisons une journĂ©e dĂ©diĂ©e Ă  la banque digitale et son Ă©cosystème avec l’apparition de nouveaux acteurs : les FinTechs.

Cette journée vous permettra de comprendre les enjeux et les implications de la vague digitale dans le domaine bancaire. Et, sur le même modèle que les Startups, 18 FinTech vous feront découvrir leurs visions et leurs produits grâce à 3 séquences de FinTech Pitch.

Avec la participation de Anne Laure Naveos (Credit Mutuel Arkea), Jean-Michel Pailhon (Expert FinTech), Nicolas Guillaume (Chappuis Halde), Patrice Bernard (Consultant Conix et Blogueur)

 

>> Inscription au FinTech Day 

Les FinTech se glissent dans les interstices du marché, en répondant à des attentes des clients peu satisfaites par les banques traditionnelles. Tous les axes métiers sont aujourd’hui touchés. Même si la licence bancaire semblait encore protéger les acteurs historiques jusqu’à ce jour, une brèche s’est ouverte et des acteurs comme Alibaba initialement spécialiste du eCommerce–se lancent dans l’aventure globale en montant en Chine une banque ex-nihilo. Plus proche de nous Fidor, banque allemande et nouvel entrant à l’approche disruptive depuis 2009, qui vient d’ouvrir ses API  s’apprête à étendre son activité en Angleterre et aux Etats Unis.

Dans un climat de reprise atone, les États ont de leur côté bien compris que l’émergence de nouveaux acteurs dans le secteur des services financiers pouvait contribuer à la relance de l’économie. Ce contexte explique pour partie l’émergence, surtout depuis 2010, d’une multitude de FinTech, dont certaines sont devenues grandes–notamment aux USA. Comme révélateur de ce constat, on peut notamment citer les valorisations respectives de Credit Karma  ou de Square, respectivement 1 et 6 milliards de dollars ; ou encore les récentes introduction en bourse de LendingClub ou de OnDeck . Fin 2014 OnDeck levait ainsi environ 200 millions de dollars valorisant la société à 1.3 milliard de dollars tandis que LendingClub levait 870 millions de dollars pour une valorisation se situant aux alentours de 8 milliards de dollars.

Quelle posture alors adopter lorsque l’on fait partie des acteurs historiques, et donc menacés par des concurrents à la réactivité et à l’agilité auxquels ces dits acteurs ne sont clairement pas habitués ? Deux grandes stratégies semblent se dessiner. L’une consiste, au travers de partenariats ou des prises de participation via des incubateurs, à revenir dans le jeu et capter indirectement une partie de ce marché sans pour autant assumer l’intégralité du risque lié à un nouveau business model. L’autre plus ambitieuse et donc plus risquée, surfant sur la vague Digitale, s’inspire des approches de ses nouveaux acteurs et tente de se transformer, de l’intérieur.

À l’étranger, certaines banques commencent donc à agir dans une perspective d’Open Innovation et de Co-Création. Les incubateurs de FinTech prolifèrent, notamment en Angleterre avec par exemple la Barclays  et son Barclays Accelerator  ou CommerzBank et son Main Incubator  le tout premier incubateur de FinTech en Allemagne. En Espagne, BBVA va plus loin et poursuit son avancée au travers du rachat de la startup bancaire Simple , ou encore via l’acquisition de Madiva, une startup maîtrisant les technologies Big Data.

En France, l’évolution du cadre réglementaire autour de la finance participative devrait favoriser l’émergence de nombreux nouveaux entrants et, déjà, Generali tente d’en tirer parti en initiant un partenariat  avec Prêt d’Union . Plus discret, mais tout aussi actif, Crédit Mutuel Arkea continue d’investir, d’innover ou de tisser des partenariats avec les nouveaux entrants comme par exemple Linxo, Prêt d’Union ou encore le dernier venu Compte Nickel.

Quant aux exemples de transformations de l’intérieur, citons BREBank, devenue mBank et CBA (Commonwealth Bank of Australia) qui en sont de magnifiques illustrations. Voilà les refontes d’une banque en ligne et d’une banque historique qui ont réussi à se réinventer, tant du point de vue de leur organisation, de leur management ou de leur vision de ce que doit être une banque au XXIe siècle. Elles sont les illustrations et les preuves vivantes que c’est possible – sous réserve d’y mettre les efforts nécessaires et d’avoir un top management engagé et visionnaire.

>> Inscriptions au FinTech Day

Articles suggested :

  1. Petit dĂ©jeuner mobilitĂ© – iPad, iPhone Android en banque et assurance, prĂ©parez-vous au coup d’après !
  2. Petit-déjeuner : inventer la banque de demain le 19 mars

Catégories: Blog Société

Comalatech announces the acquistion of Keinoby

Le blog de Valiantys - jeu, 02/12/2015 - 11:26

Comalatech, a top ranked Atlassian add-on vendor known for Comala Workflows and Canvas, has acquired Keinoby Software and extends its portfolio of products for Confluence. Newcomer in the Atlassian ecosystem,  Keinoby is the editor of Yoikee Creator, which allows you to organize new Confluence spaces in a whole new way using Mind Maps and to keep those spaces consistent by […]

The post Comalatech announces the acquistion of Keinoby appeared first on Valiantys Blog.

Catégories: Blog Société

Revue de Presse Xebia

La revue de presse hebdomadaire des technologies Big Data, Cloud et Web, architectures Java et mobilité dans des environnements agiles, proposée par Xebia.logo-revue-presse220-150x102

Objets connectés IoT et M2M : Quelles tendances en 2015 ?

http://www.gravatar.com/f02a4fb1606e6f98dd3ca1cd5d183448http://blog.xebia.fr/author/sbenfredjhttp://twitter.com/%40SamehBenFPar Sameh BEN FREDJ

Comme chaque année, les analystes de Machina Research (Cabinet  leader dans le conseil stratégique en M2M, IoT et Big data) ont livré leur vision de l’évolution du marché de l’Internet des Objets (IoT) et du M2M en 2015. De ces prédictions, nous retiendrons essentiellement une démocratisation de l’interêt des entreprises vers le monde de l’IoT. Cet interêt qui était principalement exploratoire deviendra de plus en plus significatif à travers la multiplication des offres commerciales. Parmi ces offres commerciales il y’ aura une augmentation du nombre de solutions et de plateformes qui permettront de connecter des objets différents et ainsi casser les silos établis en M2M. Aussi, les analystes de Machina Research prévoient un développement des secteurs des voitures connectées et des villes intelligentes et un intérêt croissant pour la gestion et l’analyse des données, où des entreprises chercheront à élargir leurs offres de services pour inclure des capacités analytiques. Ceci renforcera le rôle des telephones mobiles qui s’imposeront comme des passerelles de traitement de données géo-distribuées. Parmi les autres prédictions, nous citerons aussi la multiplication des API Web qui permettront de representer virtuellement le objets physiques et  de faciliter leur communication et leur interopérabilité. Enfin , l’enjeu de la sécurité des données sera majeur en 2015. La complexité des solutions IoT exigera d’adopter de nouvelles mesures de sécurité qui s’adapteront à l’application considérée et devront s’appliquer de bout en bout de la solution IoT.

AgilitĂ© ‘No Estimates’ in Action: 5 Ways to Rethink Software Projects http://www.gravatar.com/6beb8800b1d5d45c22ecc81062e12448http://blog.xebia.fr/author/nlochethttp://twitter.com/nicolaslochetPar Nicolas Lochet

Cet article par Matthew Heusser n’est pas prĂ©cisĂ©ment rĂ©cent. Pourtant, je trouve qu’il redevient d’actualitĂ© alors que le mouvement #NoEstimates prend de l’ampleur.

Face aux raccourcis induits par les 140 caractères d’un message Twitter, la rĂ©alitĂ© de ce que signifie #NoEstimates n’est plus partagĂ©e. A travers cet article vous pourrez mieux comprendre les idĂ©es derrière cette approche, ainsi que dĂ©couvrir 5 approches pour la mettre en oeuvre concrètement dans vos projets.

Une bonne façon de découvrir ou redécouvrir ce mouvement!

Thoughts on Estimation http://www.gravatar.com/6beb8800b1d5d45c22ecc81062e12448http://blog.xebia.fr/author/nlochethttp://twitter.com/nicolaslochetPar Nicolas Lochet

Une fois que vous aurez lu l’article de Matthew Heusser, vous voudrez sans doute poursuivre par celui-ci (plus rĂ©cent). Mike Cohn nous partage en effet sur son blog quelques rĂ©flexions de Ron Jeffries sur la valeur des estimations.

Ron Jeffries, faisant Ă©cho Ă  son dernier livre « The Nature of Software Development », partage ici sa vision sur les estimations. Il nous parle de son expĂ©rience et des questions que vous vous ĂŞtes certainement vous-mĂŞme posĂ©es au sujet des estimations. Il ouvre par ailleurs le dĂ©bat en vous proposant de lui partager vos idĂ©es pour qu’il enrichisse la discussion.

C’est peut-ĂŞtre l’occasion de lever vos derniers doutes!

Mobilité Support des tests unitaires sur Android http://www.gravatar.com/37a6259cc0c1dae299a7866489dff0bdhttp://blog.xebia.fr/author/jmartinezhttp://twitter.com/jeremmartinezhttp://github.com/jeremiemartinezPar Jeremie Martinez

La semaine dernière Google a sorti une version 1.1.0-RC1 de son plugin gradle pour Android et mis Ă  jour la documentation. Dans cette version, il faut noter l’apparition du support pour les tests unitaires en Android. La documentation comporte donc un tutoriel pas Ă  pas afin de configurer votre projet. Cette fonctionnalitĂ© est Ă  l’Ă©tat « experimental » mais elle reste fonctionnelle et nous permet de nous dĂ©barrasser des librairies non-officielles que nous utilisions jusque lĂ .

Swift 1.2 http://www.gravatar.com/3b046b7897aa7aacf56732f33178e713http://blog.xebia.fr/author/scivettahttp://twitter.com/viteinfinitehttp://github.com/viteinfinitePar Simone Civetta

Lundi dernier Apple a annoncĂ© la sortie d’une nouvelle beta de iOS. Surprenamment, Il ne s’agit pas de la bĂŞta 6 de iOS 8.2 mais d’un nouvelle release mineure, nommĂ©e iOS 8.3. Cette version apporte des changement très important concernant le langage Swift, qui atteint dĂ©sormais la version 1.2. Les changements sont, sous certains aspects majeurs et concernent aussi le bon vieux Objective-C. En particulier :

  • as! permet de dĂ©clarer des conversions qui peuvent Ă©chouer (failable casts)
  • Objective-C permet maintenant de dĂ©finir des paramètres nullifiable, Ă  l’aide des mots rĂ©servĂ©s nullable/nonnul/null_resettable
  • Les enums de Swift peuvent dĂ©sormais ĂŞtre exportĂ©s en Objective-C (Ă  l’aide de l’attribut @objc)
  • Modifications Ă  l’interpretation des constantes (let)
  • L’unwrapping via « if let » permet maintenant de lire plusieurs optionals en mĂŞme temps
  • Une nouvelle structure « Set », non ordonnĂ©e et contenante des valeurs uniques, permet le bridging en Swift de NSSet.

Toutes les informations sont disponible sur le blog Swift officiel, gĂ©rĂ© par Apple et publiĂ©s Ă  l’intĂ©rieur d’un article dĂ©diĂ©. Vous pouvez retrouver encore plus d’informations Ă  l’intĂ©rieur des Release Notes de Xcode 8.3 beta.

Craftsmanship Sortie de IntelliJ 14.1 EAP http://www.gravatar.com/0eac998a3709ea6d1b7498a49bb73ba9http://blog.xebia.fr/author/nullhttp://twitter.com/valdo404http://github.com/valdo404Par Laurent Valdes

 Dans cette belle version de IntelliJ nous trouverons:

  • Le support (surprise !!) de Java 9.
  • Le debugging des classes dĂ©compilĂ©es
  • Le refactoring « Extract Functional Parameter refactoring »
  • Le support de Spring Boot
  • L’intĂ©gration avec Docker
Back  Node.js: la version 0.12 est arrivée http://www.gravatar.com/b48c1ee560ff6432a574dceb746dff79http://blog.xebia.fr/author/romain-niveau%2Fhttp://twitter.com/RomainNVhttp://github.com/RNiveauPar Romain Niveau

Après 2 longues annĂ©es d’attente, node.js vient de sortir en version 0.12.

Sous fond de division avec le fork io.js, Joyent apporte des nouveautés présentes justement dans le fork comme le round-robin.

Au delĂ  de cette version, on commence Ă  parler d’une version 1.0 de node.js ainsi que d’une amĂ©lioration de la gouvernance du projet (une des causes initiales du fork).

Pour plus de dĂ©tails, c’est par ici.

Le coin de l’Alliance Thiga – DĂ©couvrez comment construire une landing page pour valider vos idĂ©es de produit http://www.gravatar.com/fb2815feba1b2e3bfc428d9bacccab6ehttp://blog.xebia.fr/author/nullhttp://twitter.com/nullPar Alexandre Irrmann-TĂ©zĂ©

Le Lean Startup prĂ´ne la confrontation perpĂ©tuelle de ses idĂ©es sur le terrain. Dans les phases amont de la crĂ©ation de produit numĂ©rique, cette confrontation peut prendre la forme d’une simple page d’atterrissage prĂ©sentant le problème auquel vous vous attaquez.

Cet article donne toutes les recettes pour faire une page d’atterrissage efficace qui vous permettra de constituer Ă  moindre coĂ»t votre premier panel d’early adopters.

Cellenza est au TechDays !

La grosse actualitĂ© dans notre Ă©cosystème est Ă©videmment les TechDays. Des sessions, un stand, l’Ă©quipe au grand complet sur place et, last but not least, les premiers tests grandeur nature de notre Live : http://live.cellenza.com, qui permet de suivre en temps rĂ©el un fil d’actualitĂ©s.

Catégories: Blog Société

Quand le street art s’invite sur les murs d’Ippon Paris – Interview Noty & Aroz

Blog d’Ippon Technologies - mer, 02/11/2015 - 20:25

Salle_Formation_Ippon_1
 

 

 

 

 

 

Salle_Formation_Ippon_2  Salle_Formation_Ippon_3

street-art-ippon-paris-ssii-java

 

 

 

 

 

 

 

 

 

Pouvez-vous vous présenter ?

Oui ! Nous sommes Noty et Aroz, un collectif de peinture mais avant tout des amis. Nous avons 23 ans et nous sommes originaires des Yvelines. Nous utilisons des techniques de Street-art afin de crĂ©er des toiles, faire de la dĂ©coration d’intĂ©rieur, mais Ă©galement de l’Ă©vĂ©nementiel et de l’animation.

D’où vous viennent vos pseudos ?

« Noty » ? C’était à 13 ans, j’étais parti en Angleterre, j’avais eu ce surnom car j’étais taquin avec les membres de ma famille d’accueil. Ils m’ont nommé « Naughty Boy », le vilain. C’est resté.
Aroz: Moi, c’est parce que « c’est la goutte d’eau qui fait déborder le blase ».

Quelles sont vos influences (culturelles, artistiques…) ?

Aroz: Ce ne sont pas vraiment les artistes qui m’ont donné envie de devenir « artiste décorateur », c’était plutôt grâce au « graffiti art magazine. »
Noty: Nous n’avons pas vraiment une influence qui vient de la peinture. Nous nous inspirons un peu de tout ce qui nous tombe sous les yeux. Du magazine de graffiti à la bande-dessinée, en passant par internet, le cinéma, les jeux-vidéos.
Nous aimons beaucoup de choses et je pense que cela se ressent dans nos travaux.

Comment en ĂŞtes-vous venus Ă  vous mettre au Street Art ?

On est pote d’enfance et on a toujours un peu dessinĂ©. La pĂ©riode dĂ©cisive a Ă©tĂ© celle du « Silo ». On visitait les chantiers la nuit et les week-ends car on vit en banlieue (Ă  cotĂ© de Saint Quentin en Yvelines). Un jour, on a dĂ©couvert une pièce dans une ferme abandonnĂ©e, c’était difficile d’accès et on en a fait notre squat. On a passĂ© 6 mois Ă  faire des encombrants, Ă  tout refaire … c’est comme ça qu’on a commencĂ© avec la peinture. On s’est inspirĂ© de notre culture pop des annĂ©es 90/2000, on s’est fait la main avec des pochoirs. On avait retapĂ© tous les murs. C’Ă©tait un vrai squat artistique. Malheureusement, un jour, le squat s’est fait dĂ©truire … du coup, ça nous a fait sortir et on a commencĂ© Ă  faire des affiches dans la rue.

Quelles sont les tendances dans le street Art ?

Aucune idée. En générale, la tendance est toujours la même : Des nouvelles techniques pour des nouveaux supports.
Le message politique devient tout de même de plus en plus présent.

Pouvez-vous nous expliquer votre/ vos manière(s) de travailler ? (supports, outils utilisés etc.)
Dans un premier temps, on a improvisé et appris sur le tas. On a développé des techniques qui nous sont propres: par exemple, nous peignons avec nos « bubble spray » (bouteilles de soda modifiées) ou encore des mélanges d’aquarelle et de café.
Lorsqu’un nouveau projet se prĂ©sente, nous nous faisons un brainstorming. De cela naĂ®t plusieurs propositions.
La technique qui est choisie sera celle qui mettra le plus en valeur le projet.

Quel rapport entretenez-vous avec les nouvelles technologies ? Peuvent-elles vous être utiles dans le processus de réalisation d’une oeuvre ?

Bien sĂ»r ! Elles sont mĂŞme indispensables. Internet est une banque d’images infinie. Et puis pour beaucoup de projets, nous utilisons des logiciels tels que Photoshop afin d’avoir un rendu sur mur avant d’enclencher le processus de crĂ©ation.

Découvrez les coulisses de la dernière création dans la salle de formation chez Ippon

Noty & Aroz

Catégories: Blog Société

Choisir une architecture Flux pour son projet React

React  est une librairie crĂ©Ă©e par Facebook permettant de gĂ©nĂ©rer des composants web au travers d’une API qui se veut simple et Ă©purĂ©e. React est aujourd’hui utilisĂ© en production par plusieurs entreprises telles que Facebook ou AirBnb avec de très bons rĂ©sultats, et est donc bel est bien une alternative viable aux frameworks tels qu’Angular ou Ember.

Cependant l’utilisation de React, qui ne permet que de crĂ©er des composants, pose des questions quant Ă  l’architecture logicielle qu’il faut utiliser : comment aller chercher sa donnĂ©e ? Comment mettre Ă  jour les composants lorsque la donnĂ©e change ? Il est possible de choisir d’utiliser une approche MVC classique, avec Backbone ou encore Angular, mais l’approche semble peu naturelle et ne pas respecter la philosophie de React, qui encourage l’immutabilitĂ© et le flux de donnĂ©es Ă  sens unique.

L’alternative au MVC proposĂ©e par Facebook se nomme Flux et cet article sera l’occasion d’analyser diffĂ©rentes options d’implĂ©mentation de Flux.

Flux "Ă  la main"

Flux est une architecture (ça n’est pas une librairie, et encore moins un framework) simple et se caractĂ©rise par le fait que le flux de donnĂ©es est unidirectionnel.

Cette architecture contient des vues, les composants React, qui Ă©coutent les modifications de store pour se mettre Ă  jour. En cas d’Ă©vènement utilisateur (clique, frappe sur le clavier, etc.), le composant React appelle une mĂ©thode d’un objet Action qui lui mĂŞme appelle le dispatcher, servant ici de "bus d’Ă©vènements". Les stores Ă©coutent le dispatcher et se mettent alors Ă  jour en fonction des Ă©vènements envoyĂ©s.

Facebook propose flux via npm. Celle-ci ne fait que mettre à disposition une classe de base pour le Dispatcher. Il reste donc au développeur une quantité non négligeable de boilerplate à écrire :

  • store intĂ©grant un système d’Ă©mission d’Ă©vènements, gĂ©nĂ©ralement via l’eventEmmiter de node
  • actions s’appuyant sur des chaĂ®nes de caractères, impliquant gĂ©nĂ©ralement la crĂ©ation d’une classe de constantes
  • composants devant attacher l’Ă©couteur lorsqu’il est montĂ© et le dĂ©tacher lorsqu’il est dĂ©montĂ©.

Exemple :

//On utilise ici browserify, permettant d'utiliser le système de module commonjs
var React = require('react');
var _ = require('lodash');
var EventEmitter = require('events').EventEmitter;
var Dispatcher = require('flux').Dispatcher;
 
//Instance unique du dispatcher
var AppDispatcher = new Dispatcher();
 
//Constantes pour éviter de devoir réécrire des chaines de caractères
var NameConstant = {
    ADD_NAME: 'ADD_NAME',
    CHANGE_EVENT: 'change'
};
 
//Action
var NameAction = {
    addName: function (name) {
        AppDispatcher.dispatch({
            actionType: NameConstant.ADD_NAME,
            name: name
        });
    }
};
 
//Store héritant de l'eventEmitter
var NameStore = _.assign({
    names: ['Jurgen-Helmut', 'Georges']
}, EventEmitter.prototype);
 
//Ecoute du dispatcher par le store.
AppDispatcher.register(function (action) {
 //Le switch case n'est ici pas justifié
 // mais est représentatif du cas réel avec beaucoup d'actions différentes
    switch (action.actionType) {
        case NameConstant.ADD_NAME:
            NameStore.names.push(action.name);
            NameStore.emit(NameConstant.CHANGE_EVENT);
            break;
        default:
            break;
    }
});
 
//Composant graphique
var App = React.createClass({
    getInitialState: function () {
        return {
            names: NameStore.names,
            currentName: ''
        }
    },
    componentDidMount: function () {
        NameStore.on(NameConstant.CHANGE_EVENT, this._loadNames);
    },
    componentWillUnmount: function () {
        NameStore.removeListener(NameConstant.CHANGE_EVENT, this._loadNames);
    },
    _loadNames: function () {
        this.setState({names: NameStore.names});
    },
    _addName: function (e) {
        e.preventDefault();
        NameAction.addName(this.state.currentName);
        this.setState({currentName: ''});
    },
    _onChangeName: function (e) {
        this.setState({currentName: e.target.value});
    },
    render: function () {
        return (
            <div>
                <form  onSubmit={this._addName}>
                    <input type="text" placeholder="Nom" value={this.state.currentName} onChange={this._onChangeName}/>
                    <input type="submit" value="Enregistrer" />
                </form>
                <ul>
                {this.state.names.map((name, index) =>
                        <li key={index}>{name}</li>
                )}
                </ul>
            </div>
        );
    }
});
React.render(<App />, document.body);

L’avantage de cette approche est qu’elle laisse Ă©normĂ©ment de possibilitĂ© au dĂ©veloppeur, qui n’est pas dĂ©pendant d’une librairie tierce qui pourrait ne plus ĂŞtre maintenue dans quelques mois.
Cependant, les dĂ©veloppeurs sont feignants, et ils prĂ©fèrent malgrĂ© tout ne pas rĂ©inventer la roue Ă  chaque fois. De nombreuses librairies pour aider Ă  l’implĂ©mentation de l’architecture Flux sont donc apparues. On parlera ici d’une des plus connue : Fluxxor

Fluxxor

Fluxxor se prĂ©sente comme un ensemble d’outils permettant de simplifier l’implĂ©mentation de l’architecture flux. Fluxxor apporte :

  • une classe Flux servant Ă  manager stores et actions, et qui s’occupe de gĂ©rer le dispatcher
  • une classe Store hĂ©ritant de l’eventEmmiter et fournissant en plus des helpers pour Ă©couter des actions
  • du sucre syntaxique dans les actions pour simplifier le dispatch d’Ă©vènements
  • des mixins pour les composants React simplifiant la mise Ă  jour des composants

Un morceau de code valant toujours mieux qu’un long discours, on pourra retrouver le mĂŞme exemple que ci-dessus, mais cette fois-ci en utilisant Fluxxor :

var React = require('react');
var Fluxxor = require('fluxxor');

//Constantes
var NameConstant = {
    ADD_NAME: 'ADD_NAME'
};
 
//Store
var NameStore = Fluxxor.createStore({
    initialize: function () {
        this.names = ['Jurgen-Helmut', 'Georges'];
        this.bindActions(
            NameConstant.ADD_NAME, this.onAddName
        );
    },
    onAddName: function (name) {
        this.names.push(name);
  //L'événement 'change' est codé en dur dans Fluxxor
        this.emit("change");
    }
});
 
//Action
var actions = {
    addName: function (name) {
        this.dispatch(NameConstant.ADD_NAME, name);
    }
};
 
//DĂ©claration de flux
var stores = {
    NameStore: new NameStore()
};

var flux = new Fluxxor.Flux(stores, actions);
 
//Composant graphique
 
//FluxMixin fourni au composant (entre autre) la méthode getFlux
var FluxMixin = Fluxxor.FluxMixin(React);
 
//StoreWatchMixin permet au composant d'écouter l'évènement 'change' du Store
var StoreWatchMixin = Fluxxor.StoreWatchMixin;
var App = React.createClass({
    mixins: [FluxMixin, StoreWatchMixin("NameStore")],
    getInitialState: function () {
        return {currentName: ''};
    },
    getStateFromFlux: function () {
        return {names: this.getFlux().store("NameStore").names};
    },
    _onChangeName: function (e) {
        this.setState({currentName: e.target.value});
    },
    _addName: function (e) {
        e.preventDefault();
        this.getFlux().actions.addName(this.state.currentName);
        this.setState({currentName: ''});
    },
    render: function () {
        return (
            <div>
                <form  onSubmit={this._addName}>
                    <input type="text" placeholder="Nom" value={this.state.currentName} onChange={this._onChangeName}/>
                    <input type="submit" value="Enregistrer" />
                </form>
                <ul>
                {this.state.names.map((name, index) =>
                        <li key={index}>{name}</li>
                )}
                </ul>
            </div>
        );
    }
});

React.render(<App flux={flux}/>, document.body);

Fluxxor permet de simplifier l’utilisation de Flux, mais certains grincheux trouveront que l’architecture Flux en elle-mĂŞme prĂ©sente des dĂ©fauts et que si le concept de Flux de donnĂ©es unidirectionnel est bon, on peut aller plus loin. Et c’est pourquoi Reflux est nĂ©.

Reflux

Reflux est une librairie permettant de mettre en place une architecture ressemblant Ă  Flux tout en s’affranchissant de concepts vu comme des erreurs de Flux :

  • Le dispatcher unique est supprimĂ© ; chaque action devient son propre dispatcher

  • Les actions sont maintenant Ă©coutables, et les stores peuvent les Ă©couter directement sans switch case autour de chaĂ®ne de caractères
  • Les stores peuvent s’Ă©couter entre eux
  • Les dĂ©pendances entre store sont gĂ©rĂ©es par des agrĂ©gations de stores et non plus par la mĂ©thode waitFor

 On retrouvera le même exemple que précédemment, mais cette fois-ci en Reflux :

var React = require('react');
var Reflux = require('reflux');
 
//Action
var addName = Reflux.createAction();
 
//Store
var NameStore = Reflux.createStore({
    init: function () {
        this.names = ['Jurgen-Helmut', 'Georges'];
        this.listenTo(addName, this.addName);
    },
    addName: function (name) {
        this.names.push(name);
        this.trigger(this.names);
    }
});
 
//Composant graphique
var App = React.createClass({
    mixins: [Reflux.connect(NameStore, "names")],
    getInitialState: function () {
        return {currentName: '', names: NameStore.names};
    },
    _onChangeName: function (e) {
        this.setState({currentName: e.target.value});
    },
    _addName: function (e) {
        e.preventDefault();
        addName(this.state.currentName);
        this.setState({currentName: ''});
    },
    render: function () {
        return (
            <div>
                <form  onSubmit={this._addName}>
                    <input type="text" placeholder="Nom" value={this.state.currentName} onChange={this._onChangeName}/>
                    <input type="submit" value="Enregistrer" />
                </form>
                <ul>
                {this.state.names.map((name, index) =>
                        <li key={index}>{name}</li>
                )}
                </ul>
            </div>
        );
    }
});
React.render(<App />, document.body);
Conclusion

Parmi les diffĂ©rentes approches proposĂ©es ci-dessus, mĂŞme si elles sont toutes viables, notre prĂ©fĂ©rence va Ă  Reflux. En effet, on peut le voir sur les exemples, Reflux permet rĂ©ellement d’avoir beaucoup moins Ă  coder, tout en s’assurant que tout ce qu’il se passe soit explicite, ce qui reste un des objectifs de l’utilisation de Flux. Cependant, le monde de Flux est un monde qui Ă©volue Ă  toute vitesse et il ne se passe pratiquement pas une semaine sans qu’une nouvelle implĂ©mentation de Flux sorte. On pourra en dĂ©couvrir un certain nombre sur cette page dĂ©diĂ©e : les outils complĂ©mentaires Ă  React.

Facebook a profitĂ© de la React.js Conf pour annoncer Relay, leur propre implĂ©mentation de Flux basĂ© sur GraphQL. La librairie n’Ă©tant pas encore open-sourcĂ© Ă  l’heure oĂą ces lignes sont Ă©crites, il est pour l’instant difficile de savoir si Relay enterrera la concurrence une fois pour toute, ou s’il ne sera qu’une implĂ©mentation de Flux en plus.

Catégories: Blog Société

Important notice: pricing update on Service Rocket add-ons

Le blog de Valiantys - mar, 02/10/2015 - 15:51

Important pricing updates have been applied since January 2015 and affect a few of Service Rocket’s plugins. According to the editor, this change comes along with the announcement of new add-ons tiers and matches the new Atlassian licensing model. Some improvements have been done by the editor regarding functional quality of the products and the community, which is becoming […]

The post Important notice: pricing update on Service Rocket add-ons appeared first on Valiantys Blog.

Catégories: Blog Société

Partagez la connaissance

Partagez BlogsdeDeveloppeurs.com sur les réseaux sociaux